diff --git a/libraries/ModifiedBulletX/ModifiedBulletX.sln b/libraries/ModifiedBulletX/ModifiedBulletX.sln deleted file mode 100644 index 79ae566314..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX.sln +++ /dev/null @@ -1,42 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C# Express 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoXnaCompactMaths", "MonoXnaCompactMaths\MonoXnaCompactMaths.csproj", "{121147BC-B06B-406C-84E9-907F268CF0EB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modified.XnaDevRu.BulletX", "ModifiedBulletX\Modified.XnaDevRu.BulletX.csproj", "{44270344-ACA7-4875-B585-81D5C06D0489}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {121147BC-B06B-406C-84E9-907F268CF0EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Debug|x86.ActiveCfg = Debug|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Release|Any CPU.Build.0 = Release|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {121147BC-B06B-406C-84E9-907F268CF0EB}.Release|x86.ActiveCfg = Release|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Debug|Any CPU.Build.0 = Debug|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Debug|x86.ActiveCfg = Debug|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Release|Any CPU.ActiveCfg = Release|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Release|Any CPU.Build.0 = Release|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {44270344-ACA7-4875-B585-81D5C06D0489}.Release|x86.ActiveCfg = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/libraries/ModifiedBulletX/ModifiedBulletX.suo b/libraries/ModifiedBulletX/ModifiedBulletX.suo deleted file mode 100644 index 6244108c88..0000000000 Binary files a/libraries/ModifiedBulletX/ModifiedBulletX.suo and /dev/null differ diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/BulletDebug.cs b/libraries/ModifiedBulletX/ModifiedBulletX/BulletDebug.cs deleted file mode 100644 index a4cbfdde11..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/BulletDebug.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; - -namespace XnaDevRu.BulletX -{ - internal static class BulletDebug - { - [Conditional("DEBUG")] - public static void Assert(Boolean condition) - { - //if (!condition) - //{ - // Throw("No info available"); - //} - Debug.Assert(condition); - } - - [Conditional("DEBUG")] - public static void Assert(Boolean condition, String message) - { - //if (!condition) - //{ - // Throw(message); - //} - Debug.Assert(condition, message); - } - - [Conditional("DEBUG")] - public static void Assert(Boolean condition, String message, String detailMessage) - { - //if (!condition) - //{ - // Throw(message); - //} - Debug.Assert(condition, message, detailMessage); - } - - private static void Throw(String message) - { - String msg = String.Format("Assertion Error: {0}", message); - - throw new BulletException(msg); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/BulletX.snk b/libraries/ModifiedBulletX/ModifiedBulletX/BulletX.snk deleted file mode 100644 index 4ce5907529..0000000000 Binary files a/libraries/ModifiedBulletX/ModifiedBulletX/BulletX.snk and /dev/null differ diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/AxisSweep3.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/AxisSweep3.cs deleted file mode 100644 index 168d94707a..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/AxisSweep3.cs +++ /dev/null @@ -1,623 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class AxisSweep3: OverlappingPairCache - { - Vector3 _worldAabbMin; - Vector3 _worldAabbMax; - - Vector3 _quantize; - - int _numHandles; - int _maxHandles; - - Handle[] _handles; - Edge[][] _edges = new Edge[3][]; - - ushort _firstFreeHandle; - - int _invalidPair; - - public AxisSweep3(Vector3 worldAabbMin, Vector3 worldAabbMax, int maxHandles) - : base() - { - BulletDebug.Assert(maxHandles > 1 && maxHandles < 32767); - - // init bounds - _worldAabbMin = worldAabbMin; - _worldAabbMax = worldAabbMax; - - Vector3 aabbSize = _worldAabbMax - _worldAabbMin; - _quantize = new Vector3(65535.0f, 65535.0f, 65535.0f) / aabbSize; - - // allocate handles buffer and put all handles on free list - _handles = new Handle[maxHandles]; - for (int i = 0; i < maxHandles; i++) - _handles[i] = new Handle(); - _maxHandles = maxHandles; - _numHandles = 0; - - // handle 0 is reserved as the null index, and is also used as the sentinel - _firstFreeHandle = 1; - { - for (int i = _firstFreeHandle; i < maxHandles; i++) - { - _handles[i].NextFree = (ushort)(i + 1); - } - _handles[maxHandles - 1].NextFree = 0; - } - - { - // allocate edge buffers - for (int i = 0; i < 3; i++) - { - _edges[i] = new Edge[maxHandles * 2]; - for (int j = 0; j < maxHandles * 2; j++) - { - _edges[i][j] = new Edge(); - } - } - } - //removed overlap management - - // make boundary sentinels - - _handles[0].ClientData = 0; - - for (int axis = 0; axis < 3; axis++) - { - _handles[0].MinEdges[axis] = 0; - _handles[0].MaxEdges[axis] = 1; - - _edges[axis][0].Position = 0; - _edges[axis][0].Handle = 0; - _edges[axis][1].Position = 0xffff; - _edges[axis][1].Handle = 0; - } - } - - public ushort AddHandle(Vector3 aabbMin, Vector3 aabbMax, object owner, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask) - { - ushort[] min = new ushort[3], max = new ushort[3]; - Quantize(out min, aabbMin, 0); - Quantize(out max, aabbMax, 1); - - ushort handle = AllocateHandle(); - Handle oHandle = GetHandle(handle); - - oHandle.HandleID = handle; - oHandle.ClientData = owner; - oHandle.CollisionFilterGroup = collisionFilterGroup; - oHandle.CollisionFilterMask = collisionFilterMask; - - int limit = _numHandles * 2; - - // (Gluk ) - // ( Inside ) - for (int axis = 0; axis < 3; axis++) - { - _handles[0].MaxEdges[axis] += 2; - - _edges[axis][limit + 1].Position = _edges[axis][limit - 1].Position; - _edges[axis][limit + 1].Handle = _edges[axis][limit - 1].Handle; - - _edges[axis][limit - 1].Position = min[axis]; - _edges[axis][limit - 1].Handle = handle; - - _edges[axis][limit].Position = max[axis]; - _edges[axis][limit].Handle = handle; - - oHandle.MinEdges[axis] = (ushort)(limit - 1); - oHandle.MaxEdges[axis] = (ushort)limit; - } - - SortMinDown(0, oHandle.MinEdges[0], false); - SortMaxDown(0, oHandle.MaxEdges[0], false); - SortMinDown(1, oHandle.MinEdges[1], false); - SortMaxDown(1, oHandle.MaxEdges[1], false); - SortMinDown(2, oHandle.MinEdges[2], true); - SortMaxDown(2, oHandle.MaxEdges[2], true); - - return handle; - } - - public void RemoveHandle(ushort handle) - { - Handle pHandle = GetHandle(handle); - - //explicitly remove the pairs containing the proxy - //we could do it also in the sortMinUp (passing true) - //todo: compare performance - RemoveOverlappingPairsContainingProxy(pHandle); - - - // compute current limit of edge arrays - int limit = _numHandles * 2; - int axis; - - for (axis = 0; axis < 3; axis++) - { - _handles[0].MaxEdges[axis] -= 2; - } - - // remove the edges by sorting them up to the end of the list - for (axis = 0; axis < 3; axis++) - { - Edge[] pEdges = _edges[axis]; - ushort max = pHandle.MaxEdges[axis]; - pEdges[max].Position = 0xffff; - - SortMaxUp(axis, max, false); - - ushort i = pHandle.MinEdges[axis]; - pEdges[i].Position = 0xffff; - - SortMinUp(axis, i, false); - - pEdges[limit - 1].Handle = 0; - pEdges[limit - 1].Position = 0xffff; - } - - // free the handle - FreeHandle(handle); - } - - public override void ProcessAllOverlappingPairs(IOverlapCallback callback) - { - OverlappingPairs.Sort(new Comparison(BroadphasePair.ComparisonSort)); - - if (_invalidPair != 0) - OverlappingPairs.RemoveRange(OverlappingPairs.Count - _invalidPair, _invalidPair); - _invalidPair = 0; - - BroadphasePair previousPair = new BroadphasePair(); - previousPair.ProxyA = null; - previousPair.ProxyB = null; - previousPair.CollisionAlgorithm = null; - - List removal = new List(); - - for (int i = 0; i < OverlappingPairs.Count; i++) - { - bool isDuplicate = (OverlappingPairs[i] == previousPair); - previousPair = OverlappingPairs[i]; - bool needsRemoval; - if (!isDuplicate) - { - bool hasOverlap = TestOverlap(previousPair.ProxyA, previousPair.ProxyB); - if (hasOverlap) - { - needsRemoval = callback.ProcessOverlap(ref previousPair); - } - else - { - needsRemoval = true; - } - } - else - { - needsRemoval = true; - BulletDebug.Assert(previousPair.CollisionAlgorithm == null); - } - - if (needsRemoval) - { - removal.Add(previousPair); - } - } - - for (int i = 0; i < removal.Count; i++) - { - BroadphasePair pair = removal[i]; - CleanOverlappingPair(ref pair); - pair.ProxyA = null; - pair.ProxyB = null; - _invalidPair++; - OverlappingPairCount--; - } - } - - private bool TestOverlap(BroadphaseProxy proxyA, BroadphaseProxy proxyB) - { - if (proxyA == null || proxyB == null) - return false; - - Handle handleA = proxyA as Handle; - Handle handleB = proxyB as Handle; - - for (int axis = 0; axis < 3; axis++) - { - if (handleA.MaxEdges[axis] < handleB.MinEdges[axis] || - handleB.MaxEdges[axis] < handleA.MinEdges[axis]) - { - return false; - } - } - return true; - } - - private bool TestOverlap(int ignoreAxis, Handle pHandleA, Handle pHandleB) - { - for (int axis = 0; axis < 3; axis++) - { - if (axis != ignoreAxis) - { - if (pHandleA.MaxEdges[axis] < pHandleB.MinEdges[axis] || - pHandleB.MaxEdges[axis] < pHandleA.MinEdges[axis]) - { - return false; - } - } - } - - return true; - } - - private ushort AllocateHandle() - { - ushort handle = _firstFreeHandle; - _firstFreeHandle = GetHandle(handle).NextFree; - _numHandles++; - - return handle; - } - - private void FreeHandle(ushort handle) - { - BulletDebug.Assert(handle > 0 && handle < _maxHandles); - - GetHandle(handle).NextFree = _firstFreeHandle; - _firstFreeHandle = handle; - - _numHandles--; - } - - private Handle GetHandle(ushort handle) - { - return _handles[handle]; - } - - private void UpdateHandle(ushort handle, Vector3 aabbMin, Vector3 aabbMax) - { - Handle pHandle = GetHandle(handle); - - // quantize the new bounds - ushort[] min = new ushort[3]; - ushort[] max = new ushort[3]; - Quantize(out min, aabbMin, 0); - Quantize(out max, aabbMax, 1); - - // update changed edges - for (int axis = 0; axis < 3; axis++) - { - ushort emin = pHandle.MinEdges[axis]; - ushort emax = pHandle.MaxEdges[axis]; - - int dmin = (int)min[axis] - (int)_edges[axis][emin].Position; - int dmax = (int)max[axis] - (int)_edges[axis][emax].Position; - - _edges[axis][emin].Position = min[axis]; - _edges[axis][emax].Position = max[axis]; - - // expand (only adds overlaps) - if (dmin < 0) - SortMinDown(axis, emin, true); - - if (dmax > 0) - SortMaxUp(axis, emax, true); - - // shrink (only removes overlaps) - if (dmin > 0) - SortMinUp(axis, emin, true); - - if (dmax < 0) - SortMaxDown(axis, emax, true); - } - } - - private void Quantize(out ushort[] result, Vector3 point, int isMax) - { - Vector3 clampedPoint = new Vector3( - point.X, - point.Y, - point.Z - ); - - MathHelper.SetMax(ref clampedPoint, _worldAabbMin); - MathHelper.SetMin(ref clampedPoint, _worldAabbMax); - - Vector3 v = (clampedPoint - _worldAabbMin) * _quantize; - - result = new ushort[3]; - result[0] = (ushort)(((int)v.X & 0xfffe) | isMax); - result[1] = (ushort)(((int)v.Y & 0xfffe) | isMax); - result[2] = (ushort)(((int)v.Z & 0xfffe) | isMax); - } - - private void SortMinDown(int axis, ushort edge, bool updateOverlaps) - { - Edge pEdge = _edges[axis][edge]; - Edge pPrev = _edges[axis][edge - 1]; - Handle pHandleEdge = GetHandle(pEdge.Handle); - - while (pEdge.Position < pPrev.Position) - { - Handle pHandlePrev = GetHandle(pPrev.Handle); - - if (pPrev.IsMax()) - { - // if previous edge is a maximum check the bounds and add an overlap if necessary - if (updateOverlaps && TestOverlap(axis, pHandleEdge, pHandlePrev)) - { - AddOverlappingPair(pHandleEdge, pHandlePrev); - } - - // update edge reference in other handle - pHandlePrev.MaxEdges[axis]++; - } - else - pHandlePrev.MinEdges[axis]++; - - pHandleEdge.MinEdges[axis]--; - - // swap the edges - pEdge.Swap(ref pPrev); - - // decrement - edge--; - pEdge = _edges[axis][edge]; - pPrev = _edges[axis][edge - 1]; - } - } - - private void SortMinUp(int axis, ushort edge, bool updateOverlaps) - { - Edge pEdge = _edges[axis][edge]; - Edge pNext = _edges[axis][edge + 1]; - Handle pHandleEdge = GetHandle(pEdge.Handle); - - while ((pNext.Handle != 0) && (pEdge.Position >= pNext.Position)) - { - Handle pHandleNext = GetHandle(pNext.Handle); - - if (pNext.IsMax()) - { - // if next edge is maximum remove any overlap between the two handles - if (updateOverlaps) - { - //Handle handle0 = GetHandle(pEdge.Handle); - //Handle handle1 = GetHandle(pNext.Handle); - //BroadphasePair tmpPair = new BroadphasePair(handle0, handle1); - //RemoveOverlappingPair(tmpPair); - } - - // update edge reference in other handle - pHandleNext.MaxEdges[axis]--; - } - else - pHandleNext.MinEdges[axis]--; - - pHandleEdge.MinEdges[axis]++; - - // swap the edges - pEdge.Swap(ref pNext); - - // increment - edge++; - pEdge = _edges[axis][edge]; - pNext = _edges[axis][edge + 1]; - } - } - - private void SortMaxDown(int axis, ushort edge, bool updateOverlaps) - { - Edge pEdge = _edges[axis][edge]; - Edge pPrev = _edges[axis][edge - 1]; - Handle pHandleEdge = GetHandle(pEdge.Handle); - - while (pEdge.Position < pPrev.Position) - { - Handle pHandlePrev = GetHandle(pPrev.Handle); - - if (!pPrev.IsMax()) - { - // if previous edge was a minimum remove any overlap between the two handles - if (updateOverlaps) - { - //this is done during the overlappingpairarray iteration/narrowphase collision - //Handle handle0 = GetHandle(pEdge.Handle); - //Handle handle1 = GetHandle(pPrev.Handle); - //BroadphasePair pair = FindPair(handle0, handle1); - - //if (pair != null) - //{ - // RemoveOverlappingPair(pair); - //} - } - - // update edge reference in other handle - pHandlePrev.MinEdges[axis]++; ; - } - else - pHandlePrev.MaxEdges[axis]++; - - pHandleEdge.MaxEdges[axis]--; - - // swap the edges - pEdge.Swap(ref pPrev); - - // decrement - edge--; - pEdge = _edges[axis][edge]; - pPrev = _edges[axis][edge - 1]; - } - } - - private void SortMaxUp(int axis, ushort edge, bool updateOverlaps) - { - Edge pEdge = _edges[axis][edge]; - Edge pNext = _edges[axis][edge + 1]; - Handle pHandleEdge = GetHandle(pEdge.Handle); - - while ((pNext.Handle!=0) && (pEdge.Position >= pNext.Position)) - { - Handle pHandleNext = GetHandle(pNext.Handle); - - if (!pNext.IsMax()) - { - // if next edge is a minimum check the bounds and add an overlap if necessary - if (updateOverlaps && TestOverlap(axis, pHandleEdge, pHandleNext)) - { - Handle handle0 = GetHandle(pEdge.Handle); - Handle handle1 = GetHandle(pNext.Handle); - AddOverlappingPair(handle0, handle1); - } - - // update edge reference in other handle - pHandleNext.MinEdges[axis]--; - } - else - pHandleNext.MaxEdges[axis]--; - - pHandleEdge.MaxEdges[axis]++; - - // swap the edges - pEdge.Swap(ref pNext); - - // increment - edge++; - pEdge = _edges[axis][edge]; - pNext = _edges[axis][edge + 1]; - } - } - - #region Abstract - - public override void RefreshOverlappingPairs() - { - } - - public override BroadphaseProxy CreateProxy(Vector3 min, Vector3 max, BroadphaseNativeTypes shapeType, object userData, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask) - { - ushort handleId = AddHandle(min, max, userData, collisionFilterGroup, collisionFilterMask); - - Handle handle = GetHandle(handleId); - - return handle; - } - - public override void DestroyProxy(BroadphaseProxy proxy) - { - Handle handle = proxy as Handle; - RemoveHandle(handle.HandleID); - } - - public override void SetAabb(BroadphaseProxy proxy, Vector3 aabbMin, Vector3 aabbMax) - { - Handle handle = proxy as Handle; - UpdateHandle(handle.HandleID, aabbMin, aabbMax); - } - #endregion - } - - public class Edge - { - ushort position; - ushort handle; - - public ushort Position - { - get { return position; } - set { position = value; } - } - - public ushort Handle - { - get { return handle; } - set { handle = value; } - } - - public bool IsMax() - { - return (position & (ushort)1) == 1; - } - - public void Swap(ref Edge e) - { - ushort tmpPosition = this.position; - ushort tmpHandle = this.handle; - this.position = e.position; - this.handle = e.handle; - e.position = tmpPosition; - e.handle = tmpHandle; - } - } - - public class Handle: BroadphaseProxy - { - ushort[] minEdges, maxEdges; - ushort pad; - ushort handleID; - - public ushort[] MinEdges - { - get { return minEdges; } - set { minEdges = value; } - } - - public ushort[] MaxEdges - { - get { return maxEdges; } - set { maxEdges = value; } - } - - public ushort HandleID - { - get { return handleID; } - set { handleID = value; } - } - - public ushort Pad - { - get { return pad; } - set { pad = value; } - } - - public ushort NextFree - { - get { return minEdges[0]; } - set { minEdges[0] = value;} - } - - public Handle() - { - minEdges = new ushort[3]; - maxEdges = new ushort[3]; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphaseNativeTypes.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphaseNativeTypes.cs deleted file mode 100644 index eb1fd4b819..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphaseNativeTypes.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - /// Dispatcher uses these types - /// IMPORTANT NOTE:The types are ordered polyhedral, implicit convex and concave - /// to facilitate type checking - public enum BroadphaseNativeTypes - { - // polyhedral convex shapes - Box, - Triangle, - Tetrahedral, - ConvexTriangleMesh, - ConvexHull, - //implicit convex shapes - ImplicitConvexShapes, - Sphere, - MultiSphere, - Capsule, - Cone, - Convex, - Cylinder, - MinkowskiSum, - MinkowskiDifference, - //concave shapes - ConcaveShapesStart, - //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy! - TriangleMesh, - //used for demo integration FAST/Swift collision library and Bullet - FastConcaveMesh, - //terrain - Terrain, - //Used for GIMPACT Trimesh integration - Gimpact, - - Empty, - StaticPlane, - ConcaveShapesEnd, - - Compound, - - MaxBroadphaseCollisionTypes, - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphasePair.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphasePair.cs deleted file mode 100644 index eec77ace73..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphasePair.cs +++ /dev/null @@ -1,113 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public class BroadphasePair - { - private BroadphaseProxy _proxyA; - private BroadphaseProxy _proxyB; - - private CollisionAlgorithm _algorithm; - private object _userInfo; - - public BroadphasePair() - { - } - - public BroadphasePair(BroadphasePair other) - { - _proxyA = other._proxyA; - _proxyB = other._proxyB; - - _algorithm = other._algorithm; - _userInfo = null; - } - - public BroadphasePair(BroadphaseProxy proxyA, BroadphaseProxy proxyB) - { - _proxyA = proxyA; - _proxyB = proxyB; - - _algorithm = null; - _userInfo = null; - } - - public BroadphaseProxy ProxyA { get { return _proxyA; } set { _proxyA = value; } } - public BroadphaseProxy ProxyB { get { return _proxyB; } set { _proxyB = value; } } - - public CollisionAlgorithm CollisionAlgorithm { get { return _algorithm; } set { _algorithm = value; } } - public object UserInfo { get { return _userInfo; } set { _userInfo = value; } } - - public override int GetHashCode() - { - return _proxyA.GetHashCode() ^ _proxyB.GetHashCode(); - } - - public override bool Equals(object obj) - { - if (obj is BroadphasePair) - return this == (BroadphasePair)obj; - return false; - } - - public static int ComparisonSort(BroadphasePair a, BroadphasePair b) - { - int aAId = a.ProxyA != null ? a.ProxyA.ComparisonID : -1; - int aBId = a.ProxyB != null ? a.ProxyB.ComparisonID : -1; - int aCId = a.CollisionAlgorithm != null ? a.CollisionAlgorithm.ComparisonID : -1; - int bAId = b.ProxyA != null ? b.ProxyA.ComparisonID : -1; - int bBId = b.ProxyB != null ? b.ProxyB.ComparisonID : -1; - int bCId = b.CollisionAlgorithm != null ? b.CollisionAlgorithm.ComparisonID : -1; - - if (aAId > bAId || - (a.ProxyA == b.ProxyA && aBId > bBId) || - (a.ProxyA == b.ProxyA && a.ProxyB == b.ProxyB && aCId > bCId)) - return -1; - else - return 1; - } - - public static bool operator ==(BroadphasePair a, BroadphasePair b) - { - if (object.Equals(a, null) && object.Equals(b, null)) - return true; - if (object.Equals(a, null) || object.Equals(b, null)) - return false; - - return (a.ProxyA == b.ProxyA) && (a.ProxyB == b.ProxyB); - } - - public static bool operator !=(BroadphasePair a, BroadphasePair b) - { - if (object.Equals(a, null) && object.Equals(b, null)) - return true; - if (object.Equals(a, null) || object.Equals(b, null)) - return false; - - return (a.ProxyA != b.ProxyA) || (a.ProxyB != b.ProxyB); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphaseProxy.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphaseProxy.cs deleted file mode 100644 index 0abc613d6f..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/BroadphaseProxy.cs +++ /dev/null @@ -1,91 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public class BroadphaseProxy - { - //Usually the client CollisionObject or Rigidbody class - private object _clientObject; - private CollisionFilterGroups _collisionFilterGroup; - private CollisionFilterGroups _collisionFilterMask; - private readonly int _comparisonID; - - private static int _globalCount = 0; - - public BroadphaseProxy() - { - _comparisonID = _globalCount++; - } - - public BroadphaseProxy(object userData, CollisionFilterGroups collisionFilterGroup, CollisionFilterGroups collisionFilterMask) - : this() - { - _clientObject = userData; - _collisionFilterGroup = collisionFilterGroup; - _collisionFilterMask = collisionFilterMask; - } - - public object ClientData { get { return _clientObject; } set { _clientObject = value; } } - public CollisionFilterGroups CollisionFilterGroup { get { return _collisionFilterGroup; } set { _collisionFilterGroup = value; } } - public CollisionFilterGroups CollisionFilterMask { get { return _collisionFilterMask; } set { _collisionFilterMask = value; } } - internal int ComparisonID { get { return _comparisonID; } } - - public static bool IsPolyhedral(BroadphaseNativeTypes proxyType) - { - return (proxyType < BroadphaseNativeTypes.ImplicitConvexShapes); - } - - public static bool IsConvex(BroadphaseNativeTypes proxyType) - { - return (proxyType < BroadphaseNativeTypes.ConcaveShapesStart); - } - - public static bool IsConcave(BroadphaseNativeTypes proxyType) - { - return ((proxyType > BroadphaseNativeTypes.ConcaveShapesStart) && - (proxyType < BroadphaseNativeTypes.ConcaveShapesEnd)); - } - public static bool IsCompound(BroadphaseNativeTypes proxyType) - { - return (proxyType == BroadphaseNativeTypes.Compound); - } - public static bool IsInfinite(BroadphaseNativeTypes proxyType) - { - return (proxyType == BroadphaseNativeTypes.StaticPlane); - } - - //optional filtering to cull potential collisions - public enum CollisionFilterGroups - { - Default = 1, - Static = 2, - Kinematic = 4, - Debris = 8, - Sensor = 16, - All = Default | Static | Kinematic | Debris | Sensor, - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/CollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/CollisionAlgorithm.cs deleted file mode 100644 index 387340ddeb..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/CollisionAlgorithm.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - /// - /// CollisionAlgorithm is an collision interface that is compatible with the Broadphase and Dispatcher. - /// It is persistent over frames - /// - public abstract class CollisionAlgorithm - { - private IDispatcher _dispatcher; - private readonly int _comparisonID = 0; - - private static int _globalCount = 0; - - public CollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo) - { - _comparisonID = _globalCount++; - _dispatcher = collisionAlgorithmConstructionInfo.Dispatcher; - } - - protected IDispatcher Dispatcher { get { return _dispatcher; } set { _dispatcher = value; } } - internal int ComparisonID { get { return _comparisonID; } } - - public abstract void ProcessCollision(CollisionObject colA, CollisionObject colB, DispatcherInfo dispatchInfo, ManifoldResult resultOut); - public abstract float CalculateTimeOfImpact(CollisionObject colA, CollisionObject colB, DispatcherInfo dispatchInfo, ManifoldResult resultOut); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/CollisionAlgorithmConstructionInfo.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/CollisionAlgorithmConstructionInfo.cs deleted file mode 100644 index de238b9f0d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/CollisionAlgorithmConstructionInfo.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public struct CollisionAlgorithmConstructionInfo - { - private IDispatcher _dispatcher; - private PersistentManifold _manifold; - - public CollisionAlgorithmConstructionInfo(IDispatcher dispatcher) - { - _dispatcher = dispatcher; - _manifold = null; - } - - public IDispatcher Dispatcher { get { return _dispatcher; } set { _dispatcher = value; } } - public PersistentManifold Manifold { get { return _manifold; } set { _manifold = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/DispatcherInfo.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/DispatcherInfo.cs deleted file mode 100644 index cde3221ae3..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/DispatcherInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public enum DispatchFunction - { - Discrete = 1, - Continuous, - } - - public class DispatcherInfo - { - private float _timeStep; - private int _stepCount; - private DispatchFunction _dispatchFunc = DispatchFunction.Discrete; - private float _timeOfImpact = 1; - private bool _useContinuous; - private bool _enableSatConvex; - private bool _enableSpu; - private IDebugDraw _debugDraw; - - public float TimeStep { get { return _timeStep; } set { _timeStep = value; } } - public int StepCount { get { return _stepCount; } set { _stepCount = value; } } - public DispatchFunction DispatchFunction { get { return _dispatchFunc; } set { _dispatchFunc = value; } } - public float TimeOfImpact { get { return _timeOfImpact; } set { _timeOfImpact = value; } } - public bool UseContinuous { get { return _useContinuous; } set { _useContinuous = value; } } - public bool EnableSatConvex { get { return _enableSatConvex; } set { _enableSatConvex = value; } } - public bool enableSpu { get { return _enableSpu; } set { _enableSpu = value; } } - public IDebugDraw DebugDraw { get { return _debugDraw; } set { _debugDraw = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IBroadphase.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IBroadphase.cs deleted file mode 100644 index fddd8afb3b..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IBroadphase.cs +++ /dev/null @@ -1,36 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public interface IBroadphase - { - BroadphaseProxy CreateProxy(Vector3 min, Vector3 max, BroadphaseNativeTypes shapeType, object userData, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask); - void DestroyProxy(BroadphaseProxy proxy); - void SetAabb(BroadphaseProxy proxy, Vector3 aabbMin, Vector3 aabbMax); - void CleanProxyFromPairs(BroadphaseProxy proxy); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IDispatcher.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IDispatcher.cs deleted file mode 100644 index 7677179d04..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IDispatcher.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public interface IDispatcher - { - CollisionAlgorithm FindAlgorithm(CollisionObject bodyA, CollisionObject bodyB, PersistentManifold sharedManifold); - CollisionAlgorithm FindAlgorithm(CollisionObject bodyA, CollisionObject bodyB); - PersistentManifold GetNewManifold(object bodyA, object bodyB); - void ReleaseManifold(PersistentManifold manifold); - void ClearManifold(PersistentManifold manifold); - bool NeedsCollision(CollisionObject bodyA, CollisionObject bodyB); - bool NeedsResponse(CollisionObject bodyA, CollisionObject bodyB); - void DispatchAllCollisionPairs(OverlappingPairCache pairCache, DispatcherInfo dispatchInfo); - PersistentManifold GetManifoldByIndex(int index); - - int ManifoldCount { get; } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IOverlapCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IOverlapCallback.cs deleted file mode 100644 index 2456911762..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/IOverlapCallback.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public interface IOverlapCallback - { - //return true for deletion of the pair - bool ProcessOverlap(ref BroadphasePair pair); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/OverlappingPairCache.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/OverlappingPairCache.cs deleted file mode 100644 index 6548560209..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/OverlappingPairCache.cs +++ /dev/null @@ -1,159 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public abstract class OverlappingPairCache : IBroadphase - { - private static int _overlappingPairCount = 0; - private List _overlappingPairs = new List(); - //during the dispatch, check that user doesn't destroy/create proxy - private bool _blockedForChanges; - - public List OverlappingPairs { get { return _overlappingPairs; } set { _overlappingPairs = value; } } - public bool BlockedForChanges { get { return _blockedForChanges; } set { _blockedForChanges = value; } } - - public static int OverlappingPairCount { get { return _overlappingPairCount; } set { _overlappingPairCount = value; } } - - public void RemoveOverlappingPair(BroadphasePair pair) - { - if (!_overlappingPairs.Contains(pair)) - return; - - CleanOverlappingPair(ref pair); - _overlappingPairs.Remove(pair); - } - - public void AddOverlappingPair(BroadphaseProxy proxyA, BroadphaseProxy proxyB) - { - //don't add overlap with own - bool test = proxyA != proxyB; - BulletDebug.Assert(proxyA != proxyB); - - if (!NeedsBroadphaseCollision(proxyA, proxyB)) - return; - - BroadphasePair pair = new BroadphasePair(proxyA, proxyB); - _overlappingPairs.Add(pair); - _overlappingPairCount++; - } - - //this FindPair becomes really slow. Either sort the list to speedup the query, or - //use a different solution. It is mainly used for Removing overlapping pairs. Removal could be delayed. - //we could keep a linked list in each proxy, and store pair in one of the proxies (with lowest memory address) - //Also we can use a 2D bitmap, which can be useful for a future GPU implementation - public BroadphasePair FindPair(BroadphaseProxy proxyA, BroadphaseProxy proxyB) - { - if (!NeedsBroadphaseCollision(proxyA, proxyB)) - return null; - - BroadphasePair pair = new BroadphasePair(proxyA, proxyB); - for (int i = 0; i < _overlappingPairs.Count; i++) - { - if (_overlappingPairs[i] == pair) - { - return _overlappingPairs[i]; - } - } - - return null; - } - - public void CleanProxyFromPairs(BroadphaseProxy proxy) - { - for (int i = 0; i < _overlappingPairs.Count; i++) - { - BroadphasePair pair = _overlappingPairs[i]; - if (pair.ProxyA == proxy || - pair.ProxyB == proxy) - { - CleanOverlappingPair(ref pair); - _overlappingPairs[i] = pair; - } - } - } - - public void RemoveOverlappingPairsContainingProxy(BroadphaseProxy proxy) - { - for (int i = _overlappingPairs.Count - 1; i >= 0; i--) - { - BroadphasePair pair = _overlappingPairs[i]; - if (pair.ProxyA == proxy || - pair.ProxyB == proxy) - { - RemoveOverlappingPair(pair); - i++; - } - } - } - - public bool NeedsBroadphaseCollision(BroadphaseProxy proxy0, BroadphaseProxy proxy1) - { - bool collides = (proxy0.CollisionFilterGroup & proxy1.CollisionFilterMask) != 0; - collides = collides && ((proxy1.CollisionFilterGroup & proxy0.CollisionFilterMask) != 0); - - return collides; - } - - public virtual void ProcessAllOverlappingPairs(IOverlapCallback callback) - { - List deleting = new List(); - for (int i = 0; i < _overlappingPairs.Count; i++) - { - BroadphasePair p = _overlappingPairs[i]; - if (callback.ProcessOverlap(ref p)) - { - CleanOverlappingPair(ref p); - deleting.Add(p); - _overlappingPairCount--; - } - } - - for (int i = 0; i < deleting.Count; i++) - _overlappingPairs.Remove(deleting[i]); - } - - public void CleanOverlappingPair(ref BroadphasePair pair) - { - if (pair.CollisionAlgorithm != null) - { - if (pair.CollisionAlgorithm is IDisposable) - (pair.CollisionAlgorithm as IDisposable).Dispose(); - pair.CollisionAlgorithm = null; - } - } - - public abstract void RefreshOverlappingPairs(); - - #region IBroadphase Members - public abstract BroadphaseProxy CreateProxy(MonoXnaCompactMaths.Vector3 min, MonoXnaCompactMaths.Vector3 max, BroadphaseNativeTypes shapeType, object userData, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask); - - public abstract void DestroyProxy(BroadphaseProxy proxy); - - public abstract void SetAabb(BroadphaseProxy proxy, MonoXnaCompactMaths.Vector3 aabbMin, MonoXnaCompactMaths.Vector3 aabbMax); - - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/SimpleBroadphase.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/SimpleBroadphase.cs deleted file mode 100644 index f37b3f5f31..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/SimpleBroadphase.cs +++ /dev/null @@ -1,128 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class SimpleBroadphase : OverlappingPairCache - { - private int _maxProxies; - private List _proxies = new List(); - - public SimpleBroadphase() - : this(16384) { } - - public SimpleBroadphase(int maxProxies) - : base() - { - _maxProxies = maxProxies; - } - - public override BroadphaseProxy CreateProxy(Vector3 min, Vector3 max, BroadphaseNativeTypes shapeType, object userData, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask) - { - if (_proxies.Count >= _maxProxies) - { - BulletDebug.Assert(false); - return null; //should never happen, but don't let the game crash ;-) - } - BulletDebug.Assert(min.X <= max.X && min.Y <= max.Y && min.Z <= max.Z); - - SimpleBroadphaseProxy proxy = new SimpleBroadphaseProxy(min, max, shapeType, userData, collisionFilterGroup, collisionFilterMask); - _proxies.Add(proxy); - - return proxy; - } - - - public override void DestroyProxy(BroadphaseProxy proxy) - { - RemoveOverlappingPairsContainingProxy(proxy); - _proxies.Remove(proxy as SimpleBroadphaseProxy); - } - - public override void SetAabb(BroadphaseProxy proxy, Vector3 aabbMin, Vector3 aabbMax) - { - SimpleBroadphaseProxy simpleProxy = GetSimpleProxyFromProxy(proxy); - simpleProxy.Minimum = aabbMin; - simpleProxy.Maximum = aabbMax; - } - - private SimpleBroadphaseProxy GetSimpleProxyFromProxy(BroadphaseProxy proxy) - { - return proxy as SimpleBroadphaseProxy; - } - - public override void RefreshOverlappingPairs() - { - for (int i = 0; i < _proxies.Count; i++) - { - SimpleBroadphaseProxy proxyA = _proxies[i]; - - for (int j = i + 1; j < _proxies.Count; j++) - { - SimpleBroadphaseProxy proxyB = _proxies[j]; - - if (AabbOverlap(proxyA, proxyB)) - { - if (FindPair(proxyA, proxyB) == null) - { - AddOverlappingPair(proxyA, proxyB); - } - } - } - } - - CheckOverlapCallback check = new CheckOverlapCallback(); - ProcessAllOverlappingPairs(check); - } - - public static bool AabbOverlap(SimpleBroadphaseProxy proxyA, SimpleBroadphaseProxy proxyB) - { - return proxyA.Minimum.X <= proxyB.Maximum.X && proxyB.Minimum.X <= proxyA.Maximum.X && - proxyA.Minimum.Y <= proxyB.Maximum.Y && proxyB.Minimum.Y <= proxyA.Maximum.Y && - proxyA.Minimum.Z <= proxyB.Maximum.Z && proxyB.Minimum.Z <= proxyA.Maximum.Z; - } - - private void Validate() - { - for (int i = 0; i < _proxies.Count; i++) - { - for (int j = i + 1; j < _proxies.Count; j++) - { - if (_proxies[i] == _proxies[j]) - throw new BulletException(); - } - } - } - } - - public class CheckOverlapCallback : IOverlapCallback - { - public bool ProcessOverlap(ref BroadphasePair pair) - { - return (!SimpleBroadphase.AabbOverlap(pair.ProxyA as SimpleBroadphaseProxy, pair.ProxyB as SimpleBroadphaseProxy)); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/SimpleBroadphaseProxy.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/SimpleBroadphaseProxy.cs deleted file mode 100644 index cfc2150905..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/BroadphaseCollision/SimpleBroadphaseProxy.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class SimpleBroadphaseProxy : BroadphaseProxy - { - private Vector3 _min; - private Vector3 _max; - - public SimpleBroadphaseProxy() { } - - public SimpleBroadphaseProxy(Vector3 minPoint, Vector3 maxPoint, BroadphaseNativeTypes shapeType, object userData, CollisionFilterGroups collisionFilterGroup, CollisionFilterGroups collisionFilterMask) - : base(userData, collisionFilterGroup, collisionFilterMask) - { - _min = minPoint; - _max = maxPoint; - } - - public Vector3 Minimum { get { return _min; } set { _min = value; } } - public Vector3 Maximum { get { return _max; } set { _max = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/BridgeTriangleRaycastCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/BridgeTriangleRaycastCallback.cs deleted file mode 100644 index 6bebf932a6..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/BridgeTriangleRaycastCallback.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - internal class BridgeTriangleRaycastCallback : TriangleRaycastCallback - { - CollisionWorld.RayResultCallback _resultCallback; - CollisionObject _collisionObject; - TriangleMeshShape _triangleMesh; - - public BridgeTriangleRaycastCallback(Vector3 from, Vector3 to, - CollisionWorld.RayResultCallback resultCallback, CollisionObject collisionObject, TriangleMeshShape triangleMesh) - : base(from, to) - { - _resultCallback = resultCallback; - _collisionObject = collisionObject; - _triangleMesh = triangleMesh; - } - - public override float ReportHit(Vector3 hitNormalLocal, float hitFraction, int partId, int triangleIndex) - { - CollisionWorld.LocalShapeInfo shapeInfo = new CollisionWorld.LocalShapeInfo(); - shapeInfo.ShapePart = partId; - shapeInfo.TriangleIndex = triangleIndex; - - CollisionWorld.LocalRayResult rayResult = new CollisionWorld.LocalRayResult - (_collisionObject, - shapeInfo, - hitNormalLocal, - hitFraction); - - return _resultCallback.AddSingleResult(rayResult); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionAlgorithmCreateFunc.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionAlgorithmCreateFunc.cs deleted file mode 100644 index 3bd5601378..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionAlgorithmCreateFunc.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class CollisionAlgorithmCreateFunction - { - private bool _swapped; - - public bool IsSwapped { get { return _swapped; } set { _swapped = value; } } - - public virtual CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo ci, CollisionObject body0, CollisionObject body1) - { - return null; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionDispatcher.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionDispatcher.cs deleted file mode 100644 index 336defdcc2..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionDispatcher.cs +++ /dev/null @@ -1,280 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public delegate void NearCallback(ref BroadphasePair collisionPair, CollisionDispatcher dispatcher, DispatcherInfo dispatchInfo); - - public class CollisionDispatcher : IDispatcher - { - private List _manifolds = new List(); - - //private bool _useIslands; - private NearCallback _nearCallback; - - //private ManifoldResult _defaultManifoldResult; - - private CollisionAlgorithmCreateFunction[,] _doubleDispatch = new CollisionAlgorithmCreateFunction[(int)BroadphaseNativeTypes.MaxBroadphaseCollisionTypes, (int)BroadphaseNativeTypes.MaxBroadphaseCollisionTypes]; - - //default CreationFunctions, filling the m_doubleDispatch table - private CollisionAlgorithmCreateFunction _convexConvexCreateFunc; - private CollisionAlgorithmCreateFunction _convexConcaveCreateFunc; - private CollisionAlgorithmCreateFunction _swappedConvexConcaveCreateFunc; - private CollisionAlgorithmCreateFunction _compoundCreateFunc; - private CollisionAlgorithmCreateFunction _swappedCompoundCreateFunc; - private CollisionAlgorithmCreateFunction _emptyCreateFunc; - - private int _count; - private static int _manifoldCount = 0; - - public CollisionDispatcher() - { - NearCallback = DefaultNearCallback; - //_useIslands = true; - //default CreationFunctions, filling the m_doubleDispatch table - _convexConvexCreateFunc = new ConvexConvexAlgorithm.CreateFunc(); - _convexConcaveCreateFunc = new ConvexConcaveCollisionAlgorithm.CreateFunc(); - _swappedConvexConcaveCreateFunc = new ConvexConcaveCollisionAlgorithm.SwappedCreateFunc(); - _compoundCreateFunc = new CompoundCollisionAlgorithm.CreateFunc(); - _swappedCompoundCreateFunc = new CompoundCollisionAlgorithm.SwappedCreateFunc(); - _emptyCreateFunc = new EmptyAlgorithm.CreateFunc(); - - for (BroadphaseNativeTypes i = BroadphaseNativeTypes.Box; i < BroadphaseNativeTypes.MaxBroadphaseCollisionTypes; i++) - { - for (BroadphaseNativeTypes j = BroadphaseNativeTypes.Box; j < BroadphaseNativeTypes.MaxBroadphaseCollisionTypes; j++) - { - _doubleDispatch[(int)i, (int)j] = FindCreateFunction(i, j); - if (_doubleDispatch[(int)i, (int)j] == null) - throw new BulletException(); - } - } - } - - public int Count { get { return _count; } set { _count = value; } } - public int ManifoldCount { get { return _manifolds.Count; } } - public List Manifolds { get { return _manifolds; } } - - public static int GlobalManifoldCount { get { return _manifoldCount; } set { _manifoldCount = value; } } - - public PersistentManifold GetManifoldByIndex(int index) - { - return _manifolds[index]; - } - - //registerCollisionCreateFunc allows registration of custom/alternative collision create functions - public void RegisterCollisionCreateFunc(BroadphaseNativeTypes proxyTypeA, BroadphaseNativeTypes proxyTypeB, CollisionAlgorithmCreateFunction createFunc) - { - _doubleDispatch[(int)proxyTypeA, (int)proxyTypeB] = createFunc; - } - - public virtual PersistentManifold GetNewManifold(object bodyA, object bodyB) - { - _manifoldCount++; - - CollisionObject body0 = bodyA as CollisionObject; - CollisionObject body1 = bodyB as CollisionObject; - - PersistentManifold manifold = new PersistentManifold(body0, body1); - _manifolds.Add(manifold); - - return manifold; - } - - public virtual void ReleaseManifold(PersistentManifold manifold) - { - _manifoldCount--; - - ClearManifold(manifold); - _manifolds.Remove(manifold); - } - - - public virtual void ClearManifold(PersistentManifold manifold) - { - manifold.ClearManifold(); - } - - public CollisionAlgorithm FindAlgorithm(CollisionObject bodyA, CollisionObject bodyB) - { - return FindAlgorithm(bodyA, bodyB, null); - } - - public CollisionAlgorithm FindAlgorithm(CollisionObject bodyA, CollisionObject bodyB, PersistentManifold sharedManifold) - { - CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo = new CollisionAlgorithmConstructionInfo(); - collisionAlgorithmConstructionInfo.Dispatcher = this; - collisionAlgorithmConstructionInfo.Manifold = sharedManifold; - CollisionAlgorithm collisionAlgorithm = _doubleDispatch[(int)bodyA.CollisionShape.ShapeType, (int)bodyB.CollisionShape.ShapeType].CreateCollisionAlgorithm(collisionAlgorithmConstructionInfo, bodyA, bodyB); - return collisionAlgorithm; - } - - /*public CollisionAlgorithm internalFindAlgorithm(CollisionObject body0, CollisionObject body1) - { - return internalFindAlgorithm(body0, body1, null); - } - - public CollisionAlgorithm internalFindAlgorithm(CollisionObject body0, CollisionObject body1, PersistentManifold sharedManifold) - { - m_count++; - - CollisionAlgorithmConstructionInfo ci = new CollisionAlgorithmConstructionInfo(); - ci.m_dispatcher = this; - - if (body0.getCollisionShape().isConvex() && body1.getCollisionShape().isConvex()) - { - return new ConvexConvexAlgorithm(sharedManifold, ci, body0, body1); - } - - if (body0.getCollisionShape().isConvex() && body1.getCollisionShape().isConcave()) - { - return new ConvexConcaveCollisionAlgorithm(ci, body0, body1, false); - } - - if (body1.getCollisionShape().isConvex() && body0.getCollisionShape().isConcave()) - { - return new ConvexConcaveCollisionAlgorithm(ci, body0, body1, true); - } - - if (body0.getCollisionShape().isCompound()) - { - return new CompoundCollisionAlgorithm(ci, body0, body1, false); - } - else - { - if (body1.getCollisionShape().isCompound()) - { - return new CompoundCollisionAlgorithm(ci, body0, body1, true); - } - } - - //failed to find an algorithm - return new EmptyAlgorithm(ci); - }*/ - - public virtual bool NeedsCollision(CollisionObject bodyA, CollisionObject bodyB) - { - if (bodyA == null || bodyB == null) - throw new BulletException(); - - bool needsCollision = true; - - //broadphase filtering already deals with this - /*if ((body0.isStaticObject() || body0.isKinematicObject()) && - (body1.isStaticObject() || body1.isKinematicObject())) - { - printf("warning btCollisionDispatcher::needsCollision: static-static collision!\n"); - }*/ - - if ((!bodyA.IsActive) && (!bodyB.IsActive)) - needsCollision = false; - - return needsCollision; - } - - public virtual bool NeedsResponse(CollisionObject bodyA, CollisionObject bodyB) - { - //here you can do filtering - bool hasResponse = bodyA.HasContactResponse && bodyB.HasContactResponse; - hasResponse = hasResponse && (!bodyA.IsStaticOrKinematicObject || !bodyB.IsStaticOrKinematicObject); - return hasResponse; - } - - public virtual void DispatchAllCollisionPairs(OverlappingPairCache pairCache, DispatcherInfo dispatchInfo) - { - CollisionPairCallback collisionCallback = new CollisionPairCallback(dispatchInfo, this); - pairCache.ProcessAllOverlappingPairs(collisionCallback); - } - - private CollisionAlgorithmCreateFunction FindCreateFunction(BroadphaseNativeTypes proxyTypeA, BroadphaseNativeTypes proxyTypeB) - { - if (BroadphaseProxy.IsConvex(proxyTypeA) && BroadphaseProxy.IsConvex(proxyTypeB)) - { - return _convexConvexCreateFunc; - } - - if (BroadphaseProxy.IsConvex(proxyTypeA) && BroadphaseProxy.IsConcave(proxyTypeB)) - { - return _convexConcaveCreateFunc; - } - - if (BroadphaseProxy.IsConvex(proxyTypeB) && BroadphaseProxy.IsConcave(proxyTypeA)) - { - return _swappedConvexConcaveCreateFunc; - } - - if (BroadphaseProxy.IsCompound(proxyTypeA)) - { - return _compoundCreateFunc; - } - else - { - if (BroadphaseProxy.IsCompound(proxyTypeB)) - { - return _swappedCompoundCreateFunc; - } - } - - //failed to find an algorithm - return _emptyCreateFunc; - } - - public NearCallback NearCallback { get { return _nearCallback; } set { _nearCallback = value; } } - - //by default, Bullet will use this near callback - public static void DefaultNearCallback(ref BroadphasePair collisionPair, CollisionDispatcher dispatcher, DispatcherInfo dispatchInfo) - { - CollisionObject collisionObjectA = collisionPair.ProxyA.ClientData as CollisionObject; - CollisionObject collisionObjectB = collisionPair.ProxyB.ClientData as CollisionObject; - - if (dispatcher.NeedsCollision(collisionObjectA, collisionObjectB)) - { - //dispatcher will keep algorithms persistent in the collision pair - if (collisionPair.CollisionAlgorithm == null) - { - collisionPair.CollisionAlgorithm = dispatcher.FindAlgorithm(collisionObjectA, collisionObjectB); - } - - if (collisionPair.CollisionAlgorithm != null) - { - ManifoldResult contactPointResult = new ManifoldResult(collisionObjectA, collisionObjectB); - - if (dispatchInfo.DispatchFunction == DispatchFunction.Discrete) - { - //discrete collision detection query - collisionPair.CollisionAlgorithm.ProcessCollision(collisionObjectA, collisionObjectB, dispatchInfo, contactPointResult); - } - else - { - //continuous collision detection query, time of impact (toi) - float timeOfImpact = collisionPair.CollisionAlgorithm.CalculateTimeOfImpact(collisionObjectA, collisionObjectB, dispatchInfo, contactPointResult); - if (dispatchInfo.TimeOfImpact > timeOfImpact) - dispatchInfo.TimeOfImpact = timeOfImpact; - } - } - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionObject.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionObject.cs deleted file mode 100644 index 3eae564f0d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionObject.cs +++ /dev/null @@ -1,163 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public enum ActivationState - { - Nothing = 0, - Active, - IslandSleeping, - WantsDeactivation, - DisableDeactivation, - DisableSimulation, - } - - public enum CollisionOptions - { - StaticObject = 1, - KinematicObject = 2, - NoContactResponse = 4, - CustomMaterialCallback = 8,//this allows per-triangle material (friction/restitution) - } - - /// - /// btCollisionObject can be used to manage collision detection objects. - /// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy. - /// They can be added to the btCollisionWorld. - /// - public class CollisionObject - { - protected Matrix _worldTransform; - private BroadphaseProxy _broadphase; - private CollisionShape _collisionShape; - - //m_interpolationWorldTransform is used for CCD and interpolation - //it can be either previous or future (predicted) transform - private Matrix _interpolationWorldTransform; - - private CollisionOptions _collisionFlags; - - private int _islandTag; - private ActivationState _activationState; - private float _deactivationTime; - - private float _friction; - private float _restitution; - - //users can point to their objects, m_userPointer is not used by Bullet - private object _userData; - - //m_internalOwner one is used by optional Bullet high level interface - private object _internalOwner; - - //time of impact calculation - private float _hitFraction; - - //Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm:: - private float _ccdSweptSphereRadius; - - // Don't do continuous collision detection if square motion (in one step) is less then m_ccdSquareMotionTreshold - private float _ccdSquareMotionThreshold; - //those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities) - //without destroying the continuous interpolated motion (which uses this interpolation velocities) - private Vector3 _interpolationLinearVelocity; - private Vector3 _interpolationAngularVelocity; - - private int _companionID; - - public CollisionObject() - { - _activationState = ActivationState.Active; - _hitFraction = 1; - } - - public bool IsStaticObject { get { return (_collisionFlags & CollisionOptions.StaticObject) != 0; } } - public bool IsKinematicObject { get { return (_collisionFlags & CollisionOptions.KinematicObject) != 0; } } - public bool IsStaticOrKinematicObject { get { return (_collisionFlags & (CollisionOptions.KinematicObject | CollisionOptions.StaticObject)) != 0; } } - - public bool HasContactResponse { get { return (_collisionFlags & CollisionOptions.NoContactResponse) == 0; } } - public bool MergesSimulationIslands - { - get - { - //static objects, kinematic and object without contact response don't merge islands - return (_collisionFlags & (CollisionOptions.StaticObject | CollisionOptions.KinematicObject | CollisionOptions.NoContactResponse)) == 0; - } - } - - public ActivationState ActivationState - { - get { return _activationState; } - set - { - if ((_activationState != ActivationState.DisableDeactivation) && (_activationState != ActivationState.DisableSimulation)) - _activationState = value; - } - } - - public bool IsActive { get { return ((ActivationState != ActivationState.IslandSleeping) && (ActivationState != ActivationState.DisableSimulation)); } } - public float Restitution { get { return _restitution; } set { _restitution = value; } } - public float Friction { get { return _friction; } set { _friction = value; } } - public CollisionShape CollisionShape { get { return _collisionShape; } set { _collisionShape = value; } } - public float DeactivationTime { get { return _deactivationTime; } set { _deactivationTime = value; } } - public object Owner { get { return _internalOwner; } protected set { _internalOwner = value; } } - public Matrix WorldTransform { get { return _worldTransform; } set { _worldTransform = value; } } - public BroadphaseProxy Broadphase { get { return _broadphase; } set { _broadphase = value; } } - public Matrix InterpolationWorldTransform { get { return _interpolationWorldTransform; } set { _interpolationWorldTransform = value; } } - public Vector3 InterpolationLinearVelocity { get { return _interpolationLinearVelocity; } protected set { _interpolationLinearVelocity = value; } } - public Vector3 InterpolationAngularVelocity { get { return _interpolationAngularVelocity; } protected set { _interpolationAngularVelocity = value; } } - public int IslandTag { get { return _islandTag; } set { _islandTag = value; } } - public float HitFraction { get { return _hitFraction; } set { _hitFraction = value; } } - public CollisionOptions CollisionFlags { get { return _collisionFlags; } set { _collisionFlags = value; } } - //Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm - public float CcdSweptSphereRadius { get { return _ccdSweptSphereRadius; } set { _ccdSweptSphereRadius = value; } } - // Don't do continuous collision detection if square motion (in one step) is less then m_ccdSquareMotionThreshold - public float CcdSquareMotionThreshold { get { return _ccdSquareMotionThreshold; } set { _ccdSquareMotionThreshold = value; } } - //users can point to their objects, userPointer is not used by Bullet - public object UserData { get { return _userData; } set { _userData = value; } } - public int CompanionID { get { return _companionID; } set { _companionID = value; } } - - public void ForceActivationState(ActivationState newState) - { - _activationState = newState; - } - - public void Activate() - { - Activate(false); - } - - public void Activate(bool forceActivation) - { - if (forceActivation || (_collisionFlags & (CollisionOptions.StaticObject | CollisionOptions.KinematicObject)) == 0) - { - ActivationState = ActivationState.Active; - _deactivationTime = 0; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionPairCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionPairCallback.cs deleted file mode 100644 index 6ba1c87204..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionPairCallback.cs +++ /dev/null @@ -1,48 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class CollisionPairCallback : IOverlapCallback - { - private DispatcherInfo _dispatchInfo; - private CollisionDispatcher _dispatcher; - - public CollisionPairCallback(DispatcherInfo dispatchInfo, CollisionDispatcher dispatcher) - { - _dispatchInfo = dispatchInfo; - _dispatcher = dispatcher; - } - - #region IOverlapCallback Members - public bool ProcessOverlap(ref BroadphasePair pair) - { - _dispatcher.NearCallback(ref pair, _dispatcher, _dispatchInfo); - return false; - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionWorld.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionWorld.cs deleted file mode 100644 index cb520bb48d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CollisionWorld.cs +++ /dev/null @@ -1,358 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class CollisionWorld - { - private List _collisionObjects = new List(); - private IDispatcher _dispatcher; - private OverlappingPairCache _broadphasePairCache; - private bool _ownsDispatcher; - private bool _ownsBroadphasePairCache; - private DispatcherInfo _dispatchInfo = new DispatcherInfo(); - - /// - /// this constructor doesn't own the dispatcher and paircache/broadphase - /// - /// - /// - public CollisionWorld(IDispatcher dispatcher, OverlappingPairCache pairCache) - { - _dispatcher = dispatcher; - _broadphasePairCache = pairCache; - _ownsDispatcher = false; - _ownsBroadphasePairCache = false; - } - - public DispatcherInfo DispatchInfo { get { return _dispatchInfo; } protected set { _dispatchInfo = value; } } - public List CollisionObjects { get { return _collisionObjects; } protected set { _collisionObjects = value; } } - public IBroadphase Broadphase { get { return _broadphasePairCache; } } - public OverlappingPairCache BroadphasePairCache { get { return _broadphasePairCache; } protected set { _broadphasePairCache = value; } } - public IDispatcher Dispatcher { get { return _dispatcher; } protected set { _dispatcher = value; } } - public int CollisionObjectsCount { get { return _collisionObjects.Count; } } - protected bool OwnsDispatcher { get { return _ownsDispatcher; } set { _ownsDispatcher = value; } } - protected bool OwnsBroadphasePairCache { get { return _ownsBroadphasePairCache; } set { _ownsBroadphasePairCache = value; } } - - // rayTest performs a raycast on all objects in the btCollisionWorld, and calls the resultCallback - // This allows for several queries: first hit, all hits, any hit, dependent on the value returned by the callback. - public void RayTest(Vector3 rayFromWorld, Vector3 rayToWorld, RayResultCallback resultCallback) - { - Matrix rayFromTrans, rayToTrans; - - rayFromTrans = Matrix.Identity; - rayFromTrans.Translation = rayFromWorld; - - rayToTrans = Matrix.Identity; - rayToTrans.Translation = rayToWorld; - - // brute force go over all objects. Once there is a broadphase, use that, or - // add a raycast against aabb first. - - foreach (CollisionObject collisionObject in _collisionObjects) - { - //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject(); - Vector3 collisionObjectAabbMin, collisionObjectAabbMax; - collisionObject.CollisionShape.GetAabb(collisionObject.WorldTransform, out collisionObjectAabbMin, out collisionObjectAabbMax); - - float hitLambda = 1f; //could use resultCallback.m_closestHitFraction, but needs testing - Vector3 hitNormal = new Vector3(); - - //if (MathHelper.TestAabbAgainstAabb2(rayAabbMin, rayAabbMax, collisionObjectAabbMin, collisionObjectAabbMax)) - if (MathHelper.RayAabb(rayFromWorld, rayToWorld, collisionObjectAabbMin, collisionObjectAabbMax, hitLambda, hitNormal)) - { - RayTestSingle(rayFromTrans, rayToTrans, - collisionObject, collisionObject.CollisionShape, - collisionObject.WorldTransform, resultCallback); - - } - } - } - - // rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest. - // In a future implementation, we consider moving the ray test as a virtual method in CollisionShape. - // This allows more customization. - public static void RayTestSingle(Matrix rayFromTrans, Matrix rayToTrans, - CollisionObject collisionObject, - CollisionShape collisionShape, - Matrix colObjWorldTransform, - RayResultCallback resultCallback) - { - SphereShape pointShape=new SphereShape(0.0f); - - if (collisionShape.IsConvex) - { - CastResult castResult = new CastResult(); - castResult.Fraction = 1f;//?? - - ConvexShape convexShape = collisionShape as ConvexShape; - VoronoiSimplexSolver simplexSolver = new VoronoiSimplexSolver(); - SubsimplexConvexCast convexCaster = new SubsimplexConvexCast(pointShape, convexShape, simplexSolver); - //GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver); - //ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0); - - if (convexCaster.CalcTimeOfImpact(rayFromTrans, rayToTrans, colObjWorldTransform, colObjWorldTransform, castResult)) - { - //add hit - if (castResult.Normal.LengthSquared() > 0.0001f) - { - castResult.Normal.Normalize(); - if (castResult.Fraction < resultCallback.ClosestHitFraction) - { - - CollisionWorld.LocalRayResult localRayResult = new LocalRayResult - ( - collisionObject, - new LocalShapeInfo(), - castResult.Normal, - castResult.Fraction - ); - - resultCallback.AddSingleResult(localRayResult); - } - } - } - else - { - if (collisionShape.IsConcave) - { - - TriangleMeshShape triangleMesh = collisionShape as TriangleMeshShape; - - Matrix worldTocollisionObject = MathHelper.InvertMatrix(colObjWorldTransform); - - Vector3 rayFromLocal = Vector3.TransformNormal(rayFromTrans.Translation, worldTocollisionObject); - Vector3 rayToLocal = Vector3.TransformNormal(rayToTrans.Translation, worldTocollisionObject); - - BridgeTriangleRaycastCallback rcb = new BridgeTriangleRaycastCallback(rayFromLocal, rayToLocal, resultCallback, collisionObject, triangleMesh); - rcb.HitFraction = resultCallback.ClosestHitFraction; - - Vector3 rayAabbMinLocal = rayFromLocal; - MathHelper.SetMin(ref rayAabbMinLocal, rayToLocal); - Vector3 rayAabbMaxLocal = rayFromLocal; - MathHelper.SetMax(ref rayAabbMaxLocal, rayToLocal); - - triangleMesh.ProcessAllTriangles(rcb, rayAabbMinLocal, rayAabbMaxLocal); - } - else - { - //todo: use AABB tree or other BVH acceleration structure! - if (collisionShape.IsCompound) - { - CompoundShape compoundShape = collisionShape as CompoundShape; - for (int i = 0; i < compoundShape.ChildShapeCount; i++) - { - Matrix childTrans = compoundShape.GetChildTransform(i); - CollisionShape childCollisionShape = compoundShape.GetChildShape(i); - Matrix childWorldTrans = colObjWorldTransform * childTrans; - RayTestSingle(rayFromTrans, rayToTrans, - collisionObject, - childCollisionShape, - childWorldTrans, - resultCallback); - } - } - } - } - } - } - - public void AddCollisionObject(CollisionObject collisionObject, BroadphaseProxy.CollisionFilterGroups collisionFilterGroup, BroadphaseProxy.CollisionFilterGroups collisionFilterMask) - { - //check that the object isn't already added - if (!_collisionObjects.Contains(collisionObject)) - { - _collisionObjects.Add(collisionObject); - - //calculate new AABB - Matrix trans = collisionObject.WorldTransform; - - Vector3 minAabb; - Vector3 maxAabb; - collisionObject.CollisionShape.GetAabb(trans, out minAabb, out maxAabb); - - BroadphaseNativeTypes type = collisionObject.CollisionShape.ShapeType; - collisionObject.Broadphase = Broadphase.CreateProxy( - minAabb, - maxAabb, - type, - collisionObject, - collisionFilterGroup, - collisionFilterMask - ); - } - } - - public void AddCollisionObject(CollisionObject collisionObject) - { - AddCollisionObject(collisionObject, BroadphaseProxy.CollisionFilterGroups.Default, BroadphaseProxy.CollisionFilterGroups.Default); - } - - public void RemoveCollisionObject(CollisionObject collisionObject) - { - BroadphaseProxy bp = collisionObject.Broadphase; - if (bp != null) - { - // - // only clear the cached algorithms - // - Broadphase.CleanProxyFromPairs(bp); - Broadphase.DestroyProxy(bp); - collisionObject.Broadphase = null; - } - - _collisionObjects.Remove(collisionObject); - } - - public virtual void PerformDiscreteCollisionDetection() - { - DispatcherInfo dispatchInfo = DispatchInfo; - //update aabb (of all moved objects) - - Vector3 aabbMin, aabbMax; - for (int i = 0; i < _collisionObjects.Count; i++) - { - _collisionObjects[i].CollisionShape.GetAabb(_collisionObjects[i].WorldTransform, out aabbMin, out aabbMax); - _broadphasePairCache.SetAabb(_collisionObjects[i].Broadphase, aabbMin, aabbMax); - } - - _broadphasePairCache.RefreshOverlappingPairs(); - - IDispatcher dispatcher = Dispatcher; - if (dispatcher != null) - dispatcher.DispatchAllCollisionPairs(_broadphasePairCache, dispatchInfo); - } - - public void Dispose(bool disposing) - { - if (disposing) - { - //clean up remaining objects - foreach (CollisionObject collisionObject in _collisionObjects) - { - BroadphaseProxy bp = collisionObject.Broadphase; - if (bp != null) - { - // - // only clear the cached algorithms - // - Broadphase.CleanProxyFromPairs(bp); - Broadphase.DestroyProxy(bp); - } - } - } - } - - /// - /// LocalShapeInfo gives extra information for complex shapes - /// Currently, only TriangleMeshShape is available, so it just contains triangleIndex and subpart - /// - public struct LocalShapeInfo - { - private int _shapePart; - private int _triangleIndex; - - public int ShapePart { get { return _shapePart; } set { _shapePart = value; } } - public int TriangleIndex { get { return _triangleIndex; } set { _triangleIndex = value; } } - } - - public struct LocalRayResult - { - private CollisionObject _collisionObject; - private LocalShapeInfo _localShapeInfo; - private Vector3 _hitNormalLocal; - private float _hitFraction; - - public LocalRayResult(CollisionObject collisionObject, - LocalShapeInfo localShapeInfo, - Vector3 hitNormalLocal, - float hitFraction) - { - _collisionObject = collisionObject; - _localShapeInfo = localShapeInfo; - _hitNormalLocal = hitNormalLocal; - _hitFraction = hitFraction; - } - - public CollisionObject CollisionObject { get { return _collisionObject; } set { _collisionObject = value; } } - public LocalShapeInfo LocalShapeInfo { get { return _localShapeInfo; } set { _localShapeInfo = value; } } - public Vector3 HitNormalLocal { get { return _hitNormalLocal; } set { _hitNormalLocal = value; } } - public float HitFraction { get { return _hitFraction; } set { _hitFraction = value; } } - } - - /// - /// RayResultCallback is used to report new raycast results - /// - public abstract class RayResultCallback - { - private float _closestHitFraction; - - public RayResultCallback() - { - _closestHitFraction = 1; - } - - public float ClosestHitFraction { get { return _closestHitFraction; } set { _closestHitFraction = value; } } - public bool HasHit { get { return _closestHitFraction < 1; } } - - public abstract float AddSingleResult(LocalRayResult rayResult); - } - - public class ClosestRayResultCallback : RayResultCallback - { - private Vector3 _rayFromWorld;//used to calculate hitPointWorld from hitFraction - private Vector3 _rayToWorld; - - private Vector3 _hitNormalWorld; - private Vector3 _hitPointWorld; - private CollisionObject _collisionObject; - - public ClosestRayResultCallback(Vector3 rayFromWorld, Vector3 rayToWorld) - { - _rayFromWorld = rayFromWorld; - _rayToWorld = rayToWorld; - _collisionObject = null; - } - - public Vector3 RayFromWorld { get { return _rayFromWorld; } set { _rayFromWorld = value; } } - public Vector3 RayToWorld { get { return _rayToWorld; } set { _rayToWorld = value; } } - public Vector3 HitNormalWorld { get { return _hitNormalWorld; } set { _hitNormalWorld = value; } } - public Vector3 HitPointWorld { get { return _hitPointWorld; } set { _hitPointWorld = value; } } - public CollisionObject CollisionObject { get { return _collisionObject; } set { _collisionObject = value; } } - - public override float AddSingleResult(LocalRayResult rayResult) - { - //caller already does the filter on the m_closestHitFraction - //assert(rayResult.m_hitFraction <= m_closestHitFraction); - ClosestHitFraction = rayResult.HitFraction; - _collisionObject = rayResult.CollisionObject; - _hitNormalWorld = Vector3.TransformNormal(rayResult.HitNormalLocal, _collisionObject.WorldTransform); - MathHelper.SetInterpolate3(_rayFromWorld, _rayToWorld, rayResult.HitFraction, ref _hitPointWorld); - return rayResult.HitFraction; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CompoundCollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CompoundCollisionAlgorithm.cs deleted file mode 100644 index 6f2278aae3..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/CompoundCollisionAlgorithm.cs +++ /dev/null @@ -1,157 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class CompoundCollisionAlgorithm : CollisionAlgorithm - { - private List _childCollisionAlgorithms; - private bool _isSwapped; - - public CompoundCollisionAlgorithm( - CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, - CollisionObject bodyA, - CollisionObject bodyB, bool isSwapped) - : base(collisionAlgorithmConstructionInfo) - { - //Begin - _isSwapped = isSwapped; - - CollisionObject collisionObject = isSwapped ? bodyB : bodyA; - CollisionObject otherObject = isSwapped ? bodyA : bodyB; - - BulletDebug.Assert(collisionObject.CollisionShape.IsCompound); - - CompoundShape compoundShape = collisionObject.CollisionShape as CompoundShape; - int childrenNumber = compoundShape.ChildShapeCount; - int index = 0; - - _childCollisionAlgorithms = new List(childrenNumber); - - for (index = 0; index < childrenNumber; index++) - { - CollisionShape childShape = compoundShape.GetChildShape(index); - CollisionShape orgShape = collisionObject.CollisionShape; - - collisionObject.CollisionShape = childShape; - _childCollisionAlgorithms[index] = collisionAlgorithmConstructionInfo.Dispatcher.FindAlgorithm(collisionObject, otherObject); - collisionObject.CollisionShape = orgShape; - } - } - - public override void ProcessCollision( - CollisionObject bodyA, - CollisionObject bodyB, - DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - //Begin - - CollisionObject collisionObject = _isSwapped ? bodyB : bodyB; - CollisionObject otherObject = _isSwapped ? bodyA : bodyB; - - //Debug.Assert(collisionObject.getCollisionShape().isCompound()); - BulletDebug.Assert(collisionObject.CollisionShape.IsCompound); - - CompoundShape compoundShape = (CompoundShape)collisionObject.CollisionShape; - - int childrenNumber = _childCollisionAlgorithms.Count; - - for (int i = 0; i < childrenNumber; i++) - { - CompoundShape childShape = compoundShape.GetChildShape(i) as CompoundShape; - - Matrix orgTransform = collisionObject.WorldTransform; - CollisionShape orgShape = collisionObject.CollisionShape; - - Matrix childTransform = compoundShape.GetChildTransform(i); - Matrix newChildWorld = orgTransform * childTransform; - - collisionObject.WorldTransform = newChildWorld; - collisionObject.CollisionShape = childShape; - _childCollisionAlgorithms[i].ProcessCollision(collisionObject, otherObject, dispatchInfo, resultOut); - - collisionObject.CollisionShape = orgShape; - collisionObject.WorldTransform = orgTransform; - } - } - - public override float CalculateTimeOfImpact(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - CollisionObject collisionObject = _isSwapped ? bodyB : bodyA; - CollisionObject otherObject = _isSwapped ? bodyA : bodyB; - - BulletDebug.Assert(collisionObject.CollisionShape.IsCompound); - - CompoundShape compoundShape = (CompoundShape)collisionObject.CollisionShape; - - float hitFraction = 1.0f; - - for (int i = 0; i < _childCollisionAlgorithms.Count; i++) - { - CollisionShape childShape = compoundShape.GetChildShape(i); - - Matrix orgTransform = collisionObject.WorldTransform; - CollisionShape orgShape = collisionObject.CollisionShape; - - Matrix childTransform = compoundShape.GetChildTransform(i); - Matrix newChildWorld = orgTransform * childTransform; - collisionObject.WorldTransform = newChildWorld; - - collisionObject.CollisionShape = childShape; - float frac = _childCollisionAlgorithms[i].CalculateTimeOfImpact( - collisionObject, otherObject, dispatchInfo, resultOut - ); - - if (frac < hitFraction) - { - hitFraction = frac; - } - - collisionObject.CollisionShape = orgShape; - collisionObject.WorldTransform = orgTransform; - } - - return hitFraction; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new CompoundCollisionAlgorithm(collisionAlgorithmConstructionInfo, bodyA, bodyB, false); - } - }; - - public class SwappedCreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new CompoundCollisionAlgorithm(collisionAlgorithmConstructionInfo, bodyA, bodyB, true); - } - }; - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cs deleted file mode 100644 index 39438e4ebc..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cs +++ /dev/null @@ -1,189 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class ConvexConcaveCollisionAlgorithm : CollisionAlgorithm - { - private bool _isSwapped; - private ConvexTriangleCallback _convexTriangleCallback; - - public ConvexConcaveCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB, bool isSwapped) - : base(collisionAlgorithmConstructionInfo) - { - _isSwapped = isSwapped; - _convexTriangleCallback = new ConvexTriangleCallback(collisionAlgorithmConstructionInfo.Dispatcher, bodyA, bodyB, isSwapped); - } - - public void ClearCache() - { - _convexTriangleCallback.ClearCache(); - } - - public override void ProcessCollision(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - CollisionObject convexBody = _isSwapped ? bodyB : bodyA; - CollisionObject triBody = _isSwapped ? bodyA : bodyB; - - if (triBody.CollisionShape.IsConcave) - { - CollisionObject triOb = triBody; - ConcaveShape concaveShape = triOb.CollisionShape as ConcaveShape; - - if (convexBody.CollisionShape.IsConvex) - { - float collisionMarginTriangle = concaveShape.Margin; - - resultOut.SetPersistentManifold(_convexTriangleCallback.Manifold); - _convexTriangleCallback.SetTimeStepAndCounters(collisionMarginTriangle, dispatchInfo, resultOut); - - //Disable persistency. previously, some older algorithm calculated all contacts in one go, so you can clear it here. - //m_dispatcher->clearManifold(m_btConvexTriangleCallback.m_manifoldPtr); - - _convexTriangleCallback.Manifold.SetBodies(convexBody, triBody); - concaveShape.ProcessAllTriangles(_convexTriangleCallback, _convexTriangleCallback.AabbMin, _convexTriangleCallback.AabbMax); - } - } - } - - public override float CalculateTimeOfImpact(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - CollisionObject convexbody = _isSwapped ? bodyB : bodyA; - CollisionObject triBody = _isSwapped ? bodyA : bodyB; - - - //quick approximation using raycast, todo: hook up to the continuous collision detection (one of the btConvexCast) - - //only perform CCD above a certain threshold, this prevents blocking on the long run - //because object in a blocked ccd state (hitfraction<1) get their linear velocity halved each frame... - float squareMot0 = (convexbody.InterpolationWorldTransform.Translation - convexbody.WorldTransform.Translation).LengthSquared(); - if (squareMot0 < convexbody.CcdSquareMotionThreshold) - { - return 1; - } - - Matrix triInv = MathHelper.InvertMatrix(triBody.WorldTransform); - Matrix convexFromLocal = triInv * convexbody.WorldTransform; - Matrix convexToLocal = triInv * convexbody.InterpolationWorldTransform; - - if (triBody.CollisionShape.IsConcave) - { - Vector3 rayAabbMin = convexFromLocal.Translation; - MathHelper.SetMin(ref rayAabbMin, convexToLocal.Translation); - Vector3 rayAabbMax = convexFromLocal.Translation; - MathHelper.SetMax(ref rayAabbMax, convexToLocal.Translation); - float ccdRadius0 = convexbody.CcdSweptSphereRadius; - rayAabbMin -= new Vector3(ccdRadius0, ccdRadius0, ccdRadius0); - rayAabbMax += new Vector3(ccdRadius0, ccdRadius0, ccdRadius0); - - float curHitFraction = 1f; //is this available? - LocalTriangleSphereCastCallback raycastCallback = new LocalTriangleSphereCastCallback(convexFromLocal, convexToLocal, - convexbody.CcdSweptSphereRadius, curHitFraction); - - raycastCallback.HitFraction = convexbody.HitFraction; - - CollisionObject concavebody = triBody; - - ConcaveShape triangleMesh = concavebody.CollisionShape as ConcaveShape; - - if (triangleMesh != null) - { - triangleMesh.ProcessAllTriangles(raycastCallback, rayAabbMin, rayAabbMax); - } - - if (raycastCallback.HitFraction < convexbody.HitFraction) - { - convexbody.HitFraction = raycastCallback.HitFraction; - return raycastCallback.HitFraction; - } - } - - return 1; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new ConvexConcaveCollisionAlgorithm(collisionAlgorithmConstructionInfo, bodyA, bodyB, false); - } - } - - public class SwappedCreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new ConvexConcaveCollisionAlgorithm(collisionAlgorithmConstructionInfo, bodyA, bodyB, true); - } - } - - private class LocalTriangleSphereCastCallback : ITriangleCallback - { - private Matrix _ccdSphereFromTrans; - private Matrix _ccdSphereToTrans; - private Matrix _meshTransform; - - private float _ccdSphereRadius; - private float _hitFraction; - - public LocalTriangleSphereCastCallback(Matrix from, Matrix to, float ccdSphereRadius, float hitFraction) - { - _ccdSphereFromTrans = from; - _ccdSphereToTrans = to; - _ccdSphereRadius = ccdSphereRadius; - _hitFraction = hitFraction; - } - - public Matrix CcdSphereFromTrans { get { return _ccdSphereFromTrans; } set { _ccdSphereFromTrans = value; } } - public Matrix CcdSphereToTrans { get { return _ccdSphereToTrans; } set { _ccdSphereToTrans = value; } } - public Matrix MeshTransform { get { return _meshTransform; } set { _meshTransform = value; } } - public float CcdSphereRadius { get { return _ccdSphereRadius; } set { _ccdSphereRadius = value; } } - public float HitFraction { get { return _hitFraction; } set { _hitFraction = value; } } - - public void ProcessTriangle(Vector3[] triangle, int partId, int triangleIndex) - { - //do a swept sphere for now - Matrix ident = Matrix.Identity; - CastResult castResult = new CastResult(); - castResult.Fraction = _hitFraction; - SphereShape pointShape = new SphereShape(_ccdSphereRadius); - TriangleShape triShape = new TriangleShape(triangle[0], triangle[1], triangle[2]); - VoronoiSimplexSolver simplexSolver = new VoronoiSimplexSolver(); - SubsimplexConvexCast convexCaster = new SubsimplexConvexCast(pointShape, triShape, simplexSolver); - //GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver); - //ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0); - //local space? - - if (convexCaster.CalcTimeOfImpact(_ccdSphereFromTrans, _ccdSphereToTrans, - ident, ident, castResult)) - { - if (_hitFraction > castResult.Fraction) - _hitFraction = castResult.Fraction; - } - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexConvexCollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexConvexCollisionAlgorithm.cs deleted file mode 100644 index 01c8fe025d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexConvexCollisionAlgorithm.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public class ConvexConvexAlgorithm : CollisionAlgorithm, IDisposable - { - private const bool DisableCcd = false; - private GjkPairDetector _gjkPairDetector; - private bool _ownManifold; - private PersistentManifold _manifold; - private bool _lowLevelOfDetail; - - public ConvexConvexAlgorithm(PersistentManifold manifold, CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB, ISimplexSolver simplexSolver, IConvexPenetrationDepthSolver penetrationDepthSolver) - : base(collisionAlgorithmConstructionInfo) - { - _gjkPairDetector = new GjkPairDetector(null, null, simplexSolver, penetrationDepthSolver); - _ownManifold = false; - _manifold = manifold; - _lowLevelOfDetail = false; - } - - public bool LowLevelOfDetail { get { return _lowLevelOfDetail; } set { _lowLevelOfDetail = value; } } - public bool OwnManifold { get { return _ownManifold; } set { _ownManifold = value; } } - public PersistentManifold Manifold { get { return _manifold; } set { _manifold = value; } } - - public override void ProcessCollision(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - if (_manifold == null) - { - //swapped? - _manifold = Dispatcher.GetNewManifold(bodyA, bodyB); - _ownManifold = true; - } - resultOut.SetPersistentManifold(_manifold); - - ConvexShape min0 = bodyA.CollisionShape as ConvexShape; - ConvexShape min1 = bodyB.CollisionShape as ConvexShape; - - GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - - //TODO: if (dispatchInfo.m_useContinuous) - _gjkPairDetector.setMinkowskiA(min0); - _gjkPairDetector.setMinkowskiB(min1); - input.MaximumDistanceSquared = min0.Margin + min1.Margin + PersistentManifold.ContactBreakingThreshold; - input.MaximumDistanceSquared *= input.MaximumDistanceSquared; - - // input.m_maximumDistanceSquared = 1e30f; - - input.TransformA = bodyA.WorldTransform; - input.TransformB = bodyB.WorldTransform; - - _gjkPairDetector.GetClosestPoints(input, resultOut, dispatchInfo.DebugDraw); - } - - public override float CalculateTimeOfImpact(CollisionObject colA, CollisionObject colB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - //Rather then checking ALL pairs, only calculate TOI when motion exceeds threshold - - //Linear motion for one of objects needs to exceed m_ccdSquareMotionThreshold - //col0->m_worldTransform, - float resultFraction = 1f; - - float squareMotA = (colA.InterpolationWorldTransform.Translation - colA.WorldTransform.Translation).LengthSquared(); - float squareMotB = (colB.InterpolationWorldTransform.Translation - colB.WorldTransform.Translation).LengthSquared(); - - if (squareMotA < colA.CcdSquareMotionThreshold && - squareMotB < colB.CcdSquareMotionThreshold) - return resultFraction; - - if (DisableCcd) - return 1f; - - //An adhoc way of testing the Continuous Collision Detection algorithms - //One object is approximated as a sphere, to simplify things - //Starting in penetration should report no time of impact - //For proper CCD, better accuracy and handling of 'allowed' penetration should be added - //also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies) - - // Convex0 against sphere for Convex1 - { - ConvexShape convexA = colA.CollisionShape as ConvexShape; - - SphereShape sphereB = new SphereShape(colB.CcdSweptSphereRadius); //todo: allow non-zero sphere sizes, for better approximation - CastResult result = new CastResult(); - VoronoiSimplexSolver voronoiSimplex = new VoronoiSimplexSolver(); - //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex); - //Simplification, one object is simplified as a sphere - GjkConvexCast ccdB = new GjkConvexCast(convexA, sphereB, voronoiSimplex); - //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0); - if (ccdB.CalcTimeOfImpact(colA.WorldTransform, colA.InterpolationWorldTransform, - colB.WorldTransform, colB.InterpolationWorldTransform, result)) - { - //store result.m_fraction in both bodies - if (colA.HitFraction > result.Fraction) - colA.HitFraction = result.Fraction; - - if (colB.HitFraction > result.Fraction) - colB.HitFraction = result.Fraction; - - if (resultFraction > result.Fraction) - resultFraction = result.Fraction; - } - } - - // Sphere (for convex0) against Convex1 - { - ConvexShape convexB = colB.CollisionShape as ConvexShape; - - SphereShape sphereA = new SphereShape(colA.CcdSweptSphereRadius); //todo: allow non-zero sphere sizes, for better approximation - CastResult result = new CastResult(); - VoronoiSimplexSolver voronoiSimplex = new VoronoiSimplexSolver(); - //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex); - ///Simplification, one object is simplified as a sphere - GjkConvexCast ccdB = new GjkConvexCast(sphereA, convexB, voronoiSimplex); - //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0); - if (ccdB.CalcTimeOfImpact(colA.WorldTransform, colA.InterpolationWorldTransform, - colB.WorldTransform, colB.InterpolationWorldTransform, result)) - { - //store result.m_fraction in both bodies - if (colA.HitFraction > result.Fraction) - colA.HitFraction = result.Fraction; - - if (colB.HitFraction > result.Fraction) - colB.HitFraction = result.Fraction; - - if (resultFraction > result.Fraction) - resultFraction = result.Fraction; - } - } - return resultFraction; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - private IConvexPenetrationDepthSolver _penetrationDepthSolver; - private ISimplexSolver _simplexSolver; - //private bool _ownsSolvers; - - public CreateFunc() - { - //_ownsSolvers = true; - _simplexSolver = new VoronoiSimplexSolver(); - _penetrationDepthSolver = new GjkEpaPenetrationDepthSolver(); - } - - public CreateFunc(ISimplexSolver simplexSolver, IConvexPenetrationDepthSolver penetrationDepthSolver) - { - //_ownsSolvers = false; - _simplexSolver = simplexSolver; - _penetrationDepthSolver = penetrationDepthSolver; - } - - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new ConvexConvexAlgorithm(collisionAlgorithmConstructionInfo.Manifold, collisionAlgorithmConstructionInfo, bodyA, bodyB, _simplexSolver, _penetrationDepthSolver); - } - } - - #region IDisposable Members - public void Dispose() - { - if (_ownManifold) - { - if (_manifold != null) - Dispatcher.ReleaseManifold(_manifold); - } - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexTriangleCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexTriangleCallback.cs deleted file mode 100644 index ba21c72062..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ConvexTriangleCallback.cs +++ /dev/null @@ -1,130 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class ConvexTriangleCallback : ITriangleCallback, IDisposable - { - private CollisionObject _convexBody; - private CollisionObject _triBody; - - private Vector3 _aabbMin; - private Vector3 _aabbMax; - - private ManifoldResult _resultOut; - - private IDispatcher _dispatcher; - private DispatcherInfo _dispatchInfo; - private float _collisionMarginTriangle; - - private int _triangleCount; - - private PersistentManifold _manifold; - - public ConvexTriangleCallback(IDispatcher dispatcher, CollisionObject bodyA, CollisionObject bodyB, bool isSwapped) - { - _dispatcher = dispatcher; - _dispatchInfo = null; - _convexBody = isSwapped ? bodyB : bodyA; - _triBody = isSwapped ? bodyA : bodyB; - - // create the manifold from the dispatcher 'manifold pool' - _manifold = _dispatcher.GetNewManifold(_convexBody, _triBody); - ClearCache(); - } - - public Vector3 AabbMin { get { return _aabbMin; } } - public Vector3 AabbMax { get { return _aabbMax; } } - public int TriangleCount { get { return _triangleCount; } set { _triangleCount = value; } } - public PersistentManifold Manifold { get { return _manifold; } set { _manifold = value; } } - - public void SetTimeStepAndCounters(float collisionMarginTriangle, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - _dispatchInfo = dispatchInfo; - _collisionMarginTriangle = collisionMarginTriangle; - _resultOut = resultOut; - - //recalc aabbs - Matrix convexInTriangleSpace = MathHelper.InvertMatrix(_triBody.WorldTransform) * _convexBody.WorldTransform; - CollisionShape convexShape = _convexBody.CollisionShape; - //CollisionShape* triangleShape = static_cast(triBody->m_collisionShape); - convexShape.GetAabb(convexInTriangleSpace, out _aabbMin, out _aabbMax); - float extraMargin = collisionMarginTriangle; - Vector3 extra = new Vector3(extraMargin, extraMargin, extraMargin); - - _aabbMax += extra; - _aabbMin -= extra; - } - - public void ClearCache() - { - _dispatcher.ClearManifold(_manifold); - } - - #region ITriangleCallback Members - public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex) - { - //aabb filter is already applied! - CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo = new CollisionAlgorithmConstructionInfo(); - collisionAlgorithmConstructionInfo.Dispatcher = _dispatcher; - - CollisionObject collisionObject = _triBody; - - //debug drawing of the overlapping triangles - /*if (m_dispatchInfoPtr && m_dispatchInfoPtr.m_debugDraw && m_dispatchInfoPtr->m_debugDraw->getDebugMode() > 0) - { - Vector3 color = new Vector3(255, 255, 0); - btTransform & tr = ob->WorldTransform; - m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]), tr(triangle[1]), color); - m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]), tr(triangle[2]), color); - m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]), tr(triangle[0]), color); - }*/ - - if (_convexBody.CollisionShape.IsConvex) - { - TriangleShape triangleShape = new TriangleShape(triangle[0], triangle[1], triangle[2]); - triangleShape.Margin=_collisionMarginTriangle; - - CollisionShape tempShape = collisionObject.CollisionShape; - collisionObject.CollisionShape = triangleShape; - - CollisionAlgorithm collisionAlgorithm = collisionAlgorithmConstructionInfo.Dispatcher.FindAlgorithm(_convexBody, _triBody, _manifold); - - _resultOut.SetShapeIdentifiers(-1, -1, partID, triangleIndex); - collisionAlgorithm.ProcessCollision(_convexBody, _triBody, _dispatchInfo, _resultOut); - collisionObject.CollisionShape = tempShape; - } - } - #endregion - #region IDisposable Members - public void Dispose() - { - ClearCache(); - _dispatcher.ReleaseManifold(_manifold); - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/EmptyAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/EmptyAlgorithm.cs deleted file mode 100644 index 5995e2cc59..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/EmptyAlgorithm.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - /// - /// EmptyAlgorithm is a stub for unsupported collision pairs. - /// The dispatcher can dispatch a persistent btEmptyAlgorithm to avoid a search every frame. - /// - public class EmptyAlgorithm : CollisionAlgorithm - { - public EmptyAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo) - : base(collisionAlgorithmConstructionInfo) { } - - public override void ProcessCollision(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) { } - - public override float CalculateTimeOfImpact(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - return 1f; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new EmptyAlgorithm(collisionAlgorithmConstructionInfo); - } - }; - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ManifoldResult.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ManifoldResult.cs deleted file mode 100644 index 69143a12c3..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/ManifoldResult.cs +++ /dev/null @@ -1,147 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public delegate bool ContactAddedCallback(ManifoldPoint contactPoint, CollisionObject collisionObjectA, int partIdA, int indexA, CollisionObject collisionObjectB, int partIdB, int indexB); - - public class ManifoldResult : DiscreteCollisionDetectorInterface.Result - { - private PersistentManifold _manifold; - private static ContactAddedCallback _contactAddedCallback = null; - - //we need this for compounds - private Matrix _rootTransA; - private Matrix _rootTransB; - - private CollisionObject _bodyA; - private CollisionObject _bodyB; - private int _partIdA; - private int _partIdB; - private int _indexA; - private int _indexB; - - public ManifoldResult() - { - } - - public ManifoldResult(CollisionObject bodyA, CollisionObject bodyB) - { - _bodyA = bodyA; - _bodyB = bodyB; - _rootTransA = bodyA.WorldTransform; - _rootTransB = bodyB.WorldTransform; - } - - public static ContactAddedCallback ContactAddedCallback { get { return _contactAddedCallback; } set { _contactAddedCallback = value; } } - - public void SetPersistentManifold(PersistentManifold manifold) - { - _manifold = manifold; - } - - public override void SetShapeIdentifiers(int partIdA, int indexA, int partIdB, int indexB) - { - _partIdA = partIdA; - _partIdB = partIdB; - _indexA = indexA; - _indexB = indexB; - } - - public override void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth) - { - if (_manifold == null) - throw new BulletException("Manifold Pointer is null."); - - //order in manifold needs to match - - if (depth > PersistentManifold.ContactBreakingThreshold) - return; - - bool isSwapped = _manifold.BodyA != _bodyA; - - Vector3 pointA = pointInWorld + normalOnBInWorld * depth; - Vector3 localA; - Vector3 localB; - - if (isSwapped) - { - localA = MathHelper.InvXForm(_rootTransB, pointA); - localB = MathHelper.InvXForm(_rootTransA, pointInWorld); - } - else - { - localA = MathHelper.InvXForm(_rootTransA, pointA); - localB = MathHelper.InvXForm(_rootTransB, pointInWorld); - } - - ManifoldPoint newPt = new ManifoldPoint(localA, localB, normalOnBInWorld, depth); - - int insertIndex = _manifold.GetCacheEntry(newPt); - - newPt.CombinedFriction = CalculateCombinedFriction(_bodyA, _bodyB); - newPt.CombinedRestitution = CalculateCombinedRestitution(_bodyA, _bodyB); - - //User can override friction and/or restitution - if (_contactAddedCallback != null && - //and if either of the two bodies requires custom material - ((_bodyA.CollisionFlags & CollisionOptions.CustomMaterialCallback) != 0 || - (_bodyB.CollisionFlags & CollisionOptions.CustomMaterialCallback) != 0)) - { - //experimental feature info, for per-triangle material etc. - CollisionObject obj0 = isSwapped ? _bodyB : _bodyA; - CollisionObject obj1 = isSwapped ? _bodyA : _bodyB; - _contactAddedCallback(newPt, obj0, _partIdA, _indexA, obj1, _partIdB, _indexB); - } - - if (insertIndex >= 0) - { - _manifold.ReplaceContactPoint(newPt, insertIndex); - } - else - { - _manifold.AddManifoldPoint(newPt); - } - } - - private float CalculateCombinedFriction(CollisionObject bodyA, CollisionObject bodyB) - { - float friction = bodyA.Friction * bodyB.Friction; - - float MaxFriction = 10; - if (friction < -MaxFriction) - friction = -MaxFriction; - if (friction > MaxFriction) - friction = MaxFriction; - return friction; - } - - private float CalculateCombinedRestitution(CollisionObject bodyA, CollisionObject bodyB) - { - return bodyA.Restitution * bodyB.Restitution; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SimulationIslandManager.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SimulationIslandManager.cs deleted file mode 100644 index 39eb53a9ea..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SimulationIslandManager.cs +++ /dev/null @@ -1,304 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class SimulationIslandManager - { - private UnionFind _unionFind = new UnionFind(); - - public void InitUnionFind(int n) - { - _unionFind.Reset(n); - } - - public UnionFind UnionFind { get { return _unionFind; } } - - public virtual void UpdateActivationState(CollisionWorld world, IDispatcher dispatcher) - { - InitUnionFind(world.CollisionObjectsCount); - - // put the index into m_controllers into m_tag - int index = 0; - for (int i = 0; i < world.CollisionObjects.Count; i++) - { - world.CollisionObjects[i].IslandTag = index; - world.CollisionObjects[i].HitFraction = 1; - world.CollisionObjects[i].CompanionID = -1; - index++; - } - // do the union find - FindUnions(dispatcher); - } - - public virtual void StoreIslandActivationState(CollisionWorld world) - { - // put the islandId ('find' value) into m_tag - int index = 0; - for (int i = 0; i < world.CollisionObjects.Count; i++) - { - if (world.CollisionObjects[i].MergesSimulationIslands) - { - world.CollisionObjects[i].IslandTag = _unionFind.Find(index); - world.CollisionObjects[i].CompanionID = -1; - } - else - { - world.CollisionObjects[i].IslandTag = -1; - world.CollisionObjects[i].CompanionID = -2; - } - index++; - } - } - - public void FindUnions(IDispatcher dispatcher) - { - for (int i = 0; i < dispatcher.ManifoldCount; i++) - { - PersistentManifold manifold = dispatcher.GetManifoldByIndex(i); - //static objects (invmass 0.f) don't merge ! - - CollisionObject colObjA = manifold.BodyA as CollisionObject; - CollisionObject colObjB = manifold.BodyB as CollisionObject; - - if (((colObjA != null) && (colObjA.MergesSimulationIslands)) && - ((colObjB != null) && (colObjB.MergesSimulationIslands))) - { - _unionFind.Unite(colObjA.IslandTag, colObjB.IslandTag); - } - } - } - - public void BuildAndProcessIslands(IDispatcher dispatcher, List collisionObjects, IIslandCallback callback) - { - //we are going to sort the unionfind array, and store the element id in the size - //afterwards, we clean unionfind, to make sure no-one uses it anymore - UnionFind.SortIslands(); - int numElem = UnionFind.ElementCount; - - int endIslandIndex = 1; - int startIslandIndex; - - //update the sleeping state for bodies, if all are sleeping - for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex) - { - int islandId = UnionFind[startIslandIndex].ID; - for (endIslandIndex = startIslandIndex + 1; (endIslandIndex < numElem) && (UnionFind[endIslandIndex].ID == islandId); endIslandIndex++) - { - } - - //int numSleeping = 0; - - bool allSleeping = true; - - int idx; - for (idx = startIslandIndex; idx < endIslandIndex; idx++) - { - int i = UnionFind[idx].Size; - - CollisionObject colObjA = collisionObjects[i]; - if ((colObjA.IslandTag != islandId) && (colObjA.IslandTag != -1)) - { - Console.WriteLine("error in island management"); - } - - BulletDebug.Assert((colObjA.IslandTag == islandId) || (colObjA.IslandTag == -1)); - if (colObjA.IslandTag == islandId) - { - if (colObjA.ActivationState == ActivationState.Active) - { - allSleeping = false; - } - if (colObjA.ActivationState == ActivationState.DisableDeactivation) - { - allSleeping = false; - } - } - } - - - if (allSleeping) - { - for (idx = startIslandIndex; idx < endIslandIndex; idx++) - { - int i = UnionFind[idx].Size; - CollisionObject colObjA = collisionObjects[i]; - if ((colObjA.IslandTag != islandId) && (colObjA.IslandTag != -1)) - { - Console.WriteLine("error in island management"); - } - - BulletDebug.Assert((colObjA.IslandTag == islandId) || (colObjA.IslandTag == -1)); - - if (colObjA.IslandTag == islandId) - { - colObjA.ActivationState =ActivationState.IslandSleeping; - } - } - } - else - { - for (idx = startIslandIndex; idx < endIslandIndex; idx++) - { - int i = UnionFind[idx].Size; - - CollisionObject colObjA = collisionObjects[i]; - if ((colObjA.IslandTag != islandId) && (colObjA.IslandTag != -1)) - { - Console.WriteLine("error in island management"); - } - - BulletDebug.Assert((colObjA.IslandTag == islandId) || (colObjA.IslandTag == -1)); - - if (colObjA.IslandTag == islandId) - { - if (colObjA.ActivationState == ActivationState.IslandSleeping) - { - colObjA.ActivationState = ActivationState.WantsDeactivation; - } - } - } - } - } - - //int maxNumManifolds = dispatcher.ManifoldCount; - List islandmanifold = new List(dispatcher.ManifoldCount); - - for (int i = 0; i < dispatcher.ManifoldCount; i++) - { - PersistentManifold manifold = dispatcher.GetManifoldByIndex(i); - - CollisionObject colObjA = manifold.BodyA as CollisionObject; - CollisionObject colObjB = manifold.BodyB as CollisionObject; - - //todo: check sleeping conditions! - if (((colObjA != null) && colObjA.ActivationState != ActivationState.IslandSleeping) || - ((colObjB != null) && colObjB.ActivationState != ActivationState.IslandSleeping)) - { - - //kinematic objects don't merge islands, but wake up all connected objects - if (colObjA.IsStaticOrKinematicObject && colObjA.ActivationState != ActivationState.IslandSleeping) - { - colObjB.Activate(); - } - if (colObjB.IsStaticOrKinematicObject && colObjB.ActivationState != ActivationState.IslandSleeping) - { - colObjA.Activate(); - } - - //filtering for response - if (dispatcher.NeedsResponse(colObjA, colObjB)) - islandmanifold.Add(manifold); - } - } - - int numManifolds = islandmanifold.Count; - - // Sort manifolds, based on islands - // Sort the vector using predicate and std::sort - islandmanifold.Sort(new Comparison(PersistentManifoldSortPredicate)); - - //now process all active islands (sets of manifolds for now) - int startManifoldIndex = 0; - int endManifoldIndex = 1; - - List islandBodies = new List(); - - for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex) - { - int islandId = UnionFind[startIslandIndex].ID; - bool islandSleeping = false; - for (endIslandIndex = startIslandIndex; (endIslandIndex < numElem) && (UnionFind[endIslandIndex].ID == islandId); endIslandIndex++) - { - int i = UnionFind[endIslandIndex].Size; - CollisionObject colObjA = collisionObjects[i]; - islandBodies.Add(colObjA); - if (!colObjA.IsActive) - islandSleeping = true; - } - - //find the accompanying contact manifold for this islandId - int numIslandManifolds = 0; - List startManifold = new List(numIslandManifolds); - - if (startManifoldIndex < numManifolds) - { - int curIslandID = GetIslandId(islandmanifold[startManifoldIndex]); - if (curIslandID == islandId) - { - for (int k = startManifoldIndex; k < islandmanifold.Count; k++) - { - startManifold.Add(islandmanifold[k]); - } - for (endManifoldIndex = startManifoldIndex + 1; (endManifoldIndex < numManifolds) && (islandId == GetIslandId(islandmanifold[endManifoldIndex])); endManifoldIndex++) { } - - // Process the actual simulation, only if not sleeping/deactivated - numIslandManifolds = endManifoldIndex - startManifoldIndex; - } - } - - if (!islandSleeping) - { - callback.ProcessIsland(islandBodies, startManifold, numIslandManifolds, islandId); - } - - if (numIslandManifolds != 0) - { - startManifoldIndex = endManifoldIndex; - } - - islandBodies.Clear(); - } - } - - private static int GetIslandId(PersistentManifold lhs) - { - int islandId; - CollisionObject rcolObjA = lhs.BodyA as CollisionObject; - CollisionObject rcolObjB = lhs.BodyB as CollisionObject; - islandId = rcolObjA.IslandTag >= 0 ? rcolObjA.IslandTag : rcolObjB.IslandTag; - return islandId; - } - - private static int PersistentManifoldSortPredicate(PersistentManifold lhs, PersistentManifold rhs) - { - int rIslandIdA, lIslandIdB; - rIslandIdA = GetIslandId(rhs); - lIslandIdB = GetIslandId(lhs); - //return lIslandId0 < rIslandId0; - if (lIslandIdB < rIslandIdA) - return -1; - //else if (lIslandIdB > rIslandIdA) - // return 1; - return 1; - } - - public interface IIslandCallback - { - void ProcessIsland(List bodies, List manifolds, int numManifolds, int islandID); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereBoxCollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereBoxCollisionAlgorithm.cs deleted file mode 100644 index 2b4e8018d0..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereBoxCollisionAlgorithm.cs +++ /dev/null @@ -1,270 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// SphereBoxCollisionAlgorithm provides sphere-box collision detection. - /// Other features are frame-coherency (persistent data) and collision response. - /// - public class SphereBoxCollisionAlgorithm : CollisionAlgorithm, IDisposable - { - private bool _ownManifold; - private PersistentManifold _manifold; - private bool _isSwapped; - - public SphereBoxCollisionAlgorithm(PersistentManifold manifold, CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject collisionObjectA, CollisionObject collisionObjectB, bool isSwapped) - : base(collisionAlgorithmConstructionInfo) - { - _ownManifold = false; - _manifold = manifold; - _isSwapped = isSwapped; - - CollisionObject sphereObject = _isSwapped ? collisionObjectB : collisionObjectA; - CollisionObject boxObject = _isSwapped ? collisionObjectA : collisionObjectB; - - if (_manifold == null && Dispatcher.NeedsCollision(sphereObject, boxObject)) - { - _manifold = Dispatcher.GetNewManifold(sphereObject, boxObject); - _ownManifold = true; - } - } - - public float GetSphereDistance(CollisionObject boxObject, out Vector3 pointOnBox, out Vector3 pointOnSphere, Vector3 sphereCenter, float radius) - { - pointOnBox = new Vector3(); - pointOnSphere = new Vector3(); - - float margins; - Vector3[] bounds = new Vector3[2]; - BoxShape boxShape = boxObject.CollisionShape as BoxShape; - - bounds[0] = -boxShape.HalfExtents; - bounds[1] = boxShape.HalfExtents; - - margins = boxShape.Margin; //also add sphereShape margin? - - Matrix m44T = boxObject.WorldTransform; - - Vector3[] boundsVec = new Vector3[2]; - float penetration; - - boundsVec[0] = bounds[0]; - boundsVec[1] = bounds[1]; - - Vector3 marginsVec = new Vector3(margins, margins, margins); - - // add margins - bounds[0] += marginsVec; - bounds[1] -= marginsVec; - - ///////////////////////////////////////////////// - - Vector3 tmp, prel, normal, v3P; - Vector3[] n = new Vector3[6]; - float sep = 10000000.0f, sepThis; - - n[0] = new Vector3(-1.0f, 0.0f, 0.0f); - n[1] = new Vector3(0.0f, -1.0f, 0.0f); - n[2] = new Vector3(0.0f, 0.0f, -1.0f); - n[3] = new Vector3(1.0f, 0.0f, 0.0f); - n[4] = new Vector3(0.0f, 1.0f, 0.0f); - n[5] = new Vector3(0.0f, 0.0f, 1.0f); - - // convert point in local space - prel = MathHelper.InvXForm(m44T, sphereCenter); - - bool found = false; - - v3P = prel; - - for (int i = 0; i < 6; i++) - { - int j = i < 3 ? 0 : 1; - if ((sepThis = (Vector3.Dot(v3P - bounds[j], n[i]))) > 0.0f) - { - v3P = v3P - n[i] * sepThis; - found = true; - } - } - - // - - if (found) - { - bounds[0] = boundsVec[0]; - bounds[1] = boundsVec[1]; - - normal = Vector3.Normalize(prel - v3P); - pointOnBox = v3P + normal * margins; - pointOnSphere = prel - normal * radius; - - if ((Vector3.Dot(pointOnSphere - pointOnBox, normal)) > 0.0f) - { - return 1.0f; - } - - // transform back in world space - tmp = MathHelper.MatrixToVector(m44T, pointOnBox); - pointOnBox = tmp; - tmp = MathHelper.MatrixToVector(m44T, pointOnSphere); - pointOnSphere = tmp; - float seps2 = (pointOnBox - pointOnSphere).LengthSquared(); - - //if this fails, fallback into deeper penetration case, below - if (seps2 > MathHelper.Epsilon) - { - sep = -(float)Math.Sqrt(seps2); - normal = (pointOnBox - pointOnSphere); - normal *= 1f / sep; - } - return sep; - } - - ////////////////////////////////////////////////// - // Deep penetration case - - penetration = GetSpherePenetration(boxObject, ref pointOnBox, ref pointOnSphere, sphereCenter, radius, bounds[0], bounds[1]); - - bounds[0] = boundsVec[0]; - bounds[1] = boundsVec[1]; - - if (penetration <= 0.0f) - return (penetration - margins); - else - return 1.0f; - } - - public float GetSpherePenetration(CollisionObject boxObject, ref Vector3 pointOnBox, ref Vector3 pointOnSphere, Vector3 sphereCenter, float radius, Vector3 aabbMin, Vector3 aabbMax) - { - Vector3[] bounds = new Vector3[2]; - - bounds[0] = aabbMin; - bounds[1] = aabbMax; - - Vector3 p0 = new Vector3(), tmp, prel, normal = new Vector3(); - Vector3[] n = new Vector3[6]; - float sep = -10000000.0f, sepThis; - - n[0] = new Vector3(-1.0f, 0.0f, 0.0f); - n[1] = new Vector3(0.0f, -1.0f, 0.0f); - n[2] = new Vector3(0.0f, 0.0f, -1.0f); - n[3] = new Vector3(1.0f, 0.0f, 0.0f); - n[4] = new Vector3(0.0f, 1.0f, 0.0f); - n[5] = new Vector3(0.0f, 0.0f, 1.0f); - - Matrix m44T = boxObject.WorldTransform; - - // convert point in local space - prel = MathHelper.InvXForm(m44T, sphereCenter); - - /////////// - - for (int i = 0; i < 6; i++) - { - int j = i < 3 ? 0 : 1; - if ((sepThis = (Vector3.Dot(prel - bounds[j], n[i])) - radius) > 0.0f) return 1.0f; - if (sepThis > sep) - { - p0 = bounds[j]; - normal = n[i]; - sep = sepThis; - } - } - - pointOnBox = prel - normal * (Vector3.Dot(normal, (prel - p0))); - pointOnSphere = pointOnBox + normal * sep; - - // transform back in world space - tmp = MathHelper.MatrixToVector(m44T, pointOnBox); - pointOnBox = tmp; - tmp = MathHelper.MatrixToVector(m44T, pointOnSphere); - pointOnSphere = tmp; - normal = Vector3.Normalize(pointOnBox - pointOnSphere); - - return sep; - } - - public override void ProcessCollision(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - if (_manifold == null) - return; - - CollisionObject sphereObject = _isSwapped ? bodyB : bodyA; - CollisionObject boxObject = _isSwapped ? bodyA : bodyB; - - SphereShape sphereA = sphereObject.CollisionShape as SphereShape; - - Vector3 pOnBox, pOnSphere; - Vector3 sphereCenter = sphereObject.WorldTransform.Translation; - float radius = sphereA.Radius; - - float dist = GetSphereDistance(boxObject, out pOnBox, out pOnSphere, sphereCenter, radius); - - if (dist < MathHelper.Epsilon) - { - Vector3 normalOnSurfaceB = Vector3.Normalize(pOnBox - pOnSphere); - - // report a contact. internally this will be kept persistent, and contact reduction is done - resultOut.SetPersistentManifold(_manifold); - resultOut.AddContactPoint(normalOnSurfaceB, pOnBox, dist); - } - } - - public override float CalculateTimeOfImpact(CollisionObject collisionObjectA, CollisionObject collisionObjectB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - //not yet - return 1; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - if (!IsSwapped) - return new SphereBoxCollisionAlgorithm(null, collisionAlgorithmConstructionInfo, bodyA, bodyB, false); - else - return new SphereBoxCollisionAlgorithm(null, collisionAlgorithmConstructionInfo, bodyA, bodyB, true); - } - } - - #region IDisposable Members - public void Dispose() - { - Dispose(true); - } - - public void Dispose(bool disposing) - { - if (disposing && _ownManifold) - { - if (_manifold != null) - Dispatcher.ReleaseManifold(_manifold); - } - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereSphereCollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereSphereCollisionAlgorithm.cs deleted file mode 100644 index 3a780c1b20..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereSphereCollisionAlgorithm.cs +++ /dev/null @@ -1,104 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class SphereSphereCollisionAlgorithm : CollisionAlgorithm - { - private bool _ownManifold; - private PersistentManifold _manifold; - - public SphereSphereCollisionAlgorithm(PersistentManifold manifold, CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - : base(collisionAlgorithmConstructionInfo) - { - _ownManifold = false; - _manifold = manifold; - - if (_manifold == null) - { - _manifold = Dispatcher.GetNewManifold(bodyA, bodyB); - _ownManifold = true; - } - } - - public SphereSphereCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo) - : base(collisionAlgorithmConstructionInfo) { } - - ~SphereSphereCollisionAlgorithm() - { - if (_ownManifold) - { - if (_manifold != null) - Dispatcher.ReleaseManifold(_manifold); - } - } - - public override void ProcessCollision(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - if (_manifold == null) - return; - - SphereShape sphereA = bodyA.CollisionShape as SphereShape; - SphereShape sphereB = bodyB.CollisionShape as SphereShape; - - Vector3 diff = bodyA.WorldTransform.Translation - bodyB.WorldTransform.Translation; - float len = diff.Length(); - float radiusA = sphereA.Radius; - float radiusB = sphereB.Radius; - - //if distance positive, don't generate a new contact - if (len > (radiusA + radiusB)) - return; - - //distance (negative means penetration) - float dist = len - (radiusA + radiusB); - - Vector3 normalOnSurfaceB = diff / len; - //point on A (worldspace) - Vector3 posA = bodyA.WorldTransform.Translation - radiusA * normalOnSurfaceB; - //point on B (worldspace) - Vector3 posB = bodyB.WorldTransform.Translation + radiusB * normalOnSurfaceB; - - // report a contact. internally this will be kept persistent, and contact reduction is done - resultOut.SetPersistentManifold(_manifold); - resultOut.AddContactPoint(normalOnSurfaceB, posB, dist); - } - - public override float CalculateTimeOfImpact(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - //not yet - return 1f; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new SphereSphereCollisionAlgorithm(null, collisionAlgorithmConstructionInfo, bodyA, bodyB); - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereTriangleCollisionAlgorithm.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereTriangleCollisionAlgorithm.cs deleted file mode 100644 index 00dfaf1287..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereTriangleCollisionAlgorithm.cs +++ /dev/null @@ -1,100 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// SphereSphereCollisionAlgorithm provides sphere-sphere collision detection. - /// Other features are frame-coherency (persistent data) and collision response. - /// Also provides the most basic sample for custom/user btCollisionAlgorithm - /// - public class SphereTriangleCollisionAlgorithm : CollisionAlgorithm, IDisposable - { - private bool _ownManifold; - private PersistentManifold _manifold; - private bool _isSwapped; - - public SphereTriangleCollisionAlgorithm(PersistentManifold manifold, CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB, bool isSwapped) - : base(collisionAlgorithmConstructionInfo) - { - _ownManifold = false; - _manifold = manifold; - _isSwapped = isSwapped; - - if (_manifold == null) - { - _manifold = Dispatcher.GetNewManifold(bodyA, bodyB); - _ownManifold = true; - } - } - - public SphereTriangleCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo) - : base(collisionAlgorithmConstructionInfo) { } - - public override void ProcessCollision(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - if (_manifold == null) - return; - - SphereShape sphere = bodyA.CollisionShape as SphereShape; - TriangleShape triangle = bodyB.CollisionShape as TriangleShape; - - /// report a contact. internally this will be kept persistent, and contact reduction is done - resultOut.SetPersistentManifold(_manifold); - SphereTriangleDetector detector = new SphereTriangleDetector(sphere, triangle); - - DiscreteCollisionDetectorInterface.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - input.MaximumDistanceSquared = 1e30f;//todo: tighter bounds - input.TransformA = bodyA.WorldTransform; - input.TransformB = bodyB.WorldTransform; - - detector.GetClosestPoints(input, resultOut, null); - } - - public override float CalculateTimeOfImpact(CollisionObject bodyA, CollisionObject bodyB, DispatcherInfo dispatchInfo, ManifoldResult resultOut) - { - //not yet - return 1f; - } - - public class CreateFunc : CollisionAlgorithmCreateFunction - { - public override CollisionAlgorithm CreateCollisionAlgorithm(CollisionAlgorithmConstructionInfo collisionAlgorithmConstructionInfo, CollisionObject bodyA, CollisionObject bodyB) - { - return new SphereTriangleCollisionAlgorithm(collisionAlgorithmConstructionInfo.Manifold, collisionAlgorithmConstructionInfo, bodyA, bodyB, IsSwapped); - } - } - - #region IDisposable Members - public void Dispose() - { - if (_ownManifold) - if (_manifold != null) - Dispatcher.ReleaseManifold(_manifold); - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereTriangleDetector.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereTriangleDetector.cs deleted file mode 100644 index 4d578d8760..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/SphereTriangleDetector.cs +++ /dev/null @@ -1,214 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class SphereTriangleDetector : DiscreteCollisionDetectorInterface - { - private SphereShape _sphere; - private TriangleShape _triangle; - private const int MaxOverlap = 0; - - public SphereTriangleDetector(SphereShape sphere, TriangleShape triangle) - { - this._sphere = sphere; - this._triangle = triangle; - } - - public override void GetClosestPoints(DiscreteCollisionDetectorInterface.ClosestPointInput input, DiscreteCollisionDetectorInterface.Result output, IDebugDraw debugDraw) - { - Matrix transformA = input.TransformA; - Matrix transformB = input.TransformB; - - Vector3 point = new Vector3(); - Vector3 normal = new Vector3(); - Single timeOfImpact = 1.0f; - Single depth = 0.0f; - - //move sphere into triangle space - Matrix sphereInTr = MathHelper.InverseTimes(transformB, transformA); - - if (Collide(sphereInTr.Translation, point, normal, depth, timeOfImpact)) - output.AddContactPoint(Vector3.TransformNormal(normal, transformB), Vector3.TransformNormal(point, transformB), depth); - } - - /// - /// See also geometrictools.com - /// Basic idea: D = |p - (lo + t0*lv)| where t0 = lv . (p - lo) / lv . lv - /// - /// - /// - /// - /// - /// - private float SegmentSquareDistance(Vector3 from, Vector3 to, Vector3 point, Vector3 nearest) - { - Vector3 diff = point - from; - Vector3 v = to - from; - float t = Vector3.Dot(v, diff); - - if (t > 0) - { - float dotVV = Vector3.Dot(v, v); - if (t < dotVV) - { - t /= dotVV; - diff -= t * v; - } - else - { - t = 1; - diff -= v; - } - } - else - t = 0; - - nearest = from + t * v; - return Vector3.Dot(diff, diff); - } - - private bool Collide(Vector3 sphereCenter, Vector3 point, Vector3 resultNormal, float depth, float timeOfImpact) - { - Vector3[] vertices = _triangle.Vertices; - Vector3 c = sphereCenter; - float r = _sphere.Radius; - - Vector3 delta = new Vector3(); - - Vector3 normal = Vector3.Cross(vertices[1] - vertices[0], vertices[2] - vertices[0]); - normal = Vector3.Normalize(normal); - Vector3 p1ToCentre = c - vertices[0]; - float distanceFromPlane = Vector3.Dot(p1ToCentre, normal); - - if (distanceFromPlane < 0) - { - //triangle facing the other way - distanceFromPlane *= -1; - normal *= -1; - } - - float contactMargin = PersistentManifold.ContactBreakingThreshold; - bool isInsideContactPlane = distanceFromPlane < r + contactMargin; - bool isInsideShellPlane = distanceFromPlane < r; - - float deltaDotNormal = Vector3.Dot(delta, normal); - if (!isInsideShellPlane && deltaDotNormal >= 0.0f) - return false; - - // Check for contact / intersection - bool hasContact = false; - Vector3 contactPoint = new Vector3(); - if (isInsideContactPlane) - { - if (FaceContains(c, vertices, normal)) - { - // Inside the contact wedge - touches a point on the shell plane - hasContact = true; - contactPoint = c - normal * distanceFromPlane; - } - else - { - // Could be inside one of the contact capsules - float contactCapsuleRadiusSqr = (r + contactMargin) * (r + contactMargin); - Vector3 nearestOnEdge = new Vector3(); - for (int i = 0; i < _triangle.EdgeCount; i++) - { - Vector3 pa, pb; - _triangle.GetEdge(i, out pa, out pb); - - float distanceSqr = SegmentSquareDistance(pa, pb, c, nearestOnEdge); - if (distanceSqr < contactCapsuleRadiusSqr) - { - // Yep, we're inside a capsule - hasContact = true; - contactPoint = nearestOnEdge; - } - } - } - } - - if (hasContact) - { - Vector3 contactToCentre = c - contactPoint; - float distanceSqr = contactToCentre.LengthSquared(); - if (distanceSqr < (r - MaxOverlap) * (r - MaxOverlap)) - { - float distance = (float)Math.Sqrt(distanceSqr); - resultNormal = contactToCentre; - resultNormal = Vector3.Normalize(resultNormal); - point = contactPoint; - depth = -(r - distance); - return true; - } - - if (Vector3.Dot(delta, contactToCentre) >= 0.0f) - return false; - - // Moving towards the contact point -> collision - point = contactPoint; - timeOfImpact = 0.0f; - return true; - } - return false; - } - - private bool PointInTriangle(Vector3[] vertices, Vector3 normal, Vector3 p) - { - Vector3 p1 = vertices[0]; - Vector3 p2 = vertices[1]; - Vector3 p3 = vertices[2]; - - Vector3 edge1 = p2 - p1; - Vector3 edge2 = p3 - p2; - Vector3 edge3 = p1 - p3; - - Vector3 p1ToP = p - p1; - Vector3 p2ToP = p - p2; - Vector3 p3ToP = p - p3; - - Vector3 edge1Normal = Vector3.Cross(edge1, normal); - Vector3 edge2Normal = Vector3.Cross(edge2, normal); - Vector3 edge3Normal = Vector3.Cross(edge3, normal); - - float r1, r2, r3; - r1 = Vector3.Dot(edge1Normal, p1ToP); - r2 = Vector3.Dot(edge2Normal, p2ToP); - r3 = Vector3.Dot(edge3Normal, p3ToP); - if ((r1 > 0 && r2 > 0 && r3 > 0) || - (r1 <= 0 && r2 <= 0 && r3 <= 0)) - return true; - return false; - } - - private bool FaceContains(Vector3 p, Vector3[] vertices, Vector3 normal) - { - Vector3 lp = p; - Vector3 lnormal = normal; - return PointInTriangle(vertices, lnormal, lp); - } - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/UnionFind.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/UnionFind.cs deleted file mode 100644 index 3c7daea8d4..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionDispatch/UnionFind.cs +++ /dev/null @@ -1,151 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public class UnionFind : IDisposable - { - private List _elements = new List(); - - public int ElementCount - { - get { return _elements.Count; } - } - - public void SortIslands() - { - for (int i = 0; i < _elements.Count; i++) - { - _elements[i].ID = Find(i); - _elements[i].Size = i; - } - - _elements.Sort(Sort); - } - - private static int Sort(Element x, Element y) - { - if (x.ID < y.ID) return -1; - //else if (x.ID > y.ID) return 1; - else return 0; - } - - public void Reset(int number) - { - Allocate(number); - - for (int i = 0; i < number; i++) - { - Element element = new Element(); - element.ID = i; - element.Size = 1; - _elements.Insert(i, element); - } - } - - public bool IsRoot(int index) - { - return (_elements[index].Size == index); - } - - public Element this[int index] - { - get { return _elements[index]; } - } - - public void Allocate(int number) - { - //Does nothing - _elements = new List(number); - } - - public bool Find(int i, int j) - { - return (Find(i) == Find(j)); - } - - public int Find(int i) - { - while (i != _elements[i].ID) - { - //Element element = _elements[i]; - //element.ID = _elements[_elements[i].ID].ID; - _elements[i].ID = _elements[_elements[i].ID].ID; - i = _elements[i].ID; - } - - return i; - } - - public void Unite(int p, int q) - { - int i = Find(p), j = Find(q); - if (i == j) - return; - - //weighted quick union, this keeps the 'trees' balanced, and keeps performance of unite O( log(n) ) - //if (_elements[i].Size < _elements[j].Size) - //{ - // Element element = _elements[i]; - // element.ID = j; - // _elements[i] = element; - - // element = _elements[j]; - // element.Size += _elements[i].Size; - // _elements[j] = element; - //} - //else - //{ - // Element element = _elements[j]; - // element.ID = i; - // _elements[j] = element; - - // element = _elements[i]; - // element.Size += _elements[j].Size; - // _elements[i] = element; - //} - _elements[i].ID = j; - _elements[j].Size += _elements[i].Size; - } - - #region IDisposable Members - - public void Dispose() - { - _elements.Clear(); - } - - #endregion - } - - public class Element - { - private int _id; - private int _size; - - public int ID { get { return _id; } set { _id = value; } } - public int Size { get { return _size; } set { _size = value; } } - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BUSimplex1to4.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BUSimplex1to4.cs deleted file mode 100644 index 34f744299a..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BUSimplex1to4.cs +++ /dev/null @@ -1,215 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// BUSimplex1to4 implements feature based and implicit simplex of up to 4 vertices (tetrahedron, triangle, line, vertex). - /// - public class BUSimplex1to4 : PolyhedralConvexShape - { - private int _numVertices = 0; - private Vector3[] _vertices = new Vector3[4]; - - public BUSimplex1to4() { } - - public BUSimplex1to4(Vector3 pointA) - { - AddVertex(pointA); - } - - public BUSimplex1to4(Vector3 pointA, Vector3 pointB) - { - AddVertex(pointA); - AddVertex(pointB); - } - - public BUSimplex1to4(Vector3 pointA, Vector3 pointB, Vector3 pointC) - { - AddVertex(pointA); - AddVertex(pointB); - AddVertex(pointC); - } - - public BUSimplex1to4(Vector3 pointA, Vector3 pointB, Vector3 pointC, Vector3 pointD) - { - AddVertex(pointA); - AddVertex(pointB); - AddVertex(pointC); - AddVertex(pointD); - } - - protected Vector3[] Vertices { get { return _vertices; } set { _vertices = value; } } - - public override int VertexCount - { - get - { - return _numVertices; - } - } - - public override int EdgeCount - { - get - { - //euler formula, F-E+V = 2, so E = F+V-2 - switch (_numVertices) - { - case 0: return 0; - case 1: return 0; - case 2: return 1; - case 3: return 3; - case 4: return 6; - } - return 0; - } - } - - public override int PlaneCount - { - get - { - switch (_numVertices) - { - case 0: - return 0; - case 1: - return 0; - case 2: - return 0; - case 3: - return 2; - case 4: - return 4; - } - return 0; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Tetrahedral; - } - } - - public override string Name - { - get - { - return "BUSimplex1to4"; - } - } - - public void AddVertex(Vector3 v) - { - _vertices[_numVertices++] = v; - } - - public void Reset() - { - _numVertices = 0; - } - - public override void GetEdge(int i, out Vector3 pa, out Vector3 pb) - { - switch (_numVertices) - { - case 2: - pa = _vertices[0]; - pb = _vertices[1]; - return; - case 3: - switch (i) - { - case 0: - pa = _vertices[0]; - pb = _vertices[1]; - return; - case 1: - pa = _vertices[1]; - pb = _vertices[2]; - return; - case 2: - pa = _vertices[2]; - pb = _vertices[0]; - return; - } - break; - case 4: - switch (i) - { - case 0: - pa = _vertices[0]; - pb = _vertices[1]; - return; - case 1: - pa = _vertices[1]; - pb = _vertices[2]; - return; - case 2: - pa = _vertices[2]; - pb = _vertices[0]; - return; - case 3: - pa = _vertices[0]; - pb = _vertices[3]; - return; - case 4: - pa = _vertices[1]; - pb = _vertices[3]; - return; - case 5: - pa = _vertices[2]; - pb = _vertices[3]; - return; - } - break; - } - - pa = new Vector3(); - pb = new Vector3(); - } - - public override void GetVertex(int i, out Vector3 vtx) - { - vtx = _vertices[i]; - } - - public override void GetPlane(out Vector3 planeNormal, out Vector3 planeSupport, int i) - { - planeNormal = new Vector3(); - planeSupport = new Vector3(); - } - - public override bool IsInside(Vector3 pt, float tolerance) - { - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BoxShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BoxShape.cs deleted file mode 100644 index 7fab5c79df..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BoxShape.cs +++ /dev/null @@ -1,316 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class BoxShape : PolyhedralConvexShape - { - public BoxShape(Vector3 boxHalfExtents) - { - ImplicitShapeDimensions = boxHalfExtents; - } - - public override int VertexCount - { - get - { - return 8; - } - } - - public override int EdgeCount - { - get - { - return 12; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Box; - } - } - - public override string Name - { - get - { - return "Box"; - } - } - - public override int PreferredPenetrationDirectionsCount - { - get - { - return 6; - } - } - - public override int PlaneCount - { - get - { - return 6; - } - } - - public Vector3 HalfExtents { get { return ImplicitShapeDimensions * LocalScaling; } } - - public override void GetEdge(int i, out Vector3 pa, out Vector3 pb) - { - int edgeVert0 = 0; - int edgeVert1 = 0; - - switch (i) - { - case 0: - edgeVert0 = 0; - edgeVert1 = 1; - break; - case 1: - edgeVert0 = 0; - edgeVert1 = 2; - break; - case 2: - edgeVert0 = 1; - edgeVert1 = 3; - - break; - case 3: - edgeVert0 = 2; - edgeVert1 = 3; - break; - case 4: - edgeVert0 = 0; - edgeVert1 = 4; - break; - case 5: - edgeVert0 = 1; - edgeVert1 = 5; - - break; - case 6: - edgeVert0 = 2; - edgeVert1 = 6; - break; - case 7: - edgeVert0 = 3; - edgeVert1 = 7; - break; - case 8: - edgeVert0 = 4; - edgeVert1 = 5; - break; - case 9: - edgeVert0 = 4; - edgeVert1 = 6; - break; - case 10: - edgeVert0 = 5; - edgeVert1 = 7; - break; - case 11: - edgeVert0 = 6; - edgeVert1 = 7; - break; - default: - throw new BulletException(); - - } - - GetVertex(edgeVert0, out pa); - GetVertex(edgeVert1, out pb); - } - - public override void GetVertex(int i, out Vector3 vtx) - { - Vector3 halfExtents = HalfExtents; - - vtx = new Vector3( - halfExtents.X * (1 - (i & 1)) - halfExtents.X * (i & 1), - halfExtents.Y * (1 - ((i & 2) >> 1)) - halfExtents.Y * ((i & 2) >> 1), - halfExtents.Z * (1 - ((i & 4) >> 2)) - halfExtents.Z * ((i & 4) >> 2)); - } - - public override void GetPlane(out Vector3 planeNormal, out Vector3 planeSupport, int i) - { - //this plane might not be aligned... - Vector4 plane; - GetPlaneEquation(out plane, i); - planeNormal = new Vector3(plane.X, plane.Y, plane.Z); - planeSupport = LocalGetSupportingVertex(-planeNormal); - } - - public override bool IsInside(Vector3 pt, float tolerance) - { - Vector3 halfExtents = HalfExtents; - - //btScalar minDist = 2*tolerance; - - bool result = (pt.X <= ( halfExtents.X + tolerance)) && - (pt.X >= (-halfExtents.X - tolerance)) && - (pt.Y <= ( halfExtents.Y + tolerance)) && - (pt.Y >= (-halfExtents.Y - tolerance)) && - (pt.Z <= ( halfExtents.Z + tolerance)) && - (pt.Z >= (-halfExtents.Z - tolerance)); - - return result; - } - - public override Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 halfExtents = HalfExtents; - - return new Vector3( vec.X < 0.0f ? -halfExtents.X : halfExtents.X, - vec.Y < 0.0f ? -halfExtents.Y : halfExtents.Y, - vec.Z < 0.0f ? -halfExtents.Z : halfExtents.Z); - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - Vector3 halfExtents = HalfExtents; - Vector3 margin = new Vector3(Margin, Margin, Margin); - halfExtents -= margin; - - return new Vector3( vec.X < 0.0f ? -halfExtents.X : halfExtents.X, - vec.Y < 0.0f ? -halfExtents.Y : halfExtents.Y, - vec.Z < 0.0f ? -halfExtents.Z : halfExtents.Z); - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - Vector3 halfExtents = HalfExtents; - Vector3 margin = new Vector3(Margin, Margin, Margin); - halfExtents -= margin; - - for (int i = 0; i < vectors.Length; i++) - { - Vector3 vec = vectors[i]; - supportVerticesOut[i] = new Vector3(vec.X < 0.0f ? -halfExtents.X : halfExtents.X, - vec.Y < 0.0f ? -halfExtents.Y : halfExtents.Y, - vec.Z < 0.0f ? -halfExtents.Z : halfExtents.Z); - } - } - - public virtual void GetPlaneEquation(out Vector4 plane, int i) - { - Vector3 halfExtents = HalfExtents; - - switch (i) - { - case 0: - plane = new Vector4(1, 0, 0, 0); - plane.W = -halfExtents.X; - break; - case 1: - plane = new Vector4(-1, 0, 0, 0); - plane.W = -halfExtents.X; - break; - case 2: - plane = new Vector4(0, 1, 0, 0); - plane.W = -halfExtents.Y; - break; - case 3: - plane = new Vector4(0, -1, 0, 0); - plane.W = -halfExtents.Y; - break; - case 4: - plane = new Vector4(0, 0, 1, 0); - plane.W = -halfExtents.Z; - break; - case 5: - plane = new Vector4(0, 0, -1, 0); - plane.W = -halfExtents.Z; - break; - default: - throw new BulletException(); - } - } - - public override void GetPreferredPenetrationDirection(int index, out Vector3 penetrationVector) - { - switch (index) - { - case 0: - penetrationVector = new Vector3(1, 0, 0); - break; - case 1: - penetrationVector = new Vector3(-1, 0, 0); - break; - case 2: - penetrationVector = new Vector3(0, 1, 0); - break; - case 3: - penetrationVector = new Vector3(0, -1, 0); - break; - case 4: - penetrationVector = new Vector3(0, 0, 1); - break; - case 5: - penetrationVector = new Vector3(0, 0, -1); - break; - default: - throw new BulletException(); - } - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - Vector3 halfExtents = HalfExtents; - - Matrix abs_b = MathHelper.Absolute(t); - Vector3 center = t.Translation; - Vector3 row1 = new Vector3(abs_b.M11, abs_b.M12, abs_b.M13); - Vector3 row2 = new Vector3(abs_b.M21, abs_b.M22, abs_b.M23); - Vector3 row3 = new Vector3(abs_b.M31, abs_b.M32, abs_b.M33); - Vector3 extent = new Vector3(Vector3.Dot(row1, halfExtents), - Vector3.Dot(row2, halfExtents), - Vector3.Dot(row3, halfExtents)); - extent += new Vector3(Margin, Margin, Margin); - - aabbMin = center - extent; - aabbMax = center + extent; - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - Vector3 halfExtents = HalfExtents; - - float lx = 2f * (halfExtents.X); - float ly = 2f * (halfExtents.Y); - float lz = 2f * (halfExtents.Z); - - inertia = new Vector3(); - inertia.X = mass / (12.0f) * (ly * ly + lz * lz); - inertia.Y = mass / (12.0f) * (lx * lx + lz * lz); - inertia.Z = mass / (12.0f) * (lx * lx + ly * ly); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BvhTriangleMeshShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BvhTriangleMeshShape.cs deleted file mode 100644 index 03e1e44889..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/BvhTriangleMeshShape.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - class MyNodeOverlapCallback : INodeOverlapCallback - { - StridingMeshInterface _meshInterface; - ITriangleCallback _callback; - Vector3[] _triangle = new Vector3[3]; - - public MyNodeOverlapCallback(ITriangleCallback callback, StridingMeshInterface meshInterface) - { - _meshInterface = meshInterface; - _callback = callback; - } - - public void ProcessNode(OptimizedBvhNode node) - { - List verts; - List indicies; - int numtriangles; - - _meshInterface.GetLockedReadOnlyVertexIndexBase(out verts, out indicies, out numtriangles, node.SubPart); - Vector3 meshScaling = _meshInterface.Scaling; - - for (int j = 0; j < 3; j++) - { - _triangle[j] = verts[indicies[j + node.TriangleIndex * 3]] * meshScaling; - } - - _callback.ProcessTriangle(_triangle, node.SubPart, node.TriangleIndex); - _meshInterface.UnLockReadOnlyVertexBase(node.SubPart); - } - } - - public class BvhTriangleMeshShape : TriangleMeshShape - { - OptimizedBvh _bvh = new OptimizedBvh(); - - public BvhTriangleMeshShape(StridingMeshInterface meshInterface) : base(meshInterface) - { - _bvh.Build(meshInterface); - } - - public override void ProcessAllTriangles(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax) - { - MyNodeOverlapCallback myNodeCallback = new MyNodeOverlapCallback(callback, MeshInterface); - _bvh.ReportAabbOverlappingNodex(myNodeCallback, aabbMin, aabbMax); - } - - public override string Name - { - get - { - return "BvhTriangleMesh"; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CollisionShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CollisionShape.cs deleted file mode 100644 index 1a4fac2203..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CollisionShape.cs +++ /dev/null @@ -1,148 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// CollisionShape provides generic interface for collidable objects - /// - public abstract class CollisionShape - { - //debugging support - private string _tempDebug; - - public abstract string Name { get; } - public string ExtraDebugInfo { get { return _tempDebug; } set { _tempDebug = value; } } - - public bool IsPolyhedral - { - get - { - return BroadphaseProxy.IsPolyhedral(ShapeType); - } - } - - public bool IsConvex - { - get - { - return BroadphaseProxy.IsConvex(ShapeType); - } - } - public bool IsConcave - { - get - { - return BroadphaseProxy.IsConcave(ShapeType); - } - } - public bool IsCompound - { - get - { - return BroadphaseProxy.IsCompound(ShapeType); - } - } - - //isInfinite is used to catch simulation error (aabb check) - public bool IsInfinite - { - get - { - return BroadphaseProxy.IsInfinite(ShapeType); - } - } - - public abstract float Margin { get; set; } - public abstract Vector3 LocalScaling { get; set; } - public abstract BroadphaseNativeTypes ShapeType { get; } - - - public virtual void GetBoundingSphere(out Vector3 center, out float radius) - { - Matrix tr = Matrix.Identity; - Vector3 aabbMin, aabbMax; - - GetAabb(tr, out aabbMin, out aabbMax); - - radius = (aabbMax - aabbMin).Length() * 0.5f; - center = (aabbMin + aabbMax) * 0.5f; - } - - public virtual float GetAngularMotionDisc() - { - Vector3 center; - float disc; - GetBoundingSphere(out center, out disc); - disc += center.Length(); - return disc; - } - - //calculateTemporalAabb calculates the enclosing aabb for the moving object over interval [0..timeStep) - //result is conservative - public void CalculateTemporalAabb(Matrix currentTransform, Vector3 linearVelocity, Vector3 angularVelocity, float timeStep, out Vector3 temporalAabbMin, out Vector3 temporalAabbMax) - { - //start with static aabb - GetAabb(currentTransform, out temporalAabbMin, out temporalAabbMax); - - float temporalAabbMaxx = temporalAabbMax.X; - float temporalAabbMaxy = temporalAabbMax.Y; - float temporalAabbMaxz = temporalAabbMax.Z; - float temporalAabbMinx = temporalAabbMin.X; - float temporalAabbMiny = temporalAabbMin.Y; - float temporalAabbMinz = temporalAabbMin.Z; - - // add linear motion - Vector3 linMotion = linearVelocity * timeStep; - //todo: simd would have a vector max/min operation, instead of per-element access - if (linMotion.X > 0) - temporalAabbMaxx += linMotion.X; - else - temporalAabbMinx += linMotion.X; - if (linMotion.Y > 0) - temporalAabbMaxy += linMotion.Y; - else - temporalAabbMiny += linMotion.Y; - if (linMotion.Z > 0) - temporalAabbMaxz += linMotion.Z; - else - temporalAabbMinz += linMotion.Z; - - //add conservative angular motion - float angularMotion = angularVelocity.Length() * GetAngularMotionDisc() * timeStep; - Vector3 angularMotion3d = new Vector3(angularMotion, angularMotion, angularMotion); - temporalAabbMin = new Vector3(temporalAabbMinx, temporalAabbMiny, temporalAabbMinz); - temporalAabbMax = new Vector3(temporalAabbMaxx, temporalAabbMaxy, temporalAabbMaxz); - - temporalAabbMin -= angularMotion3d; - temporalAabbMax += angularMotion3d; - } - - public abstract void GetAabb(Matrix transform, out Vector3 aabbMin, out Vector3 aabbMax); - - public abstract void CalculateLocalInertia(float mass, out Vector3 inertia); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CompoundShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CompoundShape.cs deleted file mode 100644 index bd13ffd8e5..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CompoundShape.cs +++ /dev/null @@ -1,183 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// CompoundShape allows to store multiple other CollisionShapes - /// This allows for concave collision objects. This is more general then the Static Concave TriangleMeshShape. - /// - public class CompoundShape : CollisionShape - { - private List _childTransforms = new List(); - private List _childShapes = new List(); - private Vector3 _localAabbMin; - private Vector3 _localAabbMax; - - private OptimizedBvh _aabbTree; - private float _collisionMargin; - private Vector3 _localScaling; - - public CompoundShape() - { - _localAabbMin = new Vector3(1e30f, 1e30f, 1e30f); - _localAabbMax = new Vector3(-1e30f, -1e30f, -1e30f); - _aabbTree = null; - _collisionMargin = 0f; - _localScaling = new Vector3(1f, 1f, 1f); - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - Vector3 localHalfExtents = 0.5f * (_localAabbMax - _localAabbMin); - Vector3 localCenter = 0.5f * (_localAabbMax + _localAabbMin); - - Matrix abs_b = MathHelper.Absolute(t); - - Vector3 row1 = new Vector3(abs_b.M11, abs_b.M12, abs_b.M13); - Vector3 row2 = new Vector3(abs_b.M21, abs_b.M22, abs_b.M23); - Vector3 row3 = new Vector3(abs_b.M31, abs_b.M32, abs_b.M33); - - Vector3 center = new Vector3(Vector3.Dot(row1, localCenter) + t.Translation.X, - Vector3.Dot(row2, localCenter) + t.Translation.Y, - Vector3.Dot(row3, localCenter) + t.Translation.Z); - - Vector3 extent = new Vector3(Vector3.Dot(row1, localHalfExtents), - Vector3.Dot(row2, localHalfExtents), - Vector3.Dot(row3, localHalfExtents)); - - aabbMin = center - extent; - aabbMax = center + extent; - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Compound; - } - } - - public override Vector3 LocalScaling - { - get - { - return _localScaling; - } - set - { - _localScaling = value; - } - } - - public override string Name - { - get - { - return "Compound"; - } - } - - public override float Margin - { - get - { - return _collisionMargin; - } - set - { - _collisionMargin = value; - } - } - - public int ChildShapeCount { get { return _childShapes.Count; } } - //this is optional, but should make collision queries faster, by culling non-overlapping nodes - public OptimizedBvh AabbTree { get { return _aabbTree; } } - - public CollisionShape GetChildShape(int index) - { - return _childShapes[index]; - } - - public Matrix GetChildTransform(int index) - { - return _childTransforms[index]; - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - //approximation: take the inertia from the aabb for now - Matrix ident = Matrix.Identity; - Vector3 aabbMin, aabbMax; - GetAabb(ident, out aabbMin, out aabbMax); - - Vector3 halfExtents = (aabbMax - aabbMin) * 0.5f; - - float lx = 2f * (halfExtents.X); - float ly = 2f * (halfExtents.Y); - float lz = 2f * (halfExtents.Z); - - inertia = new Vector3(); - inertia.X = mass / (12.0f) * (ly * ly + lz * lz); - inertia.Y = mass / (12.0f) * (lx * lx + lz * lz); - inertia.Z = mass / (12.0f) * (lx * lx + ly * ly); - } - - public void AddChildShape(Matrix localTransform, CollisionShape shape) - { - _childTransforms.Add(localTransform); - _childShapes.Add(shape); - - //extend the local aabbMin/aabbMax - Vector3 localAabbMin, localAabbMax; - shape.GetAabb(localTransform, out localAabbMin, out localAabbMax); - if (_localAabbMin.X > localAabbMin.X) - { - _localAabbMin.X = localAabbMin.X; - } - if (_localAabbMax.X < localAabbMax.X) - { - _localAabbMax.X = localAabbMax.X; - } - if (_localAabbMin.Y > localAabbMin.Y) - { - _localAabbMin.Y = localAabbMin.Y; - } - if (_localAabbMax.Y < localAabbMax.Y) - { - _localAabbMax.Y = localAabbMax.Y; - } - if (_localAabbMin.Z > localAabbMin.Z) - { - _localAabbMin.Z = localAabbMin.Z; - } - if (_localAabbMax.Z < localAabbMax.Z) - { - _localAabbMax.Z = localAabbMax.Z; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConcaveShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConcaveShape.cs deleted file mode 100644 index c0b177db6e..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConcaveShape.cs +++ /dev/null @@ -1,55 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public abstract class ConcaveShape : CollisionShape - { - private float _collisionMargin; - - public ConcaveShape() { } - - public float CollisionMargin - { - get { return _collisionMargin; } - set { _collisionMargin = value; } - } - - public override float Margin - { - get - { - return _collisionMargin; - } - set - { - _collisionMargin = value; - } - } - - public abstract void ProcessAllTriangles(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax); - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConeShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConeShape.cs deleted file mode 100644 index 52084f46ef..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConeShape.cs +++ /dev/null @@ -1,208 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// ConeShape implements a Cone shape, around the X axis - /// - public class ConeShapeX : ConeShape - { - public ConeShapeX(float radius, float height) - : base(radius, height) - { - ConeUpIndex = 0; - } - } - - /// - /// ConeShape implements a Cone shape, around the Z axis - /// - public class ConeShapeZ : ConeShape - { - public ConeShapeZ(float radius, float height) - : base(radius, height) - { - ConeUpIndex = 2; - } - } - - /// - /// ConeShape implements a Cone shape, around the Y axis - /// - public class ConeShape : ConvexShape - { - private float _sinAngle; - private float _radius; - private float _height; - private int[] _coneIndices = new int[3]; - - public ConeShape(float radius, float height) - { - _radius = radius; - _height = height; - ConeUpIndex = 1; - _sinAngle = (_radius / (float)Math.Sqrt(_radius * _radius + _height * _height)); - } - - public float Radius { get { return _radius; } } - public float Height { get { return _height; } } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Cone; - } - } - - public override string Name - { - get - { - return "Cone"; - } - } - - //choose upAxis index - public int ConeUpIndex - { - get { return _coneIndices[1]; } - set - { - switch (value) - { - case 0: - _coneIndices[0] = 1; - _coneIndices[1] = 0; - _coneIndices[2] = 2; - break; - case 1: - _coneIndices[0] = 0; - _coneIndices[1] = 1; - _coneIndices[2] = 2; - break; - case 2: - _coneIndices[0] = 0; - _coneIndices[1] = 2; - _coneIndices[2] = 1; - break; - default: - BulletDebug.Assert(false); - break; - } - } - } - - private Vector3 ConeLocalSupport(Vector3 v) - { - float halfHeight = _height * 0.5f; - bool condition; - - if (_coneIndices[1] == 0) - condition = v.X > v.Length() * _sinAngle; - else if (_coneIndices[1] == 1) - condition = v.Y > v.Length() * _sinAngle; - else - condition = v.Z > v.Length() * _sinAngle; - - if (condition) - { - Vector3 tmp = new Vector3(); - MathHelper.SetValueByIndex(ref tmp, _coneIndices[1], halfHeight); - return tmp; - } - else - { - float s = (float)Math.Sqrt(MathHelper.GetValueByIndex(v, _coneIndices[0]) * MathHelper.GetValueByIndex(v, _coneIndices[0]) - + MathHelper.GetValueByIndex(v, _coneIndices[2]) * MathHelper.GetValueByIndex(v, _coneIndices[2])); - if (s > MathHelper.Epsilon) - { - float d = _radius / s; - Vector3 tmp = new Vector3(); - MathHelper.SetValueByIndex(ref tmp, _coneIndices[0], MathHelper.GetValueByIndex(v, _coneIndices[0]) * d); - MathHelper.SetValueByIndex(ref tmp, _coneIndices[1], -halfHeight); - MathHelper.SetValueByIndex(ref tmp, _coneIndices[2], MathHelper.GetValueByIndex(v, _coneIndices[2]) * d); - return tmp; - } - else - { - Vector3 tmp = new Vector3(); - MathHelper.SetValueByIndex(ref tmp, _coneIndices[1], -halfHeight); - return tmp; - } - } - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - return ConeLocalSupport(vec); - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int i = 0; i < vectors.Length; i++) - supportVerticesOut[i] = ConeLocalSupport(vectors[i]); - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - Matrix identity = Matrix.Identity; - Vector3 aabbMin, aabbMax; - GetAabb(identity, out aabbMin, out aabbMax); - - Vector3 halfExtents = (aabbMax - aabbMin) * 0.5f; - - float margin = Margin; - - float lx = 2f * (halfExtents.X + margin); - float ly = 2f * (halfExtents.Y + margin); - float lz = 2f * (halfExtents.Z + margin); - float x2 = lx * lx; - float y2 = ly * ly; - float z2 = lz * lz; - float scaledmass = mass * 0.08333333f; - - inertia = scaledmass * (new Vector3(y2 + z2, x2 + z2, x2 + y2)); - } - - public override Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 supVertex = ConeLocalSupport(vec); - if (Margin != 0) - { - Vector3 vecnorm = vec; - if (vecnorm.LengthSquared() < (MathHelper.Epsilon * MathHelper.Epsilon)) - { - vecnorm = new Vector3(-1f, -1f, -1f); - } - vecnorm = Vector3.Normalize(vecnorm); - supVertex += Margin * vecnorm; - } - return supVertex; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexHullShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexHullShape.cs deleted file mode 100644 index 8d06c90ea8..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexHullShape.cs +++ /dev/null @@ -1,184 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// ConvexHullShape implements an implicit (getSupportingVertex) Convex Hull of a Point Cloud (vertices) - /// No connectivity is needed. localGetSupportingVertex iterates linearly though all vertices. - /// on modern hardware, due to cache coherency this isn't that bad. Complex algorithms tend to trash the cash. - /// (memory is much slower then the cpu) - /// - public class ConvexHullShape : PolyhedralConvexShape - { - private List _points = new List(); - - public ConvexHullShape() { } - - public override int VertexCount - { - get - { - return _points.Count; - } - } - - public override int EdgeCount - { - get - { - return _points.Count; - } - } - - public override int PlaneCount - { - get - { - return 0; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.ConvexHull; - } - } - - public override string Name - { - get - { - return "Convex"; - } - } - - public override Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 supVertex = LocalGetSupportingVertexWithoutMargin(vec); - - if (Margin != 0) - { - Vector3 vecnorm = vec; - if (vecnorm.LengthSquared() < (MathHelper.Epsilon * MathHelper.Epsilon)) - { - vecnorm=new Vector3(-1, -1, -1); - } - vecnorm = Vector3.Normalize(vecnorm); - supVertex += Margin * vecnorm; - } - return supVertex; - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec0) - { - Vector3 supVec = new Vector3(); - float newDot, maxDot = -1e30f; - - Vector3 vec = vec0; - float lenSqr = vec.LengthSquared(); - if (lenSqr < 0.0001f) - { - vec = new Vector3(1, 0, 0); - } - else - { - float rlen = 1f / (float)Math.Sqrt(lenSqr); - vec *= rlen; - } - - for (int i = 0; i < _points.Count; i++) - { - Vector3 vtx = _points[i] * LocalScaling; - - newDot = Vector3.Dot(vec, vtx); - if (newDot > maxDot) - { - maxDot = newDot; - supVec = vtx; - } - } - return supVec; - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - float newDot; - //use 'w' component of supportVerticesOut? - /*{ - for (int i = 0; i < numVectors; i++) - { - supportVerticesOut[i][3] = -1e30f; - } - }*/ - #warning Warning! - for (int i = 0; i < _points.Count; i++) - { - Vector3 vtx = _points[i] * LocalScaling; - - for (int j = 0; j < vectors.Length; j++) - { - newDot = Vector3.Dot(vectors[j], vtx); - if (newDot > -1e30f) - { - //WARNING: don't swap next lines, the w component would get overwritten! - supportVerticesOut[j] = vtx; - //supportVerticesOut[j][3] = newDot; - #warning Warning! - } - } - } - } - - public override void GetEdge(int i, out Vector3 pa, out Vector3 pb) - { - int index0 = i % _points.Count; - int index1 = (i + 1) % _points.Count; - pa = _points[index0] * LocalScaling; - pb = _points[index1] * LocalScaling; - } - - public override void GetVertex(int i, out Vector3 vtx) - { - vtx = _points[i] * LocalScaling; - } - - public override void GetPlane(out Vector3 planeNormal, out Vector3 planeSupport, int i) - { - planeNormal = new Vector3(); - planeSupport = new Vector3(); - BulletDebug.Assert(false); - } - - public override bool IsInside(Vector3 pt, float tolerance) - { - BulletDebug.Assert(false); - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexShape.cs deleted file mode 100644 index d5c2fbd5c7..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexShape.cs +++ /dev/null @@ -1,141 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// ConvexShape is an abstract shape interface. - /// The explicit part provides plane-equations, the implicit part provides GetClosestPoint interface. - /// used in combination with GJK or btConvexCast - /// - public abstract class ConvexShape : CollisionShape - { - private const int _maxPreferredPenetrationDirections = 10; - private const float _convexDistanceMargin = 0.04f; - - private Vector3 _localScaling; - private Vector3 _implicitShapeDimensions; - private float _collisionMargin; - - public ConvexShape() - : base() - { - _localScaling = Vector3.One; - _collisionMargin = ConvexDistanceMargin; - } - - public static int MaxPreferredPenetrationDirections { get { return _maxPreferredPenetrationDirections; } } - public static float ConvexDistanceMargin { get { return _convexDistanceMargin; } } - - public Vector3 ImplicitShapeDimensions { get { return _implicitShapeDimensions; } protected set { _implicitShapeDimensions = value; } } - public virtual int PreferredPenetrationDirectionsCount { get { return 0; } } - - protected float CollisionMargin { get { return _collisionMargin; } set { _collisionMargin = value; } } - - public virtual void GetPreferredPenetrationDirection(int index, out Vector3 penetrationVector) - { - penetrationVector = new Vector3(); - BulletDebug.Assert(false); - } - - public abstract Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec); - //notice that the vectors should be unit length - public abstract void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut); - - /// - /// getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - /// - /// - /// - /// - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - GetAabbSlow(t, out aabbMin, out aabbMax); - } - - public override Vector3 LocalScaling - { - get - { - return _localScaling; - } - set - { - _localScaling = value; - } - } - - public override float Margin - { - get - { - return _collisionMargin; - } - set - { - _collisionMargin = value; - } - } - - public virtual Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 supVertex = LocalGetSupportingVertexWithoutMargin(vec); - - if (Margin != 0f) - { - Vector3 vecnorm = vec; - if (vecnorm.LengthSquared() < (MathHelper.Epsilon * MathHelper.Epsilon)) - { - vecnorm = new Vector3(-1f, -1f, -1f); - } - vecnorm.Normalize(); - supVertex += Margin * vecnorm; - } - return supVertex; - } - - public virtual void GetAabbSlow(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - float margin = Margin; - aabbMax = new Vector3(); - aabbMin = new Vector3(); - - for (int i = 0; i < 3; i++) - { - Vector3 vec = new Vector3(0f, 0f, 0f); - MathHelper.SetElement(ref vec, i, 1); - - Vector3 sv = LocalGetSupportingVertex(Vector3.TransformNormal(vec, t)); - - Vector3 tmp = MathHelper.MatrixToVector(t, sv); - MathHelper.SetElement(ref aabbMax, i, MathHelper.GetElement(tmp, i) + margin); - MathHelper.SetElement(ref vec, i, -1f); - tmp = MathHelper.MatrixToVector(t, LocalGetSupportingVertex(Vector3.TransformNormal(vec, t))); - MathHelper.SetElement(ref aabbMin, i, MathHelper.GetElement(tmp, i) - margin); - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexTriangleMeshShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexTriangleMeshShape.cs deleted file mode 100644 index 3e46c66e26..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/ConvexTriangleMeshShape.cs +++ /dev/null @@ -1,185 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// ConvexTriangleMeshShape is a convex hull of a triangle mesh. If you just have a point cloud, you can use ConvexHullShape instead. - /// It uses the StridingMeshInterface instead of a point cloud. This can avoid the duplication of the triangle mesh data. - /// - public class ConvexTriangleMeshShape : PolyhedralConvexShape - { - private StridingMeshInterface _stridingMesh; - - public ConvexTriangleMeshShape(StridingMeshInterface meshInterface) - { - _stridingMesh = meshInterface; - } - - public StridingMeshInterface getStridingMesh() - { - return _stridingMesh; - } - - public override int VertexCount - { - get - { - return 0; - } - } - - public override int EdgeCount - { - get - { - return 0; - } - } - - public override int PlaneCount - { - get - { - return 0; - } - } - - public override Vector3 LocalScaling - { - get - { - return base.LocalScaling; - } - set - { - _stridingMesh.Scaling = value; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.ConvexTriangleMesh; - } - } - - public override string Name - { - get - { - return "ConvexTrimesh"; - } - } - - public override void GetEdge(int i, out Vector3 pa, out Vector3 pb) - { - pa = new Vector3(); - pb = new Vector3(); - BulletDebug.Assert(false); - } - - public override void GetVertex(int i, out Vector3 vtx) - { - vtx = new Vector3(); - BulletDebug.Assert(false); - } - - public override void GetPlane(out Vector3 planeNormal, out Vector3 planeSupport, int i) - { - planeNormal = new Vector3(); - planeSupport = new Vector3(); - BulletDebug.Assert(false); - } - - public override bool IsInside(Vector3 pt, float tolerance) - { - BulletDebug.Assert(false); - return false; - } - - public override Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 supVertex = LocalGetSupportingVertexWithoutMargin(vec); - - if (Margin != 0) - { - Vector3 vecnorm = vec; - if (vecnorm.LengthSquared() < (MathHelper.Epsilon * MathHelper.Epsilon)) - { - vecnorm = new Vector3(-1, -1, -1); - } - vecnorm = Vector3.Normalize(vecnorm); - supVertex += Margin * vecnorm; - } - return supVertex; - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec0) - { - Vector3 supVec = new Vector3(); - - Vector3 vec = vec0; - float lenSqr = vec.LengthSquared(); - if (lenSqr < 0.0001f) - { - vec = new Vector3(1, 0, 0); - } - else - { - float rlen = 1f / (float)Math.Sqrt(lenSqr); - vec *= rlen; - } - - LocalSupportVertexCallback supportCallback = new LocalSupportVertexCallback(vec); - Vector3 aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - _stridingMesh.InternalProcessAllTriangles(supportCallback, -aabbMax, aabbMax); - supVec = supportCallback.SupportVertexLocal; - - return supVec; - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - //use 'w' component of supportVerticesOut? - /*{ - for (int i = 0; i < numVectors; i++) - { - supportVerticesOut[i][3] = -1e30f; - } - }*/ - for (int j = 0; j < vectors.Length; j++) - { - Vector3 vec = vectors[j]; - LocalSupportVertexCallback supportCallback = new LocalSupportVertexCallback(vec); - Vector3 aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - _stridingMesh.InternalProcessAllTriangles(supportCallback, -aabbMax, aabbMax); - supportVerticesOut[j] = supportCallback.SupportVertexLocal; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShape.cs deleted file mode 100644 index 85bf7695b8..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShape.cs +++ /dev/null @@ -1,136 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// implements cylinder shape interface - /// - public class CylinderShape : BoxShape - { - public CylinderShape(Vector3 halfExtents) - : base(halfExtents) - { - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Cylinder; - } - } - - public virtual int UpAxis - { - get - { - return 1; - } - } - - public virtual float Radius - { - get - { - return HalfExtents.Z; - } - } - - //debugging - public override string Name - { - get - { - return "CylinderY"; - } - } - - //getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - GetAabbSlow(t, out aabbMin, out aabbMax); - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - return CylinderLocalSupportY(HalfExtents, vec); - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int i = 0; i < vectors.Length; i++) - { - supportVerticesOut[i] = CylinderLocalSupportY(HalfExtents, vectors[i]); - } - } - - public override Vector3 LocalGetSupportingVertex(Vector3 vec) - { - - Vector3 supVertex; - supVertex = LocalGetSupportingVertexWithoutMargin(vec); - - if (Margin != 0) - { - Vector3 vecnorm = vec; - if (vecnorm.LengthSquared() < (MathHelper.Epsilon * MathHelper.Epsilon)) - { - vecnorm=new Vector3(-1, -1, -1); - } - vecnorm = Vector3.Normalize(vecnorm); - supVertex += Margin * vecnorm; - } - return supVertex; - } - - private Vector3 CylinderLocalSupportY(Vector3 halfExtents, Vector3 v) - { - float radius = halfExtents.X; - float halfHeight = halfExtents.Y; - - Vector3 tmp = new Vector3(); - float d; - - float s = (float)Math.Sqrt(v.X * v.X + v.Z * v.Z); - if (s != 0) - { - d = radius / s; - tmp.X = v.X * d; - tmp.Y = v.Y < 0 ? -halfHeight : halfHeight; - tmp.Z = v.Z * d; - return tmp; - } - else - { - tmp.X = radius; - tmp.Y = v.Y < 0 ? -halfHeight : halfHeight; - tmp.Z = 0; - return tmp; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShapeX.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShapeX.cs deleted file mode 100644 index da84462903..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShapeX.cs +++ /dev/null @@ -1,100 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class CylinderShapeX : CylinderShape - { - public CylinderShapeX(Vector3 halfExtents) - : base(halfExtents) { } - - public override int UpAxis - { - get - { - return 0; - } - } - - public override float Radius - { - get - { - return HalfExtents.Y; - } - } - - //debugging - public override string Name - { - get - { - return "CylinderX"; - } - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - return CylinderLocalSupportX(HalfExtents, vec); - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int i = 0; i < vectors.Length; i++) - { - supportVerticesOut[i] = CylinderLocalSupportX(HalfExtents, vectors[i]); - } - } - - private Vector3 CylinderLocalSupportX(Vector3 halfExtents, Vector3 v) - { - //mapping depends on how cylinder local orientation is - // extents of the cylinder is: X,Y is for radius, and Z for height - float radius = halfExtents.Y; - float halfHeight = halfExtents.X; - - Vector3 tmp = new Vector3(); - float d; - - float s = (float)Math.Sqrt(v.Y * v.Y + v.Z * v.Z); - if (s != 0) - { - d = radius / s; - tmp.Y = v.Y * d; - tmp.X = v.X < 0 ? -halfHeight : halfHeight; - tmp.Z = v.Z * d; - return tmp; - } - else - { - tmp.Y = radius; - tmp.X = v.X < 0 ? -halfHeight : halfHeight; - tmp.Z = 0; - return tmp; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShapeZ.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShapeZ.cs deleted file mode 100644 index 10a1995628..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/CylinderShapeZ.cs +++ /dev/null @@ -1,100 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class CylinderShapeZ : CylinderShape - { - public CylinderShapeZ(Vector3 halfExtents) - : base(halfExtents) { } - - public override int UpAxis - { - get - { - return 2; - } - } - - public override float Radius - { - get - { - return HalfExtents.X; - } - } - - //debugging - public override string Name - { - get - { - return "CylinderZ"; - } - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - return CylinderLocalSupportZ(HalfExtents, vec); - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int i = 0; i < vectors.Length; i++) - { - supportVerticesOut[i] = CylinderLocalSupportZ(HalfExtents, vectors[i]); - } - } - - Vector3 CylinderLocalSupportZ(Vector3 halfExtents, Vector3 v) - { - //mapping depends on how cylinder local orientation is - // extents of the cylinder is: X,Y is for radius, and Z for height - float radius = halfExtents.X; - float halfHeight = halfExtents.Z; - - Vector3 tmp = new Vector3(); - float d; - - float s = (float)Math.Sqrt(v.X * v.X + v.Y * v.Y); - if (s != 0) - { - d = radius / s; - tmp.X = v.X * d; - tmp.Z = v.Z < 0 ? -halfHeight : halfHeight; - tmp.Y = v.Y * d; - return tmp; - } - else - { - tmp.X = radius; - tmp.Z = v.Z < 0 ? -halfHeight : halfHeight; - tmp.Y = 0; - return tmp; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/EmptyShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/EmptyShape.cs deleted file mode 100644 index ef6f13454f..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/EmptyShape.cs +++ /dev/null @@ -1,80 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; -using System.Diagnostics; - -namespace XnaDevRu.BulletX -{ - public class EmptyShape : ConcaveShape - { - private Vector3 _localScaling; - - public override string Name - { - get - { - return "Empty"; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Empty; - } - } - - public override Vector3 LocalScaling - { - get - { - return _localScaling; - } - set - { - _localScaling = value; - } - } - - public override void ProcessAllTriangles(ITriangleCallback callback, MonoXnaCompactMaths.Vector3 aabbMin, MonoXnaCompactMaths.Vector3 aabbMax) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - Vector3 margin = new Vector3(Margin, Margin, Margin); - aabbMin = t.Translation - margin; - aabbMax = t.Translation + margin; - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - inertia = new Vector3(); - BulletDebug.Assert(false); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/FilteredCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/FilteredCallback.cs deleted file mode 100644 index dffd8650d4..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/FilteredCallback.cs +++ /dev/null @@ -1,55 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class FilteredCallback : ITriangleIndexCallback - { - private ITriangleCallback _callback; - private Vector3 _aabbMin; - private Vector3 _aabbMax; - - public FilteredCallback(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax) - { - _callback = callback; - _aabbMin = aabbMin; - _aabbMax = aabbMax; - } - - public ITriangleCallback TriangleCallback { get { return _callback; } set { _callback = value; } } - public Vector3 AabbMin { get { return _aabbMin; } set { _aabbMin = value; } } - public Vector3 AabbMax { get { return _aabbMax; } set { _aabbMax = value; } } - - public void ProcessTriangleIndex(Vector3[] triangle, int partId, int triangleIndex) - { - if (MathHelper.TestTriangleAgainstAabb2(triangle, _aabbMin, _aabbMax)) - { - //check aabb in triangle-space, before doing this - _callback.ProcessTriangle(triangle, partId, triangleIndex); - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/HeightfieldTerrainShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/HeightfieldTerrainShape.cs deleted file mode 100644 index 0f30f1f2e8..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/HeightfieldTerrainShape.cs +++ /dev/null @@ -1,360 +0,0 @@ -/* - * WARNING!: this class is not in the original BulletX - * By the way it's based on the Bullet btHeightfieldTerrainShape: - * http://www.continuousphysics.com/Bullet/BulletFull/classbtHeightfieldTerrainShape.html - ***************************************************************************************** - * 3RD PARTY LICENSE. The next it's the original 3rd party lincense of Bullet: - * ---------------------------------------------------------------------------- -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - * ------------------------------------------------------------------------------ -*/ -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class HeightfieldTerrainShape : ConcaveShape - { - private Vector3 _localAabbMin; - private Vector3 _localAabbMax; - private Vector3 _localScaling = new Vector3(1f,1f,1f); - private int _width; - private int _length; - private float[] _heightfieldData; - private float _maxHeight; - private int _upAxis; - private bool _useFloatData; - private bool _flipQuadEdges; - private bool _useDiamondSubdivision = false; - private float _defaultCollisionMargin = 0.6f; - - public HeightfieldTerrainShape(int width, int length, float[] heightfieldData, float maxHeight, - int upAxis, bool useFloatData, bool flipQuadEdges) - { - _width = width; - _length = length; - _heightfieldData = heightfieldData; - _maxHeight = maxHeight; - _upAxis = upAxis; - _useFloatData = useFloatData; - _flipQuadEdges = flipQuadEdges; - this.Margin = _defaultCollisionMargin; - - float quantizationMargin = 1f; - - //enlarge the AABB to avoid division by zero when initializing the quantization value - Vector3 clampValue = new Vector3(quantizationMargin, quantizationMargin, quantizationMargin); - Vector3 halfExtents = new Vector3(0, 0, 0); - - switch (_upAxis) - { - case 0: - halfExtents.X = _maxHeight; - halfExtents.Y = _width; - halfExtents.Z = _length; - break; - case 1: - halfExtents.X = _width; - halfExtents.Y = _maxHeight; - halfExtents.Z = _length; - break; - case 2: - halfExtents.X = _width; - halfExtents.Y = _length; - halfExtents.Z = _maxHeight; - break; - default: - //need to get valid _upAxis - //btAssert(0); - throw new Exception("HeightfieldTerrainShape: need to get valid _upAxis"); - } - - halfExtents *= 0.5f; - - _localAabbMin = -halfExtents - clampValue; - _localAabbMax = halfExtents + clampValue; - //Vector3 aabbSize = new Vector3(); - //aabbSize = m_localAabbMax - m_localAabbMin; - - } - - protected Vector3 LocalAabbMin - { get { return _localAabbMin; } set { _localAabbMin = value; } } - protected Vector3 LocalAabbMax - { get { return _localAabbMax; } set { _localAabbMax = value; } } - public override string Name - { - get - { - return "HeightfieldTerrain"; - } - } - public override Vector3 LocalScaling - { - get - { - return _localScaling; - } - set - { - _localScaling = value; - } - } - public override float Margin - { - get - { - return base.Margin; - } - set - { - base.Margin = value; - } - } - public override BroadphaseNativeTypes ShapeType - { - get { return BroadphaseNativeTypes.Terrain; } - } - public Vector3 HalfExtents - { - get - { - Vector3 halfExtents = new Vector3(); - switch (_upAxis) - { - case 0: - halfExtents.X = 2f;//_maxHeight; - halfExtents.Y = _width; - halfExtents.Z = _length; - break; - case 1: - halfExtents.X = _width; - halfExtents.Y = 2f;// _maxHeight; - halfExtents.Z = _length; - break; - case 2: - halfExtents.X = _width; - halfExtents.Y = _length; - halfExtents.Z = 2f;// _maxHeight; - break; - default: - //need to get valid m_upAxis - //btAssert(0); - throw new Exception("HeightfieldTerrainShape: need to get valid _upAxis"); - //break; - } - halfExtents *= 0.5f; - return halfExtents; - } - } - - public override void ProcessAllTriangles(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax) - { - //(void)callback; - //(void)aabbMax; - //(void)aabbMin; - - //quantize the aabbMin and aabbMax, and adjust the start/end ranges - - int[] quantizedAabbMin = new int[3]; - int[] quantizedAabbMax = new int[3]; - - Vector3 localAabbMin = aabbMin * new Vector3(1f/_localScaling.X,1f/_localScaling.Y,1f/_localScaling.Z ); - Vector3 localAabbMax = aabbMax * new Vector3(1f/_localScaling.X,1f/_localScaling.Y,1f/_localScaling.Z); - - quantizeWithClamp(ref quantizedAabbMin, localAabbMin); - quantizeWithClamp(ref quantizedAabbMax, localAabbMax); - - - - int startX=0; - int endX=_width-1; - int startJ=0; - int endJ=_length-1; - - switch(_upAxis) - { - case 0: - quantizedAabbMin[1]+=_width/2-1; - quantizedAabbMax[1]+=_width/2+1; - quantizedAabbMin[2]+=_length/2-1; - quantizedAabbMax[2]+=_length/2+1; - - if (quantizedAabbMin[1]>startX) - startX = quantizedAabbMin[1]; - if (quantizedAabbMax[1]startJ) - startJ = quantizedAabbMin[2]; - if (quantizedAabbMax[2]startX) - startX = quantizedAabbMin[0]; - if (quantizedAabbMax[0]startJ) - startJ = quantizedAabbMin[2]; - if (quantizedAabbMax[2]startX) - startX = quantizedAabbMin[0]; - if (quantizedAabbMax[0]startJ) - startJ = quantizedAabbMin[1]; - if (quantizedAabbMax[1] 0))) - { - //first triangle - getVertex(x,j,ref vertices[0]); - getVertex(x+1,j,ref vertices[1]); - getVertex(x+1,j+1,ref vertices[2]); - //callback->processTriangle(vertices,x,j); - callback.ProcessTriangle(vertices,x,j); - - //second triangle - getVertex(x,j,ref vertices[0]); - getVertex(x+1,j+1,ref vertices[1]); - getVertex(x,j+1,ref vertices[2]); - //callback->processTriangle(vertices,x,j); - callback.ProcessTriangle(vertices, x, j); - } - else - { - //first triangle - getVertex(x,j,ref vertices[0]); - getVertex(x,j+1,ref vertices[1]); - getVertex(x+1,j,ref vertices[2]); - //callback->processTriangle(vertices,x,j); - callback.ProcessTriangle(vertices,x,j); - - //second triangle - getVertex(x+1,j,ref vertices[0]); - getVertex(x,j+1,ref vertices[1]); - getVertex(x+1,j+1,ref vertices[2]); - //callback->processTriangle(vertices,x,j); - callback.ProcessTriangle(vertices,x,j); - } - } - } - } - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - //aabbMin = new Vector3(-1e30f, -1e30f, -1e30f); - //aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - - Vector3 halfExtents = (_localAabbMax - _localAabbMin) * _localScaling * 0.5f; - - Vector3 center = t.Translation; - Vector3 extent = new Vector3(Math.Abs(halfExtents.X), Math.Abs(halfExtents.Y), Math.Abs(halfExtents.Z)); - extent += new Vector3(Margin, Margin, Margin); - - aabbMin = center - extent; - aabbMax = center + extent; - } - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - //moving concave objects not supported - inertia = new Vector3(); - } - public float getHeightFieldValue(int x,int y) - { - float val = 0f; - if (_useFloatData) - { - val = _heightfieldData[(y * _width) + x]; - } - else - { - //assume unsigned short int - int heightFieldValue = (int)_heightfieldData[(y * _width) + x]; - val = heightFieldValue * _maxHeight/65535f; - } - return val; - } - public void getVertex(int x,int y,ref Vector3 vertex) - { - if (x < 0) x = 0; - if (y < 0) y = 0; - if (x >= _width) x = _width - 1; - if (y >= _length) y = _length - 1; - float height = getHeightFieldValue(x,y); - switch(_upAxis) - { - case 0: - vertex.X = height; - vertex.Y = (- _width/2 ) + x; - vertex.Z = (- _length/2 ) + y; - break; - case 1: - vertex.X = (- _width/2 ) + x; - vertex.Y = height; - vertex.Z = (- _length/2 ) + y; - break; - case 2: - vertex.X = (- _width/2 ) + x; - vertex.Y = (- _length/2 ) + y; - vertex.Z = height; - break; - default: - //need to get valid m_upAxis - throw new Exception("HeightfieldTerrainShape: need to get valid _upAxis"); - //break; - } - vertex *= _localScaling; - } - public void quantizeWithClamp(ref int[] _out,Vector3 point) - { - Vector3 clampedPoint = point; - MathHelper.SetMax(ref clampedPoint,_localAabbMin); - MathHelper.SetMin(ref clampedPoint, _localAabbMax); - Vector3 v = clampedPoint; - - _out[0] = (int)(v.X); - _out[1] = (int)(v.Y); - _out[2] = (int)(v.Z); - //correct for - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/InternalTriangleIndexCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/InternalTriangleIndexCallback.cs deleted file mode 100644 index 51c65b76dc..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/InternalTriangleIndexCallback.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public interface ITriangleIndexCallback - { - void ProcessTriangleIndex(Vector3[] triangle, int partId, int triangleIndex); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/LocalSupportVertexCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/LocalSupportVertexCallback.cs deleted file mode 100644 index 1e5e1414f4..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/LocalSupportVertexCallback.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class LocalSupportVertexCallback : ITriangleIndexCallback - { - private Vector3 _supportVertexLocal; - private float _maxDot; - private Vector3 _supportVecLocal; - - public LocalSupportVertexCallback(Vector3 supportVecLocal) - { - _supportVertexLocal = new Vector3(); - _maxDot = -1e30f; - _supportVecLocal = supportVecLocal; - } - - public float MaxDot { get { return _maxDot; } set { _maxDot = value; } } - public Vector3 SupportVertexLocal { get { return _supportVecLocal; } set { _supportVecLocal = value; } } - - public void ProcessTriangleIndex(Vector3[] triangle, int partId, int triangleIndex) - { - for (int i = 0; i < 3; i++) - { - float dot = Vector3.Dot(_supportVecLocal, triangle[i]); - if (dot > _maxDot) - { - _maxDot = dot; - _supportVertexLocal = triangle[i]; - } - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/MinkowskiSumShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/MinkowskiSumShape.cs deleted file mode 100644 index 8cdcfbef25..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/MinkowskiSumShape.cs +++ /dev/null @@ -1,99 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// MinkowskiSumShape represents implicit (getSupportingVertex) based minkowski sum of two convex implicit shapes. - /// - public class MinkowskiSumShape : ConvexShape - { - private Matrix _transformA; - private Matrix _transformB; - private ConvexShape _shapeA; - private ConvexShape _shapeB; - - public MinkowskiSumShape(ConvexShape shapeA, ConvexShape shapeB) - { - _shapeA = shapeA; - _shapeB = shapeB; - _transformA = Matrix.Identity; - _transformB = Matrix.Identity; - } - - public Matrix TransformA { get { return _transformA; } set { _transformA = value; } } - public Matrix TransformB { get { return _transformB; } set { _transformB = value; } } - public ConvexShape ShapeA { get { return _shapeA; } } - public ConvexShape ShapeB { get { return _shapeB; } } - - public override float Margin - { - get - { - return _shapeA.Margin + _shapeB.Margin; - } - set - { - base.Margin = value; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.MinkowskiDifference; - } - } - - public override string Name - { - get - { - return "MinkowskiSum"; - } - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - Vector3 supVertexA = MathHelper.MatrixToVector(_transformA, _shapeA.LocalGetSupportingVertexWithoutMargin(Vector3.TransformNormal(vec, _transformA))); - Vector3 supVertexB = MathHelper.MatrixToVector(_transformB, _shapeB.LocalGetSupportingVertexWithoutMargin(Vector3.TransformNormal(vec, _transformB))); - return supVertexA + supVertexB; - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int i = 0; i < vectors.Length; i++) - supportVerticesOut[i] = LocalGetSupportingVertexWithoutMargin(vectors[i]); - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - inertia = new Vector3(); - BulletDebug.Assert(false); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/MultiSphereShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/MultiSphereShape.cs deleted file mode 100644 index 73fd09421e..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/MultiSphereShape.cs +++ /dev/null @@ -1,154 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// MultiSphereShape represents implicit convex hull of a collection of spheres (using getSupportingVertex) - /// - public class MultiSphereShape : ConvexShape - { - private const int _maxNumSpheres = 5; - private Vector3[] _localPositions = new Vector3[MaxNumSpheres]; - private float[] _radi = new float[MaxNumSpheres]; - private Vector3 _inertiaHalfExtents; - - private int m_numSpheres; - - public MultiSphereShape(Vector3 inertiaHalfExtents, Vector3[] positions, float[] radi, int numSpheres) - { - _inertiaHalfExtents = inertiaHalfExtents; - float startMargin = 1e30f; - - m_numSpheres = numSpheres; - for (int i = 0; i < m_numSpheres; i++) - { - _localPositions[i] = positions[i]; - _radi[i] = radi[i]; - if (radi[i] < startMargin) - startMargin = radi[i]; - } - Margin = startMargin; - } - - public static int MaxNumSpheres { get { return _maxNumSpheres; } } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.MultiSphere; - } - } - - public override string Name - { - get - { - return "MultiSphere"; - } - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vecA) - { - Vector3 supVec = new Vector3(); - - float maxDot = -1e30f; - - - Vector3 vec = vecA; - float lenSqr = vec.LengthSquared(); - if (lenSqr < 0.0001f) - { - vec = new Vector3(1, 0, 0); - } - else - { - float rlen = 1f / (float)Math.Sqrt(lenSqr); - vec *= rlen; - } - - Vector3 vtx; - float newDot; - - for (int i = 0; i < m_numSpheres; i++) - { - vtx = _localPositions[i] + vec * LocalScaling * _radi[i] - vec * Margin; - newDot = Vector3.Dot(vec, vtx); - if (newDot > maxDot) - { - maxDot = newDot; - supVec = vtx; - } - } - - return supVec; - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int j = 0; j < vectors.Length; j++) - { - float maxDot = -1e30f; - Vector3 vtx; - float newDot; - - for (int i = 0; i < m_numSpheres; i++) - { - vtx = _localPositions[i] + vectors[j] * LocalScaling * _radi[i] - vectors[j] * Margin; - newDot = Vector3.Dot(vectors[j], vtx); - if (newDot > maxDot) - { - maxDot = newDot; - supportVerticesOut[j] = vtx; - } - } - } - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - //as an approximation, take the inertia of the box that bounds the spheres - Matrix ident = Matrix.Identity; - Vector3 halfExtents = _inertiaHalfExtents; - - float margin = ConvexDistanceMargin; - - float lx = 2f * (halfExtents.X + margin); - float ly = 2f * (halfExtents.Y + margin); - float lz = 2f * (halfExtents.Z + margin); - float x2 = lx * lx; - float y2 = ly * ly; - float z2 = lz * lz; - float scaledmass = mass * 0.08333333f; - - inertia = new Vector3(); - inertia.X = scaledmass * (y2 + z2); - inertia.Y = scaledmass * (x2 + z2); - inertia.Z = scaledmass * (x2 + y2); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/NodeOverlapCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/NodeOverlapCallback.cs deleted file mode 100644 index 324cdbc9eb..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/NodeOverlapCallback.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX -{ - public interface INodeOverlapCallback - { - void ProcessNode(OptimizedBvhNode node); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/OptimizedBvh.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/OptimizedBvh.cs deleted file mode 100644 index 5b7a5e4fea..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/OptimizedBvh.cs +++ /dev/null @@ -1,293 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// OptimizedBvh store an AABB tree that can be quickly traversed on CPU (and SPU,GPU in future) - /// - public class OptimizedBvh - { - private static int _maxIterations = 0; - private OptimizedBvhNode _rootNode; - - private OptimizedBvhNode[] _contiguousNodes; - private int _curNodeIndex; - - private List _leafNodes = new List(); - - public OptimizedBvh() { } - - public void Build(StridingMeshInterface triangles) - { - NodeTriangleCallback callback = new NodeTriangleCallback(_leafNodes); - - Vector3 aabbMin = new Vector3(-1e30f, -1e30f, -1e30f); - Vector3 aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - - triangles.InternalProcessAllTriangles(callback, aabbMin, aabbMax); - - //now we have an array of leafnodes in m_leafNodes - _contiguousNodes = new OptimizedBvhNode[2 * _leafNodes.Count]; - for (int i = 0; i < _contiguousNodes.Length; i++) - _contiguousNodes[i] = new OptimizedBvhNode(); - _curNodeIndex = 0; - - _rootNode = BuildTree(_leafNodes, 0, _leafNodes.Count); - } - - public OptimizedBvhNode BuildTree(List leafNodes, int startIndex, int endIndex) - { - OptimizedBvhNode internalNode; - - int splitAxis, splitIndex, i; - int numIndices = endIndex - startIndex; - int curIndex = _curNodeIndex; - - if (numIndices <= 0) - throw new BulletException(); - - if (numIndices == 1) - { - _contiguousNodes[_curNodeIndex++] = leafNodes[startIndex]; - //return new (&m_contiguousNodes[m_curNodeIndex++]) btOptimizedBvhNode(leafNodes[startIndex]); - return leafNodes[startIndex]; - } - - //calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'. - splitAxis = CalculateSplittingAxis(leafNodes, startIndex, endIndex); - - splitIndex = SortAndCalculateSplittingIndex(leafNodes, startIndex, endIndex, splitAxis); - - internalNode = _contiguousNodes[_curNodeIndex++]; - - internalNode.AabbMax = new Vector3(-1e30f, -1e30f, -1e30f); - internalNode.AabbMin = new Vector3(1e30f, 1e30f, 1e30f); - - for (i = startIndex; i < endIndex; i++) - { - internalNode.AabbMax = MathHelper.SetMax(internalNode.AabbMax, leafNodes[i].AabbMax); - internalNode.AabbMin = MathHelper.SetMin(internalNode.AabbMin, leafNodes[i].AabbMin); - } - - //internalNode->m_escapeIndex; - internalNode.LeftChild = BuildTree(leafNodes, startIndex, splitIndex); - internalNode.RightChild = BuildTree(leafNodes, splitIndex, endIndex); - - internalNode.EscapeIndex = _curNodeIndex - curIndex; - return internalNode; - } - - public int CalculateSplittingAxis(List leafNodes, int startIndex, int endIndex) - { - Vector3 means = new Vector3(); - Vector3 variance = new Vector3(); - int numIndices = endIndex - startIndex; - - for (int i = startIndex; i < endIndex; i++) - { - Vector3 center = 0.5f * (leafNodes[i].AabbMax + leafNodes[i].AabbMin); - means += center; - } - means *= (1f / (float)numIndices); - - for (int i = startIndex; i < endIndex; i++) - { - Vector3 center = 0.5f * (leafNodes[i].AabbMax + leafNodes[i].AabbMin); - Vector3 diff2 = center - means; - diff2 = diff2 * diff2; - variance += diff2; - } - variance *= (1f / ((float)numIndices - 1)); - - return MathHelper.MaxAxis(variance); - } - - public int SortAndCalculateSplittingIndex(List leafNodes, int startIndex, int endIndex, int splitAxis) - { - int splitIndex = startIndex; - int numIndices = endIndex - startIndex; - float splitValue; - - Vector3 means = new Vector3(); - for (int i = startIndex; i < endIndex; i++) - { - Vector3 center = 0.5f * (leafNodes[i].AabbMax + leafNodes[i].AabbMin); - means += center; - } - means *= (1f / (float)numIndices); - - if (splitAxis == 0) - splitValue = means.X; - else if (splitAxis == 1) - splitValue = means.Y; - else if (splitAxis == 2) - splitValue = means.Z; - else - throw new ArgumentException(); - - //sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'. - for (int i = startIndex; i < endIndex; i++) - { - Vector3 center = 0.5f * (leafNodes[i].AabbMax + leafNodes[i].AabbMin); - float centerSplit; - - if (splitAxis == 0) - centerSplit = means.X; - else if (splitAxis == 1) - centerSplit = means.Y; - else if (splitAxis == 2) - centerSplit = means.Z; - else - throw new ArgumentException(); - - if (centerSplit > splitValue) - { - //swap - OptimizedBvhNode tmp = leafNodes[i]; - leafNodes[i] = leafNodes[splitIndex]; - leafNodes[splitIndex] = tmp; - splitIndex++; - } - } - if ((splitIndex == startIndex) || (splitIndex == (endIndex - 1))) - { - splitIndex = startIndex + (numIndices >> 1); - } - return splitIndex; - } - - public void WalkTree(OptimizedBvhNode rootNode, INodeOverlapCallback nodeCallback, Vector3 aabbMin, Vector3 aabbMax) - { - bool isLeafNode, aabbOverlap = MathHelper.TestAabbAgainstAabb2(aabbMin, aabbMax, rootNode.AabbMin, rootNode.AabbMax); - if (aabbOverlap) - { - isLeafNode = (rootNode.LeftChild == null && rootNode.RightChild == null); - if (isLeafNode) - { - nodeCallback.ProcessNode(rootNode); - } - else - { - WalkTree(rootNode.LeftChild, nodeCallback, aabbMin, aabbMax); - WalkTree(rootNode.RightChild, nodeCallback, aabbMin, aabbMax); - } - } - } - - public void WalkStacklessTree(OptimizedBvhNode[] rootNodeArray, INodeOverlapCallback nodeCallback, Vector3 aabbMin, Vector3 aabbMax) - { - int escapeIndex, curIndex = 0; - int walkIterations = 0; - bool aabbOverlap, isLeafNode; - int rootNodeIndex = 0; - OptimizedBvhNode rootNode = rootNodeArray[rootNodeIndex]; - - while (curIndex < _curNodeIndex) - { - //catch bugs in tree data - if (walkIterations >= _curNodeIndex) - throw new BulletException(); - - walkIterations++; - aabbOverlap = MathHelper.TestAabbAgainstAabb2(aabbMin, aabbMax, rootNode.AabbMin, rootNode.AabbMax); - isLeafNode = (rootNode.LeftChild == null && rootNode.RightChild == null); - - if (isLeafNode && aabbOverlap) - { - nodeCallback.ProcessNode(rootNode); - } - - if (aabbOverlap || isLeafNode) - { - rootNodeIndex++; // this - curIndex++; - if (rootNodeIndex < rootNodeArray.Length) - rootNode = rootNodeArray[rootNodeIndex]; - } - else - { - escapeIndex = rootNode.EscapeIndex; - rootNodeIndex += escapeIndex; // and this - curIndex += escapeIndex; - if (rootNodeIndex < rootNodeArray.Length) - rootNode = rootNodeArray[rootNodeIndex]; - } - - } - - if (_maxIterations < walkIterations) - _maxIterations = walkIterations; - } - - public void ReportAabbOverlappingNodex(INodeOverlapCallback nodeCallback, Vector3 aabbMin, Vector3 aabbMax) - { - //either choose recursive traversal (walkTree) or stackless (walkStacklessTree) - //walkTree(m_rootNode1,nodeCallback,aabbMin,aabbMax); - //WalkStacklessTree(_rootNode, nodeCallback, aabbMin, aabbMax); - WalkStacklessTree(_contiguousNodes, nodeCallback, aabbMin, aabbMax); - } - - public void ReportSphereOverlappingNodex(INodeOverlapCallback nodeCallback, Vector3 aabbMin, Vector3 aabbMax) { } - } - - public class NodeTriangleCallback : ITriangleIndexCallback - { - private List _triangleNodes; - - public NodeTriangleCallback(List triangleNodes) - { - _triangleNodes = triangleNodes; - } - - public List TriangleNodes { get { return _triangleNodes; } set { _triangleNodes = value; } } - - public void ProcessTriangleIndex(Vector3[] triangle, int partId, int triangleIndex) - { - - OptimizedBvhNode node = new OptimizedBvhNode(); - node.AabbMin = new Vector3(1e30f, 1e30f, 1e30f); - node.AabbMax = new Vector3(-1e30f, -1e30f, -1e30f); - - node.AabbMin = MathHelper.SetMin(node.AabbMin, triangle[0]); - node.AabbMax = MathHelper.SetMax(node.AabbMax, triangle[0]); - node.AabbMin = MathHelper.SetMin(node.AabbMin, triangle[1]); - node.AabbMax = MathHelper.SetMax(node.AabbMax, triangle[1]); - node.AabbMin = MathHelper.SetMin(node.AabbMin, triangle[2]); - node.AabbMax = MathHelper.SetMax(node.AabbMax, triangle[2]); - - node.EscapeIndex = -1; - node.LeftChild = null; - node.RightChild = null; - - //for child nodes - node.SubPart = partId; - node.TriangleIndex = triangleIndex; - - _triangleNodes.Add(node); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/OptimizedBvhNode.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/OptimizedBvhNode.cs deleted file mode 100644 index 83cc6e55fb..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/OptimizedBvhNode.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// OptimizedBvhNode contains both internal and leaf node information. - /// It hasn't been optimized yet for storage. Some obvious optimizations are: - /// Removal of the pointers (can already be done, they are not used for traversal) - /// and storing aabbmin/max as quantized integers. - /// 'subpart' doesn't need an integer either. It allows to re-use graphics triangle - /// meshes stored in a non-uniform way (like batches/subparts of triangle-fans - /// - public class OptimizedBvhNode - { - private Vector3 _aabbMin; - private Vector3 _aabbMax; - - //these 2 pointers are obsolete, the stackless traversal just uses the escape index - private OptimizedBvhNode _leftChild; - private OptimizedBvhNode _rightChild; - - private int _escapeIndex; - - //for child nodes - private int _subPart; - private int _triangleIndex; - - public Vector3 AabbMin { get { return _aabbMin; } set { _aabbMin = value; } } - public Vector3 AabbMax { get { return _aabbMax; } set { _aabbMax = value; } } - - public OptimizedBvhNode LeftChild { get { return _leftChild; } set { _leftChild = value; } } - public OptimizedBvhNode RightChild { get { return _rightChild; } set { _rightChild = value; } } - - public int EscapeIndex { get { return _escapeIndex; } set { _escapeIndex = value; } } - - public int SubPart { get { return _subPart; } set { _subPart = value; } } - public int TriangleIndex { get { return _triangleIndex; } set { _triangleIndex = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/PolyhedralConvexShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/PolyhedralConvexShape.cs deleted file mode 100644 index 1a911b30c4..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/PolyhedralConvexShape.cs +++ /dev/null @@ -1,133 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public abstract class PolyhedralConvexShape : ConvexShape - { - public PolyhedralConvexShape() - { - //m_optionalHull = null; - } - - public abstract int VertexCount { get; } - public abstract int EdgeCount { get; } - public abstract int PlaneCount { get; } - - public abstract void GetEdge(int i, out Vector3 pointA, out Vector3 pointB); - public abstract void GetVertex(int i, out Vector3 vertex); - public abstract void GetPlane(out Vector3 planeNormal, out Vector3 planeSupport, int i); - // abstract int getIndex(int i); - - public abstract bool IsInside(Vector3 point, float tolerance); - - // optional Hull is for optional Separating Axis Test Hull collision detection, see Hull.cpp - //public class Hull m_optionalHull; - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - Vector3 supVec = new Vector3(); - - float maxDot = -1e30f; - - float lenSqr = vec.LengthSquared(); - if (lenSqr < 0.0001f) - { - vec = new Vector3(1, 0, 0); - } - else - { - float rlen = 1f / (float)Math.Sqrt(lenSqr); - vec *= rlen; - } - - Vector3 vtx; - float newDot; - - for (int i = 0; i < VertexCount; i++) - { - GetVertex(i, out vtx); - newDot = Vector3.Dot(vec, vtx); - if (newDot > maxDot) - { - maxDot = newDot; - supVec = vtx; - } - } - return supVec; - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - #warning Think about this - /*Vector3 vtx; - float newDot; - - for (int i = 0; i < vectors.Length; i++) - { - supportVerticesOut[i][3] = -1e30f; - } - - for (int j = 0; j < vectors.Length; j++) - { - Vector3 vec = vectors[j]; - - for (int i = 0; i < getNumVertices(); i++) - { - getVertex(i, out vtx); - newDot = Vector3.Dot(vec,vtx); - if (newDot > supportVerticesOut[j][3]) - { - //WARNING: don't swap next lines, the w component would get overwritten! - supportVerticesOut[j] = vtx; - supportVerticesOut[j][3] = newDot; - } - } - }*/ - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - //not yet, return box inertia - float margin = Margin; - - Matrix ident = Matrix.Identity; - Vector3 aabbMin, aabbMax; - GetAabb(ident, out aabbMin, out aabbMax); - Vector3 halfExtents = (aabbMax - aabbMin) * 0.5f; - - float lx = 2f * (halfExtents.X + margin); - float ly = 2f * (halfExtents.Y + margin); - float lz = 2f * (halfExtents.Z + margin); - float x2 = lx * lx; - float y2 = ly * ly; - float z2 = lz * lz; - float scaledmass = mass * 0.08333333f; - - inertia = scaledmass * (new Vector3(y2 + z2, x2 + z2, x2 + y2)); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/SphereShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/SphereShape.cs deleted file mode 100644 index cc3cea9175..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/SphereShape.cs +++ /dev/null @@ -1,116 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// btSphereShape implements an implicit (getSupportingVertex) Sphere - /// - public class SphereShape : ConvexShape - { - public SphereShape(float radius) - : base() - { - Vector3 temp = ImplicitShapeDimensions; - temp.X = radius; - ImplicitShapeDimensions = temp; - } - - public float Radius { get { return ImplicitShapeDimensions.X; } } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Sphere; - } - } - - public override string Name - { - get - { - return "Sphere"; - } - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - return new Vector3(); - } - - /// - /// to improve gjk behaviour, use radius+margin as the full margin, so never get into the penetration case - /// this means, non-uniform scaling is not supported anymore - /// - public override float Margin - { - get - { - return LocalScaling.X * Radius + base.Margin; - } - set - { - base.Margin = value; - } - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - if (supportVerticesOut != null) - for (int i = 0; i < supportVerticesOut.Length; i++) - supportVerticesOut[i] = new Vector3(); - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - float elem = 0.4f * mass * Margin * Margin; - inertia = new Vector3(elem, elem, elem); - } - - public override Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 supVertex = LocalGetSupportingVertexWithoutMargin(vec); - - Vector3 vecnorm = vec; - if (vecnorm.LengthSquared() < (MathHelper.Epsilon * MathHelper.Epsilon)) - { - vecnorm = new Vector3(-1f, -1f, -1f); - } - vecnorm.Normalize(); - supVertex += Margin * vecnorm; - return supVertex; - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - Vector3 center = t.Translation; - Vector3 extent = new Vector3(Margin, Margin, Margin); - aabbMin = center - extent; - aabbMax = center + extent; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/StaticPlaneShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/StaticPlaneShape.cs deleted file mode 100644 index a79a145999..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/StaticPlaneShape.cs +++ /dev/null @@ -1,124 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class StaticPlaneShape : ConcaveShape - { - private Vector3 _localAabbMin; - private Vector3 _localAabbMax; - - private Vector3 _planeNormal; - private float _planeConstant; - private Vector3 _localScaling; - - public StaticPlaneShape(Vector3 planeNormal, float planeConstant) - { - _planeNormal = planeNormal; - _planeConstant = planeConstant; - _localScaling = new Vector3(); - } - - protected Vector3 LocalAabbMin { get { return _localAabbMin; } set { _localAabbMin = value; } } - protected Vector3 LocalAabbMax { get { return _localAabbMax; } set { _localAabbMax = value; } } - - protected Vector3 PlaneNormal { get { return _planeNormal; } set { _planeNormal = value; } } - protected float PlaneConstant { get { return _planeConstant; } set { _planeConstant = value; } } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.StaticPlane; - } - } - - public override Vector3 LocalScaling - { - get - { - return _localScaling; - } - set - { - _localScaling = value; - } - } - - public override string Name - { - get - { - return "StaticPlane"; - } - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - Vector3 infvec = new Vector3(1e30f, 1e30f, 1e30f); - - Vector3 center = _planeNormal * _planeConstant; - aabbMin = center + infvec * _planeNormal; - aabbMax = aabbMin; - MathHelper.SetMin(ref aabbMin, center - infvec * _planeNormal); - MathHelper.SetMax(ref aabbMax, center - infvec * _planeNormal); - - aabbMin = new Vector3(-1e30f, -1e30f, -1e30f); - aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - //moving concave objects not supported - inertia = new Vector3(); - } - - public override void ProcessAllTriangles(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax) { - Vector3 halfExtents = (aabbMax - aabbMin) * 0.5f; - float radius = halfExtents.Length(); - Vector3 center = (aabbMax + aabbMin) * 0.5f; - - //this is where the triangles are generated, given AABB and plane equation (normal/constant) - Vector3 tangentDir0 = new Vector3(), tangentDir1 = new Vector3(); - - //tangentDir0/tangentDir1 can be precalculated - MathHelper.PlaneSpace1(_planeNormal, ref tangentDir0, ref tangentDir1); - - Vector3 projectedCenter = center - (Vector3.Dot(_planeNormal, center) - _planeConstant) * _planeNormal; - - Vector3[] triangle = new Vector3[3]; - triangle[0] = projectedCenter + tangentDir0 * radius + tangentDir1 * radius; - triangle[1] = projectedCenter + tangentDir0 * radius - tangentDir1 * radius; - triangle[2] = projectedCenter - tangentDir0 * radius - tangentDir1 * radius; - callback.ProcessTriangle(triangle, 0, 0); - - triangle[0] = projectedCenter - tangentDir0 * radius - tangentDir1 * radius; - triangle[1] = projectedCenter - tangentDir0 * radius + tangentDir1 * radius; - triangle[2] = projectedCenter + tangentDir0 * radius + tangentDir1 * radius; - callback.ProcessTriangle(triangle, 0, 1); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/StridingMeshInterface.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/StridingMeshInterface.cs deleted file mode 100644 index 20baccb5d5..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/StridingMeshInterface.cs +++ /dev/null @@ -1,115 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// PHY_ScalarType enumerates possible scalar types. - /// See the StridingMeshInterface for its use - /// - public enum PHY_ScalarType - { - PHY_FLOAT, - PHY_DOUBLE, - PHY_INTEGER, - PHY_SHORT, - PHY_FIXEDPOINT88 - } - - /// - /// StridingMeshInterface is the interface class for high performance access to triangle meshes - /// It allows for sharing graphics and collision meshes. Also it provides locking/unlocking of graphics meshes that are in gpu memory. - /// - public abstract class StridingMeshInterface - { - protected Vector3 _scaling; - - public StridingMeshInterface() - { - _scaling = new Vector3(1f,1f,1f); - } - - public void InternalProcessAllTriangles(ITriangleIndexCallback callback, Vector3 aabbMin, Vector3 aabbMax) - { - int numtotalphysicsverts = 0; - int numtriangles, gfxindex; - int part, graphicssubparts = SubPartsCount(); - Vector3[] triangle = new Vector3[3]; - List verts; - List indicies; - - Vector3 meshScaling = Scaling; - - //if the number of parts is big, the performance might drop due to the innerloop switch on indextype - for (part = 0; part < graphicssubparts; part++) - { - GetLockedReadOnlyVertexIndexBase(out verts, out indicies, out numtriangles, part); - numtotalphysicsverts += numtriangles * 3; //upper bound - - for (gfxindex = 0; gfxindex < numtriangles; gfxindex++) - { - triangle[0] = verts[indicies[gfxindex * 3 + 0]]; - triangle[1] = verts[indicies[gfxindex * 3 + 1]]; - triangle[2] = verts[indicies[gfxindex * 3 + 2]]; - - callback.ProcessTriangleIndex(triangle, part, gfxindex); - } - - UnLockReadOnlyVertexBase(part); - } - } - - - // get read and write access to a subpart of a triangle mesh - // this subpart has a continuous array of vertices and indices - // in this way the mesh can be handled as chunks of memory with striding - // very similar to OpenGL vertexarray support - // make a call to unLockVertexBase when the read and write access is finished - public abstract void GetLockedVertexIndexBase(out List verts, out List indicies, out int numfaces, int subpart); - - public abstract void GetLockedReadOnlyVertexIndexBase(out List verts, out List indicies, out int numfaces, int subpart); - - // unLockVertexBase finishes the access to a subpart of the triangle mesh - // make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished - public abstract void UnLockVertexBase(int subpart); - - public abstract void UnLockReadOnlyVertexBase(int subpart); - - - // getNumSubParts returns the number of seperate subparts - // each subpart has a continuous array of vertices and indices - public abstract int SubPartsCount(); - - public abstract void PreallocateVertices(int numverts); - public abstract void PreallocateIndices(int numindices); - - public Vector3 Scaling - { - get { return _scaling; } - set { _scaling = value; } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/SupportVertexCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/SupportVertexCallback.cs deleted file mode 100644 index eab822efc7..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/SupportVertexCallback.cs +++ /dev/null @@ -1,67 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - internal class SupportVertexCallback : ITriangleCallback - { - private Vector3 _supportVertexLocal; - - private Matrix _worldTransform; - private float _maxDot; - private Vector3 _supportVecLocal; - - public SupportVertexCallback(Vector3 supportVecWorld, Matrix trans) - { - _supportVertexLocal = new Vector3(); - _worldTransform = trans; - _maxDot = -1e30f; - _supportVecLocal = Vector3.TransformNormal(supportVecWorld, _worldTransform); - } - - public Matrix WorldTransform { get { return _worldTransform; } set { _worldTransform = value; } } - public float MaxDot { get { return _maxDot; } set { _maxDot = value; } } - public Vector3 SupportVectorLocal { get { return _supportVecLocal; } set { _supportVecLocal = value; } } - - public Vector3 SupportVertexLocal { get { return _supportVertexLocal; } } - public Vector3 SupportVertexWorldSpace { get { return MathHelper.MatrixToVector(_worldTransform, _supportVertexLocal); } } - - #region ITriangleCallback Members - public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex) - { - for (int i = 0; i < 3; i++) - { - float dot = Vector3.Dot(_supportVecLocal, triangle[i]); - if (dot > _maxDot) - { - _maxDot = dot; - _supportVertexLocal = triangle[i]; - } - } - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleBuffer.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleBuffer.cs deleted file mode 100644 index a472583665..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleBuffer.cs +++ /dev/null @@ -1,80 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class Triangle - { - private Vector3 _vertexA; - private Vector3 _vertexB; - private Vector3 _vertexC; - private int _partId; - private int _triangleIndex; - - public Vector3 VertexA { get { return _vertexA; } set { _vertexA = value; } } - public Vector3 VertexB { get { return _vertexB; } set { _vertexB = value; } } - public Vector3 VertexC { get { return _vertexC; } set { _vertexC = value; } } - public int PartId { get { return _partId; } set { _partId = value; } } - public int TriangleIndex { get { return _triangleIndex; } set { _triangleIndex = value; } } - } - - /// - /// example usage of this class: - /// TriangleBuffer triBuf; - /// concaveShape.processAllTriangles(triBuf, out aabbMin, out aabbMax); - /// for (int i = 0; i < triBuf.getNumTriangles(); i++) - /// { - /// Triangle tri = triBuf.getTriangle(i); - /// //do something useful here with the triangle - /// } - /// - public class TriangleBuffer : ITriangleCallback - { - private List _triangleBuffer = new List(); - - public int TriangleCount { get { return _triangleBuffer.Count; } } - public Triangle this[int index] { get { return _triangleBuffer[index]; } } - - public void ClearBuffer() - { - _triangleBuffer.Clear(); - } - - #region ITriangleCallback Members - public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex) - { - Triangle tri = new Triangle(); - tri.VertexA = triangle[0]; - tri.VertexB = triangle[1]; - tri.VertexC = triangle[2]; - tri.PartId = partID; - tri.TriangleIndex = triangleIndex; - - _triangleBuffer.Add(tri); - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleCallback.cs deleted file mode 100644 index 938765b439..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleCallback.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public interface ITriangleCallback - { - void ProcessTriangle(Vector3[] triangle, int partId, int triangleIndex); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleIndexVertexArray.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleIndexVertexArray.cs deleted file mode 100644 index 52c08ed245..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleIndexVertexArray.cs +++ /dev/null @@ -1,136 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// IndexedMesh indexes into existing vertex and index arrays, in a similar way OpenGL glDrawElements - /// instead of the number of indices, we pass the number of triangles - /// - public struct IndexedMesh - { - private int _numTriangles; - private int[] _triangleIndexBase; - private int _triangleIndexStride; - private int _numVertices; - private Vector3[] _vertexBase; - private int _vertexStride; - - public IndexedMesh(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices, Vector3[] vertexBase, int vertexStride) - { - _numTriangles = numTriangleIndices; - _triangleIndexBase = triangleIndexBase; - _triangleIndexStride = triangleIndexStride; - _vertexBase = vertexBase; - _numVertices = numVertices; - _vertexStride = vertexStride; - } - - public IndexedMesh(int[] triangleIndexBase, Vector3[] vertexBase) - { - _numTriangles = triangleIndexBase.Length; - _triangleIndexBase = triangleIndexBase; - _triangleIndexStride = 32; - _vertexBase = vertexBase; - _numVertices = vertexBase.Length; - _vertexStride = 24; - } - - public int TriangleCount { get { return _numTriangles; } set { _numTriangles = value; } } - public int[] TriangleIndexBase { get { return _triangleIndexBase; } set { _triangleIndexBase = value; } } - public int TriangleIndexStride { get { return _triangleIndexStride; } set { _triangleIndexStride = value; } } - public int VertexCount { get { return _numVertices; } set { _numVertices = value; } } - public Vector3[] VertexBase { get { return _vertexBase; } set { _vertexBase = value; } } - public int VertexStride { get { return _vertexStride; } set { _vertexStride = value; } } - } - - /// - /// TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing triangle/index arrays. - /// Additional meshes can be added using addIndexedMesh - /// - public class TriangleIndexVertexArray : StridingMeshInterface - { - List _indexedMeshes = new List(); - - public TriangleIndexVertexArray() { } - - public TriangleIndexVertexArray(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices, Vector3[] vertexBase, int vertexStride) - { - IndexedMesh mesh = new IndexedMesh(); - mesh.TriangleCount = numTriangleIndices; - mesh.TriangleIndexBase = triangleIndexBase; - mesh.TriangleIndexStride = triangleIndexStride; - mesh.VertexBase = vertexBase; - mesh.VertexCount = numVertices; - mesh.VertexStride = vertexStride; - - AddIndexedMesh(mesh); - } - - public TriangleIndexVertexArray(int[] triangleIndexBase, Vector3[] vertexBase) - : this(triangleIndexBase.Length, triangleIndexBase, 32, vertexBase.Length, vertexBase, 24) { } - - public void AddIndexedMesh(IndexedMesh indexedMesh) - { - _indexedMeshes.Add(indexedMesh); - } - - public override void GetLockedVertexIndexBase(out List verts, out List indicies, out int numfaces, int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void GetLockedReadOnlyVertexIndexBase(out List verts, out List indicies, out int numfaces, int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void UnLockVertexBase(int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void UnLockReadOnlyVertexBase(int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override int SubPartsCount() - { - return _indexedMeshes.Count; - } - - public override void PreallocateVertices(int numverts) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void PreallocateIndices(int numindices) - { - throw new Exception("The method or operation is not implemented."); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleMesh.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleMesh.cs deleted file mode 100644 index d5b93ba054..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleMesh.cs +++ /dev/null @@ -1,102 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - class TriangleMesh : StridingMeshInterface - { - int _numTriangles; - List _verts; - - public TriangleMesh() - { - _numTriangles = 0; - _verts = new List(); - } - - void AddTriangle(Vector3 vertex0, Vector3 vertex1, Vector3 vertex2) - { - _verts.Add(vertex0); - _verts.Add(vertex1); - _verts.Add(vertex2); - _numTriangles++; - } - - public override void GetLockedVertexIndexBase(out List verts, out List indicies, out int numfaces, int subpart) - { - verts = new List(); - for (int i = 0; i < 3; i++) - { - verts.Add(_verts[subpart * 3 + i]); - } - indicies = new List(); - indicies.Add(0); - indicies.Add(1); - indicies.Add(2); - numfaces = 1; - } - - public override void GetLockedReadOnlyVertexIndexBase(out List verts, out List indicies, out int numfaces, int subpart) - { - verts = new List(); - for (int i = 0; i < 3; i++) - { - verts.Add(_verts[subpart * 3 + i]); - } - indicies = new List(); - indicies.Add(0); - indicies.Add(1); - indicies.Add(2); - numfaces = 1; - } - - public override void UnLockVertexBase(int subpart) - { - - } - - public override void UnLockReadOnlyVertexBase(int subpart) - { - - } - - public override int SubPartsCount() - { - return _numTriangles; - } - - public override void PreallocateVertices(int numverts) - { - - } - - public override void PreallocateIndices(int numindices) - { - - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleMeshShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleMeshShape.cs deleted file mode 100644 index 5f5a0cfd3b..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleMeshShape.cs +++ /dev/null @@ -1,160 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// Concave triangle mesh. Uses an interface to access the triangles to allow for sharing graphics/physics triangles. - /// - public class TriangleMeshShape : ConcaveShape - { - private StridingMeshInterface _meshInterface; - private Vector3 _localAabbMin; - private Vector3 _localAabbMax; - - public TriangleMeshShape(StridingMeshInterface meshInterface) - { - this._meshInterface = meshInterface; - RecalcLocalAabb(); - } - - protected StridingMeshInterface MeshInterface { get { return _meshInterface; } set { _meshInterface = value; } } - protected Vector3 LocalAabbMin { get { return _localAabbMin; } set { _localAabbMin = value; } } - protected Vector3 LocalAabbMax { get { return _localAabbMax; } set { _localAabbMax = value; } } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.TriangleMesh; - } - } - - public override Vector3 LocalScaling - { - get - { - return _meshInterface.Scaling; - } - set - { - _meshInterface.Scaling = value; - } - } - - public override string Name - { - get - { - return "TriangleMesh"; - } - } - - public void RecalcLocalAabb() - { - { - Vector3 vec = new Vector3(); - vec.X = 1f; - Vector3 tmp = LocalGetSupportingVertex(vec); - _localAabbMax.X = tmp.X + CollisionMargin; - vec.X = -1f; - tmp = LocalGetSupportingVertex(vec); - _localAabbMin.X = tmp.X - CollisionMargin; - } - { - Vector3 vec = new Vector3(); - vec.Y = 1f; - Vector3 tmp = LocalGetSupportingVertex(vec); - _localAabbMax.Y = tmp.Y + CollisionMargin; - vec.Y = -1f; - tmp = LocalGetSupportingVertex(vec); - _localAabbMin.Y = tmp.Y - CollisionMargin; - } - { - Vector3 vec = new Vector3(); - vec.Z = 1f; - Vector3 tmp = LocalGetSupportingVertex(vec); - _localAabbMax.Z = tmp.Z + CollisionMargin; - vec.Z = -1f; - tmp = LocalGetSupportingVertex(vec); - _localAabbMin.Z = tmp.Z - CollisionMargin; - } - } - - public override void ProcessAllTriangles(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax) - { - LocalProcessAllTriangles(callback, aabbMax, aabbMax); - } - - protected void LocalProcessAllTriangles(ITriangleCallback callback, Vector3 aabbMin, Vector3 aabbMax) - { - FilteredCallback filterCallback = new FilteredCallback(callback, aabbMin, aabbMax); - _meshInterface.InternalProcessAllTriangles(filterCallback, aabbMin, aabbMax); - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - Vector3 localHalfExtents = 0.5f * (_localAabbMax - _localAabbMin); - Vector3 localCenter = 0.5f * (_localAabbMax + _localAabbMin); - - Matrix abs_b = MathHelper.Absolute(t); - - Vector3 center = MathHelper.MatrixToVector(t, localCenter); - - Vector3 extent = new Vector3(Vector3.Dot(new Vector3(abs_b.M11, abs_b.M12, abs_b.M13), localHalfExtents), - Vector3.Dot(new Vector3(abs_b.M21, abs_b.M22, abs_b.M23), localHalfExtents), - Vector3.Dot(new Vector3(abs_b.M31, abs_b.M32, abs_b.M33), localHalfExtents)); - extent += new Vector3(Margin, Margin, Margin); - - aabbMin = center - extent; - aabbMax = center + extent; - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - inertia = new Vector3(); - //moving concave objects not supported - BulletDebug.Assert(false); - } - - public virtual Vector3 LocalGetSupportingVertex(Vector3 vec) - { - Vector3 supportVertex; - Matrix ident = Matrix.Identity; - SupportVertexCallback supportCallback = new SupportVertexCallback(vec, ident); - Vector3 aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - LocalProcessAllTriangles(supportCallback, -aabbMax, aabbMax); - supportVertex = supportCallback.SupportVertexLocal; - return supportVertex; - } - - public virtual Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - BulletDebug.Assert(false); - return LocalGetSupportingVertex(vec); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleShape.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleShape.cs deleted file mode 100644 index d5a17f38d0..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/CollisionShapes/TriangleShape.cs +++ /dev/null @@ -1,187 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class TriangleShape : PolyhedralConvexShape - { - private Vector3[] _vertices = new Vector3[3]; - - public TriangleShape(Vector3 pointA, Vector3 pointB, Vector3 pointC) - { - _vertices[0] = pointA; - _vertices[1] = pointB; - _vertices[2] = pointC; - } - - public override int PreferredPenetrationDirectionsCount - { - get - { - return 2; - } - } - - public Vector3[] Vertices - { - get - { - return _vertices; - } - } - - public override int VertexCount - { - get - { - return 3; - } - } - - public override int EdgeCount - { - get - { - return 3; - } - } - - public override int PlaneCount - { - get - { - return 1; - } - } - - public override BroadphaseNativeTypes ShapeType - { - get - { - return BroadphaseNativeTypes.Triangle; - } - } - - public override string Name - { - get - { - return "Triangle"; - } - } - - public override void GetPreferredPenetrationDirection(int index, out Vector3 penetrationVector) - { - CalculateNormal(out penetrationVector); - if (index != 0) - penetrationVector *= -1f; - } - - public virtual void GetPlaneEquation(int i, out Vector3 planeNormal, out Vector3 planeSupport) - { - CalculateNormal(out planeNormal); - planeSupport = _vertices[0]; - } - - public void CalculateNormal(out Vector3 normal) - { - normal = Vector3.Normalize(Vector3.Cross(_vertices[1] - _vertices[0], _vertices[2] - _vertices[0])); - } - - public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec) - { - Vector3 dots = new Vector3(Vector3.Dot(vec, _vertices[0]), Vector3.Dot(vec, _vertices[1]), Vector3.Dot(vec, _vertices[2])); - return _vertices[MathHelper.MaxAxis(dots)]; - } - - public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut) - { - for (int i = 0; i < vectors.Length; i++) - { - Vector3 dir = vectors[i]; - Vector3 dots = new Vector3(Vector3.Dot(dir, _vertices[0]), Vector3.Dot(dir, _vertices[1]), Vector3.Dot(dir, _vertices[2])); - supportVerticesOut[i] = _vertices[MathHelper.MaxAxis(dots)]; - } - } - - public override void CalculateLocalInertia(float mass, out Vector3 inertia) - { - inertia = new Vector3(); - BulletDebug.Assert(false); - } - - public override void GetEdge(int i, out Vector3 pa, out Vector3 pb) - { - GetVertex(i, out pa); - GetVertex((i + 1) % 3, out pb); - } - - public override void GetAabb(Matrix t, out Vector3 aabbMin, out Vector3 aabbMax) - { - GetAabbSlow(t, out aabbMin, out aabbMax); - } - - public override void GetVertex(int i, out Vector3 vtx) - { - vtx = _vertices[i]; - } - - public override void GetPlane(out Vector3 planeNormal, out Vector3 planeSupport, int i) - { - GetPlaneEquation(i, out planeNormal, out planeSupport); - } - - public override bool IsInside(Vector3 pt, float tolerance) - { - Vector3 normal; - CalculateNormal(out normal); - //distance to plane - float dist = Vector3.Dot(pt, normal); - float planeconst = Vector3.Dot(_vertices[0], normal); - dist -= planeconst; - if (dist >= -tolerance && dist <= tolerance) - { - //inside check on edge-planes - int i; - for (i = 0; i < 3; i++) - { - Vector3 pa, pb; - GetEdge(i, out pa, out pb); - Vector3 edge = pb - pa; - Vector3 edgeNormal = Vector3.Cross(edge, normal); - edgeNormal = Vector3.Normalize(edgeNormal); - float distance = Vector3.Dot(pt, edgeNormal); - float edgeConst = Vector3.Dot(pa, edgeNormal); - distance -= edgeConst; - if (distance < -tolerance) - return false; - } - return true; - } - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ContinuousConvexCollision.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ContinuousConvexCollision.cs deleted file mode 100644 index d011ef2c0a..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ContinuousConvexCollision.cs +++ /dev/null @@ -1,199 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// ContinuousConvexCollision implements angular and linear time of impact for convex objects. - /// Based on Brian Mirtich's Conservative Advancement idea (PhD thesis). - /// Algorithm operates in worldspace, in order to keep inbetween motion globally consistent. - /// It uses GJK at the moment. Future improvement would use minkowski sum / supporting vertex, merging innerloops - /// - public class ContinuousConvexCollision : IConvexCast - { - /// - /// This maximum should not be necessary. It allows for untested/degenerate cases in production code. - /// You don't want your game ever to lock-up. - /// - private const int MaxIterations = 1000; - - private ISimplexSolver _simplexSolver; - private IConvexPenetrationDepthSolver _penetrationDepthSolver; - private ConvexShape _convexA; - private ConvexShape _convexB; - - public ContinuousConvexCollision(ConvexShape convexA, ConvexShape convexB, - ISimplexSolver simplexSolver, IConvexPenetrationDepthSolver penetrationDepthSolver) - { - _simplexSolver = simplexSolver; - _penetrationDepthSolver = penetrationDepthSolver; - _convexA = convexA; - _convexB = convexB; - } - - public bool CalcTimeOfImpact(Matrix fromA, Matrix toA, Matrix fromB, Matrix toB, CastResult result) - { - _simplexSolver.Reset(); - - // compute linear and angular velocity for this interval, to interpolate - Vector3 linVelA = new Vector3(), angVelA = new Vector3(), linVelB = new Vector3(), angVelB = new Vector3(); - TransformUtil.CalculateVelocity(fromA, toA, 1f, ref linVelA, ref angVelA); - TransformUtil.CalculateVelocity(fromB, toB, 1f, ref linVelB, ref angVelB); - - float boundingRadiusA = _convexA.GetAngularMotionDisc(); - float boundingRadiusB = _convexB.GetAngularMotionDisc(); - - float maxAngularProjectedVelocity = angVelA.Length() * boundingRadiusA + - angVelB.Length() * boundingRadiusB; - - float radius = 0.001f; - - float lambda = 0f; - Vector3 v = new Vector3(1f, 0f, 0f); - - int maxIter = MaxIterations; - - Vector3 n = new Vector3(); - bool hasResult = false; - Vector3 c; - - float lastLambda = lambda; - //float epsilon = 0.001f; - - int numIter = 0; - //first solution, using GJK - - - Matrix identityTrans = Matrix.Identity; - - SphereShape raySphere = new SphereShape(0f); - raySphere.Margin=0f; - - - //result.drawCoordSystem(sphereTr); - - PointCollector pointCollector1 = new PointCollector(); - - GjkPairDetector gjk = new GjkPairDetector(_convexA, _convexB, (VoronoiSimplexSolver)_simplexSolver, _penetrationDepthSolver); - GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - - //we don't use margins during CCD - gjk.setIgnoreMargin(true); - - input.TransformA = fromA; - input.TransformB = fromB; - - DiscreteCollisionDetectorInterface.Result r = (DiscreteCollisionDetectorInterface.Result)pointCollector1; - gjk.GetClosestPoints(input, r, null); - - hasResult = pointCollector1.HasResult; - c = pointCollector1.PointInWorld; - - if (hasResult) - { - float dist; - dist = pointCollector1.Distance; - n = pointCollector1.NormalOnBInWorld; - - //not close enough - while (dist > radius) - { - numIter++; - if (numIter > maxIter) - return false; //todo: report a failure - - float dLambda = 0f; - - //calculate safe moving fraction from distance / (linear+rotational velocity) - - //float clippedDist = GEN_min(angularConservativeRadius,dist); - //float clippedDist = dist; - - float projectedLinearVelocity = Vector3.Dot(linVelB - linVelA, n); - - dLambda = dist / (projectedLinearVelocity + maxAngularProjectedVelocity); - - lambda = lambda + dLambda; - - if (lambda > 1f) return false; - if (lambda < 0f) return false; - - //todo: next check with relative epsilon - if (lambda <= lastLambda) - break; - lastLambda = lambda; - - - //interpolate to next lambda - Matrix interpolatedTransA = new Matrix(), interpolatedTransB = new Matrix(), relativeTrans; - - TransformUtil.IntegrateTransform(fromA, linVelA, angVelA, lambda, ref interpolatedTransA); - TransformUtil.IntegrateTransform(fromB, linVelB, angVelB, lambda, ref interpolatedTransB); - - relativeTrans = MathHelper.InverseTimes(interpolatedTransB, interpolatedTransA); - - result.DebugDraw(lambda); - - PointCollector pointCollector = new PointCollector(); - gjk = new GjkPairDetector(_convexA, _convexB, (VoronoiSimplexSolver)_simplexSolver, _penetrationDepthSolver); - input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - input.TransformA = interpolatedTransA; - input.TransformB = interpolatedTransB; - - // !!!!!!!!!! - r = (DiscreteCollisionDetectorInterface.Result)pointCollector1; - gjk.GetClosestPoints(input, r, null); - - if (pointCollector.HasResult) - { - if (pointCollector.Distance < 0f) - { - //degenerate ?! - result.Fraction = lastLambda; - result.Normal = n; - return true; - } - c = pointCollector.PointInWorld; - - dist = pointCollector.Distance; - } - else - { - //?? - return false; - } - - } - - result.Fraction = lambda; - result.Normal = n; - return true; - } - - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ConvexCast.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ConvexCast.cs deleted file mode 100644 index 93501ed7b3..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ConvexCast.cs +++ /dev/null @@ -1,73 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - - /// - /// CastResult stores the closest result - /// alternatively, add a callback method to decide about closest/all results - /// - public class CastResult - { - private Vector3 _normal; - private float _fraction; - private Matrix _hitTransformA; - private Matrix _hitTransformB; - private IDebugDraw _debugDrawer; - - public CastResult() - { - _fraction = 1e30f; - } - - public Vector3 Normal { get { return _normal; } set { _normal = value; } } - public float Fraction { get { return _fraction; } set { _fraction = value; } } - public Matrix HitTransformA { get { return _hitTransformA; } set { _hitTransformA = value; } } - public Matrix HitTransformB { get { return _hitTransformB; } set { _hitTransformB = value; } } - public IDebugDraw DebugDrawer { get { return _debugDrawer; } set { _debugDrawer = value; } } - - public virtual void DebugDraw(float fraction) { } - public virtual void DrawCoordSystem(Matrix trans) { } - } - - /// - /// ConvexCast is an interface for Casting - /// - public interface IConvexCast - { - /// - /// cast a convex against another convex object - /// - /// - /// - /// - /// - /// - /// - bool CalcTimeOfImpact(Matrix fromA, Matrix toA, Matrix fromB, Matrix toB, CastResult result); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.cs deleted file mode 100644 index 5b07d9b317..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.cs +++ /dev/null @@ -1,117 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public abstract class DiscreteCollisionDetectorInterface - { - public abstract class Result - { - public abstract void SetShapeIdentifiers(int partIdA, int indexA, int partIdB, int indexB); - public abstract void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth); - } - - public class ClosestPointInput - { - private float _maximumDistanceSquared; - private Matrix _transformA, _transformB; - - #region Properties - public Matrix TransformB - { - get { return _transformB; } - set { _transformB = value; } - } - - public Matrix TransformA - { - get { return _transformA; } - set { _transformA = value; } - } - - public float MaximumDistanceSquared - { - get { return _maximumDistanceSquared; } - set { _maximumDistanceSquared = value; } - } - #endregion - - public ClosestPointInput() - { - _maximumDistanceSquared = 1e30f; - } - } - - public abstract void GetClosestPoints(ClosestPointInput input, Result output, IDebugDraw debugDraw); - } - - public class StorageResult : DiscreteCollisionDetectorInterface.Result - { - private Vector3 _closestPointInB; - private Vector3 _normalOnSurfaceB; - private float _distance; //negative means penetration ! - - #region Properties - - public float Distance - { - get { return _distance; } - set { _distance = value; } - } - public Vector3 NormalOnSurfaceB - { - get { return _normalOnSurfaceB; } - set { _normalOnSurfaceB = value; } - } - public Vector3 ClosestPointInB - { - get { return _closestPointInB; } - set { _closestPointInB = value; } - } - - #endregion - - public StorageResult() - { - _distance = 1e30f; - } - - public override void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth) - { - if (depth < _distance) - { - _normalOnSurfaceB = normalOnBInWorld; - _closestPointInB = pointInWorld; - _distance = depth; - } - } - - public override void SetShapeIdentifiers(int partId0, int index0, int partId1, int index1) - { - throw new Exception("The method or operation is not implemented."); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkConvexCast.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkConvexCast.cs deleted file mode 100644 index ea7d335d43..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkConvexCast.cs +++ /dev/null @@ -1,176 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// GjkConvexCast performs a raycast on a convex object using support mapping. - /// - public class GjkConvexCast : IConvexCast - { - private VoronoiSimplexSolver _simplexSolver; - private ConvexShape _convexA, _convexB; - - public GjkConvexCast(ConvexShape convexShapeA, ConvexShape convexShapeB, VoronoiSimplexSolver solver) - { - _simplexSolver = solver; - - _convexA = convexShapeA; - _convexB = convexShapeB; - } - - #region IConvexCast Members - - /// - /// cast a convex against another convex object - /// - /// - /// - /// - /// - /// - /// - public bool CalcTimeOfImpact(Matrix fromA, Matrix toA, Matrix fromB, Matrix toB, CastResult result) - { - MinkowskiSumShape combined = new MinkowskiSumShape(_convexA, _convexB); - - Matrix rayFromLocalA = MathHelper.InvertMatrix(fromA) * fromB; - Matrix rayToLocalA = MathHelper.InvertMatrix(toA) * toB; - - Matrix transformA = fromA; - Matrix transformB = fromB; - - transformA.Translation = new Vector3(0, 0, 0); - transformB.Translation = new Vector3(0, 0, 0); - - combined.TransformA = transformA; - combined.TransformB = transformB; - - float radius = 0.01f; - float lambda = 0; - - Vector3 s = rayFromLocalA.Translation; - Vector3 r = rayToLocalA.Translation - rayFromLocalA.Translation; - Vector3 x = s; - Vector3 n = new Vector3(); - Vector3 c = new Vector3(); - - bool hasResult = false; - float lastLambda = lambda; - - IConvexPenetrationDepthSolver penSolver = null; - Matrix identityTransform = Matrix.Identity; - - SphereShape raySphere = new SphereShape(0.0f); - raySphere.Margin=0.0f; - - Matrix sphereTransform = Matrix.Identity; - sphereTransform.Translation = rayFromLocalA.Translation; - - result.DrawCoordSystem(sphereTransform); - - { - PointCollector pointCollector = new PointCollector(); - GjkPairDetector gjk = new GjkPairDetector(raySphere, combined, _simplexSolver, penSolver); - - GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - input.TransformA = sphereTransform; - input.TransformB = identityTransform; - - gjk.GetClosestPoints(input, pointCollector, null); - - hasResult = pointCollector.HasResult; - - c = pointCollector.PointInWorld; - n = pointCollector.NormalOnBInWorld; - } - - if (hasResult) - { - float dist = (c - x).Length(); - - if (dist < radius) - { - lastLambda = 1.0f; - } - - while (dist > radius) - { - n = x - c; - float dot = Vector3.Dot(n, r); - - if (dot >= -(MathHelper.Epsilon * MathHelper.Epsilon)) return false; - - lambda = lambda - Vector3.Distance(n, n) / dot; - if (lambda <= lastLambda) break; - - lastLambda = lambda; - - x = s + lambda * r; - - sphereTransform.Translation = x; - result.DrawCoordSystem(sphereTransform); - PointCollector pointCollector = new PointCollector(); - - GjkPairDetector gjk = new GjkPairDetector(raySphere, combined, _simplexSolver, penSolver); - GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - input.TransformA = sphereTransform; - input.TransformB = identityTransform; - - gjk.GetClosestPoints(input, pointCollector, null); - - if (pointCollector.HasResult) - { - if (pointCollector.Distance < 0.0f) - { - result.Fraction = lastLambda; - result.Normal = n; - return true; - } - - c = pointCollector.PointInWorld; - dist = (c - x).Length(); - } - else - { - return false; - } - } - - if (lastLambda < 1.0f) - { - result.Fraction = lastLambda; - result.Normal = n; - return true; - } - } - - return false; - } - - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpa.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpa.cs deleted file mode 100644 index a3064dbf9c..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpa.cs +++ /dev/null @@ -1,633 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// GJK-EPA collision solver by Nathanael Presson - /// Nov.2006 - /// - public class GjkEpa - { - //private static readonly int _precision = 1 /* U(sizeof(F) == 4)*/; - - private static readonly float _infinity = MathHelper.Infinity; - //private static readonly float _pi = (float)Math.PI; - private static readonly float _twoPi = (float)(Math.PI * 2); - - private static readonly int _gjkMaxIterations = 128; - private static readonly int _gjkHashSize = 1 << 6; - private static readonly int _gjkHashMask = _gjkHashSize - 1; - private static readonly float _gjkInSimplexEpsilon = 0.0001f; - private static readonly float _gjkSquareInSimplexEpsilon = _gjkInSimplexEpsilon * _gjkInSimplexEpsilon; - - private static readonly int _epaMaxIterations = 256; - private static readonly float _epaInFaceEpsilon = 0.01f; - private static readonly float _epaAccuracy = 0.001f; - - public static float EpaAccuracy { get { return _epaAccuracy; } } - - private static float Abs(float v) { return (v < 0 ? -v : v); } - private static float Sign(float v) { return (v < 0 ? -1 : 1); } - - static void Swap(ref T a, ref T b) - { - T t = a; - a = b; - b = t; - } - - public class Gjk - { - public class MinkowskiVertice - { - private Vector3 _vertice; /* Minkowski vertice */ - private Vector3 _ray; /* Ray */ - - public Vector3 Vertice { get { return _vertice; } set { _vertice = value; } } - public Vector3 Ray { get { return _ray; } set { _ray = value; } } - } - public class He - { - private Vector3 _ray; - private He _next; - - public He Next { get { return _next; } set { _next = value; } } - public Vector3 Ray { get { return _ray; } set { _ray = value; } } - } - - private He[] _table = new He[_gjkHashSize]; - private Matrix[] _wrotations = new Matrix[2]; - private Vector3[] _positions = new Vector3[2]; - private ConvexShape[] _shapes = new ConvexShape[2]; - private MinkowskiVertice[] _simplex = new MinkowskiVertice[5]; - private Vector3 _ray; - private int _order; - private int _iterations; - private float _margin; - private bool _failed; - - public Gjk(Matrix wrotationA, Vector3 positionA, ConvexShape shapeA, - Matrix wrotationB, Vector3 positionB, ConvexShape shapeB) - : this(wrotationA, positionA, shapeA, wrotationB, positionB, shapeB, 0) { } - - public Gjk(Matrix wrotationA, Vector3 positionA, ConvexShape shapeA, - Matrix wrotationB, Vector3 positionB, ConvexShape shapeB, - float pmargin) - { - for (int i = 0; i < _simplex.Length; i++) - _simplex[i] = new MinkowskiVertice(); - - for (int i = 0; i < _wrotations.Length; i++) - _wrotations[i] = new Matrix(); - - for (int i = 0; i < _positions.Length; i++) - _positions[i] = new Vector3(); - - _wrotations[0] = wrotationA; _positions[0] = positionA; - _shapes[0] = shapeA; - _wrotations[0].Translation = Vector3.Zero; - _wrotations[1] = wrotationB; _positions[1] = positionB; - _shapes[1] = shapeB; - _wrotations[1].Translation = Vector3.Zero; - //sablock = sa->BeginBlock(); - _margin = pmargin; - _failed = false; - } - - public bool Failed { get { return _failed; } } - public int Iterations { get { return _iterations; } } - public int Order { get { return _order; } } - public MinkowskiVertice[] Simplex { get { return _simplex; } } - - public int Hash(Vector3 v) - { - int h = ((int)(v.X * 15461) ^ (int)(v.Y * 83003) ^ (int)(v.Z * 15473)); - return (h * 169639) & _gjkHashMask; - } - - public bool FetchSupport() - { - int h = Hash(_ray); - He e = _table[h]; - while (e != null) - { - if (e.Ray == _ray) - { - --_order; - return (false); - } - else e = e.Next; - } - e = new He(); - e.Ray = _ray; - e.Next = _table[h]; - _table[h] = e; - Support(_ray, ref _simplex[++_order]); - return (Vector3.Dot(_ray, _simplex[_order].Vertice) > 0); - } - - public Vector3 LocalSupport(Vector3 d, int i) - { - Matrix m = _wrotations[i]; - m.Translation = Vector3.Zero; - Vector3 vtx = Vector3.TransformNormal(d, m); - Vector3 result = MathHelper.MatrixToVector(_wrotations[i], _shapes[i].LocalGetSupportingVertex(vtx)); - return (result + _positions[i]); - } - - public void Support(Vector3 d, ref MinkowskiVertice v) - { - v.Ray = d; - v.Vertice = LocalSupport(d, 0) - LocalSupport(-d, 1) + d * _margin; - } - - public bool SolveSimplex2(Vector3 ao, Vector3 ab) - { - if (Vector3.Dot(ab, ao) >= 0) - { - Vector3 cabo = Vector3.Cross(ab, ao); - if (cabo.LengthSquared() > _gjkSquareInSimplexEpsilon) - { _ray = Vector3.Cross(cabo, ab); } - else - { return true; } - } - else - { - _order = 0; - _simplex[0].Ray = _simplex[1].Ray; - _simplex[0].Vertice = _simplex[1].Vertice; - - _ray = ao; - } - return false; - } - - public bool SolveSimplex3(Vector3 ao, Vector3 ab, Vector3 ac) - { - return (SolveSimplex3a(ao, ab, ac, Vector3.Cross(ab, ac))); - } - - public bool SolveSimplex3a(Vector3 ao, Vector3 ab, Vector3 ac, Vector3 cabc) - { - if ((Vector3.Dot(Vector3.Cross(cabc, ab), ao)) < -_gjkInSimplexEpsilon) - { - _order = 1; - _simplex[0].Vertice = _simplex[1].Vertice; - _simplex[0].Ray = _simplex[1].Ray; - - _simplex[1].Vertice = _simplex[2].Vertice; - _simplex[1].Ray = _simplex[2].Ray; - - return (SolveSimplex2(ao, ab)); - } - else if (Vector3.Dot(Vector3.Cross(cabc, ac), ao) > +_gjkInSimplexEpsilon) - { - _order = 1; - _simplex[1].Vertice = _simplex[2].Vertice; - _simplex[1].Ray = _simplex[2].Ray; - - return (SolveSimplex2(ao, ac)); - } - else - { - float d = Vector3.Dot(cabc, ao); - if (Abs(d) > _gjkInSimplexEpsilon) - { - if (d > 0) - { _ray = cabc; } - else - { _ray = -cabc; Swap(ref _simplex[0], ref _simplex[1]); } - return (false); - } - else return (true); - } - } - - public bool SolveSimplex4(Vector3 ao, Vector3 ab, Vector3 ac, Vector3 ad) - { - Vector3 crs; - if (Vector3.Dot((crs = Vector3.Cross(ab, ac)), ao) > _gjkInSimplexEpsilon) - { - _order = 2; - _simplex[0].Vertice = _simplex[1].Vertice; - _simplex[0].Ray = _simplex[1].Ray; - - _simplex[1].Vertice = _simplex[2].Vertice; - _simplex[1].Ray = _simplex[2].Ray; - - _simplex[2].Vertice = _simplex[3].Vertice; - _simplex[2].Ray = _simplex[3].Ray; - - return (SolveSimplex3a(ao, ab, ac, crs)); - } - else if (Vector3.Dot((crs = Vector3.Cross(ac, ad)), ao) > _gjkInSimplexEpsilon) - { - _order = 2; - _simplex[2].Vertice = _simplex[3].Vertice; - _simplex[2].Ray = _simplex[3].Ray; - - return (SolveSimplex3a(ao, ac, ad, crs)); - } - else if (Vector3.Dot((crs = Vector3.Cross(ad, ab)), ao) > _gjkInSimplexEpsilon) - { - _order = 2; - - _simplex[1].Vertice = _simplex[0].Vertice; - _simplex[1].Ray = _simplex[0].Ray; - - _simplex[0].Vertice = _simplex[2].Vertice; - _simplex[0].Ray = _simplex[2].Ray; - - _simplex[2].Vertice = _simplex[3].Vertice; - _simplex[2].Ray = _simplex[3].Ray; - - return (SolveSimplex3a(ao, ad, ab, crs)); - } - else return (true); - } - - public bool SearchOrigin() - { - return SearchOrigin(new Vector3(1, 0, 0)); - } - - public bool SearchOrigin(Vector3 initray) - { - _iterations = 0; - unchecked - { - _order = (int)(-1); - } - _failed = false; - _ray = Vector3.Normalize(initray); - - //ClearMemory(table, sizeof(void*) * GJK_hashsize); - for (int i = 0; i < _table.Length; i++) - _table[i] = null; - FetchSupport(); - _ray = -_simplex[0].Vertice; - for (; _iterations < _gjkMaxIterations; ++_iterations) - { - float rl = _ray.Length(); - _ray /= rl > 0 ? rl : 1; - if (FetchSupport()) - { - bool found = (false); - switch (_order) - { - case 1: found = SolveSimplex2(-_simplex[1].Vertice, _simplex[0].Vertice - _simplex[1].Vertice); break; - case 2: found = SolveSimplex3(-_simplex[2].Vertice, _simplex[1].Vertice - _simplex[2].Vertice, _simplex[0].Vertice - _simplex[2].Vertice); break; - case 3: found = SolveSimplex4(-_simplex[3].Vertice, _simplex[2].Vertice - _simplex[3].Vertice, _simplex[1].Vertice - _simplex[3].Vertice, _simplex[0].Vertice - _simplex[3].Vertice); break; - } - if (found) return (true); - } - else return (false); - } - _failed = true; - return (false); - } - - public bool EncloseOrigin() - { - switch (_order) - { - /* Point */ - case 0: break; - /* Line */ - case 1: - Vector3 ab = _simplex[1].Vertice - _simplex[0].Vertice; - Vector3[] b ={ Vector3.Cross(ab, new Vector3(1, 0, 0)), - Vector3.Cross(ab, new Vector3(0, 1, 0)), - Vector3.Cross(ab, new Vector3(0, 0, 1)) }; - float[] m ={ b[0].LengthSquared(), b[1].LengthSquared(), b[2].LengthSquared() }; - Matrix r = Matrix.CreateFromQuaternion(new Quaternion(Vector3.Normalize(ab), _twoPi / 3)); - Vector3 w = b[m[0] > m[1] ? m[0] > m[2] ? 0 : 2 : m[1] > m[2] ? 1 : 2]; - Support(Vector3.Normalize(w), ref _simplex[4]); w = Vector3.TransformNormal(w, r); - Support(Vector3.Normalize(w), ref _simplex[2]); w = Vector3.TransformNormal(w, r); - Support(Vector3.Normalize(w), ref _simplex[3]); w = Vector3.TransformNormal(w, r); - _order = 4; - return true; - /* Triangle */ - case 2: - Vector3 n = Vector3.Normalize(Vector3.Cross(_simplex[1].Vertice - _simplex[0].Vertice, _simplex[2].Vertice - _simplex[0].Vertice)); - Support(n, ref _simplex[3]); - Support(-n, ref _simplex[4]); - _order = 4; - return true; - /* Tetrahedron */ - case 3: return (true); - /* Hexahedron */ - case 4: return (true); - } - return (false); - } - } - - public class Epa - { - public class Face - { - public Gjk.MinkowskiVertice[] _vertices = new Gjk.MinkowskiVertice[3]; - public Face[] _faces = new Face[3]; - public int[] _e = new int[3]; - public Vector3 _n; - public float _d; - public int _mark; - public Face _prev; - public Face _next; - } - - private Gjk _gjk; - private Face _root; - private int _nfaces; - private int _iterations; - private Vector3[,] _features = new Vector3[2, 3]; - private Vector3[] _nearest = new Vector3[2]; - private Vector3 _normal; - private float _depth; - private bool _failed; - - public Epa(Gjk gjk) - { - this._gjk = gjk; - } - - public bool Failed { get { return _failed; } } - public int Iterations { get { return _iterations; } } - public Vector3 Normal { get { return _normal; } } - public Vector3[] Nearest { get { return _nearest; } } - - public Vector3 GetCoordinates(Face face) - { - Vector3 o = face._n * -face._d; - float[] a ={ Vector3.Cross(face._vertices[0].Vertice - o, face._vertices[1].Vertice - o).Length(), - Vector3.Cross(face._vertices[1].Vertice - o, face._vertices[2].Vertice - o).Length(), - Vector3.Cross(face._vertices[2].Vertice - o, face._vertices[0].Vertice - o).Length()}; - float sm = a[0] + a[1] + a[2]; - return (new Vector3(a[1], a[2], a[0]) / (sm > 0 ? sm : 1)); - } - - public Face FindBest() - { - Face bf = null; - if (_root != null) - { - Face cf = _root; - float bd = _infinity; - do - { - if (cf._d < bd) { bd = cf._d; bf = cf; } - } while (null != (cf = cf._next)); - } - return bf; - } - - public bool Set(ref Face f, Gjk.MinkowskiVertice a, Gjk.MinkowskiVertice b, Gjk.MinkowskiVertice c) - { - Vector3 nrm = Vector3.Cross(b.Vertice - a.Vertice, c.Vertice - a.Vertice); - float len = nrm.Length(); - bool valid = (Vector3.Dot(Vector3.Cross(a.Vertice, b.Vertice), nrm) >= -_epaInFaceEpsilon && - Vector3.Dot(Vector3.Cross(b.Vertice, c.Vertice), nrm) >= -_epaInFaceEpsilon && - Vector3.Dot(Vector3.Cross(c.Vertice, a.Vertice), nrm) >= -_epaInFaceEpsilon); - f._vertices[0] = a; - f._vertices[1] = b; - f._vertices[2] = c; - f._mark = 0; - f._n = nrm / (len > 0 ? len : _infinity); - f._d = Max(0, -Vector3.Dot(f._n, a.Vertice)); - return valid; - } - - public Face NewFace(Gjk.MinkowskiVertice a, Gjk.MinkowskiVertice b, Gjk.MinkowskiVertice c) - { - Face pf = new Face(); - if (Set(ref pf, a, b, c)) - { - if (_root != null) _root._prev = pf; - pf._prev = null; - pf._next = _root; - _root = pf; - ++_nfaces; - } - else - { - pf._prev = pf._next = null; - } - return (pf); - } - - public void Detach(ref Face face) - { - if (face._prev != null || face._next != null) - { - --_nfaces; - if (face == _root) - { - _root = face._next; - _root._prev = null; - } - else - { - if (face._next == null) - { - face._prev._next = null; - } - else - { - face._prev._next = face._next; - face._next._prev = face._prev; - } - } - face._prev = face._next = null; - } - } - - public void Link(ref Face f0, int e0, ref Face f1, int e1) - { - f0._faces[e0] = f1; f1._e[e1] = e0; - f1._faces[e1] = f0; f0._e[e0] = e1; - } - - public Gjk.MinkowskiVertice Support(Vector3 w) - { - Gjk.MinkowskiVertice v = new Gjk.MinkowskiVertice(); - _gjk.Support(w, ref v); - return v; - } - - private static int[] mod3 ={ 0, 1, 2, 0, 1 }; - - public int BuildHorizon(int markid, Gjk.MinkowskiVertice w, ref Face f, int e, ref Face cf, ref Face ff) - { - int ne = (0); - if (f._mark != markid) - { - int e1 = (mod3[e + 1]); - if ((Vector3.Dot(f._n, w.Vertice) + f._d) > 0) - { - Face nf = NewFace(f._vertices[e1], f._vertices[e], w); - Link(ref nf, 0, ref f, e); - if (cf != null) Link(ref cf, 1, ref nf, 2); else ff = nf; - cf = nf; ne = 1; - } - else - { - int e2 = (mod3[e + 2]); - Detach(ref f); - f._mark = markid; - ne += BuildHorizon(markid, w, ref f._faces[e1], f._e[e1], ref cf, ref ff); - ne += BuildHorizon(markid, w, ref f._faces[e2], f._e[e2], ref cf, ref ff); - } - } - return (ne); - } - - public float EvaluatePD() - { - return EvaluatePD(_epaAccuracy); - } - - private int[,] fidx; - private int[,] eidx; - - public float EvaluatePD(float accuracy) - { - //Block* sablock = sa->BeginBlock(); - Face bestface = null; - int markid = 1; - _depth = -_infinity; - _normal = new Vector3(); - _root = null; - _nfaces = 0; - _iterations = 0; - _failed = false; - /* Prepare hull */ - if (_gjk.EncloseOrigin()) - { - int nfidx = 0; - int neidx = 0; - Gjk.MinkowskiVertice[] basemkv = new Gjk.MinkowskiVertice[5]; - Face[] basefaces = new Face[6]; - switch (_gjk.Order) - { - /* Tetrahedron */ - case 3: - { - fidx = new int[,] { { 2, 1, 0 }, { 3, 0, 1 }, { 3, 1, 2 }, { 3, 2, 0 } }; - eidx = new int[,] { { 0, 0, 2, 1 }, { 0, 1, 1, 1 }, { 0, 2, 3, 1 }, { 1, 0, 3, 2 }, { 2, 0, 1, 2 }, { 3, 0, 2, 2 } }; - nfidx = 4; neidx = 6; - } break; - /* Hexahedron */ - case 4: - { - fidx = new int[,] { { 2, 0, 4 }, { 4, 1, 2 }, { 1, 4, 0 }, { 0, 3, 1 }, { 0, 2, 3 }, { 1, 3, 2 } }; - eidx = new int[,] { { 0, 0, 4, 0 }, { 0, 1, 2, 1 }, { 0, 2, 1, 2 }, { 1, 1, 5, 2 }, { 1, 0, 2, 0 }, { 2, 2, 3, 2 }, { 3, 1, 5, 0 }, { 3, 0, 4, 2 }, { 5, 1, 4, 1 } }; - nfidx = 6; neidx = 9; - } break; - } - int i; - - for (i = 0; i <= _gjk.Order; ++i) - { - //basemkv[i] = (GJK::Mkv*)sa->Allocate(sizeof(GJK::Mkv)); - basemkv[i] = new Gjk.MinkowskiVertice(); - basemkv[i].Vertice = _gjk.Simplex[i].Vertice; - basemkv[i].Ray = _gjk.Simplex[i].Ray; - } - for (i = 0; i < nfidx; ++i) - { - basefaces[i] = NewFace(basemkv[fidx[i, 0]], basemkv[fidx[i, 1]], basemkv[fidx[i, 2]]); - } - for (i = 0; i < neidx; ++i) - { - Link(ref basefaces[eidx[i, 0]], eidx[i, 1], ref basefaces[eidx[i, 2]], eidx[i, 3]); - } - } - if (0 == _nfaces) - { - return _depth; - } - /* Expand hull */ - for (; _iterations < _epaMaxIterations; ++_iterations) - { - Face bf = FindBest(); - if (bf != null) - { - Gjk.MinkowskiVertice w = Support(-bf._n); - float d = Vector3.Dot(bf._n, w.Vertice) + bf._d; - bestface = bf; - if (d < -accuracy) - { - Face cf = null; - Face ff = null; - int nf = 0; - Detach(ref bf); - bf._mark = ++markid; - for (int i = 0; i < 3; ++i) - { - nf += BuildHorizon(markid, w, ref bf._faces[i], bf._e[i], ref cf, ref ff); - } - if (nf <= 2) { break; } - Link(ref cf, 1, ref ff, 2); - } - else break; - } - else break; - } - /* Extract contact */ - if (bestface != null) - { - Vector3 b = GetCoordinates(bestface); - _normal = bestface._n; - _depth = Max(0, bestface._d); - for (int i = 0; i < 2; ++i) - { - float s = i != 0 ? -1 : 1; - for (int j = 0; j < 3; ++j) - { - _features[i, j] = _gjk.LocalSupport(s * bestface._vertices[j].Ray, i); - } - } - _nearest[0] = _features[0, 0] * b.X + _features[0, 1] * b.Y + _features[0, 2] * b.Z; - _nearest[1] = _features[1, 0] * b.X + _features[1, 1] * b.Y + _features[1, 2] * b.Z; - } - else _failed = true; - return _depth; - } - - private float Max(float a, float b) - { - return (a > b ? a : b); - } - - private float Min(float a, float b) - { - return (a < b ? a : b); - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpaPenetrationDepthSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpaPenetrationDepthSolver.cs deleted file mode 100644 index 551449f99c..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpaPenetrationDepthSolver.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// EpaPenetrationDepthSolver uses the Expanding Polytope Algorithm to - /// calculate the penetration depth between two convex shapes. - /// - public class GjkEpaPenetrationDepthSolver : IConvexPenetrationDepthSolver - { - public bool CalculatePenetrationDepth(ISimplexSolver simplexSolver, ConvexShape convexA, ConvexShape convexB, Matrix transformA, Matrix transformB, Vector3 vector, out Vector3 ptrA, out Vector3 ptrB, IDebugDraw debugDraw) - { - float radialmargin = 0; - - GjkEpaSolver.Results results; - if (GjkEpaSolver.Collide(convexA, transformA, - convexB, transformB, - radialmargin, out results)) - { - // debugDraw->drawLine(results.witnesses[1],results.witnesses[1]+results.normal,btVector3(255,0,0)); - //resultOut->addContactPoint(results.normal,results.witnesses[1],-results.depth); - ptrA = results.Witnesses[0]; - ptrB = results.Witnesses[1]; - return true; - } - ptrA = new Vector3(); - ptrB = new Vector3(); - - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpaSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpaSolver.cs deleted file mode 100644 index 20af1921b4..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkEpaSolver.cs +++ /dev/null @@ -1,101 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// GjkEpaSolver contributed under zlib by Nathanael Presson - /// - public class GjkEpaSolver - { - public struct Results - { - public enum Status - { - Separated, /* Shapes doesnt penetrate */ - Penetrating, /* Shapes are penetrating */ - GjkFailed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */ - EpaFailed, /* EPA phase fail, bigger problem, need to save parameters, and debug */ - } - - private Vector3[] _witnesses; - private Vector3 _normal; - private float _depth; - private int _epaIterations; - private int _gjkIterations; - private Status _status; - - public Vector3[] Witnesses { get { return _witnesses; } set { _witnesses = value; } } - public Vector3 Normal { get { return _normal; } set { _normal = value; } } - public float Depth { get { return _depth; } set { _depth = value; } } - public int EpaIterations { get { return _epaIterations; } set { _epaIterations = value; } } - public int GjkIterations { get { return _gjkIterations; } set { _gjkIterations = value; } } - public Status ResultStatus { get { return _status; } set { _status = value; } } - } - - public static bool Collide(ConvexShape shapeA, Matrix wtrsA, - ConvexShape shapeB, Matrix wtrsB, - float radialmargin, - out Results results) - { - /* Initialize */ - results = new Results(); - results.Witnesses = new Vector3[2]; - results.Witnesses[0] = - results.Witnesses[1] = - results.Normal = new Vector3(); - results.Depth = 0; - results.ResultStatus = Results.Status.Separated; - results.EpaIterations = 0; - results.GjkIterations = 0; - /* Use GJK to locate origin */ - GjkEpa.Gjk gjk = new GjkEpa.Gjk(wtrsA, wtrsA.Translation, shapeA, - wtrsB, wtrsB.Translation, shapeB, - radialmargin + GjkEpa.EpaAccuracy); - bool collide = gjk.SearchOrigin(); - results.GjkIterations = gjk.Iterations + 1; - if (collide) - { - /* Then EPA for penetration depth */ - GjkEpa.Epa epa = new GjkEpa.Epa(gjk); - float pd = epa.EvaluatePD(); - results.EpaIterations = epa.Iterations + 1; - if (pd > 0) - { - results.ResultStatus = Results.Status.Penetrating; - results.Normal = epa.Normal; - results.Depth = pd; - results.Witnesses[0] = epa.Nearest[0]; - results.Witnesses[1] = epa.Nearest[1]; - return true; - } - else { if (epa.Failed) results.ResultStatus = Results.Status.EpaFailed; } - } - else { if (gjk.Failed) results.ResultStatus = Results.Status.GjkFailed; } - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkPairDetector.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkPairDetector.cs deleted file mode 100644 index 7557ed99a8..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/GjkPairDetector.cs +++ /dev/null @@ -1,343 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class GjkPairDetector : DiscreteCollisionDetectorInterface - { - private Vector3 _cachedSeparatingAxis; - private IConvexPenetrationDepthSolver _penetrationDepthSolver; - private ISimplexSolver _simplexSolver; - private ConvexShape _minkowskiA, _minkowskiB; - private bool _ignoreMargin; - - private int _lastUsedMethod; - private int _currentIteration; - private int _degenerateSimplex; - private int _catchDegeneracies; - - private static int _numDeepPenetrationChecks = 0; - private static int _numGjkChecks = 0; - - private const float RelativeError2 = 1.0e-6f; - - #region Properties - public int LastUsedMethod - { - get { return _lastUsedMethod; } - set { _lastUsedMethod = value; } - } - - public int CurrentIteration - { - get { return _currentIteration; } - set { _currentIteration = value; } - } - - public int DegenerateSimplex - { - get { return _degenerateSimplex; } - set { _degenerateSimplex = value; } - } - - public int CatchDegeneracies - { - get { return _catchDegeneracies; } - set { _catchDegeneracies = value; } - } - - public static int DeepPenetrationChecksCount { get { return _numDeepPenetrationChecks; } } - public static int GjkChecksCount { get { return _numGjkChecks; } } - #endregion - - public GjkPairDetector(ConvexShape objectA, ConvexShape objectB, - ISimplexSolver simplexSolver, - IConvexPenetrationDepthSolver penetrationDepthSolver) - { - _cachedSeparatingAxis = new Vector3(0, 0, 1); - - _penetrationDepthSolver = penetrationDepthSolver; - _simplexSolver = simplexSolver; - _minkowskiA = objectA; - _minkowskiB = objectB; - _ignoreMargin = false; - _lastUsedMethod = -1; - _catchDegeneracies = 1; - } - - public void setMinkowskiA(ConvexShape minkA) - { - _minkowskiA = minkA; - } - - public void setMinkowskiB(ConvexShape minkB) - { - _minkowskiB = minkB; - } - public void setCachedSeperatingAxis(Vector3 seperatingAxis) - { - _cachedSeparatingAxis = seperatingAxis; - } - - public void setPenetrationDepthSolver(IConvexPenetrationDepthSolver penetrationDepthSolver) - { - this._penetrationDepthSolver = penetrationDepthSolver; - } - - public void setIgnoreMargin(bool ignoreMargin) - { - this._ignoreMargin = ignoreMargin; - } - - public override void GetClosestPoints(DiscreteCollisionDetectorInterface.ClosestPointInput input, DiscreteCollisionDetectorInterface.Result output, IDebugDraw debugDraw) - { - float distance = 0; - - Vector3 normalInB = new Vector3(); - Vector3 pointOnA = new Vector3(), pointOnB = new Vector3(); - - Matrix localTransA = input.TransformA; - Matrix localTransB = input.TransformB; - - Vector3 positionOffset = (localTransA.Translation + localTransB.Translation) * 0.5f; - localTransA.Translation -= positionOffset; - localTransB.Translation -= positionOffset; - - float marginA = _minkowskiA.Margin; - float marginB = _minkowskiB.Margin; - - _numGjkChecks++; - - if (_ignoreMargin) - { - marginA = 0; - marginB = 0; - } - - _currentIteration = 0; - - int gjkMaxIter = 1000; - _cachedSeparatingAxis = new Vector3(0, 1, 0); - - bool isValid = false; - bool checkSimplex = false; - bool checkPenetration = true; - _degenerateSimplex = 0; - - _lastUsedMethod = -1; - - { - float squaredDistance = MathHelper.Infinity; - float delta = 0; - - float margin = marginA + marginB; - - _simplexSolver.Reset(); - - while (true) - { - Matrix transABasis = input.TransformA; - transABasis.Translation = Vector3.Zero; - - Matrix transBBasis = input.TransformB; - transBBasis.Translation = Vector3.Zero; - - Vector3 seperatingAxisInA = Vector3.TransformNormal(-_cachedSeparatingAxis, transABasis); - Vector3 seperatingAxisInB = Vector3.TransformNormal(_cachedSeparatingAxis, transBBasis); - - Vector3 pInA = _minkowskiA.LocalGetSupportingVertexWithoutMargin(seperatingAxisInA); - Vector3 qInB = _minkowskiB.LocalGetSupportingVertexWithoutMargin(seperatingAxisInB); - Vector3 pWorld = MathHelper.MatrixToVector(localTransA, pInA); - Vector3 qWorld = MathHelper.MatrixToVector(localTransB, qInB); - - Vector3 w = pWorld - qWorld; - delta = Vector3.Dot(_cachedSeparatingAxis, w); - - if ((delta > 0.0) && (delta * delta > squaredDistance * input.MaximumDistanceSquared)) - { - checkPenetration = false; - break; - } - - if (_simplexSolver.InSimplex(w)) - { - _degenerateSimplex = 1; - checkSimplex = true; - break; - } - - float f0 = squaredDistance - delta; - float f1 = squaredDistance * RelativeError2; - - if (f0 <= f1) - { - if (f0 <= 0.0f) - { - _degenerateSimplex = 2; - } - - checkSimplex = true; - break; - } - - _simplexSolver.AddVertex(w, pWorld, qWorld); - - if (!_simplexSolver.Closest(out _cachedSeparatingAxis)) - { - _degenerateSimplex = 3; - checkSimplex = true; - break; - } - - float previouseSquaredDistance = squaredDistance; - squaredDistance = _cachedSeparatingAxis.LengthSquared(); - - if (previouseSquaredDistance - squaredDistance <= MathHelper.Epsilon * previouseSquaredDistance) - { - _simplexSolver.BackupClosest(out _cachedSeparatingAxis); - checkSimplex = true; - break; - } - - if (_currentIteration++ > gjkMaxIter) - { -#if DEBUG - Console.WriteLine("GjkPairDetector maxIter exceeded: {0}", _currentIteration); - Console.WriteLine("sepAxis=({0},{1},{2}), squaredDistance = {3}, shapeTypeA={4}, shapeTypeB={5}", - _cachedSeparatingAxis.X, - _cachedSeparatingAxis.Y, - _cachedSeparatingAxis.Z, - squaredDistance, - _minkowskiA.ShapeType, - _minkowskiB.ShapeType - ); -#endif - break; - } - - bool check = (!_simplexSolver.FullSimplex); - - if (!check) - { - _simplexSolver.BackupClosest(out _cachedSeparatingAxis); - break; - } - } - - if (checkSimplex) - { - _simplexSolver.ComputePoints(out pointOnA, out pointOnB); - normalInB = pointOnA - pointOnB; - float lenSqr = _cachedSeparatingAxis.LengthSquared(); - - if (lenSqr < 0.0001f) - { - _degenerateSimplex = 5; - } - - if (lenSqr > MathHelper.Epsilon * MathHelper.Epsilon) - { - float rlen = 1.0f / (float)Math.Sqrt((float)lenSqr); - normalInB *= rlen; - float s = (float)Math.Sqrt((float)squaredDistance); - - BulletDebug.Assert(s > 0); - pointOnA -= _cachedSeparatingAxis * (marginA / s); - pointOnB += _cachedSeparatingAxis * (marginB / s); - distance = ((1 / rlen) - margin); - - isValid = true; - - _lastUsedMethod = 1; - } - else - { - _lastUsedMethod = 2; - } - } - - bool catchDegeneratePenetrationCase = - (_catchDegeneracies != 0 && _penetrationDepthSolver != null && _degenerateSimplex != 0 && ((distance + margin) < 0.01f)); - - if (checkPenetration && (!isValid || catchDegeneratePenetrationCase)) - { -#warning Check this - if (_penetrationDepthSolver != null) - { - Vector3 tmpPointOnA, tmpPointOnB; - - _numDeepPenetrationChecks++; - - bool isValid2 = _penetrationDepthSolver.CalculatePenetrationDepth( - _simplexSolver, _minkowskiA, _minkowskiB, localTransA, localTransB, - _cachedSeparatingAxis, out tmpPointOnA, out tmpPointOnB, - debugDraw - ); - - if (isValid2) - { - Vector3 tmpNormalInB = tmpPointOnB - tmpPointOnA; - float lengSqr = tmpNormalInB.LengthSquared(); - - if (lengSqr > (MathHelper.Epsilon * MathHelper.Epsilon)) - { - tmpNormalInB /= (float)Math.Sqrt((float)lengSqr); - float distance2 = -(tmpPointOnA - tmpPointOnB).Length(); - - if (!isValid || (distance2 < distance)) - { - distance = distance2; - pointOnA = tmpPointOnA; - pointOnB = tmpPointOnB; - normalInB = tmpNormalInB; - isValid = true; - _lastUsedMethod = 3; - } - else - { - - } - } - else - { - _lastUsedMethod = 4; - } - } - else - { - _lastUsedMethod = 5; - } - } - } - - if (isValid) - { - output.AddContactPoint(normalInB, pointOnB + positionOffset, distance); - } - } - } - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/IConvexPenetrationDepthSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/IConvexPenetrationDepthSolver.cs deleted file mode 100644 index 08206c8e93..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/IConvexPenetrationDepthSolver.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// IConvexPenetrationDepthSolver provides an interface for penetration depth calculation. - /// - public interface IConvexPenetrationDepthSolver - { - bool CalculatePenetrationDepth( - ISimplexSolver simplexSolver, - ConvexShape convexA, ConvexShape convexB, - Matrix transformA, Matrix transformB, - Vector3 vector, out Vector3 ptrA, out Vector3 ptrB, - IDebugDraw debugDraw//, StackAlloc stackAlloc - ); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ISimplexSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ISimplexSolver.cs deleted file mode 100644 index f1b1807177..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ISimplexSolver.cs +++ /dev/null @@ -1,48 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// ISimplexSolver can incrementally calculate distance between origin and up to 4 vertices - /// Used by GJK or Linear Casting. Can be implemented by the Johnson-algorithm or alternative approaches based on - /// voronoi regions or barycentric coordinates - public interface ISimplexSolver - { - void Reset(); - void AddVertex(Vector3 w, Vector3 p, Vector3 q); - bool Closest(out Vector3 v); - - int GetSimplex(out Vector3[] pBuf, out Vector3[] qBuf, out Vector3[] yBuf); - bool InSimplex(Vector3 w); - void BackupClosest(out Vector3 v); - void ComputePoints(out Vector3 pA, out Vector3 pB); - - int NumVertices { get;} - bool EmptySimplex { get;} - float MaxVertex { get;} - bool FullSimplex { get;} - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ManifoldPoint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ManifoldPoint.cs deleted file mode 100644 index f5bcedc3e9..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/ManifoldPoint.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class ManifoldPoint - { - private Vector3 _localPointA; - private Vector3 _localPointB; - private Vector3 _positionWorldOnB; - private Vector3 _positionWorldOnA; - private Vector3 _normalWorldOnB; - - private float _distance; - private float _combinedFriction; - private float _combinedRestitution; - - private object _userPersistentData; - - private int _lifeTime;//lifetime of the contactpoint in frames - - public ManifoldPoint() - : this(new Vector3(), new Vector3(), new Vector3(), 0f) - { - } - - public ManifoldPoint(Vector3 pointA, Vector3 pointB, - Vector3 normal, - float distance) - { - _localPointA = pointA; - _localPointB = pointB; - _normalWorldOnB = normal; - _distance = distance; - _positionWorldOnA = new Vector3(); - _positionWorldOnB = new Vector3(); - } - - public float Distance { get { return _distance; } set { _distance = value; } } - public int LifeTime { get { return _lifeTime; } set { _lifeTime = value; } } - - public Vector3 PositionWorldOnA { get { return _positionWorldOnA; } set { _positionWorldOnA = value; } } - public Vector3 PositionWorldOnB { get { return _positionWorldOnB; } set { _positionWorldOnB = value; } } - - public Vector3 LocalPointA { get { return _localPointA; } set { _localPointA = value; } } - public Vector3 LocalPointB { get { return _localPointB; } set { _localPointB = value; } } - - public Vector3 NormalWorldOnB { get { return _normalWorldOnB; } } - - public float CombinedFriction { get { return _combinedFriction; } set { _combinedFriction = value; } } - public float CombinedRestitution { get { return _combinedRestitution; } set { _combinedRestitution = value; } } - - public object UserPersistentData { get { return _userPersistentData; } set { _userPersistentData = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cs deleted file mode 100644 index 7363e2830d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cs +++ /dev/null @@ -1,246 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// MinkowskiPenetrationDepthSolver implements bruteforce penetration depth estimation. - /// Implementation is based on sampling the depth using support mapping, and using GJK step to get the witness points. - /// - public class MinkowskiPenetrationDepthSolver : IConvexPenetrationDepthSolver - { - private const int UnitSpherePointsCount = 42; - - private static Vector3[] penetrationDirections = - { - new Vector3(0.000000f , -0.000000f,-1.000000f), - new Vector3(0.723608f , -0.525725f,-0.447219f), - new Vector3(-0.276388f , -0.850649f,-0.447219f), - new Vector3(-0.894426f , -0.000000f,-0.447216f), - new Vector3(-0.276388f , 0.850649f,-0.447220f), - new Vector3(0.723608f , 0.525725f,-0.447219f), - new Vector3(0.276388f , -0.850649f,0.447220f), - new Vector3(-0.723608f , -0.525725f,0.447219f), - new Vector3(-0.723608f , 0.525725f,0.447219f), - new Vector3(0.276388f , 0.850649f,0.447219f), - new Vector3(0.894426f , 0.000000f,0.447216f), - new Vector3(-0.000000f , 0.000000f,1.000000f), - new Vector3(0.425323f , -0.309011f,-0.850654f), - new Vector3(-0.162456f , -0.499995f,-0.850654f), - new Vector3(0.262869f , -0.809012f,-0.525738f), - new Vector3(0.425323f , 0.309011f,-0.850654f), - new Vector3(0.850648f , -0.000000f,-0.525736f), - new Vector3(-0.525730f , -0.000000f,-0.850652f), - new Vector3(-0.688190f , -0.499997f,-0.525736f), - new Vector3(-0.162456f , 0.499995f,-0.850654f), - new Vector3(-0.688190f , 0.499997f,-0.525736f), - new Vector3(0.262869f , 0.809012f,-0.525738f), - new Vector3(0.951058f , 0.309013f,0.000000f), - new Vector3(0.951058f , -0.309013f,0.000000f), - new Vector3(0.587786f , -0.809017f,0.000000f), - new Vector3(0.000000f , -1.000000f,0.000000f), - new Vector3(-0.587786f , -0.809017f,0.000000f), - new Vector3(-0.951058f , -0.309013f,-0.000000f), - new Vector3(-0.951058f , 0.309013f,-0.000000f), - new Vector3(-0.587786f , 0.809017f,-0.000000f), - new Vector3(-0.000000f , 1.000000f,-0.000000f), - new Vector3(0.587786f , 0.809017f,-0.000000f), - new Vector3(0.688190f , -0.499997f,0.525736f), - new Vector3(-0.262869f , -0.809012f,0.525738f), - new Vector3(-0.850648f , 0.000000f,0.525736f), - new Vector3(-0.262869f , 0.809012f,0.525738f), - new Vector3(0.688190f , 0.499997f,0.525736f), - new Vector3(0.525730f , 0.000000f,0.850652f), - new Vector3(0.162456f , -0.499995f,0.850654f), - new Vector3(-0.425323f , -0.309011f,0.850654f), - new Vector3(-0.425323f , 0.309011f,0.850654f), - new Vector3(0.162456f , 0.499995f,0.850654f) - }; - - private class IntermediateResult : DiscreteCollisionDetectorInterface.Result - { - private Vector3 _normalOnBInWorld; - private Vector3 _pointInWorld; - private float _depth; - private bool _hasResult; - - public IntermediateResult() - { - _hasResult = false; - } - - public bool HasResult { get { return _hasResult; } } - public float Depth { get { return _depth; } } - public Vector3 PointInWorld { get { return _pointInWorld; } } - - public override void SetShapeIdentifiers(int partId0, int index0, int partId1, int index1) - { - } - - public override void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth) - { - _normalOnBInWorld = normalOnBInWorld; - _pointInWorld = pointInWorld; - _depth = depth; - _hasResult = true; - } - } - - #region IConvexPenetrationDepthSolver Members - public bool CalculatePenetrationDepth(ISimplexSolver simplexSolver, - ConvexShape convexA, ConvexShape convexB, - Matrix transformA, Matrix transformB, - Vector3 v, out Vector3 pa, out Vector3 pb, IDebugDraw debugDraw) - { - pa = new Vector3(); - pb = new Vector3(); - //just take fixed number of orientation, and sample the penetration depth in that direction - float minProj = 1e30f; - Vector3 minNorm = new Vector3(); - Vector3 minA = new Vector3(), minB = new Vector3(); - Vector3 seperatingAxisInA, seperatingAxisInB; - Vector3 pInA, qInB, pWorld, qWorld, w; - - Vector3[] supportVerticesABatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2]; - Vector3[] supportVerticesBBatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2]; - Vector3[] seperatingAxisInABatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2]; - Vector3[] seperatingAxisInBBatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2]; - - int numSampleDirections = UnitSpherePointsCount; - - for (int i = 0; i < numSampleDirections; i++) - { - Vector3 norm = penetrationDirections[i]; - seperatingAxisInABatch[i] = Vector3.TransformNormal((-norm), transformA); - seperatingAxisInBBatch[i] = Vector3.TransformNormal(norm, transformB); - } - - { - int numPDA = convexA.PreferredPenetrationDirectionsCount; - if (numPDA != 0) - { - for (int i = 0; i < numPDA; i++) - { - Vector3 norm; - convexA.GetPreferredPenetrationDirection(i, out norm); - norm = Vector3.TransformNormal(norm, transformA); - penetrationDirections[numSampleDirections] = norm; - seperatingAxisInABatch[numSampleDirections] = Vector3.TransformNormal((-norm), transformA); - seperatingAxisInBBatch[numSampleDirections] = Vector3.TransformNormal(norm, transformB); - numSampleDirections++; - } - } - } - - { - int numPDB = convexB.PreferredPenetrationDirectionsCount; - if (numPDB != 0) - { - for (int i = 0; i < numPDB; i++) - { - Vector3 norm; - convexB.GetPreferredPenetrationDirection(i, out norm); - norm = Vector3.TransformNormal(norm, transformB); - penetrationDirections[numSampleDirections] = norm; - seperatingAxisInABatch[numSampleDirections] = Vector3.TransformNormal((-norm), transformA); - seperatingAxisInBBatch[numSampleDirections] = Vector3.TransformNormal(norm, transformB); - numSampleDirections++; - } - } - } - - convexA.BatchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch, supportVerticesABatch); //, numSampleDirections); - convexB.BatchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch, supportVerticesBBatch); //, numSampleDirections); - - for (int i = 0; i < numSampleDirections; i++) - { - Vector3 norm = penetrationDirections[i]; - seperatingAxisInA = seperatingAxisInABatch[i]; - seperatingAxisInB = seperatingAxisInBBatch[i]; - - pInA = supportVerticesABatch[i]; - qInB = supportVerticesBBatch[i]; - - pWorld = MathHelper.MatrixToVector(transformA, pInA); - qWorld = MathHelper.MatrixToVector(transformB, qInB); - w = qWorld - pWorld; - float delta = Vector3.Dot(norm, w); - //find smallest delta - if (delta < minProj) - { - minProj = delta; - minNorm = norm; - minA = pWorld; - minB = qWorld; - } - } - - //add the margins - minA += minNorm * convexA.Margin; - minB -= minNorm * convexB.Margin; - //no penetration - if (minProj < 0) - return false; - - minProj += (convexA.Margin + convexB.Margin); - - GjkPairDetector gjkdet = new GjkPairDetector(convexA, convexB, simplexSolver, null); - - float offsetDist = minProj; - Vector3 offset = minNorm * offsetDist; - - GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput(); - - Vector3 newOrg = transformA.Translation + offset; - - Matrix displacedTrans = transformA; - displacedTrans.Translation = newOrg; - - input.TransformA = displacedTrans; - input.TransformB = transformB; - input.MaximumDistanceSquared = 1e30f;//minProj; - - IntermediateResult res = new IntermediateResult(); - gjkdet.GetClosestPoints(input, res, debugDraw); - - float correctedMinNorm = minProj - res.Depth; - - //the penetration depth is over-estimated, relax it - float penetration_relaxation = 1; - minNorm *= penetration_relaxation; - - if (res.HasResult) - { - - pa = res.PointInWorld - minNorm * correctedMinNorm; - pb = res.PointInWorld; - } - - return res.HasResult; - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/PersistentManifold.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/PersistentManifold.cs deleted file mode 100644 index 04a533d281..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/PersistentManifold.cs +++ /dev/null @@ -1,272 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public delegate bool ContactDestroyedCallback(object userPersistentData); - - public class PersistentManifold - { - private static ContactDestroyedCallback _contactDestroyedCallback = null; - private static float _contactBreakingThreshold = 0.02f; - - private ManifoldPoint[] _pointCache = new ManifoldPoint[4]; - - // this two body pointers can point to the physics rigidbody class. - // object will allow any rigidbody class - private object _bodyA; - private object _bodyB; - private int _cachedPoints; - - public PersistentManifold(object bodyA, object bodyB) - { - _bodyA = bodyA; - _bodyB = bodyB; - _cachedPoints = 0; - } - - public object BodyA { get { return _bodyA; } } - public object BodyB { get { return _bodyB; } } - - public int ContactsCount { get { return _cachedPoints; } } - - public static ContactDestroyedCallback ContactDestroyedCallback { get { return _contactDestroyedCallback; } set { _contactDestroyedCallback = value; } } - public static float ContactBreakingThreshold { get { return _contactBreakingThreshold; } } - - public void SetBodies(object bodyA, object bodyB) - { - _bodyA = bodyA; - _bodyB = bodyB; - } - - public ManifoldPoint GetContactPoint(int index) - { - if (index >= _cachedPoints) - throw new ArgumentOutOfRangeException("index", "index must be smaller than cachedPoints"); - - return _pointCache[index]; - } - - public int GetCacheEntry(ManifoldPoint newPoint) - { - float shortestDist = ContactBreakingThreshold * ContactBreakingThreshold; - int size = ContactsCount; - int nearestPoint = -1; - for (int i = 0; i < size; i++) - { - ManifoldPoint mp = _pointCache[i]; - - Vector3 diffA = mp.LocalPointA - newPoint.LocalPointA; - float distToManiPoint = Vector3.Dot(diffA, diffA); - if (distToManiPoint < shortestDist) - { - shortestDist = distToManiPoint; - nearestPoint = i; - } - } - return nearestPoint; - } - - public void AddManifoldPoint(ManifoldPoint newPoint) - { - if (!ValidContactDistance(newPoint)) - throw new BulletException(); - - int insertIndex = ContactsCount; - if (insertIndex == 4) - { - //sort cache so best points come first, based on area - insertIndex = SortCachedPoints(newPoint); - } - else - { - _cachedPoints++; - } - ReplaceContactPoint(newPoint, insertIndex); - } - - public void RemoveContactPoint(int index) - { - ClearUserCache(_pointCache[index]); - - int lastUsedIndex = ContactsCount - 1; - _pointCache[index] = _pointCache[lastUsedIndex]; - //get rid of duplicated userPersistentData pointer - _pointCache[lastUsedIndex].UserPersistentData = null; - _cachedPoints--; - } - - public void ReplaceContactPoint(ManifoldPoint newPoint, int insertIndex) - { - BulletDebug.Assert(ValidContactDistance(newPoint)); - - if (_pointCache[insertIndex] != null) - { - int lifeTime = _pointCache[insertIndex].LifeTime; - BulletDebug.Assert(lifeTime >= 0); - object cache = _pointCache[insertIndex].UserPersistentData; - - _pointCache[insertIndex] = newPoint; - - _pointCache[insertIndex].UserPersistentData = cache; - _pointCache[insertIndex].LifeTime = lifeTime; - } - else - { - _pointCache[insertIndex] = newPoint; - } - - //ClearUserCache(_pointCache[insertIndex]); - //_pointCache[insertIndex] = newPoint; - } - - public bool ValidContactDistance(ManifoldPoint pt) - { - return pt.Distance <= ContactBreakingThreshold; - } - - // calculated new worldspace coordinates and depth, and reject points that exceed the collision margin - public void RefreshContactPoints(Matrix trA, Matrix trB) - { - // first refresh worldspace positions and distance - for (int i = ContactsCount - 1; i >= 0; i--) - { - ManifoldPoint manifoldPoint = _pointCache[i]; - manifoldPoint.PositionWorldOnA = MathHelper.MatrixToVector(trA,manifoldPoint.LocalPointA); - manifoldPoint.PositionWorldOnB = MathHelper.MatrixToVector(trB, manifoldPoint.LocalPointB); - manifoldPoint.Distance = Vector3.Dot(manifoldPoint.PositionWorldOnA - manifoldPoint.PositionWorldOnB, manifoldPoint.NormalWorldOnB); - manifoldPoint.LifeTime++; - } - - // then - float distance2d; - Vector3 projectedDifference, projectedPoint; - for (int i = ContactsCount - 1; i >= 0; i--) - { - - ManifoldPoint manifoldPoint = _pointCache[i]; - //contact becomes invalid when signed distance exceeds margin (projected on contactnormal direction) - if (!ValidContactDistance(manifoldPoint)) - { - RemoveContactPoint(i); - } - else - { - //contact also becomes invalid when relative movement orthogonal to normal exceeds margin - projectedPoint = manifoldPoint.PositionWorldOnA - manifoldPoint.NormalWorldOnB * manifoldPoint.Distance; - projectedDifference = manifoldPoint.PositionWorldOnB - projectedPoint; - distance2d = Vector3.Dot(projectedDifference, projectedDifference); - if (distance2d > ContactBreakingThreshold * ContactBreakingThreshold) - { - RemoveContactPoint(i); - } - } - } - } - - public void ClearManifold() - { - for (int i = 0; i < _cachedPoints; i++) - { - ClearUserCache(_pointCache[i]); - } - _cachedPoints = 0; - } - - private void ClearUserCache(ManifoldPoint pt) - { - if (pt != null) - { - object oldPtr = pt.UserPersistentData; - - if (oldPtr != null) - { - if (pt.UserPersistentData != null && _contactDestroyedCallback != null) - { - _contactDestroyedCallback(pt.UserPersistentData); - pt.UserPersistentData = null; - } - } - } - } - - // sort cached points so most isolated points come first - private int SortCachedPoints(ManifoldPoint pt) - { - //calculate 4 possible cases areas, and take biggest area - //also need to keep 'deepest' - - int maxPenetrationIndex = -1; - float maxPenetration = pt.Distance; - for (int i = 0; i < 4; i++) - { - if (_pointCache[i].Distance < maxPenetration) - { - maxPenetrationIndex = i; - maxPenetration = _pointCache[i].Distance; - } - } - - float res0 = 0, res1 = 0, res2 = 0, res3 = 0; - if (maxPenetrationIndex != 0) - { - Vector3 a0 = pt.LocalPointA - _pointCache[1].LocalPointA; - Vector3 b0 = _pointCache[3].LocalPointA - _pointCache[2].LocalPointA; - Vector3 cross = Vector3.Cross(a0, b0); - res0 = cross.LengthSquared(); - } - if (maxPenetrationIndex != 1) - { - Vector3 a1 = pt.LocalPointA - _pointCache[0].LocalPointA; - Vector3 b1 = _pointCache[3].LocalPointA - _pointCache[2].LocalPointA; - Vector3 cross = Vector3.Cross(a1, b1); - res1 = cross.LengthSquared(); - } - - if (maxPenetrationIndex != 2) - { - Vector3 a2 = pt.LocalPointA - _pointCache[0].LocalPointA; - Vector3 b2 = _pointCache[3].LocalPointA - _pointCache[1].LocalPointA; - Vector3 cross = Vector3.Cross(a2, b2); - res2 = cross.LengthSquared(); - } - - if (maxPenetrationIndex != 3) - { - Vector3 a3 = pt.LocalPointA - _pointCache[0].LocalPointA; - Vector3 b3 = _pointCache[2].LocalPointA - _pointCache[1].LocalPointA; - Vector3 cross = Vector3.Cross(a3, b3); - res3 = cross.LengthSquared(); - } - - Vector4 maxvec = new Vector4(res0, res1, res2, res3); - int biggestarea = MathHelper.ClosestAxis(maxvec); - return biggestarea; - } - - private int FindContactPoint(ManifoldPoint unUsed, int numUnused, ManifoldPoint pt) { return 0; } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/PointCollector.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/PointCollector.cs deleted file mode 100644 index c70741e719..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/PointCollector.cs +++ /dev/null @@ -1,64 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class PointCollector : DiscreteCollisionDetectorInterface.Result - { - private Vector3 _normalOnBInWorld; - private Vector3 _pointInWorld; - private float _distance; //negative means penetration - private bool _hasResult; - - public PointCollector() - { - _distance = 1e30f; - _hasResult = false; - } - - public Vector3 NormalOnBInWorld { get { return _normalOnBInWorld; } } - public Vector3 PointInWorld { get { return _pointInWorld; } } - public float Distance { get { return _distance; } } - public bool HasResult { get { return _hasResult; } } - - public override void SetShapeIdentifiers(int partIdA, int indexA, int partIdB, int indexB) - { - //?? - } - - public override void AddContactPoint(Vector3 normalOnBInWorld, Vector3 pointInWorld, float depth) - { - if (depth < _distance) - { - _hasResult = true; - _normalOnBInWorld = normalOnBInWorld; - _pointInWorld = pointInWorld; - //negative means penetration - _distance = depth; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/SubsimplexConvexCast.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/SubsimplexConvexCast.cs deleted file mode 100644 index 5c92a0cc36..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/SubsimplexConvexCast.cs +++ /dev/null @@ -1,142 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - /// - /// SubsimplexConvexCast implements Gino van den Bergens' paper - /// "Ray Casting against bteral Convex Objects with Application to Continuous Collision Detection" - /// GJK based Ray Cast, optimized version - /// Objects should not start in overlap, otherwise results are not defined. - /// - public class SubsimplexConvexCast : IConvexCast - { - private ISimplexSolver _simplexSolver; - private ConvexShape _convexA; - private ConvexShape _convexB; - - /// - /// Typically the conservative advancement reaches solution in a few iterations, clip it to 32 for degenerate cases. - /// See discussion about this here http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=565 - /// - private const int MaxIterations = 32; - - public SubsimplexConvexCast(ConvexShape shapeA, ConvexShape shapeB, ISimplexSolver simplexSolver) - { - _simplexSolver = simplexSolver; - _convexA = shapeA; - _convexB = shapeB; - } - - #region IConvexCast Members - /// - /// SimsimplexConvexCast calculateTimeOfImpact calculates the time of impact+normal for the linear cast (sweep) between two moving objects. - /// Precondition is that objects should not penetration/overlap at the start from the interval. Overlap can be tested using GjkPairDetector. - /// - /// - /// - /// - /// - /// - /// - public bool CalcTimeOfImpact(Matrix fromA, Matrix toA, Matrix fromB, Matrix toB, CastResult result) - { - MinkowskiSumShape convex = new MinkowskiSumShape(_convexA, _convexB); - - Matrix rayFromLocalA; - Matrix rayToLocalA; - - rayFromLocalA = MathHelper.InvertMatrix(fromA) * fromB; - rayToLocalA = MathHelper.InvertMatrix(toA) * toB; - - _simplexSolver.Reset(); - - convex.TransformB = rayFromLocalA; - - float lambda = 0; - //todo: need to verify this: - //because of minkowski difference, we need the inverse direction - - Vector3 s = -rayFromLocalA.Translation; - Vector3 r = -(rayToLocalA.Translation - rayFromLocalA.Translation); - Vector3 x = s; - Vector3 v; - Vector3 arbitraryPoint = convex.LocalGetSupportingVertex(r); - - v = x - arbitraryPoint; - - int maxIter = MaxIterations; - - Vector3 n = new Vector3(); - float lastLambda = lambda; - - float dist2 = v.LengthSquared(); - float epsilon = 0.0001f; - - Vector3 w, p; - float VdotR; - - while ((dist2 > epsilon) && (maxIter-- != 0)) - { - p = convex.LocalGetSupportingVertex(v); - w = x - p; - - float VdotW = Vector3.Dot(v, w); - - if (VdotW > 0) - { - VdotR = Vector3.Dot(v, r); - - if (VdotR >= -(MathHelper.Epsilon * MathHelper.Epsilon)) - return false; - else - { - lambda = lambda - VdotW / VdotR; - x = s + lambda * r; - _simplexSolver.Reset(); - //check next line - w = x - p; - lastLambda = lambda; - n = v; - } - } - _simplexSolver.AddVertex(w, x, p); - if (_simplexSolver.Closest(out v)) - { - dist2 = v.LengthSquared(); - } - else - { - dist2 = 0f; - } - } - result.Fraction = lambda; - result.Normal = n; - return true; - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/TriangleRaycastCallback.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/TriangleRaycastCallback.cs deleted file mode 100644 index 1e0fb3b205..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/TriangleRaycastCallback.cs +++ /dev/null @@ -1,115 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public abstract class TriangleRaycastCallback : ITriangleCallback - { - private Vector3 _from; - private Vector3 _to; - private float _hitFraction; - - public TriangleRaycastCallback(Vector3 from, Vector3 to) - { - _from = from; - _to = to; - _hitFraction = 1; - } - - public Vector3 From { get { return _from; } set { _from = value; } } - public Vector3 To { get { return _to; } set { _to = value; } } - public float HitFraction { get { return _hitFraction; } set { _hitFraction = value; } } - - public abstract float ReportHit(Vector3 hitNormalLocal, float hitFraction, int partId, int triangleIndex); - - #region ITriangleCallback Members - - public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex) - { - Vector3 vertA = triangle[0]; - Vector3 vertB = triangle[1]; - Vector3 vertC = triangle[2]; - - Vector3 vBA = vertB - vertA; - Vector3 vCA = vertC - vertA; - - Vector3 triangleNormal = Vector3.Cross(vBA, vCA); - - float dist = Vector3.Dot(vertA, triangleNormal); - float distA = Vector3.Dot(triangleNormal, _from); - distA -= dist; - float distB = Vector3.Dot(triangleNormal, _to); - distB -= dist; - - if (distA * distB >= 0.0f) - { - return; // same sign - } - - float projLength = distA - distB; - float distance = (distA) / (projLength); - // Now we have the intersection point on the plane, we'll see if it's inside the triangle - // Add an epsilon as a tolerance for the raycast, - // in case the ray hits exacly on the edge of the triangle. - // It must be scaled for the triangle size. - - if (distance < _hitFraction) - { - float edgeTolerance = triangleNormal.LengthSquared(); - edgeTolerance *= -0.0001f; - Vector3 point = new Vector3(); - MathHelper.SetInterpolate3(_from, _to, distance, ref point); - - Vector3 vertexAPoint = vertA - point; - Vector3 vertexBPoint = vertB - point; - Vector3 contactPointA = Vector3.Cross(vertexAPoint, vertexBPoint); - - if (Vector3.Dot(contactPointA, triangleNormal) >= edgeTolerance) - { - Vector3 vertexCPoint = vertC - point; - Vector3 contactPointB = Vector3.Cross(vertexBPoint, vertexCPoint); - if (Vector3.Dot(contactPointB, triangleNormal) >= edgeTolerance) - { - Vector3 contactPointC = Vector3.Cross(vertexCPoint, vertexAPoint); - - if (Vector3.Dot(contactPointC, triangleNormal) >= edgeTolerance) - { - if (distA > 0) - { - _hitFraction = ReportHit(triangleNormal, distance, partID, triangleIndex); - } - else - { - _hitFraction = ReportHit(-triangleNormal, distance, partID, triangleIndex); - } - } - } - } - } - } - #endregion - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/VoronoiSimplexSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/VoronoiSimplexSolver.cs deleted file mode 100644 index 1bc94d3345..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Collision/NarrowPhaseCollision/VoronoiSimplexSolver.cs +++ /dev/null @@ -1,643 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public class UsageBitfield - { - private bool _usedVertexA, _usedVertexB, _usedVertexC, _usedVertexD; - - public bool UsedVertexA { get { return _usedVertexA; } set { _usedVertexA = value; } } - public bool UsedVertexB { get { return _usedVertexB; } set { _usedVertexB = value; } } - public bool UsedVertexC { get { return _usedVertexC; } set { _usedVertexC = value; } } - public bool UsedVertexD { get { return _usedVertexD; } set { _usedVertexD = value; } } - - public void Reset() - { - _usedVertexA = _usedVertexB = _usedVertexC = _usedVertexD = false; - } - } - - public class SubSimplexClosestResult - { - private Vector3 _closestPointOnSimplex; - - //MASK for m_usedVertices - //stores the simplex vertex-usage, using the MASK, - // if m_usedVertices & MASK then the related vertex is used - private UsageBitfield _usedVertices = new UsageBitfield(); - private float[] _barycentricCoords = new float[4]; - private bool _degenerate; - - public Vector3 ClosestPointOnSimplex { get { return _closestPointOnSimplex; } set { _closestPointOnSimplex = value; } } - public UsageBitfield UsedVertices { get { return _usedVertices; } set { _usedVertices = value; } } - public float[] BarycentricCoords { get { return _barycentricCoords; } set { _barycentricCoords = value; } } - public bool Degenerate { get { return _degenerate; } set { _degenerate = value; } } - - public void Reset() - { - _degenerate = false; - SetBarycentricCoordinates(); - _usedVertices.Reset(); - } - - public bool IsValid - { - get - { - return (_barycentricCoords[0] >= 0f) && - (_barycentricCoords[1] >= 0f) && - (_barycentricCoords[2] >= 0f) && - (_barycentricCoords[3] >= 0f); - } - } - - public void SetBarycentricCoordinates() - { - SetBarycentricCoordinates(0f, 0f, 0f, 0f); - } - - public void SetBarycentricCoordinates(float a, float b, float c, float d) - { - _barycentricCoords[0] = a; - _barycentricCoords[1] = b; - _barycentricCoords[2] = c; - _barycentricCoords[3] = d; - } - } - - /// VoronoiSimplexSolver is an implementation of the closest point distance - /// algorithm from a 1-4 points simplex to the origin. - /// Can be used with GJK, as an alternative to Johnson distance algorithm. - public class VoronoiSimplexSolver : ISimplexSolver - { - private const int VertexA = 0, VertexB = 1, VertexC = 2, VertexD = 3; - - private const int VoronoiSimplexMaxVerts = 5; - private const bool CatchDegenerateTetrahedron = true; - - private int _numVertices; - - private Vector3[] _simplexVectorW = new Vector3[VoronoiSimplexMaxVerts]; - private Vector3[] _simplexPointsP = new Vector3[VoronoiSimplexMaxVerts]; - private Vector3[] _simplexPointsQ = new Vector3[VoronoiSimplexMaxVerts]; - - private Vector3 _cachedPA; - private Vector3 _cachedPB; - private Vector3 _cachedV; - private Vector3 _lastW; - private bool _cachedValidClosest; - - private SubSimplexClosestResult _cachedBC = new SubSimplexClosestResult(); - - private bool _needsUpdate; - - #region ISimplexSolver Members - - public bool FullSimplex - { - get - { - return _numVertices == 4; - } - } - - public int NumVertices - { - get - { - return _numVertices; - } - } - - public void Reset() - { - _cachedValidClosest = false; - _numVertices = 0; - _needsUpdate = true; - _lastW = new Vector3(1e30f, 1e30f, 1e30f); - _cachedBC.Reset(); - } - - public void AddVertex(Vector3 w, Vector3 p, Vector3 q) - { - _lastW = w; - _needsUpdate = true; - - _simplexVectorW[_numVertices] = w; - _simplexPointsP[_numVertices] = p; - _simplexPointsQ[_numVertices] = q; - - _numVertices++; - } - - //return/calculate the closest vertex - public bool Closest(out Vector3 v) - { - bool succes = UpdateClosestVectorAndPoints(); - v = _cachedV; - return succes; - } - - public float MaxVertex - { - get - { - int numverts = NumVertices; - float maxV = 0f, curLen2; - for (int i = 0; i < numverts; i++) - { - curLen2 = _simplexVectorW[i].LengthSquared(); - if (maxV < curLen2) maxV = curLen2; - } - return maxV; - } - } - - //return the current simplex - public int GetSimplex(out Vector3[] pBuf, out Vector3[] qBuf, out Vector3[] yBuf) - { - int numverts = NumVertices; - pBuf = new Vector3[numverts]; - qBuf = new Vector3[numverts]; - yBuf = new Vector3[numverts]; - for (int i = 0; i < numverts; i++) - { - yBuf[i] = _simplexVectorW[i]; - pBuf[i] = _simplexPointsP[i]; - qBuf[i] = _simplexPointsQ[i]; - } - return numverts; - } - - public bool InSimplex(Vector3 w) - { - //check in case lastW is already removed - if (w == _lastW) return true; - - //w is in the current (reduced) simplex - int numverts = NumVertices; - for (int i = 0; i < numverts; i++) - if (_simplexVectorW[i] == w) return true; - - return false; - } - - public void BackupClosest(out Vector3 v) - { - v = _cachedV; - } - - public bool EmptySimplex - { - get - { - return NumVertices == 0; - } - } - - public void ComputePoints(out Vector3 p1, out Vector3 p2) - { - UpdateClosestVectorAndPoints(); - p1 = _cachedPA; - p2 = _cachedPB; - } - - #endregion - - public void RemoveVertex(int index) - { - BulletDebug.Assert(_numVertices > 0); - _numVertices--; - _simplexVectorW[index] = _simplexVectorW[_numVertices]; - _simplexPointsP[index] = _simplexPointsP[_numVertices]; - _simplexPointsQ[index] = _simplexPointsQ[_numVertices]; - } - - public void ReduceVertices(UsageBitfield usedVerts) - { - if ((NumVertices >= 4) && (!usedVerts.UsedVertexD)) RemoveVertex(3); - if ((NumVertices >= 3) && (!usedVerts.UsedVertexC)) RemoveVertex(2); - if ((NumVertices >= 2) && (!usedVerts.UsedVertexB)) RemoveVertex(1); - if ((NumVertices >= 1) && (!usedVerts.UsedVertexA)) RemoveVertex(0); - } - - public bool UpdateClosestVectorAndPoints() - { - if (_needsUpdate) - { - _cachedBC.Reset(); - _needsUpdate = false; - - Vector3 p, a, b, c, d; - switch (NumVertices) - { - case 0: - _cachedValidClosest = false; - break; - case 1: - _cachedPA = _simplexPointsP[0]; - _cachedPB = _simplexPointsQ[0]; - _cachedV = _cachedPA - _cachedPB; - _cachedBC.Reset(); - _cachedBC.SetBarycentricCoordinates(1f, 0f, 0f, 0f); - _cachedValidClosest = _cachedBC.IsValid; - break; - case 2: - //closest point origin from line segment - Vector3 from = _simplexVectorW[0]; - Vector3 to = _simplexVectorW[1]; - Vector3 nearest; - - Vector3 diff = -from; - Vector3 v = to - from; - float t = Vector3.Dot(v, diff); - - if (t > 0) - { - float dotVV = v.LengthSquared(); - if (t < dotVV) - { - t /= dotVV; - diff -= t * v; - _cachedBC.UsedVertices.UsedVertexA = true; - _cachedBC.UsedVertices.UsedVertexB = true; - } - else - { - t = 1; - diff -= v; - //reduce to 1 point - _cachedBC.UsedVertices.UsedVertexB = true; - } - } - else - { - t = 0; - //reduce to 1 point - _cachedBC.UsedVertices.UsedVertexA = true; - } - - _cachedBC.SetBarycentricCoordinates(1 - t, t, 0, 0); - nearest = from + t * v; - - _cachedPA = _simplexPointsP[0] + t * (_simplexPointsP[1] - _simplexPointsP[0]); - _cachedPB = _simplexPointsQ[0] + t * (_simplexPointsQ[1] - _simplexPointsQ[0]); - _cachedV = _cachedPA - _cachedPB; - - ReduceVertices(_cachedBC.UsedVertices); - - _cachedValidClosest = _cachedBC.IsValid; - break; - case 3: - //closest point origin from triangle - p = new Vector3(); - a = _simplexVectorW[0]; - b = _simplexVectorW[1]; - c = _simplexVectorW[2]; - - ClosestPtPointTriangle(p, a, b, c, ref _cachedBC); - _cachedPA = _simplexPointsP[0] * _cachedBC.BarycentricCoords[0] + - _simplexPointsP[1] * _cachedBC.BarycentricCoords[1] + - _simplexPointsP[2] * _cachedBC.BarycentricCoords[2] + - _simplexPointsP[3] * _cachedBC.BarycentricCoords[3]; - - _cachedPB = _simplexPointsQ[0] * _cachedBC.BarycentricCoords[0] + - _simplexPointsQ[1] * _cachedBC.BarycentricCoords[1] + - _simplexPointsQ[2] * _cachedBC.BarycentricCoords[2] + - _simplexPointsQ[3] * _cachedBC.BarycentricCoords[3]; - - _cachedV = _cachedPA - _cachedPB; - - ReduceVertices(_cachedBC.UsedVertices); - _cachedValidClosest = _cachedBC.IsValid; - break; - case 4: - p = new Vector3(); - a = _simplexVectorW[0]; - b = _simplexVectorW[1]; - c = _simplexVectorW[2]; - d = _simplexVectorW[3]; - - bool hasSeperation = ClosestPtPointTetrahedron(p, a, b, c, d, ref _cachedBC); - - if (hasSeperation) - { - _cachedPA = _simplexPointsP[0] * _cachedBC.BarycentricCoords[0] + - _simplexPointsP[1] * _cachedBC.BarycentricCoords[1] + - _simplexPointsP[2] * _cachedBC.BarycentricCoords[2] + - _simplexPointsP[3] * _cachedBC.BarycentricCoords[3]; - - _cachedPB = _simplexPointsQ[0] * _cachedBC.BarycentricCoords[0] + - _simplexPointsQ[1] * _cachedBC.BarycentricCoords[1] + - _simplexPointsQ[2] * _cachedBC.BarycentricCoords[2] + - _simplexPointsQ[3] * _cachedBC.BarycentricCoords[3]; - - _cachedV = _cachedPA - _cachedPB; - ReduceVertices(_cachedBC.UsedVertices); - } - else - { - if (_cachedBC.Degenerate) - { - _cachedValidClosest = false; - } - else - { - _cachedValidClosest = true; - //degenerate case == false, penetration = true + zero - _cachedV.X = _cachedV.Y = _cachedV.Z = 0f; - } - break; // !!!!!!!!!!!! proverit na vsakiy sluchai - } - - _cachedValidClosest = _cachedBC.IsValid; - - //closest point origin from tetrahedron - break; - default: - _cachedValidClosest = false; - break; - } - } - - return _cachedValidClosest; - } - - public bool ClosestPtPointTriangle(Vector3 p, Vector3 a, Vector3 b, Vector3 c, - ref SubSimplexClosestResult result) - { - result.UsedVertices.Reset(); - - float v, w; - - // Check if P in vertex region outside A - Vector3 ab = b - a; - Vector3 ac = c - a; - Vector3 ap = p - a; - float d1 = Vector3.Dot(ab, ap); - float d2 = Vector3.Dot(ac, ap); - if (d1 <= 0f && d2 <= 0f) - { - result.ClosestPointOnSimplex = a; - result.UsedVertices.UsedVertexA = true; - result.SetBarycentricCoordinates(1, 0, 0, 0); - return true; // a; // barycentric coordinates (1,0,0) - } - - // Check if P in vertex region outside B - Vector3 bp = p - b; - float d3 = Vector3.Dot(ab, bp); - float d4 = Vector3.Dot(ac, bp); - if (d3 >= 0f && d4 <= d3) - { - result.ClosestPointOnSimplex = b; - result.UsedVertices.UsedVertexB = true; - result.SetBarycentricCoordinates(0, 1, 0, 0); - - return true; // b; // barycentric coordinates (0,1,0) - } - // Check if P in edge region of AB, if so return projection of P onto AB - float vc = d1 * d4 - d3 * d2; - if (vc <= 0f && d1 >= 0f && d3 <= 0f) - { - v = d1 / (d1 - d3); - result.ClosestPointOnSimplex = a + v * ab; - result.UsedVertices.UsedVertexA = true; - result.UsedVertices.UsedVertexB = true; - result.SetBarycentricCoordinates(1 - v, v, 0, 0); - return true; - //return a + v * ab; // barycentric coordinates (1-v,v,0) - } - - // Check if P in vertex region outside C - Vector3 cp = p - c; - float d5 = Vector3.Dot(ab, cp); - float d6 = Vector3.Dot(ac, cp); - if (d6 >= 0f && d5 <= d6) - { - result.ClosestPointOnSimplex = c; - result.UsedVertices.UsedVertexC = true; - result.SetBarycentricCoordinates(0, 0, 1, 0); - return true;//c; // barycentric coordinates (0,0,1) - } - - // Check if P in edge region of AC, if so return projection of P onto AC - float vb = d5 * d2 - d1 * d6; - if (vb <= 0f && d2 >= 0f && d6 <= 0f) - { - w = d2 / (d2 - d6); - result.ClosestPointOnSimplex = a + w * ac; - result.UsedVertices.UsedVertexA = true; - result.UsedVertices.UsedVertexC = true; - result.SetBarycentricCoordinates(1 - w, 0, w, 0); - return true; - //return a + w * ac; // barycentric coordinates (1-w,0,w) - } - - // Check if P in edge region of BC, if so return projection of P onto BC - float va = d3 * d6 - d5 * d4; - if (va <= 0f && (d4 - d3) >= 0f && (d5 - d6) >= 0f) - { - w = (d4 - d3) / ((d4 - d3) + (d5 - d6)); - - result.ClosestPointOnSimplex = b + w * (c - b); - result.UsedVertices.UsedVertexB = true; - result.UsedVertices.UsedVertexC = true; - result.SetBarycentricCoordinates(0, 1 - w, w, 0); - return true; - // return b + w * (c - b); // barycentric coordinates (0,1-w,w) - } - - // P inside face region. Compute Q through its barycentric coordinates (u,v,w) - float denom = 1.0f / (va + vb + vc); - v = vb * denom; - w = vc * denom; - - result.ClosestPointOnSimplex = a + ab * v + ac * w; - result.UsedVertices.UsedVertexA = true; - result.UsedVertices.UsedVertexB = true; - result.UsedVertices.UsedVertexC = true; - result.SetBarycentricCoordinates(1 - v - w, v, w, 0); - - return true; - } - - /// Test if point p and d lie on opposite sides of plane through abc - public int PointOutsideOfPlane(Vector3 p, Vector3 a, Vector3 b, Vector3 c, Vector3 d) - { - Vector3 normal = Vector3.Cross(b - a, c - a); - - float signp = Vector3.Dot(p - a, normal); // [AP AB AC] - float signd = Vector3.Dot(d - a, normal); // [AD AB AC] - - if (CatchDegenerateTetrahedron) - if (signd * signd < (1e-4f * 1e-4f)) return -1; - - // Points on opposite sides if expression signs are opposite - return signp * signd < 0f ? 1 : 0; - } - - public bool ClosestPtPointTetrahedron(Vector3 p, Vector3 a, Vector3 b, Vector3 c, Vector3 d, - ref SubSimplexClosestResult finalResult) - { - SubSimplexClosestResult tempResult = new SubSimplexClosestResult(); - - // Start out assuming point inside all halfspaces, so closest to itself - finalResult.ClosestPointOnSimplex = p; - finalResult.UsedVertices.Reset(); - finalResult.UsedVertices.UsedVertexA = true; - finalResult.UsedVertices.UsedVertexB = true; - finalResult.UsedVertices.UsedVertexC = true; - finalResult.UsedVertices.UsedVertexD = true; - - int pointOutsideABC = PointOutsideOfPlane(p, a, b, c, d); - int pointOutsideACD = PointOutsideOfPlane(p, a, c, d, b); - int pointOutsideADB = PointOutsideOfPlane(p, a, d, b, c); - int pointOutsideBDC = PointOutsideOfPlane(p, b, d, c, a); - - if (pointOutsideABC < 0 || pointOutsideACD < 0 || pointOutsideADB < 0 || pointOutsideBDC < 0) - { - finalResult.Degenerate = true; - return false; - } - - if (pointOutsideABC == 0 && pointOutsideACD == 0 && pointOutsideADB == 0 && pointOutsideBDC == 0) - return false; - - float bestSqDist = float.MaxValue; - // If point outside face abc then compute closest point on abc - if (pointOutsideABC != 0) - { - ClosestPtPointTriangle(p, a, b, c, ref tempResult); - Vector3 q = tempResult.ClosestPointOnSimplex; - - float sqDist = ((Vector3)(q - p)).LengthSquared(); - // Update best closest point if (squared) distance is less than current best - if (sqDist < bestSqDist) - { - bestSqDist = sqDist; - finalResult.ClosestPointOnSimplex = q; - //convert result bitmask! - finalResult.UsedVertices.Reset(); - finalResult.UsedVertices.UsedVertexA = tempResult.UsedVertices.UsedVertexA; - finalResult.UsedVertices.UsedVertexB = tempResult.UsedVertices.UsedVertexB; - finalResult.UsedVertices.UsedVertexC = tempResult.UsedVertices.UsedVertexC; - finalResult.SetBarycentricCoordinates( - tempResult.BarycentricCoords[VertexA], - tempResult.BarycentricCoords[VertexB], - tempResult.BarycentricCoords[VertexC], - 0); - } - } - - // Repeat test for face acd - if (pointOutsideACD != 0) - { - ClosestPtPointTriangle(p, a, c, d, ref tempResult); - Vector3 q = tempResult.ClosestPointOnSimplex; - //convert result bitmask! - - float sqDist = ((Vector3)(q - p)).LengthSquared(); - if (sqDist < bestSqDist) - { - bestSqDist = sqDist; - finalResult.ClosestPointOnSimplex = q; - finalResult.UsedVertices.Reset(); - finalResult.UsedVertices.UsedVertexA = tempResult.UsedVertices.UsedVertexA; - finalResult.UsedVertices.UsedVertexC = tempResult.UsedVertices.UsedVertexB; - finalResult.UsedVertices.UsedVertexD = tempResult.UsedVertices.UsedVertexC; - finalResult.SetBarycentricCoordinates( - tempResult.BarycentricCoords[VertexA], - 0, - tempResult.BarycentricCoords[VertexB], - tempResult.BarycentricCoords[VertexC]); - } - } - // Repeat test for face adb - - if (pointOutsideADB != 0) - { - ClosestPtPointTriangle(p, a, d, b, ref tempResult); - Vector3 q = tempResult.ClosestPointOnSimplex; - //convert result bitmask! - - float sqDist = ((Vector3)(q - p)).LengthSquared(); - if (sqDist < bestSqDist) - { - bestSqDist = sqDist; - finalResult.ClosestPointOnSimplex = q; - finalResult.UsedVertices.Reset(); - finalResult.UsedVertices.UsedVertexA = tempResult.UsedVertices.UsedVertexA; - finalResult.UsedVertices.UsedVertexD = tempResult.UsedVertices.UsedVertexB; - finalResult.UsedVertices.UsedVertexB = tempResult.UsedVertices.UsedVertexC; - finalResult.SetBarycentricCoordinates( - tempResult.BarycentricCoords[VertexA], - tempResult.BarycentricCoords[VertexC], - 0, - tempResult.BarycentricCoords[VertexB]); - - } - } - // Repeat test for face bdc - - if (pointOutsideBDC != 0) - { - ClosestPtPointTriangle(p, b, d, c, ref tempResult); - Vector3 q = tempResult.ClosestPointOnSimplex; - //convert result bitmask! - float sqDist = ((Vector3)(q - p)).LengthSquared(); - if (sqDist < bestSqDist) - { - bestSqDist = sqDist; - finalResult.ClosestPointOnSimplex = q; - finalResult.UsedVertices.Reset(); - finalResult.UsedVertices.UsedVertexB = tempResult.UsedVertices.UsedVertexA; - finalResult.UsedVertices.UsedVertexD = tempResult.UsedVertices.UsedVertexB; - finalResult.UsedVertices.UsedVertexC = tempResult.UsedVertices.UsedVertexC; - - finalResult.SetBarycentricCoordinates( - 0, - tempResult.BarycentricCoords[VertexA], - tempResult.BarycentricCoords[VertexC], - tempResult.BarycentricCoords[VertexB]); - } - } - - //help! we ended up full ! - - if (finalResult.UsedVertices.UsedVertexA && - finalResult.UsedVertices.UsedVertexB && - finalResult.UsedVertices.UsedVertexC && - finalResult.UsedVertices.UsedVertexD) - { - return true; - } - - return true; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/ContactConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/ContactConstraint.cs deleted file mode 100644 index e73164381d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/ContactConstraint.cs +++ /dev/null @@ -1,488 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public delegate float ContactSolverFunc (RigidBody bodyA, RigidBody bodyB, ManifoldPoint contactPoint, ContactSolverInfo info); - - public enum ContactSolverType - { - Default = 0, - TypeA, - TypeB, - User, - MaxContactSolverType, - } - - public class ConstraintPersistentData - { - // total applied impulse during most recent frame - private float _appliedImpulse; - private float _previousAppliedImpulse; - private float _accumulatedTangentImpulse0; - private float _accumulatedTangentImpulse1; - - private float _jacDiagABInv; - private float _jacDiagABInvTangentA; - private float _jacDiagABInvTangentB; - private int _persistentLifeTime; - private float _restitution; - private float _friction; - private float _penetration; - private Vector3 _frictionWorldTangentialA; - private Vector3 _frictionWorldTangentialB; - - private Vector3 _frictionAngularComponent0A; - private Vector3 _frictionAngularComponent0B; - private Vector3 _frictionAngularComponent1A; - private Vector3 _frictionAngularComponent1B; - - //some data doesn't need to be persistent over frames: todo: clean/reuse this - private Vector3 _angularComponentA; - private Vector3 _angularComponentB; - - private ContactSolverFunc _contactSolverFunc; - private ContactSolverFunc _frictionSolverFunc; - - public float AppliedImpulse { get { return _appliedImpulse; } set { _appliedImpulse = value; } } - public float PreviousAppliedImpulse { get { return _previousAppliedImpulse; } set { _previousAppliedImpulse = value; } } - public float AccumulatedTangentImpulseA { get { return _accumulatedTangentImpulse0; } set { _accumulatedTangentImpulse0 = value; } } - public float AccumulatedTangentImpulseB { get { return _accumulatedTangentImpulse1; } set { _accumulatedTangentImpulse1 = value; } } - - public float JacDiagABInv { get { return _jacDiagABInv; } set { _jacDiagABInv = value; } } - public float JacDiagABInvTangentA { get { return _jacDiagABInvTangentA; } set { _jacDiagABInvTangentA = value; } } - public float JacDiagABInvTangentB { get { return _jacDiagABInvTangentB; } set { _jacDiagABInvTangentB = value; } } - public int PersistentLifeTime { get { return _persistentLifeTime; } set { _persistentLifeTime = value; } } - public float Restitution { get { return _restitution; } set { _restitution = value; } } - public float Friction { get { return _friction; } set { _friction = value; } } - public float Penetration { get { return _penetration; } set { _penetration = value; } } - public Vector3 FrictionWorldTangentialA { get { return _frictionWorldTangentialA; } set { _frictionWorldTangentialA = value; } } - public Vector3 FrictionWorldTangentialB { get { return _frictionWorldTangentialB; } set { _frictionWorldTangentialB = value; } } - - public Vector3 FrictionAngularComponent0A { get { return _frictionAngularComponent0A; } set { _frictionAngularComponent0A = value; } } - public Vector3 FrictionAngularComponent0B { get { return _frictionAngularComponent0B; } set { _frictionAngularComponent0B = value; } } - public Vector3 FrictionAngularComponent1A { get { return _frictionAngularComponent1A; } set { _frictionAngularComponent1A = value; } } - public Vector3 FrictionAngularComponent1B { get { return _frictionAngularComponent1B; } set { _frictionAngularComponent1B = value; } } - - public Vector3 AngularComponentA { get { return _angularComponentA; } set { _angularComponentA = value; } } - public Vector3 AngularComponentB { get { return _angularComponentB; } set { _angularComponentB = value; } } - - public ContactSolverFunc ContactSolverFunc { get { return _contactSolverFunc; } set { _contactSolverFunc = value; } } - public ContactSolverFunc FrictionSolverFunc { get { return _frictionSolverFunc; } set { _frictionSolverFunc = value; } } - } - - public static class ContactConstraint - { - private const int UseInternalApplyImpulse = 1; - - /// - /// bilateral constraint between two dynamic objects - /// positive distance = separation, negative distance = penetration - /// - /// - /// - /// - /// - /// - /// - /// - /// - public static void ResolveSingleBilateral(RigidBody bodyA, Vector3 posA, - RigidBody bodyB, Vector3 posB, - float distance, Vector3 normal, out float impulse, float timeStep) - { - float normalLenSqr = normal.LengthSquared(); - - if (Math.Abs(normalLenSqr) >= 1.1f) - throw new BulletException(); - - /*if (normalLenSqr > 1.1f) - { - impulse = 0f; - return; - }*/ - Vector3 rel_pos1 = posA - bodyA.CenterOfMassPosition; - Vector3 rel_pos2 = posB - bodyB.CenterOfMassPosition; - //this jacobian entry could be re-used for all iterations - - Vector3 vel1 = bodyA.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = bodyB.GetVelocityInLocalPoint(rel_pos2); - Vector3 vel = vel1 - vel2; - - - JacobianEntry jac = new JacobianEntry(Matrix.Transpose(bodyA.CenterOfMassTransform), - Matrix.Transpose(bodyB.CenterOfMassTransform), - rel_pos1, rel_pos2, normal, bodyA.InvInertiaDiagLocal, bodyA.InverseMass, - bodyB.InvInertiaDiagLocal, bodyB.InverseMass); - - float jacDiagAB = jac.Diagonal; - float jacDiagABInv = 1f / jacDiagAB; - - float rel_vel = jac.GetRelativeVelocity( - bodyA.LinearVelocity, - Vector3.TransformNormal(bodyA.AngularVelocity, Matrix.Transpose(bodyA.CenterOfMassTransform)), - bodyB.LinearVelocity, - Vector3.TransformNormal(bodyB.AngularVelocity, Matrix.Transpose(bodyB.CenterOfMassTransform))); - float a; - a = jacDiagABInv; - - - rel_vel = Vector3.Dot(normal, vel); - - float contactDamping = 0.2f; - - float velocityImpulse = -contactDamping * rel_vel * jacDiagABInv; - impulse = velocityImpulse; - } - - - /// - /// contact constraint resolution: - /// calculate and apply impulse to satisfy non-penetration and non-negative relative velocity constraint - /// positive distance = separation, negative distance = penetration - /// - /// - /// - /// - /// - /// - public static float ResolveSingleCollision(RigidBody bodyA, RigidBody bodyB, - ManifoldPoint contactPoint, ContactSolverInfo solverInfo) - { - Vector3 pos1 = contactPoint.PositionWorldOnA; - Vector3 pos2 = contactPoint.PositionWorldOnB; - - - // printf("distance=%f\n",distance); - - Vector3 normal = contactPoint.NormalWorldOnB; - - Vector3 rel_pos1 = pos1 - bodyA.CenterOfMassPosition; - Vector3 rel_pos2 = pos2 - bodyB.CenterOfMassPosition; - - Vector3 vel1 = bodyA.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = bodyB.GetVelocityInLocalPoint(rel_pos2); - Vector3 vel = vel1 - vel2; - float rel_vel; - rel_vel = Vector3.Dot(normal, vel); - - - float Kfps = 1f / solverInfo.TimeStep; - - //float damping = solverInfo.m_damping; - float Kerp = solverInfo.Erp; - - float Kcor = Kerp * Kfps; - - //printf("dist=%f\n",distance); - - ConstraintPersistentData cpd = contactPoint.UserPersistentData as ConstraintPersistentData; - if (cpd == null) - throw new BulletException(); - - float distance = cpd.Penetration;//contactPoint.getDistance(); - - - //distance = 0.f; - float positionalError = Kcor * -distance; - //jacDiagABInv; - float velocityError = cpd.Restitution - rel_vel;// * damping; - - - float penetrationImpulse = positionalError * cpd.JacDiagABInv; - float velocityImpulse = velocityError * cpd.JacDiagABInv; - float normalImpulse = penetrationImpulse + velocityImpulse; - - // See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse - float oldNormalImpulse = cpd.AppliedImpulse; - float sum = oldNormalImpulse + normalImpulse; - cpd.AppliedImpulse = 0f > sum ? 0f : sum; - - normalImpulse = cpd.AppliedImpulse - oldNormalImpulse; - - if (bodyA.InverseMass != 0) - { - bodyA.InternalApplyImpulse(contactPoint.NormalWorldOnB * bodyA.InverseMass, cpd.AngularComponentA, normalImpulse); - } - if (bodyB.InverseMass != 0) - { - bodyB.InternalApplyImpulse(contactPoint.NormalWorldOnB * bodyB.InverseMass, cpd.AngularComponentB, -normalImpulse); - } - - /*body1.applyImpulse(normal * (normalImpulse), rel_pos1); - body2.applyImpulse(-normal * (normalImpulse), rel_pos2);*/ - - return normalImpulse; - } - - public static float ResolveSingleFriction(RigidBody bodyA, RigidBody bodyB, - ManifoldPoint contactPoint, ContactSolverInfo solverInfo) - { - - Vector3 pos1 = contactPoint.PositionWorldOnA; - Vector3 pos2 = contactPoint.PositionWorldOnB; - - Vector3 rel_pos1 = pos1 - bodyA.CenterOfMassPosition; - Vector3 rel_pos2 = pos2 - bodyB.CenterOfMassPosition; - - ConstraintPersistentData cpd = contactPoint.UserPersistentData as ConstraintPersistentData; - if (cpd == null) - throw new BulletException(); - - float combinedFriction = cpd.Friction; - - float limit = cpd.AppliedImpulse * combinedFriction; - - //friction - if (cpd.AppliedImpulse > 0) - { - //apply friction in the 2 tangential directions - - // 1st tangent - Vector3 vel1 = bodyA.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = bodyB.GetVelocityInLocalPoint(rel_pos2); - Vector3 vel = vel1 - vel2; - - float j1, j2; - - { - - float vrel = Vector3.Dot(cpd.FrictionWorldTangentialA, vel); - - // calculate j that moves us to zero relative velocity - j1 = -vrel * cpd.JacDiagABInvTangentA; - float oldTangentImpulse = cpd.AccumulatedTangentImpulseA; - cpd.AccumulatedTangentImpulseA = oldTangentImpulse + j1; - float atia = cpd.AccumulatedTangentImpulseA; - MathHelper.SetMin(ref atia, limit); - MathHelper.SetMax(ref atia, -limit); - cpd.AccumulatedTangentImpulseA = atia; - j1 = cpd.AccumulatedTangentImpulseA - oldTangentImpulse; - - } - { - // 2nd tangent - - float vrel = Vector3.Dot(cpd.FrictionWorldTangentialB, vel); - - // calculate j that moves us to zero relative velocity - j2 = -vrel * cpd.JacDiagABInvTangentB; - float oldTangentImpulse = cpd.AccumulatedTangentImpulseB; - cpd.AccumulatedTangentImpulseB = oldTangentImpulse + j2; - float atib = cpd.AccumulatedTangentImpulseB; - MathHelper.SetMin(ref atib, limit); - MathHelper.SetMax(ref atib, -limit); - cpd.AccumulatedTangentImpulseB = atib; - j2 = cpd.AccumulatedTangentImpulseB - oldTangentImpulse; - } - - if (bodyA.InverseMass != 0) - { - bodyA.InternalApplyImpulse(cpd.FrictionWorldTangentialA * bodyA.InverseMass, cpd.FrictionAngularComponent0A, j1); - bodyA.InternalApplyImpulse(cpd.FrictionWorldTangentialB * bodyA.InverseMass, cpd.FrictionAngularComponent1A, j2); - } - if (bodyB.InverseMass != 0) - { - bodyB.InternalApplyImpulse(cpd.FrictionWorldTangentialA * bodyB.InverseMass, cpd.FrictionAngularComponent0B, -j1); - bodyB.InternalApplyImpulse(cpd.FrictionWorldTangentialB * bodyB.InverseMass, cpd.FrictionAngularComponent1B, -j2); - } - - } - return cpd.AppliedImpulse; - } - - public static float ResolveSingleFrictionOriginal( - RigidBody bodyA, - RigidBody bodyB, - ManifoldPoint contactPoint, - ContactSolverInfo solverInfo) - { - Vector3 posA = contactPoint.PositionWorldOnA; - Vector3 posB = contactPoint.PositionWorldOnB; - - Vector3 relPosA = posA - bodyA.CenterOfMassPosition; - Vector3 relPosB = posB - bodyB.CenterOfMassPosition; - - ConstraintPersistentData cpd = contactPoint.UserPersistentData as ConstraintPersistentData; - if (cpd == null) - throw new BulletException(); - - float combinedFriction = cpd.Friction; - - float limit = cpd.AppliedImpulse * combinedFriction; - //if (contactPoint.m_appliedImpulse>0.f) - //friction - { - //apply friction in the 2 tangential directions - - { - // 1st tangent - Vector3 velA = bodyA.GetVelocityInLocalPoint(relPosA); - Vector3 velB = bodyB.GetVelocityInLocalPoint(relPosB); - Vector3 vel = velA - velB; - - float vrel = Vector3.Dot(cpd.FrictionWorldTangentialA, vel); - - // calculate j that moves us to zero relative velocity - float j = -vrel * cpd.JacDiagABInvTangentA; - float total = cpd.AccumulatedTangentImpulseA + j; - if (limit < total) - total = limit; - if (total < -limit) - total = -limit; - j = total - cpd.AccumulatedTangentImpulseA; - cpd.AccumulatedTangentImpulseA = total; - bodyA.ApplyImpulse(j * cpd.FrictionWorldTangentialA, relPosA); - bodyB.ApplyImpulse(j * -cpd.FrictionWorldTangentialA, relPosB); - } - - - { - // 2nd tangent - Vector3 velA = bodyA.GetVelocityInLocalPoint(relPosA); - Vector3 velB = bodyB.GetVelocityInLocalPoint(relPosB); - Vector3 vel = velA - velB; - - float vrel = Vector3.Dot(cpd.FrictionWorldTangentialB, vel); - - // calculate j that moves us to zero relative velocity - float j = -vrel * cpd.JacDiagABInvTangentB; - float total = cpd.AccumulatedTangentImpulseB + j; - if (limit < total) - total = limit; - if (total < -limit) - total = -limit; - j = total - cpd.AccumulatedTangentImpulseB; - cpd.AccumulatedTangentImpulseB = total; - bodyA.ApplyImpulse(j * cpd.FrictionWorldTangentialB, relPosA); - bodyB.ApplyImpulse(j * -cpd.FrictionWorldTangentialB, relPosB); - } - } - - return cpd.AppliedImpulse; - } - - //velocity + friction - //response between two dynamic objects with friction - public static float ResolveSingleCollisionCombined( - RigidBody bodyA, - RigidBody bodyB, - ManifoldPoint contactPoint, - ContactSolverInfo solverInfo) - { - - Vector3 posA = contactPoint.PositionWorldOnA; - Vector3 posB = contactPoint.PositionWorldOnB; - Vector3 normal = contactPoint.NormalWorldOnB; - - Vector3 relPosA = posA - bodyA.CenterOfMassPosition; - Vector3 relPosB = posB - bodyB.CenterOfMassPosition; - - Vector3 velA = bodyA.GetVelocityInLocalPoint(relPosA); - Vector3 velB = bodyB.GetVelocityInLocalPoint(relPosB); - Vector3 vel = velA - velB; - float relVel; - relVel = Vector3.Dot(normal, vel); - - float Kfps = 1f / solverInfo.TimeStep; - - //float damping = solverInfo.m_damping; - float Kerp = solverInfo.Erp; - float Kcor = Kerp * Kfps; - - ConstraintPersistentData cpd = contactPoint.UserPersistentData as ConstraintPersistentData; - if (cpd == null) - throw new BulletException(); - - float distance = cpd.Penetration; - float positionalError = Kcor * -distance; - float velocityError = cpd.Restitution - relVel;// * damping; - - float penetrationImpulse = positionalError * cpd.JacDiagABInv; - - float velocityImpulse = velocityError * cpd.JacDiagABInv; - - float normalImpulse = penetrationImpulse + velocityImpulse; - - // See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse - float oldNormalImpulse = cpd.AppliedImpulse; - float sum = oldNormalImpulse + normalImpulse; - cpd.AppliedImpulse = 0 > sum ? 0 : sum; - - normalImpulse = cpd.AppliedImpulse - oldNormalImpulse; - - if (bodyA.InverseMass != 0) - { - bodyA.InternalApplyImpulse(contactPoint.NormalWorldOnB * bodyA.InverseMass, cpd.AngularComponentA, normalImpulse); - } - if (bodyB.InverseMass != 0) - { - bodyB.InternalApplyImpulse(contactPoint.NormalWorldOnB * bodyB.InverseMass, cpd.AngularComponentB, -normalImpulse); - } - - { - //friction - Vector3 vel12 = bodyA.GetVelocityInLocalPoint(relPosA); - Vector3 vel22 = bodyB.GetVelocityInLocalPoint(relPosB); - Vector3 vel3 = vel12 - vel22; - - relVel = Vector3.Dot(normal, vel3); - - - Vector3 latVel = vel3 - normal * relVel; - float lat_rel_vel = latVel.Length(); - - float combinedFriction = cpd.Friction; - - if (cpd.AppliedImpulse > 0) - if (lat_rel_vel > float.Epsilon) - { - latVel /= lat_rel_vel; - Vector3 temp1 = Vector3.TransformNormal(Vector3.Cross(relPosA, latVel), bodyA.InvInertiaTensorWorld); - Vector3 temp2 = Vector3.TransformNormal(Vector3.Cross(relPosB, latVel), bodyB.InvInertiaTensorWorld); - float friction_impulse = lat_rel_vel / - (bodyA.InverseMass + bodyB.InverseMass + Vector3.Dot(latVel, Vector3.Cross(temp1, relPosA) + Vector3.Cross(temp2, relPosB))); - float normal_impulse = cpd.AppliedImpulse * combinedFriction; - - MathHelper.SetMin(ref friction_impulse, normal_impulse); - MathHelper.SetMin(ref friction_impulse, -normal_impulse); - bodyA.ApplyImpulse(latVel * -friction_impulse, relPosA); - bodyB.ApplyImpulse(latVel * friction_impulse, relPosB); - } - } - return normalImpulse; - } - - public static float ResolveSingleFrictionEmpty( - RigidBody bodyA, - RigidBody bodyB, - ManifoldPoint contactPoint, - ContactSolverInfo solverInfo) - { - return 0; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/ContactSolverInfo.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/ContactSolverInfo.cs deleted file mode 100644 index d3424f6212..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/ContactSolverInfo.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX.Dynamics -{ - public class ContactSolverInfo - { - private float _tau; - private float _damping; - private float _friction; - private float _timeStep; - private float _restitution; - private int _numIterations; - private float _maxErrorReduction; - private float _sor; - private float _erp; - - public ContactSolverInfo() - { - _tau = 0.6f; - _damping = 1.0f; - _friction = 0.3f; - _restitution = 0f; - _maxErrorReduction = 20f; - _numIterations = 10; - _erp = 0.4f; - _sor = 1.3f; - } - - public float Tau { get { return _tau; } set { _tau = value; } } - public float Damping { get { return _damping; } set { _damping = value; } } - public float Friction { get { return _friction; } set { _friction = value; } } - public float TimeStep { get { return _timeStep; } set { _timeStep = value; } } - public float Restitution { get { return _restitution; } set { _restitution = value; } } - public int IterationsCount { get { return _numIterations; } set { _numIterations = value; } } - public float MaxErrorReduction { get { return _maxErrorReduction; } set { _maxErrorReduction = value; } } - public float Sor { get { return _sor; } set { _sor = value; } } - public float Erp { get { return _erp; } set { _erp = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Generic6DofConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Generic6DofConstraint.cs deleted file mode 100644 index f1e0b1ec35..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Generic6DofConstraint.cs +++ /dev/null @@ -1,440 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - /// - /// Generic6DofConstraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space - /// Generic6DofConstraint can leave any of the 6 degree of freedom 'free' or 'locked' - /// Work in progress (is still a Hinge actually) - /// - public class Generic6DofConstraint : TypedConstraint - { - private static readonly float[] _sign = { 1.0f, -1.0f, 1.0f }; - private static readonly int[] _axisA = { 1, 0, 0 }; - private static readonly int[] _axisB = { 2, 2, 1 }; - - private JacobianEntry[] _jacLinear = new JacobianEntry[3]; // 3 orthogonal linear constraints - private JacobianEntry[] _jacAng = new JacobianEntry[3]; // 3 orthogonal angular constraints - - private Matrix _frameInA; // the constraint space w.r.t body A - private Matrix _frameInB; // the constraint space w.r.t body B - - private float[] _lowerLimit = new float[6]; // the constraint lower limits - private float[] _upperLimit = new float[6]; // the constraint upper limits - - private float[] _accumulatedImpulse = new float[6]; - - public Generic6DofConstraint(RigidBody rbA, RigidBody rbB, Matrix frameInA, Matrix frameInB) - : base(rbA, rbB) - { - _frameInA = frameInA; - _frameInB = frameInB; - //free means upper < lower, - //locked means upper == lower - //limited means upper > lower - //so start all locked - for (int i = 0; i < 6; ++i) - { - _lowerLimit[i] = 0.0f; - _upperLimit[i] = 0.0f; - _accumulatedImpulse[i] = 0.0f; - } - } - - public Generic6DofConstraint() { } - - public void UpdateRHS(float timeStep) { } - - public float ComputeAngle(int axis) - { - float angle = 0; - - switch (axis) - { - case 0: - { - Vector3 v1 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInA, 1), RigidBodyA.CenterOfMassTransform); - Vector3 v2 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, 1), RigidBodyB.CenterOfMassTransform); - Vector3 w2 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, 2), RigidBodyB.CenterOfMassTransform); - - float s = Vector3.Dot(v1, w2); - float c = Vector3.Dot(v1, v2); - - angle = (float)Math.Atan2(s, c); - break; - } - case 1: - { - Vector3 w1 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInA, 2), RigidBodyA.CenterOfMassTransform); - Vector3 w2 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, 2), RigidBodyB.CenterOfMassTransform); - Vector3 u2 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, 0), RigidBodyB.CenterOfMassTransform); - - float s = Vector3.Dot(w1, u2); - float c = Vector3.Dot(w1, w2); - - angle = (float)Math.Atan2(s, c); - break; - } - case 2: - { - Vector3 u1 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInA, 0), RigidBodyA.CenterOfMassTransform); - Vector3 u2 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, 0), RigidBodyB.CenterOfMassTransform); - Vector3 v2 = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, 1), RigidBodyB.CenterOfMassTransform); - - float s = Vector3.Dot(u1, v2); - float c = Vector3.Dot(u1, u2); - - angle = (float)Math.Atan2(s, c); - break; - } - default: BulletDebug.Assert(false); break; - } - - return angle; - } - - public void SetLinearLowerLimit(Vector3 linearLower) - { - _lowerLimit[0] = linearLower.X; - _lowerLimit[1] = linearLower.Y; - _lowerLimit[2] = linearLower.Z; - } - - public void SetLinearUpperLimit(Vector3 linearUpper) - { - _upperLimit[0] = linearUpper.X; - _upperLimit[1] = linearUpper.Y; - _upperLimit[2] = linearUpper.Z; - } - - public void SetAngularLowerLimit(Vector3 angularLower) - { - _lowerLimit[3] = angularLower.X; - _lowerLimit[4] = angularLower.Y; - _lowerLimit[5] = angularLower.Z; - } - - public void SetAngularUpperLimit(Vector3 angularUpper) - { - _upperLimit[3] = angularUpper.X; - _upperLimit[4] = angularUpper.Y; - _upperLimit[5] = angularUpper.Z; - } - - //first 3 are linear, next 3 are angular - public void SetLimit(int axis, float lo, float hi) - { - _lowerLimit[axis] = lo; - _upperLimit[axis] = hi; - } - - //free means upper < lower, - //locked means upper == lower - //limited means upper > lower - //limitIndex: first 3 are linear, next 3 are angular - public bool IsLimited(int limitIndex) - { - return (_upperLimit[limitIndex] >= _lowerLimit[limitIndex]); - } - - public override void BuildJacobian() - { - Vector3 localNormalInA = new Vector3(0, 0, 0); - - Vector3 pivotInA = _frameInA.Translation; - Vector3 pivotInB = _frameInB.Translation; - - Vector3 pivotAInW = MathHelper.Transform(_frameInA.Translation, RigidBodyA.CenterOfMassTransform); - Vector3 pivotBInW = MathHelper.Transform(_frameInB.Translation, RigidBodyB.CenterOfMassTransform); - - Vector3 rel_pos1 = pivotAInW - RigidBodyA.CenterOfMassPosition; - Vector3 rel_pos2 = pivotBInW - RigidBodyB.CenterOfMassPosition; - - //linear part - for (int i = 0; i < 3; i++) - { - if (IsLimited(i)) - { - if (i == 0) - localNormalInA = new Vector3(1, 0, 0); - else if (i == 1) - localNormalInA = new Vector3(0, 1, 0); - else - localNormalInA = new Vector3(0, 0, 1); - - Vector3 normalWorld = MathHelper.TransformNormal(localNormalInA, RigidBodyA.CenterOfMassTransform); - - // Create linear atom - _jacLinear[i] = new JacobianEntry( - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - MathHelper.Transform(pivotInA, RigidBodyA.CenterOfMassTransform) - RigidBodyA.CenterOfMassPosition, - MathHelper.Transform(pivotInB, RigidBodyB.CenterOfMassTransform) - RigidBodyB.CenterOfMassPosition, - normalWorld, - RigidBodyA.InvInertiaDiagLocal, - RigidBodyA.InverseMass, - RigidBodyB.InvInertiaDiagLocal, - RigidBodyB.InverseMass); - - //optionally disable warmstarting - _accumulatedImpulse[i] = 0f; - - // Apply accumulated impulse - Vector3 impulse_vector = _accumulatedImpulse[i] * normalWorld; - - RigidBodyA.ApplyImpulse(impulse_vector, rel_pos1); - RigidBodyB.ApplyImpulse(-impulse_vector, rel_pos2); - } - } - - // angular part - for (int i = 0; i < 3; i++) - { - if (IsLimited(i + 3)) - { - Vector3 axisA = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInA, _axisA[i] + 1), RigidBodyA.CenterOfMassTransform); - Vector3 axisB = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, _axisB[i] + 1), RigidBodyB.CenterOfMassTransform); - - Vector3 axis = _sign[i] * Vector3.Cross(axisA, axisB); - - // Create angular atom - _jacAng[i] = new JacobianEntry(axis, - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - RigidBodyA.InvInertiaDiagLocal, - RigidBodyB.InvInertiaDiagLocal); - - _accumulatedImpulse[i + 3] = 0f; - - // Apply accumulated impulse - Vector3 impulse_vector = _accumulatedImpulse[i + 3] * axis; - - RigidBodyA.ApplyTorqueImpulse(impulse_vector); - RigidBodyB.ApplyTorqueImpulse(-impulse_vector); - } - } - } - - public override void SolveConstraint(float timeStep) - { - float tau = 0.1f; - float damping = 1.0f; - - Vector3 pivotAInW = MathHelper.Transform(_frameInA.Translation, RigidBodyA.CenterOfMassTransform); - Vector3 pivotBInW = MathHelper.Transform(_frameInB.Translation, RigidBodyB.CenterOfMassTransform); - - Vector3 rel_pos1 = pivotAInW - RigidBodyA.CenterOfMassPosition; - Vector3 rel_pos2 = pivotBInW - RigidBodyB.CenterOfMassPosition; - - Vector3 localNormalInA = new Vector3(); - - // linear - for (int i = 0; i < 3; i++) - { - if (IsLimited(i)) - { - Vector3 angvelA = MathHelper.TransformNormal(RigidBodyA.AngularVelocity, MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform)); - Vector3 angvelB = MathHelper.TransformNormal(RigidBodyB.AngularVelocity, MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform)); - - if (i == 0) - localNormalInA = new Vector3(1, 0, 0); - else if (i == 1) - localNormalInA = new Vector3(0, 1, 0); - else - localNormalInA = new Vector3(0, 0, 1); - - Vector3 normalWorld = MathHelper.TransformNormal(localNormalInA, RigidBodyA.CenterOfMassTransform); - - float jacDiagABInv = 1f / _jacLinear[i].Diagonal; - - //velocity error (first order error) - float rel_vel = _jacLinear[i].GetRelativeVelocity(RigidBodyA.LinearVelocity, angvelA, - RigidBodyB.LinearVelocity, angvelB); - - //positional error (zeroth order error) - float depth = -Vector3.Dot(pivotAInW - pivotBInW, normalWorld); - float lo = -1e30f; - float hi = 1e30f; - - //handle the limits - if (_lowerLimit[i] < _upperLimit[i]) - { - if (depth > _upperLimit[i]) - { - depth -= _upperLimit[i]; - lo = 0f; - } - else - { - if (depth < _lowerLimit[i]) - { - depth -= _lowerLimit[i]; - hi = 0f; - } - else - { - continue; - } - } - } - - float normalImpulse = (tau * depth / timeStep - damping * rel_vel) * jacDiagABInv; - float oldNormalImpulse = _accumulatedImpulse[i]; - float sum = oldNormalImpulse + normalImpulse; - _accumulatedImpulse[i] = sum > hi ? 0f : sum < lo ? 0f : sum; - normalImpulse = _accumulatedImpulse[i] - oldNormalImpulse; - - Vector3 impulse_vector = normalWorld * normalImpulse; - RigidBodyA.ApplyImpulse(impulse_vector, rel_pos1); - RigidBodyB.ApplyImpulse(-impulse_vector, rel_pos2); - } - } - - Vector3 axis; - float angle; - Matrix frameAWorld = RigidBodyA.CenterOfMassTransform * _frameInA; - Matrix frameBWorld = RigidBodyB.CenterOfMassTransform * _frameInB; - - TransformUtil.CalculateDiffAxisAngle(frameAWorld, frameBWorld, out axis, out angle); - Quaternion diff = new Quaternion(axis, angle); - Matrix diffMat = Matrix.CreateFromQuaternion(diff); - Vector3 xyz; - // this is not perfect, we can first check which axis are limited, and choose a more appropriate order - MatrixToEulerXYZ(diffMat, out xyz); - - // angular - for (int i = 0; i < 3; i++) - { - if (IsLimited(i + 3)) - { - Vector3 angvelA = MathHelper.TransformNormal(RigidBodyA.AngularVelocity, MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform)); - Vector3 angvelB = MathHelper.TransformNormal(RigidBodyB.AngularVelocity, MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform)); - - float jacDiagABInv = 1f / _jacAng[i].Diagonal; - - //velocity error (first order error) - float rel_vel = _jacAng[i].GetRelativeVelocity(RigidBodyA.LinearVelocity, angvelA, - RigidBodyB.LinearVelocity, angvelB); - - //positional error (zeroth order error) - Vector3 axisA = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInA, _axisA[i] + 1), RigidBodyA.CenterOfMassTransform); - Vector3 axisB = MathHelper.TransformNormal(MathHelper.GetColumn(_frameInB, _axisB[i] + 1), RigidBodyB.CenterOfMassTransform); - - float rel_pos = _sign[i] * Vector3.Dot(axisA, axisB); - - float lo = -1e30f; - float hi = 1e30f; - - //handle the twist limit - if (_lowerLimit[i + 3] < _upperLimit[i + 3]) - { - //clamp the values - float loLimit = _upperLimit[i + 3] > -3.1415 ? _lowerLimit[i + 3] : -1e30f; - float hiLimit = _upperLimit[i + 3] < 3.1415 ? _upperLimit[i + 3] : 1e30f; - - float projAngle; - - if (i == 0) - projAngle = -2f * xyz.Z; - else if (i == 1) - projAngle = -2f * xyz.Y; - else - projAngle = -2f * xyz.Z; - - if (projAngle < loLimit) - { - hi = 0f; - rel_pos = loLimit - projAngle; - } - else - { - if (projAngle > hiLimit) - { - lo = 0f; - rel_pos = (hiLimit - projAngle); - } - else - { - continue; - } - } - } - - //impulse - - float normalImpulse = -(tau * rel_pos / timeStep + damping * rel_vel) * jacDiagABInv; - float oldNormalImpulse = _accumulatedImpulse[i + 3]; - float sum = oldNormalImpulse + normalImpulse; - _accumulatedImpulse[i + 3] = sum > hi ? 0f : sum < lo ? 0f : sum; - normalImpulse = _accumulatedImpulse[i + 3] - oldNormalImpulse; - - Vector3 axis2 = _sign[i] * Vector3.Cross(axisA, axisB); - Vector3 impulse_vector = axis2 * normalImpulse; - - RigidBodyA.ApplyTorqueImpulse(impulse_vector); - RigidBodyB.ApplyTorqueImpulse(-impulse_vector); - } - } - } - - //MatrixToEulerXYZ from http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3.inl.html - private bool MatrixToEulerXYZ(Matrix mat, out Vector3 xyz) - { - // rot = cy*cz -cy*sz sy - // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx - // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy - xyz = new Vector3(); - - if (MathHelper.GetElement(mat, 2) < 1.0f) - { - if (MathHelper.GetElement(mat, 2) > -1.0f) - { - xyz.X = (float)Math.Atan2(-MathHelper.GetElement(mat, 5), MathHelper.GetElement(mat, 8)); - xyz.Y = (float)Math.Asin(MathHelper.GetElement(mat, 2)); - xyz.Z = (float)Math.Atan2(-MathHelper.GetElement(mat, 1), MathHelper.GetElement(mat, 0)); - return true; - } - else - { - // WARNING. Not unique. XA - ZA = -atan2(r10,r11) - xyz.X = -(float)Math.Atan2(MathHelper.GetElement(mat, 3), MathHelper.GetElement(mat, 4)); - xyz.Y = -(float)Math.PI / 2; - xyz.Z = 0.0f; - return false; - } - } - else - { - // WARNING. Not unique. XAngle + ZAngle = atan2(r10,r11) - xyz.X = (float)Math.Atan2(MathHelper.GetElement(mat, 3), MathHelper.GetElement(mat, 4)); - xyz.Y = (float)Math.PI / 2; - xyz.Z = 0.0f; - return false; - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/HingeConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/HingeConstraint.cs deleted file mode 100644 index 02bcf8a791..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/HingeConstraint.cs +++ /dev/null @@ -1,246 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - /// - /// hinge constraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space - /// axis defines the orientation of the hinge axis - /// - public class HingeConstraint : TypedConstraint - { - private JacobianEntry[] _jac = new JacobianEntry[3]; //3 orthogonal linear constraints - private JacobianEntry[] _jacAng = new JacobianEntry[3]; //2 orthogonal angular constraints + 1 for limit/motor - - private Vector3 _pivotInA; - private Vector3 _pivotInB; - private Vector3 _axisInA; - private Vector3 _axisInB; - - private bool _angularOnly; - - private float _motorTargetVelocity; - private float _maxMotorImpulse; - private bool _enableAngularMotor; - - public HingeConstraint(RigidBody rbA, RigidBody rbB, Vector3 pivotInA, Vector3 pivotInB, Vector3 axisInA, Vector3 axisInB) - : base(rbA, rbB) - { - _pivotInA = pivotInA; - _pivotInB = pivotInB; - _axisInA = axisInA; - _axisInB = -axisInB; - _angularOnly = false; - } - - public HingeConstraint(RigidBody rbA, Vector3 pivotInA, Vector3 axisInA) - : base(rbA) - { - _pivotInA = pivotInA; - _pivotInB = MathHelper.MatrixToVector(rbA.CenterOfMassTransform, pivotInA); - _axisInA = axisInA; - //fixed axis in worldspace - _axisInB = MathHelper.TransformNormal(-axisInA, rbA.CenterOfMassTransform); - _angularOnly = false; - } - - public HingeConstraint() { } - - public bool AngularOnly { set { _angularOnly = value; } } - - public override void BuildJacobian() - { - AppliedImpulse = 0f; - - Vector3 normal = new Vector3(); - - if (!_angularOnly) - { - for (int i = 0; i < 3; i++) - { - MathHelper.SetElement(ref normal, i, 1); - _jac[i] = new JacobianEntry( - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - MathHelper.Transform(_pivotInA, RigidBodyA.CenterOfMassTransform) - RigidBodyA.CenterOfMassPosition, - MathHelper.Transform(_pivotInB, RigidBodyB.CenterOfMassTransform) - RigidBodyB.CenterOfMassPosition, - normal, - RigidBodyA.InvInertiaDiagLocal, - RigidBodyA.InverseMass, - RigidBodyB.InvInertiaDiagLocal, - RigidBodyB.InverseMass); - MathHelper.SetElement(ref normal, i, 0); - } - } - - //calculate two perpendicular jointAxis, orthogonal to hingeAxis - //these two jointAxis require equal angular velocities for both bodies - //this is unused for now, it's a todo - Vector3 jointAxisALocal = new Vector3(); - Vector3 jointAxisBLocal = new Vector3(); - MathHelper.PlaneSpace1(_axisInA, ref jointAxisALocal, ref jointAxisBLocal); - - Vector3 jointAxisA = MathHelper.TransformNormal(jointAxisALocal, RigidBodyA.CenterOfMassTransform); - Vector3 jointAxisB = MathHelper.TransformNormal(jointAxisBLocal, RigidBodyA.CenterOfMassTransform); - Vector3 hingeAxisWorld = MathHelper.TransformNormal(_axisInA, RigidBodyA.CenterOfMassTransform); - - _jacAng[0] = new JacobianEntry(jointAxisA, - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - RigidBodyA.InvInertiaDiagLocal, - RigidBodyB.InvInertiaDiagLocal); - - _jacAng[1] = new JacobianEntry(jointAxisB, - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - RigidBodyA.InvInertiaDiagLocal, - RigidBodyB.InvInertiaDiagLocal); - - _jacAng[2] = new JacobianEntry(hingeAxisWorld, - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - RigidBodyA.InvInertiaDiagLocal, - RigidBodyB.InvInertiaDiagLocal); - } - - public override void SolveConstraint(float timeStep) - { - Vector3 pivotAInW = MathHelper.Transform(_pivotInA, RigidBodyA.CenterOfMassTransform); - Vector3 pivotBInW = MathHelper.Transform(_pivotInB, RigidBodyB.CenterOfMassTransform); - - Vector3 normal = new Vector3(0, 0, 0); - float tau = 0.3f; - float damping = 1f; - - //linear part - if (!_angularOnly) - { - for (int i = 0; i < 3; i++) - { - if (i == 0) - normal = new Vector3(1, 0, 0); - else if (i == 1) - normal = new Vector3(0, 1, 0); - else - normal = new Vector3(0, 0, 1); - - float jacDiagABInv = 1f / _jac[i].Diagonal; - - Vector3 rel_pos1 = pivotAInW - RigidBodyA.CenterOfMassPosition; - Vector3 rel_pos2 = pivotBInW - RigidBodyB.CenterOfMassPosition; - - Vector3 vel1 = RigidBodyA.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = RigidBodyB.GetVelocityInLocalPoint(rel_pos2); - Vector3 vel = vel1 - vel2; - float rel_vel; - rel_vel = Vector3.Dot(normal, vel); - //positional error (zeroth order error) - float depth = -Vector3.Dot(pivotAInW - pivotBInW, normal); //this is the error projected on the normal - float impulse = depth * tau / timeStep * jacDiagABInv - damping * rel_vel * jacDiagABInv * damping; - AppliedImpulse += impulse; - Vector3 impulse_vector = normal * impulse; - RigidBodyA.ApplyImpulse(impulse_vector, pivotAInW - RigidBodyA.CenterOfMassPosition); - RigidBodyB.ApplyImpulse(-impulse_vector, pivotBInW - RigidBodyB.CenterOfMassPosition); - } - } - //solve angular part - // get axes in world space - Vector3 axisA = MathHelper.TransformNormal(_axisInA, RigidBodyA.CenterOfMassTransform); - Vector3 axisB = MathHelper.TransformNormal(_axisInB, RigidBodyB.CenterOfMassTransform); - - Vector3 angVelA = RigidBodyA.AngularVelocity; - Vector3 angVelB = RigidBodyB.AngularVelocity; - Vector3 angVelAroundHingeAxisA = axisA * Vector3.Dot(axisA, angVelA); - Vector3 angVelAroundHingeAxisB = axisB * Vector3.Dot(axisB, angVelB); - - Vector3 angAOrthog = angVelA - angVelAroundHingeAxisA; - Vector3 angBOrthog = angVelB - angVelAroundHingeAxisB; - Vector3 velrelOrthog = angAOrthog - angBOrthog; - - //solve angular velocity correction - float relaxation = 1f; - float len = velrelOrthog.Length(); - if (len > 0.00001f) - { - Vector3 normal2 = Vector3.Normalize(velrelOrthog); - float denom = RigidBodyA.ComputeAngularImpulseDenominator(normal2) + - RigidBodyB.ComputeAngularImpulseDenominator(normal2); - // scale for mass and relaxation - velrelOrthog *= (1f / denom) * 0.9f; - } - - //solve angular positional correction - Vector3 angularError = -Vector3.Cross(axisA, axisB) * (1f / timeStep); - float len2 = angularError.Length(); - if (len2 > 0.00001f) - { - Vector3 normal2 = Vector3.Normalize(angularError); - float denom2 = RigidBodyA.ComputeAngularImpulseDenominator(normal2) + - RigidBodyB.ComputeAngularImpulseDenominator(normal2); - angularError *= (1f / denom2) * relaxation; - } - - RigidBodyA.ApplyTorqueImpulse(-velrelOrthog + angularError); - RigidBodyB.ApplyTorqueImpulse(velrelOrthog - angularError); - - //apply motor - if (_enableAngularMotor) - { - //todo: add limits too - Vector3 angularLimit = Vector3.Zero; - - Vector3 velrel = angVelAroundHingeAxisA - angVelAroundHingeAxisB; - float projRelVel = Vector3.Dot(velrel, axisA); - - float desiredMotorVel = _motorTargetVelocity; - float motorRelvel = desiredMotorVel - projRelVel; - - float denom3 = RigidBodyA.ComputeAngularImpulseDenominator(axisA) + - RigidBodyB.ComputeAngularImpulseDenominator(axisA); - - float unclippedMotorImpulse = (1f / denom3) * motorRelvel; - //todo: should clip against accumulated impulse - float clippedMotorImpulse = unclippedMotorImpulse > _maxMotorImpulse ? _maxMotorImpulse : unclippedMotorImpulse; - clippedMotorImpulse = clippedMotorImpulse < -_maxMotorImpulse ? -_maxMotorImpulse : clippedMotorImpulse; - Vector3 motorImp = clippedMotorImpulse * axisA; - - RigidBodyA.ApplyTorqueImpulse(motorImp + angularLimit); - RigidBodyB.ApplyTorqueImpulse(-motorImp - angularLimit); - } - } - - public void EnableAngularMotor(bool enableMotor, float targetVelocity, float maxMotorImpulse) - { - _enableAngularMotor = enableMotor; - _motorTargetVelocity = targetVelocity; - _maxMotorImpulse = maxMotorImpulse; - } - - public void UpdateRHS(float timeStep) - { - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/IConstraintSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/IConstraintSolver.cs deleted file mode 100644 index a83eaa5f59..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/IConstraintSolver.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX.Dynamics -{ - public interface IConstraintSolver - { - float SolveGroup(List bodies, List manifolds, int numManifolds, List constraints, ContactSolverInfo info, IDebugDraw debugDrawer); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/JacobianEntry.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/JacobianEntry.cs deleted file mode 100644 index 624999842e..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/JacobianEntry.cs +++ /dev/null @@ -1,155 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - /// - /// Jacobian entry is an abstraction that allows to describe constraints - /// it can be used in combination with a constraint solver - /// Can be used to relate the effect of an impulse to the constraint error - /// - public class JacobianEntry - { - private Vector3 _linearJointAxis; - private Vector3 _aJ; - private Vector3 _bJ; - private Vector3 _0MinvJt; - private Vector3 _1MinvJt; - private float _adiag; - - public JacobianEntry() { } - - //constraint between two different rigidbodies - public JacobianEntry( - Matrix world2A, - Matrix world2B, - Vector3 relPosA, Vector3 relPosB, - Vector3 jointAxis, - Vector3 inertiaInvA, - float massInvA, - Vector3 inertiaInvB, - float massInvB) - { - _linearJointAxis = jointAxis; - _aJ = Vector3.TransformNormal(Vector3.Cross(relPosA, _linearJointAxis), world2A); - _bJ = Vector3.TransformNormal(Vector3.Cross(relPosB, -_linearJointAxis), world2B); - _0MinvJt = inertiaInvA * _aJ; - _1MinvJt = inertiaInvB * _bJ; - _adiag = massInvA + Vector3.Dot(_0MinvJt, _aJ) + massInvB + Vector3.Dot(_1MinvJt, _bJ); - - if (_adiag <= 0.0f) - throw new BulletException(); - } - - //angular constraint between two different rigidbodies - public JacobianEntry(Vector3 jointAxis, - Matrix world2A, - Matrix world2B, - Vector3 inertiaInvA, - Vector3 inertiaInvB) - { - _linearJointAxis = new Vector3(); - _aJ = Vector3.TransformNormal(jointAxis, world2A); - _bJ = Vector3.TransformNormal(-jointAxis, world2B); - _0MinvJt = inertiaInvA * _aJ; - _1MinvJt = inertiaInvB * _bJ; - _adiag = Vector3.Dot(_0MinvJt, _aJ) + Vector3.Dot(_1MinvJt, _bJ); - - if (_adiag <= 0.0f) - throw new BulletException(); - } - - //angular constraint between two different rigidbodies - public JacobianEntry(Vector3 axisInA, - Vector3 axisInB, - Vector3 inertiaInvA, - Vector3 inertiaInvB) - { - _linearJointAxis = new Vector3(); - _aJ = axisInA; - _bJ = -axisInB; - _0MinvJt = inertiaInvA * _aJ; - _1MinvJt = inertiaInvB * _bJ; - _adiag = Vector3.Dot(_0MinvJt, _aJ) + Vector3.Dot(_1MinvJt, _bJ); - - if (_adiag <= 0.0f) - throw new BulletException(); - } - - //constraint on one rigidbody - public JacobianEntry( - Matrix world2A, - Vector3 rel_pos1, Vector3 rel_pos2, - Vector3 jointAxis, - Vector3 inertiaInvA, - float massInvA) - { - _linearJointAxis = jointAxis; - _aJ = Vector3.TransformNormal(Vector3.Cross(rel_pos1, jointAxis), world2A); - _bJ = Vector3.TransformNormal(Vector3.Cross(rel_pos2, -jointAxis), world2A); - _0MinvJt = inertiaInvA * _aJ; - _1MinvJt = new Vector3(); - _adiag = massInvA + Vector3.Dot(_0MinvJt, _aJ); - - if (_adiag <= 0.0f) - throw new BulletException(); - } - - public float Diagonal { get { return _adiag; } } - - // for two constraints on the same rigidbody (for example vehicle friction) - public float GetNonDiagonal(JacobianEntry jacB, float massInvA) - { - float lin = massInvA * Vector3.Dot(_linearJointAxis, jacB._linearJointAxis); - float ang = Vector3.Dot(_0MinvJt, jacB._aJ); - return lin + ang; - } - - // for two constraints on sharing two same rigidbodies (for example two contact points between two rigidbodies) - public float GetNonDiagonal(JacobianEntry jacB, float massInvA, float massInvB) - { - Vector3 lin = _linearJointAxis * jacB._linearJointAxis; - Vector3 ang0 = _0MinvJt * jacB._aJ; - Vector3 ang1 = _1MinvJt * jacB._bJ; - Vector3 lin0 = massInvA * lin; - Vector3 lin1 = massInvB * lin; - Vector3 sum = ang0 + ang1 + lin0 + lin1; - return sum.X + sum.Y + sum.Z; - } - - public float GetRelativeVelocity(Vector3 linvelA, Vector3 angvelA, Vector3 linvelB, Vector3 angvelB) - { - Vector3 linrel = linvelA - linvelB; - Vector3 angvela = angvelA * _aJ; - Vector3 angvelb = angvelB * _bJ; - linrel *= _linearJointAxis; - angvela += angvelb; - angvela += linrel; - float rel_vel2 = angvela.X + angvela.Y + angvela.Z; - return rel_vel2 + float.Epsilon; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Point2PointConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Point2PointConstraint.cs deleted file mode 100644 index 8ffd3d5796..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Point2PointConstraint.cs +++ /dev/null @@ -1,157 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public class ConstraintSetting - { - private float _tau, _damping; - - public ConstraintSetting() - { - _tau = 0.3f; - _damping = 1.0f; - } - - public float Damping - { - get { return _damping; } - set { _damping = value; } - } - - public float Tau - { - get { return _tau; } - set { _tau = value; } - } - } - - public class Point2PointConstraint : TypedConstraint - { - private JacobianEntry[] _jacobian; - private Vector3 _pivotInA, _pivotInB; - - private ConstraintSetting _setting = new ConstraintSetting(); - - public Point2PointConstraint() - { - _jacobian = new JacobianEntry[3]; - } - - public Point2PointConstraint(RigidBody rbA, RigidBody rbB, Vector3 pivotInA, Vector3 pivotInB) - : base(rbA, rbB) - { - _jacobian = new JacobianEntry[3]; - - _pivotInA = pivotInA; - _pivotInB = pivotInB; - } - - public Point2PointConstraint(RigidBody rbA, Vector3 pivotInA) - : base(rbA) - { - _jacobian = new JacobianEntry[3]; - - _pivotInA = pivotInA; - _pivotInB = MathHelper.MatrixToVector(rbA.CenterOfMassTransform, _pivotInA); - } - - public ConstraintSetting Settings { get { return _setting; } set { _setting = value; } } - - public Vector3 PivotInA - { - set - { - _pivotInA = value; - } - } - - public Vector3 PivotInB - { - set - { - _pivotInB = value; - } - } - - public override void BuildJacobian() - { - Vector3 normal = new Vector3(); - - for (int i = 0; i < 3; i++) - { - MathHelper.SetElement(ref normal, i, 1); - _jacobian[i] = new JacobianEntry( - MatrixOperations.Transpose(RigidBodyA.CenterOfMassTransform), - MatrixOperations.Transpose(RigidBodyB.CenterOfMassTransform), - MathHelper.Transform(_pivotInA, RigidBodyA.CenterOfMassTransform) - RigidBodyA.CenterOfMassPosition, - MathHelper.Transform(_pivotInB, RigidBodyB.CenterOfMassTransform) - RigidBodyB.CenterOfMassPosition, - normal, - RigidBodyA.InvInertiaDiagLocal, - RigidBodyA.InverseMass, - RigidBodyB.InvInertiaDiagLocal, - RigidBodyB.InverseMass - ); - MathHelper.SetElement(ref normal, i, 0); - } - } - - public override void SolveConstraint(float timeStep) - { - Vector3 pivotAInW = MathHelper.Transform(_pivotInA, RigidBodyA.CenterOfMassTransform); - Vector3 pivotBInW = MathHelper.Transform(_pivotInB, RigidBodyB.CenterOfMassTransform); - - Vector3 normal = new Vector3(); - - for (int i = 0; i < 3; i++) - { - MathHelper.SetElement(ref normal, i, 1); - - float jacDiagABInv = 1.0f / _jacobian[i].Diagonal; - - Vector3 rel_pos1 = pivotAInW - RigidBodyA.CenterOfMassPosition; - Vector3 rel_pos2 = pivotBInW - RigidBodyB.CenterOfMassPosition; - - Vector3 vel1 = RigidBodyA.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = RigidBodyB.GetVelocityInLocalPoint(rel_pos2); - - Vector3 vel = vel1 - vel2; - - float rel_vel = Vector3.Dot(normal, vel); - float depth = -Vector3.Dot((pivotAInW - pivotBInW), normal); - - float impulse = depth * _setting.Tau / timeStep * jacDiagABInv - _setting.Damping * rel_vel * jacDiagABInv; - AppliedImpulse += impulse; - Vector3 impulseVector = normal * impulse; - - RigidBodyA.ApplyImpulse(impulseVector, pivotAInW - RigidBodyA.CenterOfMassPosition); - RigidBodyB.ApplyImpulse(-impulseVector, pivotBInW - RigidBodyB.CenterOfMassPosition); - - MathHelper.SetElement(ref normal, i, 0); - } - } - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SequentialImpulseConstraintSolver.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SequentialImpulseConstraintSolver.cs deleted file mode 100644 index f275550a72..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SequentialImpulseConstraintSolver.cs +++ /dev/null @@ -1,915 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - [Flags] - public enum SolverMode - { - None = 0, - RandomizeOrder = 1, - FrictionSeperate = 2, - UseWarmstarting = 4, - CacheFriendly = 8, - } - - public class SequentialImpulseConstraintSolver : IConstraintSolver - { - private static int _totalContactPoints = 0; - - private SolverMode _solverMode; - private int _totalCpd = 0; - private ContactSolverFunc[,] _contactDispatch = new ContactSolverFunc[(int)ContactSolverType.MaxContactSolverType, (int)ContactSolverType.MaxContactSolverType]; - private ContactSolverFunc[,] _frictionDispatch = new ContactSolverFunc[(int)ContactSolverType.MaxContactSolverType, (int)ContactSolverType.MaxContactSolverType]; - - private float _penetrationResolveFactor = 0.9f; - private List _tmpSolverBodyPool = new List(); - private List _tmpSolverConstraintPool = new List(); - private List _tmpSolverFrictionConstraintPool = new List(); - - private const int _sequentialImpulseMaxSolverPoints = 16384; - private static OrderIndex[] _order = new OrderIndex[SequentialImpulseMaxSolverPoints]; - private static long _seed2 = 0; - - public SequentialImpulseConstraintSolver() - { - _solverMode = SolverMode.RandomizeOrder | SolverMode.CacheFriendly; - PersistentManifold.ContactDestroyedCallback = MyContactDestroyedCallback; - - //initialize default friction/contact funcs - int i, j; - for (i = 0; i < (int)ContactSolverType.MaxContactSolverType; i++) - for (j = 0; j < (int)ContactSolverType.MaxContactSolverType; j++) - { - - _contactDispatch[i, j] = ContactConstraint.ResolveSingleCollision; - _frictionDispatch[i, j] = ContactConstraint.ResolveSingleFriction; - } - } - - public SolverMode SolverMode { get { return _solverMode; } set { _solverMode = value; } } - public static int SequentialImpulseMaxSolverPoints { get { return _sequentialImpulseMaxSolverPoints; } } - protected static OrderIndex[] Order { get { return _order; } set { _order = value; } } - public static long RandSeed { get { return _seed2; } set { _seed2 = value; } } - - /// - /// Advanced: Override the default contact solving function for contacts, for certain types of rigidbody - /// See btRigidBody::m_contactSolverType and btRigidBody::m_frictionSolverType - /// - public void SetContactSolverFunc(ContactSolverFunc func, int typeA, int typeB) - { - _contactDispatch[typeA, typeB] = func; - } - - /// - /// Advanced: Override the default friction solving function for contacts, for certain types of rigidbody - /// See btRigidBody::m_contactSolverType and btRigidBody::m_frictionSolverType - /// - public void SetFrictionSolverFunc(ContactSolverFunc func, int typeA, int typeB) - { - _frictionDispatch[typeA, typeB] = func; - } - - protected float Solve(RigidBody bodyA, RigidBody bodyB, ManifoldPoint cp, ContactSolverInfo info, int iter, IDebugDraw debugDraw) - { - float maxImpulse = 0; - - Vector3 color = new Vector3(0, 1, 0); - if (cp.Distance <= 0) - { - if (iter == 0) - if(debugDraw != null) - debugDraw.DrawContactPoint(cp.PositionWorldOnB, cp.NormalWorldOnB, cp.Distance, cp.LifeTime, color); - - ConstraintPersistentData cpd = cp.UserPersistentData as ConstraintPersistentData; - float impulse = cpd.ContactSolverFunc( - bodyA, bodyB, - cp, - info); - - if (maxImpulse < impulse) - maxImpulse = impulse; - } - return maxImpulse; - } - - protected float Solve(RigidBody bodyA, RigidBody bodyB, ManifoldPoint cp, ContactSolverInfo info, int iter) - { - return Solve(bodyA, bodyB, cp, info, iter, null); - } - - protected float SolveCombinedContactFriction(RigidBody bodyA, RigidBody bodyB, ManifoldPoint cp, ContactSolverInfo info, int iter, IDebugDraw debugDraw) - { - float maxImpulse = 0; - - Vector3 color = new Vector3(0, 1, 0); - if (cp.Distance <= 0) - { - if (iter == 0) - if (debugDraw != null) - debugDraw.DrawContactPoint(cp.PositionWorldOnB, cp.NormalWorldOnB, cp.Distance, cp.LifeTime, color); - - float impulse = ContactConstraint.ResolveSingleCollisionCombined( - bodyA, bodyB, - cp, - info); - - if (maxImpulse < impulse) - maxImpulse = impulse; - } - return maxImpulse; - } - - protected float SolveFriction(RigidBody bodyA, RigidBody bodyB, ManifoldPoint cp, ContactSolverInfo info, int iter, IDebugDraw debugDraw) - { - Vector3 color = new Vector3(0, 1, 0); - - if (cp.Distance <= 0) - { - - ConstraintPersistentData cpd = cp.UserPersistentData as ConstraintPersistentData; - cpd.FrictionSolverFunc( - bodyA, bodyB, - cp, - info); - } - return 0; - } - - protected void PrepareConstraints(PersistentManifold manifold, ContactSolverInfo info) - { - RigidBody body0 = manifold.BodyA as RigidBody; - RigidBody body1 = manifold.BodyB as RigidBody; - - - //only necessary to refresh the manifold once (first iteration). The integration is done outside the loop - { - manifold.RefreshContactPoints(body0.CenterOfMassTransform, body1.CenterOfMassTransform); - - int numpoints = manifold.ContactsCount; - - _totalContactPoints += numpoints; - - Vector3 color = new Vector3(0, 1, 0); - for (int i = 0; i < numpoints; i++) - { - ManifoldPoint cp = manifold.GetContactPoint(i); - if (cp.Distance <= 0) - { - Vector3 pos1 = cp.PositionWorldOnA; - Vector3 pos2 = cp.PositionWorldOnB; - - Vector3 rel_pos1 = pos1 - body0.CenterOfMassPosition; - Vector3 rel_pos2 = pos2 - body1.CenterOfMassPosition; - - - //this jacobian entry is re-used for all iterations - JacobianEntry jac = new JacobianEntry(MatrixOperations.Transpose(body0.CenterOfMassTransform), - MatrixOperations.Transpose(body1.CenterOfMassTransform), - rel_pos1, rel_pos2, cp.NormalWorldOnB, body0.InvInertiaDiagLocal, body0.InverseMass, - body1.InvInertiaDiagLocal, body1.InverseMass); - - float jacDiagAB = jac.Diagonal; - - ConstraintPersistentData cpd = cp.UserPersistentData as ConstraintPersistentData; - if (cpd != null) - { - //might be invalid - cpd.PersistentLifeTime++; - if (cpd.PersistentLifeTime != cp.LifeTime) - { - //printf("Invalid: cpd->m_persistentLifeTime = %i cp.getLifeTime() = %i\n",cpd->m_persistentLifeTime,cp.getLifeTime()); - cpd = new ConstraintPersistentData(); - cpd.PersistentLifeTime = cp.LifeTime; - - } - } - else - { - - cpd = new ConstraintPersistentData(); - _totalCpd++; - //printf("totalCpd = %i Created Ptr %x\n",totalCpd,cpd); - cp.UserPersistentData = cpd; - cpd.PersistentLifeTime = cp.LifeTime; - //printf("CREATED: %x . cpd->m_persistentLifeTime = %i cp.getLifeTime() = %i\n",cpd,cpd->m_persistentLifeTime,cp.getLifeTime()); - - } - if (cpd == null) - throw new BulletException(); - - cpd.JacDiagABInv = 1f / jacDiagAB; - - //Dependent on Rigidbody A and B types, fetch the contact/friction response func - //perhaps do a similar thing for friction/restutution combiner funcs... - - cpd.FrictionSolverFunc = _frictionDispatch[(int)body0.FrictionSolverType, (int)body1.FrictionSolverType]; - cpd.ContactSolverFunc = _contactDispatch[(int)body0.ContactSolverType, (int)body1.ContactSolverType]; - - Vector3 vel1 = body0.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = body1.GetVelocityInLocalPoint(rel_pos2); - Vector3 vel = vel1 - vel2; - float rel_vel; - rel_vel = Vector3.Dot(cp.NormalWorldOnB, vel); - - float combinedRestitution = cp.CombinedRestitution; - - cpd.Penetration = cp.Distance; - cpd.Friction = cp.CombinedFriction; - cpd.Restitution = RestitutionCurve(rel_vel, combinedRestitution); - if (cpd.Restitution < 0f) - { - cpd.Restitution = 0.0f; - - }; - - //restitution and penetration work in same direction so - //rel_vel - - float penVel = -cpd.Penetration / info.TimeStep; - - if (cpd.Restitution > penVel) - { - cpd.Penetration = 0; - } - - - float relaxation = info.Damping; - if ((_solverMode & SolverMode.UseWarmstarting) != 0) - { - cpd.AppliedImpulse *= relaxation; - } - else - { - cpd.AppliedImpulse = 0f; - } - - //for friction - cpd.PreviousAppliedImpulse = cpd.AppliedImpulse; - - //re-calculate friction direction every frame, todo: check if this is really needed - Vector3 fwta = cpd.FrictionWorldTangentialA; - Vector3 fwtb = cpd.FrictionWorldTangentialB; - MathHelper.PlaneSpace1(cp.NormalWorldOnB, ref fwta, ref fwtb); - cpd.FrictionWorldTangentialA = fwta; - cpd.FrictionWorldTangentialB = fwtb; - - cpd.AccumulatedTangentImpulseA = 0; - cpd.AccumulatedTangentImpulseB = 0; - float denom0 = body0.ComputeImpulseDenominator(pos1, cpd.FrictionWorldTangentialA); - float denom1 = body1.ComputeImpulseDenominator(pos2, cpd.FrictionWorldTangentialA); - float denom = relaxation / (denom0 + denom1); - cpd.JacDiagABInvTangentA = denom; - - - denom0 = body0.ComputeImpulseDenominator(pos1, cpd.FrictionWorldTangentialB); - denom1 = body1.ComputeImpulseDenominator(pos2, cpd.FrictionWorldTangentialB); - denom = relaxation / (denom0 + denom1); - cpd.JacDiagABInvTangentB = denom; - - Vector3 totalImpulse = cp.NormalWorldOnB * cpd.AppliedImpulse; - - { - Vector3 torqueAxis0 = Vector3.Cross(rel_pos1, cp.NormalWorldOnB); - cpd.AngularComponentA = Vector3.TransformNormal(torqueAxis0, body0.InvInertiaTensorWorld); - Vector3 torqueAxis1 = Vector3.Cross(rel_pos2, cp.NormalWorldOnB); - cpd.AngularComponentB = Vector3.TransformNormal(torqueAxis1, body1.InvInertiaTensorWorld); - } - { - Vector3 ftorqueAxis0 = Vector3.Cross(rel_pos1, cpd.FrictionWorldTangentialA); - cpd.FrictionAngularComponent0A = Vector3.TransformNormal(ftorqueAxis0, body0.InvInertiaTensorWorld); - } - { - Vector3 ftorqueAxis1 = Vector3.Cross(rel_pos1, cpd.FrictionWorldTangentialB); - cpd.FrictionAngularComponent1A = Vector3.TransformNormal(ftorqueAxis1, body0.InvInertiaTensorWorld); - } - { - Vector3 ftorqueAxis0 = Vector3.Cross(rel_pos2, cpd.FrictionWorldTangentialA); - cpd.FrictionAngularComponent0B = Vector3.TransformNormal(ftorqueAxis0, body1.InvInertiaTensorWorld); - } - { - Vector3 ftorqueAxis1 = Vector3.Cross(rel_pos2, cpd.FrictionWorldTangentialB); - cpd.FrictionAngularComponent1B = Vector3.TransformNormal(ftorqueAxis1, body1.InvInertiaTensorWorld); - } - - - //apply previous frames impulse on both bodies - body0.ApplyImpulse(totalImpulse, rel_pos1); - body1.ApplyImpulse(-totalImpulse, rel_pos2); - } - } - } - } - - private bool MyContactDestroyedCallback(object userPersistentData) - { - if (userPersistentData == null) - throw new BulletException(); - ConstraintPersistentData cpd = userPersistentData as ConstraintPersistentData; - _totalCpd--; - return true; - } - - private float RestitutionCurve(float relVel, float restitution) - { - float rest = restitution * -relVel; - return rest; - } - - //velocity + friction - //response between two dynamic objects with friction - public virtual float ResolveSingleCollisionCombinedCacheFriendly( - SolverBody bodyA, - SolverBody bodyB, - SolverConstraint contactConstraint, - ContactSolverInfo solverInfo) - { - float normalImpulse = 0; - - if (contactConstraint.Penetration < 0) - return 0; - - float relVel; - float velADotn = Vector3.Dot(contactConstraint.ContactNormal,bodyA.LinearVelocity) - + Vector3.Dot(contactConstraint.RelPosACrossNormal,bodyA.AngularVelocity); - float velBDotn = Vector3.Dot(contactConstraint.ContactNormal,bodyB.LinearVelocity) - + Vector3.Dot(contactConstraint.RelPosBCrossNormal,bodyB.AngularVelocity); - - relVel = velADotn - velBDotn; - - float positionalError = contactConstraint.Penetration; - float velocityError = contactConstraint.Restitution - relVel;// * damping; - - float penetrationImpulse = positionalError * contactConstraint.JacDiagABInv; - float velocityImpulse = velocityError * contactConstraint.JacDiagABInv; - normalImpulse = penetrationImpulse + velocityImpulse; - - // See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse - float oldNormalImpulse = contactConstraint.AppliedImpulse; - float sum = oldNormalImpulse + normalImpulse; - contactConstraint.AppliedImpulse = 0 > sum ? 0 : sum; - - float oldVelocityImpulse = contactConstraint.AppliedVelocityImpulse; - float velocitySum = oldVelocityImpulse + velocityImpulse; - contactConstraint.AppliedVelocityImpulse = 0 > velocitySum ? 0 : velocitySum; - - normalImpulse = contactConstraint.AppliedImpulse - oldNormalImpulse; - - if (bodyA.InvMass != 0) - { - bodyA.ApplyImpulse(contactConstraint.ContactNormal * bodyA.InvMass, - contactConstraint.AngularComponentA, normalImpulse); - } - if (bodyB.InvMass != 0) - { - bodyB.ApplyImpulse(contactConstraint.ContactNormal * bodyB.InvMass, - contactConstraint.AngularComponentB, -normalImpulse); - } - - return normalImpulse; - } - - public virtual float ResolveSingleFrictionCacheFriendly( - SolverBody bodyA, - SolverBody bodyB, - SolverConstraint contactConstraint, - ContactSolverInfo solverInfo, - float appliedNormalImpulse) - { - float combinedFriction = contactConstraint.Friction; - float limit = appliedNormalImpulse * combinedFriction; - - if (appliedNormalImpulse > 0) - //friction - { - float j1; - { - float relVel; - float velADotn = Vector3.Dot(contactConstraint.ContactNormal, bodyA.LinearVelocity) - + Vector3.Dot(contactConstraint.RelPosACrossNormal, bodyA.AngularVelocity); - float velBDotn = Vector3.Dot(contactConstraint.ContactNormal, bodyB.LinearVelocity) - + Vector3.Dot(contactConstraint.RelPosBCrossNormal, bodyB.AngularVelocity); - relVel = velADotn - velBDotn; - - // calculate j that moves us to zero relative velocity - j1 = -relVel * contactConstraint.JacDiagABInv; - float oldTangentImpulse = contactConstraint.AppliedImpulse; - contactConstraint.AppliedImpulse = oldTangentImpulse + j1; - - float test = contactConstraint.AppliedImpulse; - MathHelper.SetMin(ref test, limit); - MathHelper.SetMax(ref test, -limit); - contactConstraint.AppliedImpulse = test; - - j1 = contactConstraint.AppliedImpulse - oldTangentImpulse; - } - - if (bodyA.InvMass != 0) - { - bodyA.ApplyImpulse(contactConstraint.ContactNormal * bodyA.InvMass, contactConstraint.AngularComponentA, j1); - } - if (bodyB.InvMass != 0) - { - bodyB.ApplyImpulse(contactConstraint.ContactNormal * bodyB.InvMass, contactConstraint.AngularComponentB, -j1); - } - } - return 0; - } - - public virtual float SolveGroupCacheFriendly(List bodies, List manifolds, int numManifolds, List constraints, ContactSolverInfo infoGlobal, IDebugDraw debugDrawer) - { - if (constraints.Count + numManifolds == 0) - { - return 0; - } - - for (int i = 0; i < numManifolds; i++) - { - PersistentManifold manifold = manifolds[i]; - RigidBody rbA = (RigidBody)manifold.BodyA; - RigidBody rbB = (RigidBody)manifold.BodyB; - - manifold.RefreshContactPoints(rbA.CenterOfMassTransform, rbB.CenterOfMassTransform); - } - - int minReservation = manifolds.Count * 2; - - _tmpSolverBodyPool = new List(minReservation); - - for (int i = 0; i < bodies.Count; i++) - { - RigidBody rb = RigidBody.Upcast(bodies[i]); - if (rb != null && rb.IslandTag >= 0) - { - BulletDebug.Assert(rb.CompanionID < 0); - int solverBodyId = _tmpSolverBodyPool.Count; - SolverBody solverBody; - InitSolverBody(out solverBody, rb); - _tmpSolverBodyPool.Add(solverBody); - rb.CompanionID = solverBodyId; - } - } - - _tmpSolverConstraintPool = new List(minReservation); - _tmpSolverFrictionConstraintPool = new List(minReservation); - - for (int i = 0; i < numManifolds; i++) - { - PersistentManifold manifold = manifolds[i]; - RigidBody rb0 = (RigidBody)manifold.BodyA; - RigidBody rb1 = (RigidBody)manifold.BodyB; - - int solverBodyIdA = -1; - int solverBodyIdB = -1; - - //if (i == 89) - // System.Diagnostics.Debugger.Break(); - - if (manifold.ContactsCount != 0) - { - if (rb0.IslandTag >= 0) - { - solverBodyIdA = rb0.CompanionID; - } - else - { - //create a static body - solverBodyIdA = _tmpSolverBodyPool.Count; - SolverBody solverBody; - InitSolverBody(out solverBody, rb0); - _tmpSolverBodyPool.Add(solverBody); - } - - if (rb1.IslandTag >= 0) - { - solverBodyIdB = rb1.CompanionID; - } - else - { - //create a static body - solverBodyIdB = _tmpSolverBodyPool.Count; - SolverBody solverBody; - InitSolverBody(out solverBody, rb1); - _tmpSolverBodyPool.Add(solverBody); - } - } - - if (solverBodyIdB == -1 || solverBodyIdA == -1) - System.Diagnostics.Debug.WriteLine(string.Format("We're in ass ! {0}", i)); - - for (int j = 0; j < manifold.ContactsCount; j++) - { - ManifoldPoint cp = manifold.GetContactPoint(j); - - int frictionIndex = _tmpSolverConstraintPool.Count; - - if (cp.Distance <= 0) - { - - Vector3 pos1 = cp.PositionWorldOnA; - Vector3 pos2 = cp.PositionWorldOnB; - - Vector3 rel_pos1 = pos1 - rb0.CenterOfMassPosition; - Vector3 rel_pos2 = pos2 - rb1.CenterOfMassPosition; - - float relaxation = 1; - { - SolverConstraint solverConstraint = new SolverConstraint(); - _tmpSolverConstraintPool.Add(solverConstraint); - - solverConstraint.SolverBodyIdA = solverBodyIdA; - solverConstraint.SolverBodyIdB = solverBodyIdB; - solverConstraint.ConstraintType = SolverConstraint.SolverConstraintType.Contact; - - //can be optimized, the cross products are already calculated - float denom0 = rb0.ComputeImpulseDenominator(pos1, cp.NormalWorldOnB); - float denom1 = rb1.ComputeImpulseDenominator(pos2, cp.NormalWorldOnB); - float denom = relaxation / (denom0 + denom1); - solverConstraint.JacDiagABInv = denom; - - solverConstraint.ContactNormal = cp.NormalWorldOnB; - solverConstraint.RelPosACrossNormal = Vector3.Cross(rel_pos1, cp.NormalWorldOnB); - solverConstraint.RelPosBCrossNormal = Vector3.Cross(rel_pos2, cp.NormalWorldOnB); - - Vector3 vel1 = rb0.GetVelocityInLocalPoint(rel_pos1); - Vector3 vel2 = rb1.GetVelocityInLocalPoint(rel_pos2); - - Vector3 vel = vel1 - vel2; - float rel_vel; - rel_vel = Vector3.Dot(cp.NormalWorldOnB, vel); - - - solverConstraint.Penetration = cp.Distance;//btScalar(infoGlobal.m_numIterations); - solverConstraint.Friction = cp.CombinedFriction; - float rest = RestitutionCurve(rel_vel, cp.CombinedRestitution); - if (rest <= 0) - { - rest = 0; - } - - float penVel = -solverConstraint.Penetration / infoGlobal.TimeStep; - if (rest > penVel) - { - rest = 0; - } - solverConstraint.Restitution = rest; - - solverConstraint.Penetration *= -(infoGlobal.Erp / infoGlobal.TimeStep); - - solverConstraint.AppliedImpulse = 0f; - solverConstraint.AppliedVelocityImpulse = 0f; - -#warning Check to see if we need Vector3.Transform - Vector3 torqueAxis0 = Vector3.Cross(rel_pos1, cp.NormalWorldOnB); - solverConstraint.AngularComponentA = Vector3.TransformNormal(torqueAxis0, rb0.InvInertiaTensorWorld); - Vector3 torqueAxis1 = Vector3.Cross(rel_pos2, cp.NormalWorldOnB); - solverConstraint.AngularComponentB = Vector3.TransformNormal(torqueAxis1, rb1.InvInertiaTensorWorld); - } - //create 2 '1d axis' constraints for 2 tangential friction directions - - //re-calculate friction direction every frame, todo: check if this is really needed - Vector3 frictionTangential0a = new Vector3(), - frictionTangential1b = new Vector3(); - - MathHelper.PlaneSpace1(cp.NormalWorldOnB, ref frictionTangential0a, ref frictionTangential1b); - { - SolverConstraint solverConstraint = new SolverConstraint(); - _tmpSolverFrictionConstraintPool.Add(solverConstraint); - solverConstraint.ContactNormal = frictionTangential0a; - - solverConstraint.SolverBodyIdA = solverBodyIdA; - solverConstraint.SolverBodyIdB = solverBodyIdB; - solverConstraint.ConstraintType = SolverConstraint.SolverConstraintType.Friction; - solverConstraint.FrictionIndex = frictionIndex; - - solverConstraint.Friction = cp.CombinedFriction; - - solverConstraint.AppliedImpulse = 0; - solverConstraint.AppliedVelocityImpulse = 0; - - float denom0 = rb0.ComputeImpulseDenominator(pos1, solverConstraint.ContactNormal); - float denom1 = rb1.ComputeImpulseDenominator(pos2, solverConstraint.ContactNormal); - float denom = relaxation / (denom0 + denom1); - solverConstraint.JacDiagABInv = denom; - - { - Vector3 ftorqueAxis0 = Vector3.Cross(rel_pos1, solverConstraint.ContactNormal); - solverConstraint.RelPosACrossNormal = ftorqueAxis0; - solverConstraint.AngularComponentA = Vector3.TransformNormal(ftorqueAxis0, rb0.InvInertiaTensorWorld); - } - { - Vector3 ftorqueAxis0 = Vector3.Cross(rel_pos2, solverConstraint.ContactNormal); - solverConstraint.RelPosBCrossNormal = ftorqueAxis0; - solverConstraint.AngularComponentB = Vector3.TransformNormal(ftorqueAxis0, rb1.InvInertiaTensorWorld); - } - } - - - { - - SolverConstraint solverConstraint = new SolverConstraint(); - _tmpSolverFrictionConstraintPool.Add(solverConstraint); - solverConstraint.ContactNormal = frictionTangential1b; - - solverConstraint.SolverBodyIdA = solverBodyIdA; - solverConstraint.SolverBodyIdB = solverBodyIdB; - solverConstraint.ConstraintType = SolverConstraint.SolverConstraintType.Friction; - solverConstraint.FrictionIndex = frictionIndex; - - solverConstraint.Friction = cp.CombinedFriction; - - solverConstraint.AppliedImpulse = 0; - solverConstraint.AppliedVelocityImpulse = 0; - - float denom0 = rb0.ComputeImpulseDenominator(pos1, solverConstraint.ContactNormal); - float denom1 = rb1.ComputeImpulseDenominator(pos2, solverConstraint.ContactNormal); - float denom = relaxation / (denom0 + denom1); - solverConstraint.JacDiagABInv = denom; - { - Vector3 ftorqueAxis1 = Vector3.Cross(rel_pos1, solverConstraint.ContactNormal); - solverConstraint.RelPosACrossNormal = ftorqueAxis1; - solverConstraint.AngularComponentA = Vector3.TransformNormal(ftorqueAxis1, rb0.InvInertiaTensorWorld); - } - { - Vector3 ftorqueAxis1 = Vector3.Cross(rel_pos2, solverConstraint.ContactNormal); - solverConstraint.RelPosBCrossNormal = ftorqueAxis1; - solverConstraint.AngularComponentB = Vector3.TransformNormal(ftorqueAxis1, rb1.InvInertiaTensorWorld); - } - } - } - } - } - - ContactSolverInfo info = infoGlobal; - { - for (int j = 0; j < constraints.Count; j++) - { - TypedConstraint constraint = constraints[j]; - constraint.BuildJacobian(); - } - } - - int numConstraintPool = _tmpSolverConstraintPool.Count; - int numFrictionPool = _tmpSolverFrictionConstraintPool.Count; - - //todo: use stack allocator for such temporarily memory, same for solver bodies/constraints - List gOrderTmpConstraintPool = new List(numConstraintPool); - List gOrderFrictionConstraintPool = new List(numFrictionPool); - { - for (int i = 0; i < numConstraintPool; i++) - { - gOrderTmpConstraintPool.Add(i); - } - for (int i = 0; i < numFrictionPool; i++) - { - gOrderFrictionConstraintPool.Add(i); - } - } - - //should traverse the contacts random order... - int iteration; - { - for (iteration = 0; iteration < info.IterationsCount; iteration++) - { - - int j; - if ((_solverMode & SolverMode.RandomizeOrder) != SolverMode.None) - { - if ((iteration & 7) == 0) - { - for (j = 0; j < numConstraintPool; ++j) - { - int tmp = gOrderTmpConstraintPool[j]; - int swapi = RandInt2(j + 1); - gOrderTmpConstraintPool[j] = gOrderTmpConstraintPool[swapi]; - gOrderTmpConstraintPool[swapi] = tmp; - } - - for (j = 0; j < numFrictionPool; ++j) - { - int tmp = gOrderFrictionConstraintPool[j]; - int swapi = RandInt2(j + 1); - gOrderFrictionConstraintPool[j] = gOrderFrictionConstraintPool[swapi]; - gOrderFrictionConstraintPool[swapi] = tmp; - } - } - } - - for (j = 0; j < constraints.Count; j++) - { - TypedConstraint constraint = constraints[j]; - //todo: use solver bodies, so we don't need to copy from/to btRigidBody - - if ((constraint.RigidBodyA.IslandTag >= 0) && (constraint.RigidBodyA.CompanionID >= 0)) - { - _tmpSolverBodyPool[constraint.RigidBodyA.CompanionID].WriteBackVelocity(); - } - if ((constraint.RigidBodyB.IslandTag >= 0) && (constraint.RigidBodyB.CompanionID >= 0)) - { - _tmpSolverBodyPool[constraint.RigidBodyB.CompanionID].WriteBackVelocity(); - } - - constraint.SolveConstraint(info.TimeStep); - - if ((constraint.RigidBodyA.IslandTag >= 0) && (constraint.RigidBodyA.CompanionID >= 0)) - { - _tmpSolverBodyPool[constraint.RigidBodyA.CompanionID].ReadVelocity(); - } - if ((constraint.RigidBodyB.IslandTag >= 0) && (constraint.RigidBodyB.CompanionID >= 0)) - { - _tmpSolverBodyPool[constraint.RigidBodyB.CompanionID].ReadVelocity(); - } - - } - - { - int numPoolConstraints = _tmpSolverConstraintPool.Count; - for (j = 0; j < numPoolConstraints; j++) - { - SolverConstraint solveManifold = _tmpSolverConstraintPool[gOrderTmpConstraintPool[j]]; - ResolveSingleCollisionCombinedCacheFriendly(_tmpSolverBodyPool[solveManifold.SolverBodyIdA], - _tmpSolverBodyPool[solveManifold.SolverBodyIdB], solveManifold, info); - } - } - - { - int numFrictionPoolConstraints = _tmpSolverFrictionConstraintPool.Count; - for (j = 0; j < numFrictionPoolConstraints; j++) - { - SolverConstraint solveManifold = _tmpSolverFrictionConstraintPool[gOrderFrictionConstraintPool[j]]; - float appliedNormalImpulse = _tmpSolverConstraintPool[solveManifold.FrictionIndex].AppliedImpulse; - - ResolveSingleFrictionCacheFriendly(_tmpSolverBodyPool[solveManifold.SolverBodyIdA], - _tmpSolverBodyPool[solveManifold.SolverBodyIdB], solveManifold, info, appliedNormalImpulse); - } - } - } - } - - for (int i = 0; i < _tmpSolverBodyPool.Count; i++) - { - _tmpSolverBodyPool[i].WriteBackVelocity(); - } - - _tmpSolverBodyPool.Clear(); - _tmpSolverConstraintPool.Clear(); - _tmpSolverFrictionConstraintPool.Clear(); - - return 0; - } - - public virtual float SolveGroup(List bodies, List manifolds, int numManifolds, List constraints, ContactSolverInfo infoGlobal, IDebugDraw debugDrawer) - { - if ((_solverMode & SolverMode.CacheFriendly) != SolverMode.None) - { - return SolveGroupCacheFriendly(bodies, manifolds, numManifolds, constraints, infoGlobal, debugDrawer); - } - - ContactSolverInfo info = infoGlobal; - int totalPoints = 0; - - int numiter = infoGlobal.IterationsCount; - - for (int j = 0; j < manifolds.Count; j++) - { - PersistentManifold manifold = manifolds[j]; - PrepareConstraints(manifold, info); - - for (int p = 0; p < manifolds[j].ContactsCount; p++) - { - _order[totalPoints].ManifoldIndex = j; - _order[totalPoints].PointIndex = p; - totalPoints++; - } - } - - for (int j = 0; j < constraints.Count; j++) - { - constraints[j].BuildJacobian(); - } - - //should traverse the contacts random order... - int iteration; - - for (iteration = 0; iteration < numiter; iteration++) - { - int j; - if ((_solverMode & SolverMode.RandomizeOrder) != SolverMode.None) - { - if ((iteration & 7) == 0) - { - for (j = 0; j < totalPoints; ++j) - { - OrderIndex tmp = _order[j]; - int swapi = RandInt2(j + 1); - _order[j] = _order[swapi]; - _order[swapi] = tmp; - } - } - } - - for (j = 0; j < constraints.Count; j++) - { - constraints[j].SolveConstraint(info.TimeStep); - } - - for (j = 0; j < totalPoints; j++) - { - PersistentManifold manifold = manifolds[_order[j].ManifoldIndex]; - Solve((RigidBody)manifold.BodyA, (RigidBody)manifold.BodyB, - manifold.GetContactPoint(_order[j].PointIndex), info, iteration, debugDrawer); - } - - for (j = 0; j < totalPoints; j++) - { - PersistentManifold manifold = manifolds[_order[j].ManifoldIndex]; - SolveFriction((RigidBody)manifold.BodyA, - (RigidBody)manifold.BodyB, manifold.GetContactPoint(_order[j].PointIndex), info, iteration, debugDrawer); - } - } - - return 0; - } - - private void InitSolverBody(out SolverBody solverBody, RigidBody rigidBody) - { - solverBody = new SolverBody(); - solverBody.AngularVelocity = rigidBody.AngularVelocity; - solverBody.CenterOfMassPosition = rigidBody.CenterOfMassPosition; - solverBody.Friction = rigidBody.Friction; - solverBody.InvMass = rigidBody.InverseMass; - solverBody.LinearVelocity = rigidBody.LinearVelocity; - solverBody.OriginalBody = rigidBody; - solverBody.AngularFactor = rigidBody.AngularFactor; - } - - private long Rand2() - { - _seed2 = (1664525L * _seed2 + 1013904223L) & 0xffffffff; - return _seed2; - } - - private int RandInt2(int n) - { - // seems good; xor-fold and modulus - long un = n; - long r = Rand2(); - - // note: probably more aggressive than it needs to be -- might be - // able to get away without one or two of the innermost branches. - if (un <= 0x00010000L) - { - r ^= (r >> 16); - if (un <= 0x00000100L) - { - r ^= (r >> 8); - if (un <= 0x00000010L) - { - r ^= (r >> 4); - if (un <= 0x00000004L) - { - r ^= (r >> 2); - if (un <= 0x00000002L) - { - r ^= (r >> 1); - } - } - } - } - } - return (int)(r % un); - } - - protected struct OrderIndex - { - private int _manifoldIndex; - private int _pointIndex; - - public int ManifoldIndex { get { return _manifoldIndex; } set { _manifoldIndex = value; } } - public int PointIndex { get { return _pointIndex; } set { _pointIndex = value; } } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Solve2LinearConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Solve2LinearConstraint.cs deleted file mode 100644 index 9d4060daa9..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/Solve2LinearConstraint.cs +++ /dev/null @@ -1,188 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - /// - /// constraint class used for lateral tyre friction - /// - public class Solve2LinearConstraint - { - private float _tau; - private float _damping; - - public Solve2LinearConstraint(float tau, float damping) - { - _tau = tau; - _damping = damping; - } - - // solve unilateral constraint (equality, direct method) - public void ResolveUnilateralPairConstraint( - RigidBody body1, RigidBody body2, - Matrix world2A, - Matrix world2B, - Vector3 invInertiaADiag, - float invMassA, - Vector3 linvelA, Vector3 angvelA, - Vector3 rel_posA1, - Vector3 invInertiaBDiag, - float invMassB, - Vector3 linvelB, Vector3 angvelB, - Vector3 rel_posA2, - float depthA, Vector3 normalA, - Vector3 rel_posB1, Vector3 rel_posB2, - float depthB, Vector3 normalB, - out float imp0, out float imp1) - { - imp0 = 0; - imp1 = 0; - - float len = Math.Abs(normalA.Length()) - 1f; - if (Math.Abs(len) >= float.Epsilon) - return; - - BulletDebug.Assert(len < float.Epsilon); - - //this jacobian entry could be re-used for all iterations - JacobianEntry jacA = new JacobianEntry(world2A, world2B, rel_posA1, rel_posA2, normalA, invInertiaADiag, invMassA, - invInertiaBDiag, invMassB); - JacobianEntry jacB = new JacobianEntry(world2A, world2B, rel_posB1, rel_posB2, normalB, invInertiaADiag, invMassA, - invInertiaBDiag, invMassB); - - float vel0 = Vector3.Dot(normalA, body1.GetVelocityInLocalPoint(rel_posA1) - body2.GetVelocityInLocalPoint(rel_posA1)); - float vel1 = Vector3.Dot(normalB, body1.GetVelocityInLocalPoint(rel_posB1) - body2.GetVelocityInLocalPoint(rel_posB1)); - - // btScalar penetrationImpulse = (depth*contactTau*timeCorrection) * massTerm;//jacDiagABInv - float massTerm = 1f / (invMassA + invMassB); - - // calculate rhs (or error) terms - float dv0 = depthA * _tau * massTerm - vel0 * _damping; - float dv1 = depthB * _tau * massTerm - vel1 * _damping; - - float nonDiag = jacA.GetNonDiagonal(jacB, invMassA, invMassB); - float invDet = 1.0f / (jacA.Diagonal * jacB.Diagonal - nonDiag * nonDiag); - - imp0 = dv0 * jacA.Diagonal * invDet + dv1 * -nonDiag * invDet; - imp1 = dv1 * jacB.Diagonal * invDet + dv0 * -nonDiag * invDet; - } - - // solving 2x2 lcp problem (inequality, direct solution ) - public void ResolveBilateralPairConstraint( - RigidBody body1, RigidBody body2, - Matrix world2A, Matrix world2B, - Vector3 invInertiaADiag, - float invMassA, - Vector3 linvelA, Vector3 angvelA, - Vector3 rel_posA1, - Vector3 invInertiaBDiag, - float invMassB, - Vector3 linvelB, Vector3 angvelB, - Vector3 rel_posA2, - float depthA, Vector3 normalA, - Vector3 rel_posB1, Vector3 rel_posB2, - float depthB, Vector3 normalB, - out float imp0, out float imp1) - { - imp0 = 0f; - imp1 = 0f; - - float len = Math.Abs(normalA.Length()) - 1f; - if (Math.Abs(len) >= float.Epsilon) - return; - - BulletDebug.Assert(len < float.Epsilon); - - JacobianEntry jacA = new JacobianEntry(world2A, world2B, rel_posA1, rel_posA2, normalA, invInertiaADiag, invMassA, - invInertiaBDiag, invMassB); - JacobianEntry jacB = new JacobianEntry(world2A, world2B, rel_posB1, rel_posB2, normalB, invInertiaADiag, invMassA, - invInertiaBDiag, invMassB); - - float vel0 = Vector3.Dot(normalA, body1.GetVelocityInLocalPoint(rel_posA1) - body2.GetVelocityInLocalPoint(rel_posA1)); - float vel1 = Vector3.Dot(normalB, body1.GetVelocityInLocalPoint(rel_posB1) - body2.GetVelocityInLocalPoint(rel_posB1)); - - // calculate rhs (or error) terms - float dv0 = depthA * _tau - vel0 * _damping; - float dv1 = depthB * _tau - vel1 * _damping; - - float nonDiag = jacA.GetNonDiagonal(jacB, invMassA, invMassB); - float invDet = 1.0f / (jacA.Diagonal * jacB.Diagonal - nonDiag * nonDiag); - - imp0 = dv0 * jacA.Diagonal * invDet + dv1 * -nonDiag * invDet; - imp1 = dv1 * jacB.Diagonal * invDet + dv0 * -nonDiag * invDet; - - if (imp0 > 0.0f) - { - if (imp1 <= 0.0f) - { - imp1 = 0f; - - // now imp0>0 imp1<0 - imp0 = dv0 / jacA.Diagonal; - if (imp0 < 0.0f) - imp0 = 0f; - } - } - else - { - imp0 = 0f; - - imp1 = dv1 / jacB.Diagonal; - if (imp1 <= 0.0f) - { - imp1 = 0f; - // now imp0>0 imp1<0 - imp0 = dv0 / jacA.Diagonal; - if (imp0 > 0.0f) - { - } - else - { - imp0 = 0f; - } - } - } - } - - //public void ResolveAngularConstraint( - // Matrix invInertiaAWS, - // float invMassA, - // Vector3 linvelA, Vector3 angvelA, - // Vector3 rel_posA1, - // Matrix invInertiaBWS, - // float invMassB, - // Vector3 linvelB, Vector3 angvelB, - // Vector3 rel_posA2, - // float depthA, Vector3 normalA, - // Vector3 rel_posB1, Vector3 rel_posB2, - // float depthB, Vector3 normalB, - // out float imp0, out float imp1) - //{ - // imp0 = 0; - // imp1 = 0; - //} - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SolverBody.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SolverBody.cs deleted file mode 100644 index 6996272f14..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SolverBody.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; -using System.Runtime.InteropServices; - -namespace XnaDevRu.BulletX.Dynamics -{ - public class SolverBody - { - private Vector3 _centerOfMassPosition = new Vector3(); - private Vector3 _linearVelocity = new Vector3(); - private Vector3 _angularVelocity = new Vector3(); - private RigidBody _originalBody = null; - private float _invMass; - private float _friction; - private float _angularFactor; - - public Vector3 CenterOfMassPosition { get { return _centerOfMassPosition; } set { _centerOfMassPosition = value; } } - public Vector3 LinearVelocity { get { return _linearVelocity; } set { _linearVelocity = value; } } - public Vector3 AngularVelocity { get { return _angularVelocity; } set { _angularVelocity = value; } } - public RigidBody OriginalBody { get { return _originalBody; } set { _originalBody = value; } } - public float InvMass { get { return _invMass; } set { _invMass = value; } } - public float Friction { get { return _friction; } set { _friction = value; } } - public float AngularFactor { get { return _angularFactor; } set { _angularFactor = value; } } - - public void GetVelocityInLocalPoint(Vector3 relPos, out Vector3 velocity) - { - velocity = _linearVelocity + Vector3.Cross(_angularVelocity, relPos); - } - - public void WriteBackVelocity() - { - if (_invMass != 0) - { - _originalBody.LinearVelocity = _linearVelocity; - _originalBody.AngularVelocity = _angularVelocity; - } - } - - public void ReadVelocity() - { - if (_invMass != 0) - { - _linearVelocity = _originalBody.LinearVelocity; - _angularVelocity = _originalBody.AngularVelocity; - } - } - - //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position - internal void ApplyImpulse(Vector3 linearComponent, Vector3 angularComponent, float impulseMagnitude) - { - _linearVelocity += linearComponent * impulseMagnitude; - _angularVelocity += angularComponent * impulseMagnitude * _angularFactor; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SolverConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SolverConstraint.cs deleted file mode 100644 index 4fd0361a77..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/SolverConstraint.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; -using System.Runtime.InteropServices; - -namespace XnaDevRu.BulletX.Dynamics -{ - //1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints. - public class SolverConstraint - { - private Vector3 _relpos1CrossNormal = new Vector3(); - private Vector3 _relpos2CrossNormal = new Vector3(); - private Vector3 _contactNormal = new Vector3(); - private Vector3 _angularComponentA = new Vector3(); - private Vector3 _angularComponentB = new Vector3(); - - private float _appliedVelocityImpulse; - private int _solverBodyIdA; - int _solverBodyIdB; - private float _friction; - private float _restitution; - private float _jacDiagABInv; - private float _penetration; - private float _appliedImpulse; - - private SolverConstraintType _constraintType = SolverConstraintType.Contact; - private int _frictionIndex; - private int[] _unusedPadding = new int[2]; - - public Vector3 RelPosACrossNormal { get { return _relpos1CrossNormal; } set { _relpos1CrossNormal = value; } } - public Vector3 RelPosBCrossNormal { get { return _relpos2CrossNormal; } set { _relpos2CrossNormal = value; } } - public Vector3 ContactNormal { get { return _contactNormal; } set { _contactNormal = value; } } - public Vector3 AngularComponentA { get { return _angularComponentA; } set { _angularComponentA = value; } } - public Vector3 AngularComponentB { get { return _angularComponentB; } set { _angularComponentB = value; } } - - public float AppliedVelocityImpulse { get { return _appliedVelocityImpulse; } set { _appliedVelocityImpulse = value; } } - public int SolverBodyIdA { get { return _solverBodyIdA; } set { _solverBodyIdA = value; } } - public int SolverBodyIdB { get { return _solverBodyIdB; } set { _solverBodyIdB = value; } } - public float Friction { get { return _friction; } set { _friction = value; } } - public float Restitution { get { return _restitution; } set { _restitution = value; } } - public float JacDiagABInv { get { return _jacDiagABInv; } set { _jacDiagABInv = value; } } - public float Penetration { get { return _penetration; } set { _penetration = value; } } - public float AppliedImpulse { get { return _appliedImpulse; } set { _appliedImpulse = value; } } - - public SolverConstraintType ConstraintType { get { return _constraintType; } set { _constraintType = value; } } - public int FrictionIndex { get { return _frictionIndex; } set { _frictionIndex = value; } } - public int[] UnusedPadding { get { return _unusedPadding; } set { _unusedPadding = value; } } - - public enum SolverConstraintType - { - Contact = 0, - Friction, - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/TypedConstraint.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/TypedConstraint.cs deleted file mode 100644 index 813146307a..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/ConstraintSolver/TypedConstraint.cs +++ /dev/null @@ -1,88 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public abstract class TypedConstraint - { - private static RigidBody _fixed = new RigidBody(0, null, null, new Vector3(), 0, 0, 0.5f, 0); - private int _userConstraintType; - private int _userConstraintId; - - private RigidBody _rbA; - private RigidBody _rbB; - private float _appliedImpulse; - - public TypedConstraint() - : this(_fixed, _fixed) { } - - public TypedConstraint(RigidBody rbA) - : this(rbA, _fixed) { } - - public TypedConstraint(RigidBody rbA, RigidBody rbB) - { - _userConstraintType = -1; - _userConstraintId = -1; - _rbA = rbA; - _rbB = rbB; - _appliedImpulse = 0; - - _fixed.SetMassProps(0, new Vector3()); - } - - public virtual RigidBody RigidBodyA { get { return _rbA; } protected set { _rbA = value; } } - public virtual RigidBody RigidBodyB { get { return _rbB; } protected set { _rbB = value; } } - - public float AppliedImpulse { get { return _appliedImpulse; } protected set { _appliedImpulse = value; } } - public int UserConstraintId { get { return _userConstraintId; } set { _userConstraintId = value; } } - public int UserConstraintType { get { return _userConstraintType; } set { _userConstraintType = value; } } - - public abstract void BuildJacobian(); - public abstract void SolveConstraint(float timeStep); - - public static int SortConstraintOnIslandPredicate(TypedConstraint left, TypedConstraint right) - { - int rightIslandID, leftIslandID; - rightIslandID = GetConstraintIslandId(right); - leftIslandID = GetConstraintIslandId(left); - if (leftIslandID < rightIslandID) - return -1; - else - return 1; - return 0; - } - - internal static int GetConstraintIslandId(TypedConstraint lhs) - { - int islandId; - - CollisionObject colObjA = lhs.RigidBodyA; - CollisionObject colObjB = lhs.RigidBodyB; - islandId = colObjA.IslandTag >= 0 ? colObjA.IslandTag : colObjB.IslandTag; - return islandId; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/DiscreteDynamicsWorld.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/DiscreteDynamicsWorld.cs deleted file mode 100644 index 3702c2a27e..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/DiscreteDynamicsWorld.cs +++ /dev/null @@ -1,790 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - /// - /// DiscreteDynamicsWorld provides discrete rigid body simulation - /// those classes replace the obsolete CcdPhysicsEnvironment/CcdPhysicsController - /// - public class DiscreteDynamicsWorld : DynamicsWorld - { - private static bool _reportMe = true; - - private IConstraintSolver _constraintSolver; - private SimulationIslandManager _islandManager; - private List _constraints = new List(); - private IDebugDraw _debugDrawer; - private ContactSolverInfo _solverInfo = new ContactSolverInfo(); - private Vector3 _gravity; - //for variable timesteps - private float _localTime; - //for variable timesteps - private bool _ownsIslandManager; - private bool _ownsConstraintSolver; - private List _vehicles = new List(); - private int _profileTimings; - - public DiscreteDynamicsWorld(IDispatcher dispatcher, OverlappingPairCache pairCache) - : this(dispatcher, pairCache, null) { } - - //this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those - public DiscreteDynamicsWorld(IDispatcher dispatcher, OverlappingPairCache pairCache, IConstraintSolver constraintSolver) - : base(dispatcher, pairCache) - { - _constraintSolver = constraintSolver != null ? constraintSolver : new SequentialImpulseConstraintSolver(); - _debugDrawer = null; - _gravity = new Vector3(0, -10, 0); - _localTime = 1f / 60f; - _profileTimings = 0; - _islandManager = new SimulationIslandManager(); - _ownsIslandManager = true; - _ownsConstraintSolver = constraintSolver == null; - } - - public ContactSolverInfo SolverInfo { get { return _solverInfo; } } - public SimulationIslandManager SimulationIslandManager { get { return _islandManager; } } - public CollisionWorld CollisionWorld { get { return this; } } - - public override IDebugDraw DebugDrawer - { - get - { - return _debugDrawer; - } - set - { - _debugDrawer = value; - } - } - - public override Vector3 Gravity - { - set - { - _gravity = value; - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - body.Gravity = value; - } - } - } - } - - public override IConstraintSolver ConstraintSolver - { - set - { - _ownsConstraintSolver = false; - _constraintSolver = value; - } - } - - public override int ConstraintsCount - { - get - { - return _constraints.Count; - } - } - - //if maxSubSteps > 0, it will interpolate motion between fixedTimeStep's - public override void StepSimulation(float timeStep, int maxSubSteps, float fixedTimeStep) - { - int numSimulationSubSteps = 0; - - if (maxSubSteps != 0) - { - //fixed timestep with interpolation - _localTime += timeStep; - if (_localTime >= fixedTimeStep) - { - numSimulationSubSteps = (int)(_localTime / fixedTimeStep); - _localTime -= numSimulationSubSteps * fixedTimeStep; - } - } - else - { - //variable timestep - fixedTimeStep = timeStep; - _localTime = timeStep; - if (Math.Abs(timeStep) < float.Epsilon) - { - numSimulationSubSteps = 0; - maxSubSteps = 0; - } - else - { - numSimulationSubSteps = 1; - maxSubSteps = 1; - } - } - - //process some debugging flags - if (DebugDrawer != null) - { - RigidBody.DisableDeactivation = (DebugDrawer.DebugMode & DebugDrawModes.NoDeactivation) != 0; - } - if (numSimulationSubSteps != 0) - { - - SaveKinematicState(fixedTimeStep); - - //clamp the number of substeps, to prevent simulation grinding spiralling down to a halt - int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps) ? maxSubSteps : numSimulationSubSteps; - - for (int i = 0; i < clampedSimulationSteps; i++) - { - InternalSingleStepSimulation(fixedTimeStep); - SynchronizeMotionStates(); - } - - } - - SynchronizeMotionStates(); - - //return numSimulationSubSteps; - } - - public void StepSimulation(float timeStep, int maxSubSteps) - { - StepSimulation(timeStep, maxSubSteps, 1f / 60f); - } - - public override void UpdateAabbs() - { - Vector3 colorvec = new Vector3(1, 0, 0); - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - - if (body != null) - { - // if (body->IsActive() && (!body->IsStatic())) - { - Vector3 minAabb, maxAabb; - colObj.CollisionShape.GetAabb(colObj.WorldTransform, out minAabb, out maxAabb); - OverlappingPairCache bp = BroadphasePairCache; - - //moving objects should be moderately sized, probably something wrong if not - if (colObj.IsStaticObject || ((maxAabb - minAabb).LengthSquared() < 1e12f)) - { - bp.SetAabb(body.Broadphase, minAabb, maxAabb); - } - else - { - //something went wrong, investigate - //this assert is unwanted in 3D modelers (danger of loosing work) - BulletDebug.Assert(false); - body.ActivationState = ActivationState.DisableSimulation; - - if (_reportMe) - { - _reportMe = false; - Console.WriteLine("Overflow in AABB, object removed from simulation \n"); - Console.WriteLine("If you can reproduce this, please email bugs@continuousphysics.com\n"); - Console.WriteLine("Please include above information, your Platform, version of OS.\n"); - Console.WriteLine("Thanks.\n"); - } - } - if (_debugDrawer != null && (_debugDrawer.DebugMode & DebugDrawModes.DrawAabb) != 0) - DrawAabb(_debugDrawer, minAabb, maxAabb, colorvec); - } - } - } - } - - public override void AddConstraint(TypedConstraint constraint) - { - _constraints.Add(constraint); - } - - public override void RemoveConstraint(TypedConstraint constraint) - { - _constraints.Remove(constraint); - } - - public void AddVehicle(RaycastVehicle vehicle) - { - _vehicles.Add(vehicle); - } - - public void RemoveVehicle(RaycastVehicle vehicle) - { - _vehicles.Remove(vehicle); - } - - public override void AddRigidBody(RigidBody body) - { - if (!body.IsStaticOrKinematicObject) - { - body.Gravity = _gravity; - } - - if (body.CollisionShape != null) - { - bool isDynamic = !(body.IsStaticObject || body.IsKinematicObject); - BroadphaseProxy.CollisionFilterGroups collisionFilterGroup = isDynamic ? BroadphaseProxy.CollisionFilterGroups.Default : BroadphaseProxy.CollisionFilterGroups.Static; - BroadphaseProxy.CollisionFilterGroups collisionFilterMask = isDynamic ? BroadphaseProxy.CollisionFilterGroups.All : (BroadphaseProxy.CollisionFilterGroups.All ^ BroadphaseProxy.CollisionFilterGroups.Static); - - AddCollisionObject(body, collisionFilterGroup, collisionFilterMask); - } - } - - public override void RemoveRigidBody(RigidBody body) - { - RemoveCollisionObject(body); - } - - public void DebugDrawObject(Matrix worldTransform, CollisionShape shape, Vector3 color) - { - if (shape.ShapeType == BroadphaseNativeTypes.Compound) - { - CompoundShape compoundShape = shape as CompoundShape; - for (int i = compoundShape.ChildShapeCount - 1; i >= 0; i--) - { - Matrix childTrans = compoundShape.GetChildTransform(i); - CollisionShape colShape = compoundShape.GetChildShape(i); - DebugDrawObject(worldTransform * childTrans, colShape, color); - } - - } - else - { - switch (shape.ShapeType) - { - - case BroadphaseNativeTypes.Sphere: - { - SphereShape sphereShape = shape as SphereShape; - float radius = sphereShape.Margin;//radius doesn't include the margin, so draw with margin - Vector3 start = worldTransform.Translation; - DebugDrawer.DrawLine(start, start + Vector3.TransformNormal(new Vector3(radius, 0, 0), worldTransform), color); - DebugDrawer.DrawLine(start, start + Vector3.TransformNormal(new Vector3(0, radius, 0), worldTransform), color); - DebugDrawer.DrawLine(start, start + Vector3.TransformNormal(new Vector3(0, 0, radius), worldTransform), color); - //drawSphere - break; - } - case BroadphaseNativeTypes.MultiSphere: - case BroadphaseNativeTypes.Cone: - { - ConeShape coneShape = shape as ConeShape; - float radius = coneShape.Radius;//+coneShape->getMargin(); - float height = coneShape.Height;//+coneShape->getMargin(); - Vector3 start = worldTransform.Translation; - DebugDrawer.DrawLine(start + Vector3.TransformNormal(new Vector3(0f, 0f, 0.5f * height), worldTransform), start + Vector3.TransformNormal(new Vector3(radius, 0f, -0.5f * height), worldTransform), color); - DebugDrawer.DrawLine(start + Vector3.TransformNormal(new Vector3(0f, 0f, 0.5f * height), worldTransform), start + Vector3.TransformNormal(new Vector3(-radius, 0f, -0.5f * height), worldTransform), color); - DebugDrawer.DrawLine(start + Vector3.TransformNormal(new Vector3(0f, 0f, 0.5f * height), worldTransform), start + Vector3.TransformNormal(new Vector3(0f, radius, -0.5f * height), worldTransform), color); - DebugDrawer.DrawLine(start + Vector3.TransformNormal(new Vector3(0f, 0f, 0.5f * height), worldTransform), start + Vector3.TransformNormal(new Vector3(0f, -radius, -0.5f * height), worldTransform), color); - break; - } - case BroadphaseNativeTypes.Cylinder: - { - CylinderShape cylinder = shape as CylinderShape; - int upAxis = cylinder.UpAxis; - float radius = cylinder.Radius; - float halfHeight = MathHelper.GetElement(cylinder.HalfExtents, upAxis); - Vector3 start = worldTransform.Translation; - Vector3 offsetHeight = new Vector3(); - MathHelper.SetElement(ref offsetHeight, upAxis, halfHeight); - Vector3 offsetRadius = new Vector3(); - MathHelper.SetElement(ref offsetRadius, (upAxis + 1) % 3, radius); - DebugDrawer.DrawLine(start + Vector3.TransformNormal(offsetHeight + offsetRadius, worldTransform), start + Vector3.TransformNormal(-offsetHeight + offsetRadius, worldTransform), color); - DebugDrawer.DrawLine(start + Vector3.TransformNormal(offsetHeight - offsetRadius, worldTransform), start + Vector3.TransformNormal(-offsetHeight - offsetRadius, worldTransform), color); - break; - } - default: - { - if (shape.ShapeType == BroadphaseNativeTypes.TriangleMesh) - { - TriangleMeshShape concaveMesh = shape as TriangleMeshShape; - //btVector3 aabbMax(1e30f,1e30f,1e30f); - //btVector3 aabbMax(100,100,100);//1e30f,1e30f,1e30f); - - //todo pass camera, for some culling - Vector3 aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - Vector3 aabbMin = new Vector3(-1e30f, -1e30f, -1e30f); - - DebugDrawCallback drawCallback = new DebugDrawCallback(DebugDrawer, worldTransform, color); - concaveMesh.ProcessAllTriangles(drawCallback, aabbMin, aabbMax); - } - - if (shape.ShapeType == BroadphaseNativeTypes.ConvexTriangleMesh) - { - ConvexTriangleMeshShape convexMesh = shape as ConvexTriangleMeshShape; - //todo: pass camera for some culling - Vector3 aabbMax = new Vector3(1e30f, 1e30f, 1e30f); - Vector3 aabbMin = new Vector3(-1e30f, -1e30f, -1e30f); - //DebugDrawcallback drawCallback; - DebugDrawCallback drawCallback = new DebugDrawCallback(DebugDrawer, worldTransform, color); - convexMesh.getStridingMesh().InternalProcessAllTriangles(drawCallback, aabbMin, aabbMax); - } - - // for polyhedral shapes - if (shape.IsPolyhedral) - { - PolyhedralConvexShape polyshape = shape as PolyhedralConvexShape; - - for (int i = 0; i < polyshape.EdgeCount; i++) - { - Vector3 a, b; - polyshape.GetEdge(i, out a, out b); - a = Vector3.TransformNormal(a, worldTransform); - b = Vector3.TransformNormal(b, worldTransform); - DebugDrawer.DrawLine(a, b, color); - } - } - break; - } - } - } - } - - public override TypedConstraint GetConstraint(int index) - { - return _constraints[index]; - } - - public static void DrawAabb(IDebugDraw debugDrawer, Vector3 from, Vector3 to, Vector3 color) - { - Vector3 halfExtents = (to - from) * 0.5f; - Vector3 center = (to + from) * 0.5f; - - Vector3 edgecoord = new Vector3(1f, 1f, 1f), pa, pb; - for (int i = 0; i < 4; i++) - { - for (int j = 0; j < 3; j++) - { - pa = new Vector3(edgecoord.X * halfExtents.X, edgecoord.Y * halfExtents.Y, - edgecoord.Z * halfExtents.Z); - pa += center; - - int othercoord = j % 3; - MathHelper.SetElement(ref edgecoord, othercoord, MathHelper.GetElement(edgecoord, othercoord) * -1f); - pb = new Vector3(edgecoord.X * halfExtents.X, edgecoord.Y * halfExtents.Y, - edgecoord.Z * halfExtents.Z); - pb += center; - - debugDrawer.DrawLine(pa, pb, color); - } - edgecoord = new Vector3(-1f, -1f, -1f); - if (i < 3) - MathHelper.SetElement(ref edgecoord, i, MathHelper.GetElement(edgecoord, i) * -1f); - } - } - - protected void PredictUnconstraintMotion(float timeStep) - { - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - if (!body.IsStaticOrKinematicObject) - { - if (body.IsActive) - { - body.ApplyForces(timeStep); - body.IntegrateVelocities(timeStep); - Matrix temp = body.InterpolationWorldTransform; - body.PredictIntegratedTransform(timeStep, ref temp); - body.InterpolationWorldTransform = temp; - } - } - } - } - } - - protected void IntegrateTransforms(float timeStep) - { - Matrix predictedTrans = new Matrix(); - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - if (body.IsActive && (!body.IsStaticOrKinematicObject)) - { - body.PredictIntegratedTransform(timeStep, ref predictedTrans); - body.ProceedToTransform(predictedTrans); - } - } - } - } - - protected void CalculateSimulationIslands() - { - SimulationIslandManager.UpdateActivationState(this, Dispatcher); - - for (int i = 0; i < _constraints.Count; i++) - { - TypedConstraint constraint = _constraints[i]; - - RigidBody colObj0 = constraint.RigidBodyA; - RigidBody colObj1 = constraint.RigidBodyB; - - if (((colObj0 != null) && (colObj0.MergesSimulationIslands)) && - ((colObj1 != null) && (colObj1.MergesSimulationIslands))) - { - if (colObj0.IsActive || colObj1.IsActive) - { - - SimulationIslandManager.UnionFind.Unite((colObj0).IslandTag, - (colObj1).IslandTag); - } - } - } - - //Store the island id in each body - SimulationIslandManager.StoreIslandActivationState(this); - } - - //protected void SolveNonContactConstraints(ContactSolverInfo solverInfo) - //{ - // //constraint preparation: building jacobians - // for (int i = 0; i < _constraints.Count; i++) - // { - // TypedConstraint constraint = _constraints[i]; - // constraint.BuildJacobian(); - // } - - // //solve the regular non-contact constraints (point 2 point, hinge, generic d6) - // for (int g = 0; g < solverInfo.IterationsCount; g++) - // { - // for (int i = 0; i < _constraints.Count; i++) - // { - // TypedConstraint constraint = _constraints[i]; - // constraint.SolveConstraint(solverInfo.TimeStep); - // } - // } - //} - - //protected void SolveContactConstraints(ContactSolverInfo solverInfo) - //{ - // InplaceSolverIslandCallback solverCallback = new InplaceSolverIslandCallback(solverInfo, _constraintSolver, _debugDrawer); - - // // solve all the contact points and contact friction - // _islandManager.BuildAndProcessIslands(Dispatcher, CollisionObjects, solverCallback); - //} - - protected void SolveConstraints(ContactSolverInfo solverInfo) - { - //sorted version of all btTypedConstraint, based on islandId - List sortedConstraints = new List(ConstraintsCount); - - for (int i = 0; i < ConstraintsCount; i++) - { - sortedConstraints.Add(_constraints[i]); - } - - sortedConstraints.Sort(new Comparison(TypedConstraint.SortConstraintOnIslandPredicate)); - List constraintsPtr = ConstraintsCount != 0 ? sortedConstraints : new List(); - - InplaceSolverIslandCallback solverCallback = new InplaceSolverIslandCallback(solverInfo, _constraintSolver, constraintsPtr, _debugDrawer); - - // solve all the constraints for this island - _islandManager.BuildAndProcessIslands(CollisionWorld.Dispatcher, CollisionWorld.CollisionObjects, solverCallback); - } - - protected void UpdateActivationState(float timeStep) - { - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - body.UpdateDeactivation(timeStep); - - if (body.WantsSleeping()) - { - if (body.IsStaticOrKinematicObject) - { - body.ActivationState = ActivationState.IslandSleeping; - } - else - { - if (body.ActivationState == ActivationState.Active) - body.ActivationState = ActivationState.WantsDeactivation; - } - } - else - { - if (body.ActivationState != ActivationState.DisableDeactivation) - body.ActivationState = ActivationState.Active; - } - } - } - } - - protected void UpdateVehicles(float timeStep) - { - for (int i = 0; i < _vehicles.Count; i++) - { - RaycastVehicle vehicle = _vehicles[i]; - vehicle.updateVehicle(timeStep); - } - } - - protected void StartProfiling(float timeStep) { } - - protected virtual void InternalSingleStepSimulation(float timeStep) - { - StartProfiling(timeStep); - - //update aabbs information - UpdateAabbs(); - - //apply gravity, predict motion - PredictUnconstraintMotion(timeStep); - - DispatcherInfo dispatchInfo = DispatchInfo; - dispatchInfo.TimeStep = timeStep; - dispatchInfo.StepCount = 0; - dispatchInfo.DebugDraw = DebugDrawer; - - //perform collision detection - PerformDiscreteCollisionDetection(); - - CalculateSimulationIslands(); - - SolverInfo.TimeStep = timeStep; - - //solve contact and other joint constraints - SolveConstraints(SolverInfo); - - //CallbackTriggers(); - - //integrate transforms - IntegrateTransforms(timeStep); - - //update vehicle simulation - UpdateVehicles(timeStep); - - UpdateActivationState(timeStep); - } - - protected void SynchronizeMotionStates() - { - //debug vehicle wheels - { - //todo: iterate over awake simulation islands! - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - if (DebugDrawer != null && (DebugDrawer.DebugMode & DebugDrawModes.DrawWireframe) != 0) - { - Vector3 color = new Vector3(255f, 255f, 255f); - switch (colObj.ActivationState) - { - case ActivationState.Active: - color = new Vector3(255f, 255f, 255f); break; - case ActivationState.IslandSleeping: - color = new Vector3(0f, 255f, 0f); break; - case ActivationState.WantsDeactivation: - color = new Vector3(0f, 255f, 255f); break; - case ActivationState.DisableDeactivation: - color = new Vector3(255f, 0f, 0f); break; - case ActivationState.DisableSimulation: - color = new Vector3(255f, 255f, 0f); break; - default: - color = new Vector3(255f, 0f, 0f); break; - } - - DebugDrawObject(colObj.WorldTransform, colObj.CollisionShape, color); - } - RigidBody body = RigidBody.Upcast(colObj); - if (body != null && body.MotionState != null && !body.IsStaticOrKinematicObject) - { - //if (body.ActivationState != ActivationState.IslandSleeping) - { - Matrix interpolatedTransform = new Matrix(); - TransformUtil.IntegrateTransform(body.InterpolationWorldTransform, - body.InterpolationLinearVelocity, body.InterpolationAngularVelocity, _localTime, ref interpolatedTransform); - body.MotionState.SetWorldTransform(interpolatedTransform); - } - } - } - } - - if (DebugDrawer != null && (DebugDrawer.DebugMode & DebugDrawModes.DrawWireframe) != 0) - { - for (int i = 0; i < _vehicles.Count; i++) - { - for (int v = 0; v < _vehicles[i].getNumWheels(); v++) - { - Vector3 wheelColor = new Vector3(0, 255, 255); - if (_vehicles[i].getWheelInfo(v).RaycastInfo.IsInContact) - { - wheelColor = new Vector3(0, 0, 255); - } - else - { - wheelColor = new Vector3(255, 0, 255); - } - - //synchronize the wheels with the (interpolated) chassis worldtransform - _vehicles[i].updateWheelTransform(v, true); - - Vector3 wheelPosWS = _vehicles[i].getWheelInfo(v).WorldTransform.Translation; - - Vector3 axle = new Vector3( - MathHelper.GetElement(_vehicles[i].getWheelInfo(v).WorldTransform, 0, _vehicles[i].getRightAxis()), - MathHelper.GetElement(_vehicles[i].getWheelInfo(v).WorldTransform, 1, _vehicles[i].getRightAxis()), - MathHelper.GetElement(_vehicles[i].getWheelInfo(v).WorldTransform, 2, _vehicles[i].getRightAxis())); - - - //m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_wheelAxleWS - //debug wheels (cylinders) - _debugDrawer.DrawLine(wheelPosWS, wheelPosWS + axle, wheelColor); - _debugDrawer.DrawLine(wheelPosWS, _vehicles[i].getWheelInfo(v).RaycastInfo.ContactPointWS, wheelColor); - } - } - } - } - - protected void SaveKinematicState(float timeStep) - { - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - if (body.ActivationState != ActivationState.IslandSleeping) - { - if (body.IsKinematicObject) - { - //to calculate velocities next frame - body.SaveKinematicState(timeStep); - } - } - } - } - } - - internal class InplaceSolverIslandCallback : SimulationIslandManager.IIslandCallback - { - private ContactSolverInfo _solverInfo; - private IConstraintSolver _solver; - private IDebugDraw _debugDrawer; - private List _sortedConstraints; - - public InplaceSolverIslandCallback( - ContactSolverInfo solverInfo, - IConstraintSolver solver, - List sortedConstraints, - IDebugDraw debugDrawer) - { - _solverInfo = solverInfo; - _solver = solver; - _sortedConstraints = sortedConstraints; - _debugDrawer = debugDrawer; - } - - public ContactSolverInfo SolverInfo { get { return _solverInfo; } set { _solverInfo = value; } } - public IConstraintSolver Solver { get { return _solver; } set { _solver = value; } } - public List Constraints { get { return _sortedConstraints; } set { _sortedConstraints = value; } } - public IDebugDraw DebugDrawer { get { return _debugDrawer; } set { _debugDrawer = value; } } - - public void ProcessIsland(List bodies, List manifolds, int numManifolds, int islandID) - { - //also add all non-contact constraints/joints for this island - List startConstraint = new List(); - int numCurConstraints = 0; - int startIndex = 0; - int i; - - //find the first constraint for this island - for (i = 0; i < _sortedConstraints.Count; i++) - { - if (TypedConstraint.GetConstraintIslandId(_sortedConstraints[i]) == islandID) - { - //startConstraint = &m_sortedConstraints[i]; - startIndex = i; - break; - } - } - //count the number of constraints in this island - for (; i < _sortedConstraints.Count; i++) - { - if (TypedConstraint.GetConstraintIslandId(_sortedConstraints[i]) == islandID) - { - numCurConstraints++; - } - } - - for (i = startIndex; i < startIndex + numCurConstraints; i++) - { - startConstraint.Add(_sortedConstraints[i]); - } - - _solver.SolveGroup(bodies, manifolds, numManifolds, startConstraint, _solverInfo, _debugDrawer); - } - } - } - - internal class DebugDrawCallback : ITriangleIndexCallback, ITriangleCallback - { - private IDebugDraw _debugDrawer; - private Vector3 _color; - private Matrix _worldTrans; - - public DebugDrawCallback(IDebugDraw debugDrawer, Matrix worldTrans, Vector3 color) - { - _debugDrawer = debugDrawer; - _worldTrans = worldTrans; - _color = color; - } - - public void ProcessTriangleIndex(Vector3[] triangle, int partId, int triangleIndex) - { - ProcessTriangle(triangle, partId, triangleIndex); - } - - #region ITriangleCallback Members - - public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex) - { - Vector3 wv0, wv1, wv2; - wv0 = Vector3.TransformNormal(triangle[0], _worldTrans); - wv1 = Vector3.TransformNormal(triangle[1], _worldTrans); - wv2 = Vector3.TransformNormal(triangle[2], _worldTrans); - _debugDrawer.DrawLine(wv0, wv1, _color); - _debugDrawer.DrawLine(wv1, wv2, _color); - _debugDrawer.DrawLine(wv2, wv0, _color); - } - - #endregion - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/DynamicsWorld.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/DynamicsWorld.cs deleted file mode 100644 index 34ae608285..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/DynamicsWorld.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public abstract class DynamicsWorld : CollisionWorld - { - public DynamicsWorld(IDispatcher dispatcher, OverlappingPairCache pairCache) - : base(dispatcher, pairCache) { } - - //once a rigidbody is added to the dynamics world, it will get this gravity assigned - //existing rigidbodies in the world get gravity assigned too, during this method - public abstract Vector3 Gravity { set; } - public abstract IConstraintSolver ConstraintSolver { set; } - public virtual int ConstraintsCount { get { return 0; } } - public abstract IDebugDraw DebugDrawer { get; set; } - - //stepSimulation proceeds the simulation over timeStep units - public abstract void StepSimulation(float timeStep, int numSubsteps, float fixedTimeStep); - - public void StepSimulation(float timeStep) - { - StepSimulation(timeStep, 1, 1f / 60f); - } - - public abstract void UpdateAabbs(); - - public virtual void AddConstraint(TypedConstraint constraint) { } - public virtual void RemoveConstraint(TypedConstraint constraint) { } - - public abstract void AddRigidBody(RigidBody body); - public abstract void RemoveRigidBody(RigidBody body); - - public virtual TypedConstraint GetConstraint(int index) { return null; } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/RigidBody.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/RigidBody.cs deleted file mode 100644 index 12a7485525..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/RigidBody.cs +++ /dev/null @@ -1,447 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public class RigidBody : CollisionObject - { - private static float _linearAirDamping = 1; - //'temporarily' global variables - private static float _rigidBodyDeactivationTime = 2; - private static bool _disableDeactivation = false; - - private static float _linearSleepingThreshold = 0.8f; - private static float _angularSleepingThreshold = 1.0f; - private static int _uniqueId = 0; - - private Matrix _invInertiaTensorWorld; - private Vector3 _linearVelocity; - private Vector3 _angularVelocity; - private float _inverseMass; - private float _angularFactor; - - private Vector3 _gravity; - private Vector3 _invInertiaLocal; - private Vector3 _totalForce; - private Vector3 _totalTorque; - - private float _linearDamping; - private float _angularDamping; - - //m_optionalMotionState allows to automatic synchronize the world transform for active objects - private MotionState _optionalMotionState; - - //for experimental overriding of friction/contact solver func - private ContactSolverType _contactSolverType; - private ContactSolverType _frictionSolverType; - - private int _debugBodyId; - - //Bullet 2.20b has experimental damping code to reduce jitter just before objects fall asleep/deactivate - //doesn't work very well yet (value 0 disabled this damping) - //note there this influences deactivation thresholds! - private float _clippedAngvelThresholdSqr = 0.01f; - private float _clippedLinearThresholdSqr = 0.01f; - - private float _jitterVelocityDampingFactor = 0.7f; - - public RigidBody(float mass, MotionState motionState, CollisionShape collisionShape, Vector3 localInertia, float linearDamping, float angularDamping, float friction, float restitution) - { - _optionalMotionState = motionState; - _angularFactor = 1; - _angularDamping = 0.5f; - - if (motionState != null) - { - motionState.GetWorldTransform(out _worldTransform); - } - else - { - WorldTransform = Matrix.Identity; - } - - InterpolationWorldTransform = WorldTransform; - InterpolationLinearVelocity = new Vector3(); - InterpolationAngularVelocity = new Vector3(); - - //moved to btCollisionObject - Friction = friction; - Restitution = restitution; - - CollisionShape = collisionShape; - _debugBodyId = UniqueID++; - - //m_internalOwner is to allow upcasting from collision object to rigid body - Owner = this; - - SetMassProps(mass, localInertia); - SetDamping(linearDamping, angularDamping); - UpdateInertiaTensor(); - } - - public int DebugBodyID { get { return _debugBodyId; } set { _debugBodyId = value; } } - - public ContactSolverType ContactSolverType { get { return _contactSolverType; } set { _contactSolverType = value; } } - public ContactSolverType FrictionSolverType { get { return _frictionSolverType; } set { _frictionSolverType = value; } } - - public float AngularFactor { get { return _angularFactor; } set { _angularFactor = value; } } - - //is this rigidbody added to a btCollisionWorld/btDynamicsWorld/btBroadphase? - public bool IsInWorld { get { return Broadphase != null; } } - - public Vector3 Gravity - { - get { return _gravity; } - set - { - if (_inverseMass != 0.0f) - { - _gravity = value * (1.0f / _inverseMass); - } - } - } - public Matrix InvInertiaTensorWorld { get { return _invInertiaTensorWorld; } } - public float InverseMass { get { return _inverseMass; } } - public Vector3 InvInertiaDiagLocal { get { return _invInertiaLocal; } set { _invInertiaLocal = value; } } - public Vector3 CenterOfMassPosition { get { return WorldTransform.Translation; } } - public Quaternion Orientation { get { return Quaternion.CreateFromRotationMatrix(WorldTransform); } } - public Matrix CenterOfMassTransform - { - get { return WorldTransform; } - set - { - InterpolationWorldTransform = value; - InterpolationLinearVelocity = LinearVelocity; - InterpolationAngularVelocity = AngularVelocity; - WorldTransform = value; - UpdateInertiaTensor(); - } - } - - public Vector3 LinearVelocity - { - get { return _linearVelocity; } - set - { - if (CollisionFlags == CollisionOptions.StaticObject) - throw new BulletException("Static objects can't have linear velocity!"); - _linearVelocity = value; - } - } - - public Vector3 AngularVelocity - { - get { return _angularVelocity; } - set - { - if (CollisionFlags == CollisionOptions.StaticObject) - throw new BulletException("Static objects can't have angular velocity!"); - _angularVelocity = value; - } - } - - //MotionState allows to automatic synchronize the world transform for active objects - public MotionState MotionState - { - get { return _optionalMotionState; } - set - { - _optionalMotionState = value; - if (_optionalMotionState != null) - value.GetWorldTransform(out _worldTransform); - } - } - - public static float LinearAirDamping { get { return _linearAirDamping; } set { _linearAirDamping = value; } } - public static float RigidBodyDeactivationTime { get { return _rigidBodyDeactivationTime; } set { _rigidBodyDeactivationTime = value; } } - public static bool DisableDeactivation { get { return _disableDeactivation; } set { _disableDeactivation = value; } } - public static float LinearSleepingThreshold { get { return _linearSleepingThreshold; } set { _linearSleepingThreshold = value; } } - public static float AngularSleepingThreshold { get { return _angularSleepingThreshold; } set { _angularSleepingThreshold = value; } } - public static int UniqueID { get { return _uniqueId; } set { _uniqueId = value; } } - - public void ProceedToTransform(Matrix newTrans) - { - CenterOfMassTransform = newTrans; - } - - //to keep collision detection and dynamics separate we don't store a rigidbody pointer - //but a rigidbody is derived from btCollisionObject, so we can safely perform an upcast - public static RigidBody Upcast(CollisionObject colObj) - { - return colObj.Owner as RigidBody; - } - - // continuous collision detection needs prediction - public void PredictIntegratedTransform(float step, ref Matrix predictedTransform) - { - if ((_angularVelocity.LengthSquared() < _clippedAngvelThresholdSqr) && - (_linearVelocity.LengthSquared() < _clippedLinearThresholdSqr)) - { - _angularVelocity *= _jitterVelocityDampingFactor; - _linearVelocity *= _jitterVelocityDampingFactor; - } - - TransformUtil.IntegrateTransform(WorldTransform, _linearVelocity, _angularVelocity, step, ref predictedTransform); - } - - public void SaveKinematicState(float step) - { - //todo: clamp to some (user definable) safe minimum timestep, to limit maximum angular/linear velocities - if (step != 0) - { - //if we use motionstate to synchronize world transforms, get the new kinematic/animated world transform - if (MotionState != null) - MotionState.GetWorldTransform(out _worldTransform); - - TransformUtil.CalculateVelocity(InterpolationWorldTransform, WorldTransform, step, ref _linearVelocity, ref _angularVelocity); - InterpolationLinearVelocity = _linearVelocity; - InterpolationAngularVelocity = _angularVelocity; - InterpolationWorldTransform = WorldTransform; - } - } - - public void ApplyForces(float step) - { - if (IsStaticOrKinematicObject) - return; - - ApplyCentralForce(_gravity); - - _linearVelocity *= (1 - step * LinearAirDamping * _linearDamping) < 0.0f ? 0.0f : (1.0f < (1 - step * LinearAirDamping * _linearDamping) ? 1.0f : (1 - step * LinearAirDamping * _linearDamping)); - _angularVelocity *= (1 - step * _angularDamping) < 0.0f ? 0.0f : (1.0f < (1 - step * _angularDamping) ? 1.0f : (1 - step * _angularDamping)); - - float speed = _linearVelocity.Length(); - if (speed < _linearDamping) - { - float dampVel = 0.005f; - if (speed > dampVel) - { - Vector3 dir = _linearVelocity; - dir.Normalize(); - _linearVelocity -= dir * dampVel; - } - else - { - _linearVelocity = new Vector3(); - } - } - - float angSpeed = _angularVelocity.Length(); - if (angSpeed < _angularDamping) - { - float angDampVel = 0.005f; - if (angSpeed > angDampVel) - { - Vector3 dir = _angularVelocity; - dir.Normalize(); - _angularVelocity -= dir * angDampVel; - } - else - { - _angularVelocity = new Vector3(); - } - } - } - - public void SetDamping(float linDamping, float angDamping) - { - _linearDamping = linDamping < 0.0f ? 0.0f : (1.0f < linDamping ? 1.0f : linDamping); - _angularDamping = angDamping < 0.0f ? 0.0f : (1.0f < angDamping ? 1.0f : angDamping); - } - - public void SetMassProps(float mass, Vector3 inertia) - { - if (mass == 0) - { - CollisionFlags |= CollisionOptions.StaticObject; - _inverseMass = 0; - } - else - { - CollisionFlags &= (~CollisionOptions.StaticObject); - _inverseMass = 1.0f / mass; - } - - _invInertiaLocal = new Vector3(inertia.X != 0.0f ? 1.0f / inertia.X : 0.0f, - inertia.Y != 0.0f ? 1.0f / inertia.Y : 0.0f, - inertia.Z != 0.0f ? 1.0f / inertia.Z : 0.0f); - } - - public void IntegrateVelocities(float step) - { - if (IsStaticOrKinematicObject) - return; - - _linearVelocity += _totalForce * (_inverseMass * step); - _angularVelocity += Vector3.TransformNormal(_totalTorque, _invInertiaTensorWorld) * step; - - //float MAX_ANGVEL = MonoXnaCompactMaths.MathHelper.PiOver2; - float MAX_ANGVEL = (float)Math.PI / 2.0f; - /// clamp angular velocity. collision calculations will fail on higher angular velocities - float angvel = _angularVelocity.Length(); - if (angvel * step > MAX_ANGVEL) - { - _angularVelocity *= (MAX_ANGVEL / step) / angvel; - } - - ClearForces(); - } - - public void ApplyCentralForce(Vector3 force) - { - _totalForce += force; - } - - public void ApplyTorque(Vector3 torque) - { - _totalTorque += torque; - } - - public void ApplyForce(Vector3 force, Vector3 rel_pos) - { - ApplyCentralForce(force); - ApplyTorque(Vector3.Cross(rel_pos, force)); - } - - public void ApplyCentralImpulse(Vector3 impulse) - { - _linearVelocity += impulse * _inverseMass; - } - - public void ApplyTorqueImpulse(Vector3 torque) - { - _angularVelocity += Vector3.TransformNormal(torque, _invInertiaTensorWorld); - } - - public void ApplyImpulse(Vector3 impulse, Vector3 rel_pos) - { - if (_inverseMass != 0) - { - ApplyCentralImpulse(impulse); - if (_angularFactor != 0) - ApplyTorqueImpulse(Vector3.Cross(rel_pos, impulse) * _angularFactor); - } - } - - public void InternalApplyImpulse(Vector3 linearComponent, Vector3 angularComponent, float impulseMagnitude) - { - if (_inverseMass != 0) - { - _linearVelocity += linearComponent * impulseMagnitude; - if (_angularFactor != 0) - _angularVelocity += angularComponent * impulseMagnitude * _angularFactor; - } - } - - public void ClearForces() - { - _totalForce = new Vector3(); - _totalTorque = new Vector3(); - } - - public void UpdateInertiaTensor() - { - Matrix temp = WorldTransform; - temp.Translation = Vector3.Zero; - _invInertiaTensorWorld = MatrixOperations.Multiply(MatrixOperations.Scaled(WorldTransform, _invInertiaLocal), Matrix.Transpose(temp)); - } - - public Vector3 GetVelocityInLocalPoint(Vector3 relPos) - { - //we also calculate lin/ang velocity for kinematic objects - return _linearVelocity + Vector3.Cross(_angularVelocity, relPos); - - //for kinematic objects, we could also use use: - // return (m_worldTransform(rel_pos) - m_interpolationWorldTransform(rel_pos)) / m_kinematicTimeStep; - } - - public void Translate(Vector3 v) - { - Matrix m = WorldTransform; - m.Translation += v; - WorldTransform = m; - } - - public void GetAabb(out Vector3 aabbMin, out Vector3 aabbMax) - { - CollisionShape.GetAabb(WorldTransform, out aabbMin, out aabbMax); - } - - public float ComputeImpulseDenominator(Vector3 pos, Vector3 normal) - { - Vector3 r0 = pos - CenterOfMassPosition; - Vector3 c0 = Vector3.Cross(r0, normal); - Vector3 vec = Vector3.Cross(Vector3.TransformNormal(c0, InvInertiaTensorWorld), r0); - - return _inverseMass + Vector3.Dot(normal, vec); - - } - - public float ComputeAngularImpulseDenominator(Vector3 axis) - { - Vector3 vec = Vector3.TransformNormal(axis, InvInertiaTensorWorld); - return Vector3.Dot(axis, vec); - } - - public void UpdateDeactivation(float timeStep) - { - if ((ActivationState == ActivationState.IslandSleeping) || (ActivationState == ActivationState.DisableDeactivation)) - return; - - if ((LinearVelocity.LengthSquared() < LinearSleepingThreshold * LinearSleepingThreshold) && - (AngularVelocity.LengthSquared() < AngularSleepingThreshold * AngularSleepingThreshold)) - { - DeactivationTime += timeStep; - } - else - { - DeactivationTime = 0; - ActivationState = ActivationState.Nothing; - } - - } - - public bool WantsSleeping() - { - - if (ActivationState == ActivationState.DisableDeactivation) - return false; - - //disable deactivation - if (DisableDeactivation || (RigidBodyDeactivationTime == 0)) - return false; - - if ((ActivationState == ActivationState.IslandSleeping) || (ActivationState == ActivationState.WantsDeactivation)) - return true; - - if (DeactivationTime > RigidBodyDeactivationTime) - { - return true; - } - return false; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/SimpleDynamicsWorld.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/SimpleDynamicsWorld.cs deleted file mode 100644 index 3430a734b2..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/SimpleDynamicsWorld.cs +++ /dev/null @@ -1,211 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public class SimpleDynamicsWorld : DynamicsWorld - { - private IConstraintSolver _constraintSolver; - private bool _ownsConstraintSolver; - private Vector3 _gravity; - private IDebugDraw _debugDrawer; - - /// - /// this btSimpleDynamicsWorld constructor creates dispatcher, broadphase pairCache and constraintSolver - /// - /// - /// - /// - public SimpleDynamicsWorld(IDispatcher dispatcher, OverlappingPairCache pairCache, IConstraintSolver constraintSolver) - : base(dispatcher, pairCache) - { - _constraintSolver = constraintSolver; - _ownsConstraintSolver = false; - _gravity = new Vector3(0, 0, -10); - } - - public override Vector3 Gravity - { - set - { - _gravity = value; - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - body.Gravity = value; - } - } - } - } - - public override IConstraintSolver ConstraintSolver - { - set - { - _ownsConstraintSolver = false; - _constraintSolver = value; - } - } - - public override IDebugDraw DebugDrawer - { - get - { - return _debugDrawer; - } - set - { - _debugDrawer = value; - } - } - - public override void StepSimulation(float timeStep, int numSubsteps, float fixedTimeStep) - { - //apply gravity, predict motion - PredictUnconstraintMotion(timeStep); - - DispatcherInfo dispatchInfo = new DispatcherInfo(); - dispatchInfo.TimeStep = timeStep; - dispatchInfo.StepCount = 0; - dispatchInfo.DebugDraw = DebugDrawer; - //perform collision detection - PerformDiscreteCollisionDetection(); - - //solve contact constraints - int numManifolds = Dispatcher.ManifoldCount; - if (numManifolds != 0) - { - - List manifolds = (Dispatcher as CollisionDispatcher).Manifolds; - //int numManifolds = m_dispatcher1.GetNumManifolds(); - ContactSolverInfo infoGlobal = new ContactSolverInfo(); - infoGlobal.TimeStep = timeStep; - - _constraintSolver.SolveGroup(new List(), manifolds, manifolds.Count, new List(), infoGlobal, _debugDrawer); - } - //integrate transforms - IntegrateTransforms(timeStep); - - UpdateAabbs(); - - SynchronizeMotionStates(); - } - - public override void UpdateAabbs() - { - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - if (body.IsActive && (!body.IsStaticObject)) - { - Vector3 minAabb, maxAabb; - colObj.CollisionShape.GetAabb(colObj.WorldTransform, out minAabb, out maxAabb); - IBroadphase bp = Broadphase; - bp.SetAabb(body.Broadphase, minAabb, maxAabb); - } - } - } - } - - public override void AddRigidBody(RigidBody body) - { - body.Gravity = _gravity; - - if (body.CollisionShape != null) - { - AddCollisionObject(body); - } - } - - public override void RemoveRigidBody(RigidBody body) - { - RemoveCollisionObject(body); - } - - public void SynchronizeMotionStates() - { - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null && body.MotionState != null) - { - if (body.ActivationState != ActivationState.IslandSleeping) - { - body.MotionState.SetWorldTransform(body.WorldTransform); - } - } - } - } - - protected void PredictUnconstraintMotion(float timeStep) - { - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - if (!body.IsStaticObject) - { - if (body.IsActive) - { - body.ApplyForces(timeStep); - body.IntegrateVelocities(timeStep); - Matrix temp = body.InterpolationWorldTransform; - body.PredictIntegratedTransform(timeStep, ref temp); - body.InterpolationWorldTransform = temp; - } - } - } - } - } - - protected void IntegrateTransforms(float timeStep) - { - Matrix predictedTrans = Matrix.Identity; - for (int i = 0; i < CollisionObjects.Count; i++) - { - CollisionObject colObj = CollisionObjects[i]; - RigidBody body = RigidBody.Upcast(colObj); - if (body != null) - { - if (body.IsActive && (!body.IsStaticObject)) - { - body.PredictIntegratedTransform(timeStep, ref predictedTrans); - body.ProceedToTransform(predictedTrans); - } - } - } - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/RaycastVehicle.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/RaycastVehicle.cs deleted file mode 100644 index 4e0e64bc85..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/RaycastVehicle.cs +++ /dev/null @@ -1,94 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public class RaycastVehicle : TypedConstraint - { - public override void BuildJacobian() - { - throw new Exception("The method or operation is not implemented."); - } - - public override void SolveConstraint(float timeStep) - { - throw new Exception("The method or operation is not implemented."); - } - - public int getNumWheels() - { - throw new Exception("The method or operation is not implemented."); - } - - public WheelInfo getWheelInfo(int v) - { - throw new Exception("The method or operation is not implemented."); - } - - public void updateWheelTransform(int v, bool p) - { - throw new Exception("The method or operation is not implemented."); - } - - public int getRightAxis() - { - throw new Exception("The method or operation is not implemented."); - } - - public void updateVehicle(float timeStep) - { - throw new Exception("The method or operation is not implemented."); - } - } - - public class DefaultVehicleRaycaster : IVehicleRaycaster - { - DynamicsWorld _dynamicsWorld; - - public DefaultVehicleRaycaster(DynamicsWorld world) - { - _dynamicsWorld = world; - } - - public object CastRay(Vector3 from, Vector3 to, out VehicleRaycasterResult result) - { - CollisionWorld.ClosestRayResultCallback rayCallback = new CollisionWorld.ClosestRayResultCallback(from, to); - _dynamicsWorld.RayTest(from, to, rayCallback); - - result = new VehicleRaycasterResult(); - - if (!rayCallback.HasHit) return 0; - RigidBody body = RigidBody.Upcast(rayCallback.CollisionObject); - if (body == null) return 0; - - result.HitPointInWorld = rayCallback.HitPointWorld; - result.HitNormalInWorld = rayCallback.HitNormalWorld; - result.HitNormalInWorld.Normalize(); - result.DistFraction = rayCallback.ClosestHitFraction; - return body; - } - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/VehicleRaycaster.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/VehicleRaycaster.cs deleted file mode 100644 index 14c13c69f7..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/VehicleRaycaster.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public interface IVehicleRaycaster - { - object CastRay(Vector3 from, Vector3 to, out VehicleRaycasterResult result); - } - - public class VehicleRaycasterResult - { - private Single _distFraction; - private Vector3 _hitNormalInWorld; - private Vector3 _hitPointInWorld; - - public VehicleRaycasterResult() - { - _distFraction = -1; - } - - public float DistFraction { get { return _distFraction; } set { _distFraction = value; } } - public Vector3 HitNormalInWorld { get { return _hitNormalInWorld; } set { _hitNormalInWorld = value; } } - public Vector3 HitPointInWorld { get { return _hitPointInWorld; } set { _hitPointInWorld = value; } } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/WheelInfo.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/WheelInfo.cs deleted file mode 100644 index 516e455b20..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Dynamics/Vehicle/WheelInfo.cs +++ /dev/null @@ -1,529 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX.Dynamics -{ - public struct WheelInfoConstructionInfo - { - private Vector3 _chassicConnectionCS; - private Vector3 _wheelDirectionCS; - private Vector3 _wheelAxisCS; - - private Single _suspensionRestLength; - private Single _maxSuspensionTravelCm; - private Single _wheelRadius; - private Single _suspensionStiffness; - private Single _wheelsDampingCompression; - private Single _wheelsDampingRelaxation; - private Single _frictionSlip; - - private Boolean _isFrontWheel; - - #region Basic Properties - public Vector3 ChassicConnectionCS - { - get { return _chassicConnectionCS; } - set { _chassicConnectionCS = value; } - } - - public Vector3 WheelDirectionCS - { - get { return _wheelDirectionCS; } - set { _wheelDirectionCS = value; } - } - - public Vector3 WheelAxleCS - { - get { return _wheelAxisCS; } - set { _wheelAxisCS = value; } - } - - - public Single SuspensionRestLength - { - get { return _suspensionRestLength; } - set { _suspensionRestLength = value; } - } - - public Single MaxSuspensionTravelCm - { - get { return _maxSuspensionTravelCm; } - set { _maxSuspensionTravelCm = value; } - } - - public Single WheelRadius - { - get { return _wheelRadius; } - set { _wheelRadius = value; } - } - - - public Single SuspensionStiffness - { - get { return _suspensionStiffness; } - set { _suspensionStiffness = value; } - } - - public Single WheelsDampingCompression - { - get { return _wheelsDampingCompression; } - set { _wheelsDampingCompression = value; } - } - - public Single WheelsDampingRelaxation - { - get { return _wheelsDampingRelaxation; } - set { _wheelsDampingRelaxation = value; } - } - - public Single FrictionSlip - { - get { return _frictionSlip; } - set { _frictionSlip = value; } - } - - - public Boolean IsFrontWheel - { - get { return _isFrontWheel; } - set { _isFrontWheel = value; } - } - #endregion - } - - public struct RaycastInfo - { - private Vector3 _contractNormalWS; - private Vector3 _contractPointWS; - - private Vector3 _hardPointWS; - private Vector3 _wheelDirectionWS; - private Vector3 _wheelAxleWS; - - private Single _suspensionLength; - private Boolean _isInContract; - - #region Basic Properties - public Single SuspensionLength - { - get { return _suspensionLength; } - set { _suspensionLength = value; } - } - - public Boolean IsInContact - { - get { return _isInContract; } - set { _isInContract = value; } - } - - public Vector3 ContactNormalWS - { - get { return _contractNormalWS; } - set { _contractNormalWS = value; } - } - - public Vector3 ContactPointWS - { - get { return _contractPointWS; } - set { _contractPointWS = value; } - } - - public Vector3 HardPointWS - { - get { return _hardPointWS; } - set { _hardPointWS = value; } - } - - public Vector3 WheelDirectionWS - { - get { return _wheelDirectionWS; } - set { _wheelDirectionWS = value; } - } - - public Vector3 WheelAxleWS - { - get { return _wheelAxleWS; } - set { _wheelAxleWS = value; } - } - #endregion - } - - public struct WheelInfo - { - private RaycastInfo _raycastInfo; - - private Matrix _worldTransform; - - private Vector3 _chassicConnectionPointCS; - private Vector3 _wheelDirectionCS; - private Vector3 _wheelAxleCS; - - private Single _suspensionRestLength; - private Single _maxSuspensionTravelCm; - - private Single _wheelsRadius; - private Single _rollInfluence; - private Single _suspensionStiffness; - private Single _wheelsDampingCompression; - private Single _wheelsDampingRelaxation; - private Single _frictionSlip; - private Single _steering; - private Single _rotation; - private Single _deltaRotation; - - private Single _engineForce; - private Single _brake; - private Boolean _isFrontWheel; - - - private Single _clippedInvContactDotSuspension; - private Single _skidInfo; - private Single _wheelsSuspensionForce; - private Single _suspensionRelativeVelocity; - //can be used to store pointer to sync transforms... - private object _clientInfo; - - #region Constructor - public WheelInfo(WheelInfoConstructionInfo constructionInfo) - { - _suspensionRestLength = constructionInfo.SuspensionRestLength; - _maxSuspensionTravelCm = constructionInfo.MaxSuspensionTravelCm; - - _wheelsRadius = constructionInfo.WheelRadius; - _wheelsDampingCompression = constructionInfo.WheelsDampingCompression; - _wheelsDampingRelaxation = constructionInfo.WheelsDampingRelaxation; - _wheelDirectionCS = constructionInfo.WheelDirectionCS; - - _suspensionStiffness = constructionInfo.SuspensionStiffness; - _chassicConnectionPointCS = constructionInfo.ChassicConnectionCS; - - _wheelAxleCS = constructionInfo.WheelAxleCS; - _frictionSlip = constructionInfo.FrictionSlip; - - _clippedInvContactDotSuspension = 0; - _suspensionRelativeVelocity = 0; - _wheelsSuspensionForce = 0; - _skidInfo = 0; - - _steering = 0; - _engineForce = 0; - _rotation = 0; - _rotation = 0; - _deltaRotation = 0; - _brake = 0; - _rollInfluence = 0.1f; - _brake = 0; - _rollInfluence = 0.1f; - - _isFrontWheel = constructionInfo.IsFrontWheel; - - _raycastInfo = default(RaycastInfo); - _worldTransform = default(Matrix); - _clientInfo = null; - } - #endregion - - #region BasicProperties - public object ClientInfo { get { return _clientInfo; } set { _clientInfo = value; } } - - public RaycastInfo RaycastInfo - { - get { return _raycastInfo; } - set { _raycastInfo = value; } - } - - public Matrix WorldTransform - { - get { return _worldTransform; } - set { _worldTransform = value; } - } - - public Vector3 ChassicConnectionPointCS - { - get { return _chassicConnectionPointCS; } - set { _chassicConnectionPointCS = value; } - } - public Vector3 WheelDirectionCS - { - get { return _wheelDirectionCS; } - set { _wheelDirectionCS = value; } - } - public Vector3 WheelAxleCS - { - get { return _wheelAxleCS; } - set { _wheelAxleCS = value; } - } - - public Single SuspensionRestLength - { - get { return _suspensionRestLength; } - set { _suspensionRestLength = value; } - } - - - public Single MaxSuspensionTravelCm - { - get { return _maxSuspensionTravelCm; } - set { _maxSuspensionTravelCm = value; } - } - - public Single WheelsRadius - { - get { return _wheelsRadius; } - set { _wheelsRadius = value; } - } - - public Single SuspensionStiffness - { - get { return _suspensionStiffness; } - set { _suspensionStiffness = value; } - } - - public Single WheelsDampingCompression - { - get { return _wheelsDampingCompression; } - set { _wheelsDampingCompression = value; } - } - - public Single WheelsDampingRelaxation - { - get { return _wheelsDampingRelaxation; } - set { _wheelsDampingRelaxation = value; } - } - - public Single FrictionSlip - { - get { return _frictionSlip; } - set { _frictionSlip = value; } - } - - public Single Steering - { - get { return _steering; } - set { _steering = value; } - } - - public Single Rotation - { - get { return _rotation; } - set { _rotation = value; } - } - - public Single DeltaRotation - { - get { return _deltaRotation; } - set { _deltaRotation = value; } - } - - public Single RollInfluence - { - get { return _rollInfluence; } - set { _rollInfluence = value; } - } - - public Single EngineForce - { - get { return _engineForce; } - set { _engineForce = value; } - } - - public Single Brake - { - get { return _brake; } - set { _brake = value; } - } - - public Boolean IsFrontWheel - { - get { return _isFrontWheel; } - set { _isFrontWheel = value; } - } - - public Single ClippedInvContactDotSuspension - { - get { return _clippedInvContactDotSuspension; } - set { _clippedInvContactDotSuspension = value; } - } - - public Single SuspensionRelativeVelocity - { - get { return _suspensionRelativeVelocity; } - set { _suspensionRelativeVelocity = value; } - } - - public Single WheelsSuspensionForce - { - get { return _wheelsSuspensionForce; } - set { _wheelsSuspensionForce = value; } - } - - public Single SkidInfo - { - get { return _skidInfo; } - set { _skidInfo = value; } - } - #endregion - - /// - /// - /// - /// - /// Not used! - public void UpdateWheel(RigidBody chassis, RaycastInfo paramRaycastInfo) - { - if (_raycastInfo.IsInContact) - { - float project = Vector3.Dot(_raycastInfo.ContactNormalWS, _raycastInfo.WheelDirectionWS); - - Vector3 chassisVelocityAtContactPoint = new Vector3(); - Vector3 relpos = _raycastInfo.ContactPointWS - chassis.CenterOfMassPosition; - chassisVelocityAtContactPoint = chassis.GetVelocityInLocalPoint(relpos); - float projVel = Vector3.Dot(_raycastInfo.ContactNormalWS, chassisVelocityAtContactPoint); - - if (project >= -0.1f) - { - _suspensionRelativeVelocity = 0; - _clippedInvContactDotSuspension = 1.0f / 0.1f; - } - else - { - float inv = -1 / project; - _suspensionRelativeVelocity = projVel * inv; - _clippedInvContactDotSuspension = inv; - } - } - else - { - _raycastInfo.SuspensionLength = _suspensionRestLength; - _suspensionRelativeVelocity = 0.0f; - _raycastInfo.ContactNormalWS = -_raycastInfo.WheelDirectionWS; - _clippedInvContactDotSuspension = 1.0f; - } - } - - // if (m_raycastInfo.m_isInContact) - - //{ - // btScalar project= m_raycastInfo.m_contactNormalWS.dot( m_raycastInfo.m_wheelDirectionWS ); - // btVector3 chassis_velocity_at_contactPoint; - // btVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition(); - // chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint( relpos ); - // btScalar projVel = m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint ); - // if ( project >= -0.1f) - // { - // m_suspensionRelativeVelocity = 0.0f; - // m_clippedInvContactDotSuspension = 1.0f / 0.1f; - // } - // else - // { - // btScalar inv = -1.f / project; - // m_suspensionRelativeVelocity = projVel * inv; - // m_clippedInvContactDotSuspension = inv; - // } - - //} - - //else // Not in contact : position wheel in a nice (rest length) position - //{ - // m_raycastInfo.m_suspensionLength = this->getSuspensionRestLength(); - // m_suspensionRelativeVelocity = 0.0f; - // m_raycastInfo.m_contactNormalWS = -m_raycastInfo.m_wheelDirectionWS; - // m_clippedInvContactDotSuspension = 1.0f; - //} - }; - - //btScalar m_clippedInvContactDotSuspension; - //btScalar m_suspensionRelativeVelocity; - //btScalar m_wheelsSuspensionForce; - //btScalar m_skidInfo; - - //void* m_clientInfo;//can be used to store pointer to sync transforms... - - //btWheelInfo(btWheelInfoConstructionInfo& ci) - - //{ - - // m_suspensionRestLength1 = ci.m_suspensionRestLength; - // m_maxSuspensionTravelCm = ci.m_maxSuspensionTravelCm; - - // m_wheelsRadius = ci.m_wheelRadius; - // m_suspensionStiffness = ci.m_suspensionStiffness; - // m_wheelsDampingCompression = ci.m_wheelsDampingCompression; - // m_wheelsDampingRelaxation = ci.m_wheelsDampingRelaxation; - // m_chassisConnectionPointCS = ci.m_chassisConnectionCS; - // m_wheelDirectionCS = ci.m_wheelDirectionCS; - // m_wheelAxleCS = ci.m_wheelAxleCS; - // m_frictionSlip = ci.m_frictionSlip; - // m_steering = 0.f; - // m_engineForce = 0.f; - // m_rotation = 0.f; - // m_deltaRotation = 0.f; - // m_brake = 0.f; - // m_rollInfluence = 0.1f; - // m_bIsFrontWheel = ci.m_bIsFrontWheel; - - //} - - //void updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInfo); - - //btScalar m_clippedInvContactDotSuspension; - //btScalar m_suspensionRelativeVelocity; - ////calculated by suspension - //btScalar m_wheelsSuspensionForce; - //btScalar m_skidInfo; - - //}; - - //struct RaycastInfo - //{ - // //set by raycaster - // btVector3 m_contactNormalWS;//contactnormal - // btVector3 m_contactPointWS;//raycast hitpoint - // btScalar m_suspensionLength; - // btVector3 m_hardPointWS;//raycast starting point - // btVector3 m_wheelDirectionWS; //direction in worldspace - // btVector3 m_wheelAxleWS; // axle in worldspace - // bool m_isInContact; - // void* m_groundObject; //could be general void* ptr - //}; - - //struct btWheelInfoConstructionInfo - //{ - // btVector3 m_chassisConnectionCS; - // btVector3 m_wheelDirectionCS; - // btVector3 m_wheelAxleCS; - // btScalar m_suspensionRestLength; - // btScalar m_maxSuspensionTravelCm; - // btScalar m_wheelRadius; - - // float m_suspensionStiffness; - // float m_wheelsDampingCompression; - // float m_wheelsDampingRelaxation; - // float m_frictionSlip; - // bool m_bIsFrontWheel; - - //}; -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Exceptions/BulletException.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Exceptions/BulletException.cs deleted file mode 100644 index 3ae3ad665f..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Exceptions/BulletException.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.Serialization; - -namespace XnaDevRu.BulletX -{ - public class BulletException : Exception - { - internal BulletException() - : base("Bullet Physics Library has thrown an exception.") - { - } - - internal BulletException(string message) - : base(message) - { - } - - internal BulletException(string message, Exception innerException) - : base(message, innerException) - { - } - -#if !XBOX - internal BulletException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } -#endif - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/IDebugDraw.cs b/libraries/ModifiedBulletX/ModifiedBulletX/IDebugDraw.cs deleted file mode 100644 index 5af979c158..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/IDebugDraw.cs +++ /dev/null @@ -1,60 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public enum DebugDrawModes - { - NoDebug = 0, - DrawWireframe = 1, - DrawAabb = 2, - DrawFeaturesText = 4, - DrawContactPoints = 8, - NoDeactivation = 16, - NoHelpText = 32, - DrawText = 64, - ProfileTimings = 128, - EnableSatComparison = 256, - DisableBulletLcp = 512, - EnableCcd = 1024, - MaxDebugDrawMode - } - - public interface IDebugDraw - { - void DrawLine(Vector3 from, Vector3 to, Vector3 color); - - void DrawContactPoint( - Vector3 pointOnB, - Vector3 normalOnB, - float distance, - int lifeTime, - Vector3 color - ); - - DebugDrawModes DebugMode { get; set; } - } -} \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/DefaultMotionState.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/DefaultMotionState.cs deleted file mode 100644 index 73dc67525e..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/DefaultMotionState.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - // DefaultMotionState provides a common implementation to synchronize world transforms with offsets - public class DefaultMotionState : MotionState - { - private Matrix _graphicsWorldTransform; - private Matrix _centerOfMassOffset; - private Matrix _startWorldTransform; - private object _userData; - - public DefaultMotionState() - : this(Matrix.Identity, Matrix.Identity) { } - - public DefaultMotionState(Matrix startTransform, Matrix centerOfMassOffset) - { - _graphicsWorldTransform = startTransform; - _centerOfMassOffset = centerOfMassOffset; - _startWorldTransform = startTransform; - } - - public Matrix GraphicsWorldTransform { get { return _graphicsWorldTransform; } set { _graphicsWorldTransform = value; } } - public Matrix CenterOfMassOffset { get { return _centerOfMassOffset; } set { _centerOfMassOffset = value; } } - public Matrix StartWorldTransform { get { return _startWorldTransform; } set { _startWorldTransform = value; } } - public object UserData { get { return _userData; } set { _userData = value; } } - - // synchronizes world transform from user to physics - public override void GetWorldTransform(out Matrix centerOfMassWorldTrans) - { - centerOfMassWorldTrans = MathHelper.InvertMatrix(_centerOfMassOffset) * _graphicsWorldTransform; - } - - // synchronizes world transform from physics to user - // Bullet only calls the update of worldtransform for active objects - public override void SetWorldTransform(Matrix centerOfMassWorldTrans) - { - _graphicsWorldTransform = MatrixOperations.Multiply(centerOfMassWorldTrans, _centerOfMassOffset); - _graphicsWorldTransform.Translation = centerOfMassWorldTrans.Translation; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MathHelper.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MathHelper.cs deleted file mode 100644 index 15c7bb849c..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MathHelper.cs +++ /dev/null @@ -1,581 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public static class MathHelper - { - internal const float Sqrt12 = 0.7071067811865475244008443621048490f; - internal const float Infinity = 3.402823466e+38f; - internal const float Epsilon = 1.192092896e-07f; - - public static Vector3 MatrixToVector(Matrix m, Vector3 v) - { - return new Vector3( - Vector3.Dot(new Vector3(m.M11, m.M12, m.M13), v) + m.Translation.X, - Vector3.Dot(new Vector3(m.M21, m.M22, m.M23), v) + m.Translation.Y, - Vector3.Dot(new Vector3(m.M31, m.M32, m.M33), v) + m.Translation.Z - ); - } - - internal static int ClosestAxis(Vector4 v) - { - return MaxAxis(Absolute(v)); - } - - internal static Vector4 Absolute(Vector4 v) - { - return new Vector4(Math.Abs(v.X), Math.Abs(v.Y), Math.Abs(v.Z), Math.Abs(v.W)); - } - - internal static int MaxAxis(Vector4 v) - { - int maxIndex = -1; - float maxVal = float.MinValue; - if (v.X > maxVal) - { - maxIndex = 0; - maxVal = v.X; - } - if (v.Y > maxVal) - { - maxIndex = 1; - maxVal = v.Y; - } - if (v.Z > maxVal) - { - maxIndex = 2; - maxVal = v.Z; - } - if (v.W > maxVal) - { - maxIndex = 3; - maxVal = v.W; - } - - return maxIndex; - } - - internal static int MaxAxis(Vector3 v) - { - return v.X < v.Y ? (v.Y < v.Z ? 2 : 1) : (v.X < v.Z ? 2 : 0); - } - - // conservative test for overlap between two aabbs - internal static bool TestAabbAgainstAabb2(Vector3 aabbMinA, Vector3 aabbMaxA, Vector3 aabbMinB, Vector3 aabbMaxB) - { - bool overlap = true; - overlap = (aabbMinA.X > aabbMaxB.X || aabbMaxA.X < aabbMinB.X) ? false : overlap; - overlap = (aabbMinA.Z > aabbMaxB.Z || aabbMaxA.Z < aabbMinB.Z) ? false : overlap; - overlap = (aabbMinA.Y > aabbMaxB.Y || aabbMaxA.Y < aabbMinB.Y) ? false : overlap; - return overlap; - } - - internal static bool TestTriangleAgainstAabb2(Vector3[] vertices, Vector3 aabbMin, Vector3 aabbMax) - { - Vector3 p1 = vertices[0]; - Vector3 p2 = vertices[1]; - Vector3 p3 = vertices[2]; - - if (Math.Min(Math.Min(p1.X, p2.X), p3.X) > aabbMax.X) return false; - if (Math.Max(Math.Max(p1.X, p2.X), p3.X) < aabbMin.X) return false; - - if (Math.Min(Math.Min(p1.Z, p2.Z), p3.Z) > aabbMax.Z) return false; - if (Math.Max(Math.Max(p1.Z, p2.Z), p3.Z) < aabbMin.Z) return false; - - if (Math.Min(Math.Min(p1.Y, p2.Y), p3.Y) > aabbMax.Y) return false; - if (Math.Max(Math.Max(p1.Y, p2.Y), p3.Y) < aabbMin.Y) return false; - return true; - } - - internal static void SetInterpolate3(Vector3 vA, Vector3 vB, float rt, ref Vector3 interpolated) - { - float s = 1.0f - rt; - interpolated.X = s * vA.X + rt * vB.X; - interpolated.Y = s * vA.Y + rt * vB.Y; - interpolated.Z = s * vA.Z + rt * vB.Z; - } - - internal static void PlaneSpace1(Vector3 n, ref Vector3 p, ref Vector3 q) - { - if (Math.Abs(n.Z) > Sqrt12) - { - // choose p in y-z plane - float a = n.Y * n.Y + n.Z * n.Z; - float k = 1f / (float)Math.Sqrt(a); - p.X = 0; - p.Y = -n.Z * k; - p.Z = n.Y * k; - // set q = n x p - q.X = a * k; - q.Y = -n.X * p.Z; - q.Z = n.X * p.Y; - } - else - { - // choose p in x-y plane - float a = n.X * n.X + n.Y * n.Y; - float k = 1f / (float)Math.Sqrt(a); - p.X = -n.Y * k; - p.Y = n.X * k; - p.Z = 0; - // set q = n x p - q.X = -n.Z * p.Y; - q.Y = n.Z * p.X; - q.Z = a * k; - } - } - - internal static bool RayAabb(Vector3 rayFrom, - Vector3 rayTo, - Vector3 aabbMin, - Vector3 aabbMax, - float param, Vector3 normal) - { - Vector3 aabbHalfExtent = (aabbMax - aabbMin) * 0.5f; - Vector3 aabbCenter = (aabbMax + aabbMin) * 0.5f; - Vector3 source = rayFrom - aabbCenter; - Vector3 target = rayTo - aabbCenter; - int sourceOutcode = Outcode(source, aabbHalfExtent); - int targetOutcode = Outcode(target, aabbHalfExtent); - if ((sourceOutcode & targetOutcode) == 0x0) - { - float lambda_enter = 0; - float lambda_exit = param; - Vector3 r = target - source; - float normSign = 1; - Vector3 hitNormal = new Vector3(); - int bit = 1; - - for (int j = 0; j < 2; j++) - { - { - if ((sourceOutcode & bit) != 0) - { - float lambda = (-source.X - aabbHalfExtent.X * normSign) / r.X; - if (lambda_enter <= lambda) - { - lambda_enter = lambda; - hitNormal = new Vector3(); - hitNormal.X = normSign; - } - } - else if ((targetOutcode & bit) != 0) - { - float lambda = (-source.X - aabbHalfExtent.X * normSign) / r.X; - SetMin(ref lambda_exit, lambda); - } - bit <<= 1; - } - { - if ((sourceOutcode & bit) != 0) - { - float lambda = (-source.Y - aabbHalfExtent.Y * normSign) / r.Y; - if (lambda_enter <= lambda) - { - lambda_enter = lambda; - hitNormal = new Vector3(); - hitNormal.Y = normSign; - } - } - else if ((targetOutcode & bit) != 0) - { - float lambda = (-source.Y - aabbHalfExtent.Y * normSign) / r.Y; - SetMin(ref lambda_exit, lambda); - } - bit <<= 1; - } - { - if ((sourceOutcode & bit) != 0) - { - float lambda = (-source.Z - aabbHalfExtent.Z * normSign) / r.Z; - if (lambda_enter <= lambda) - { - lambda_enter = lambda; - hitNormal = new Vector3(); - hitNormal.Z = normSign; - } - } - else if ((targetOutcode & bit) != 0) - { - float lambda = (-source.Z - aabbHalfExtent.Z * normSign) / r.Z; - SetMin(ref lambda_exit, lambda); - } - bit <<= 1; - } - normSign = -1; - } - if (lambda_enter <= lambda_exit) - { - param = lambda_enter; - normal = hitNormal; - return true; - } - } - return false; - } - - internal static void SetMin(ref float a, float b) - { - if (a > b) - a = b; - } - - internal static void SetMax(ref float a, float b) - { - if (a < b) - a = b; - } - - internal static void SetMax(ref Vector3 self, Vector3 other) - { - if (other.X > self.X) - self.X = other.X; - - if (other.Y > self.Y) - self.Y = other.Y; - - if (other.Z > self.Z) - self.Z = other.Z; - } - - internal static Vector3 SetMax(Vector3 self, Vector3 other) - { - if (other.X > self.X) - self.X = other.X; - - if (other.Y > self.Y) - self.Y = other.Y; - - if (other.Z > self.Z) - self.Z = other.Z; - - return self; - } - - internal static void SetMin(ref Vector3 self, Vector3 other) - { - if (other.X < self.X) - self.X = other.X; - - if (other.Y < self.Y) - self.Y = other.Y; - - if (other.Z < self.Z) - self.Z = other.Z; - } - - internal static Vector3 SetMin(Vector3 self, Vector3 other) - { - if (other.X < self.X) - self.X = other.X; - - if (other.Y < self.Y) - self.Y = other.Y; - - if (other.Z < self.Z) - self.Z = other.Z; - - return self; - } - - internal static int Outcode(Vector3 p, Vector3 halfExtent) - { - return (p.X < -halfExtent.X ? 0x01 : 0x0) | - (p.X > halfExtent.X ? 0x08 : 0x0) | - (p.Y < -halfExtent.Y ? 0x02 : 0x0) | - (p.Y > halfExtent.Y ? 0x10 : 0x0) | - (p.Z < -halfExtent.Z ? 0x4 : 0x0) | - (p.Z > halfExtent.Z ? 0x20 : 0x0); - } - - internal static Matrix Absolute(Matrix m) - { - return new Matrix(Math.Abs(m.M11), Math.Abs(m.M12), Math.Abs(m.M13), Math.Abs(m.M14), - Math.Abs(m.M21), Math.Abs(m.M22), Math.Abs(m.M23), Math.Abs(m.M24), - Math.Abs(m.M31), Math.Abs(m.M32), Math.Abs(m.M33), Math.Abs(m.M34), - Math.Abs(m.M41), Math.Abs(m.M42), Math.Abs(m.M43), Math.Abs(m.M44)); - } - - internal static void SetValueByIndex(ref Vector3 v, int i, float value) - { - if (i == 0) - v.X = value; - else if (i == 1) - v.Y = value; - else - v.Z = value; - } - - internal static float GetValueByIndex(Vector3 v, int i) - { - if (i == 0) - return v.X; - else if (i == 1) - return v.Y; - else - return v.Z; - } - - internal static Vector3 InvXForm(Matrix m, Vector3 v) - { - v -= m.Translation; - m.Translation = new Vector3(); - return MathHelper.Transform(v, Matrix.Transpose(m)); - } - - internal static Matrix InverseTimes(Matrix m, Matrix t) - { - Vector3 v = t.Translation - m.Translation; - - Matrix mat = TransposeTimes(m, t); - mat.Translation = Vector3.Transform(v, m); - return mat; - } - - internal static Matrix TransposeTimes(Matrix mA, Matrix mB) - { - return new Matrix( - mA.M11 * mB.M11 + mA.M21 * mB.M21 + mA.M31 * mB.M31, - mA.M11 * mB.M12 + mA.M21 * mB.M22 + mA.M31 * mB.M32, - mA.M11 * mB.M13 + mA.M21 * mB.M23 + mA.M31 * mB.M33, - 0, - mA.M12 * mB.M11 + mA.M22 * mB.M21 + mA.M32 * mB.M31, - mA.M12 * mB.M12 + mA.M22 * mB.M22 + mA.M32 * mB.M32, - mA.M12 * mB.M13 + mA.M22 * mB.M23 + mA.M32 * mB.M33, - 0, - mA.M13 * mB.M11 + mA.M23 * mB.M21 + mA.M33 * mB.M31, - mA.M13 * mB.M12 + mA.M23 * mB.M22 + mA.M33 * mB.M32, - mA.M13 * mB.M13 + mA.M23 * mB.M23 + mA.M33 * mB.M33, - 0, 0, 0, 0, 1); - } - - internal static Vector3 GetColumn(Matrix m, int column) - { - switch (column) - { - case 1: - return new Vector3(m.M11, m.M21, m.M31); - case 2: - return new Vector3(m.M12, m.M22, m.M32); - case 3: - return new Vector3(m.M13, m.M23, m.M33); - default: - throw new ArgumentOutOfRangeException("column"); - } - } - - internal static Vector3 GetRow(Matrix m, int row) - { - switch (row) - { - case 1: - return new Vector3(m.M11, m.M12, m.M13); - case 2: - return new Vector3(m.M21, m.M22, m.M23); - case 3: - return new Vector3(m.M31, m.M32, m.M33); - default: - throw new ArgumentOutOfRangeException("row"); - } - } - - internal static Quaternion GetRotation(Matrix m) - { - float trace = m.M11 + m.M22 + m.M33; - Quaternion q = new Quaternion(); - - if (trace > 0) - { - float s = (float)Math.Sqrt(trace + 1.0f); - q.W = s * 0.5f; - s = 0.5f / s; - - q.X = (m.M32 - m.M23) * s; - q.Y = (m.M13 - m.M31) * s; - q.Z = (m.M21 - m.M12) * s; - } - else - { - int i = m.M11 < m.M22 ? - (m.M22 < m.M33 ? 2 : 1) : - (m.M11 < m.M33 ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - - float s = (float)Math.Sqrt(GetElement(m, i, i) - GetElement(m, j, j) - GetElement(m, k, k) + 1.0f); - SetElement(ref q, i, s * 0.5f); - s = 0.5f / s; - - q.W = (GetElement(m, k, j) - GetElement(m, j, k)) * s; - SetElement(ref q, j, (GetElement(m, j, i) + GetElement(m, i, j)) * s); - SetElement(ref q, k, (GetElement(m, k, i) + GetElement(m, i, k)) * s); - } - return q; - } - - internal static float SetElement(ref Quaternion q, int index, float value) - { - switch (index) - { - case 0: - q.X = value; break; - case 1: - q.Y = value; break; - case 2: - q.Z = value; break; - case 3: - q.W = value; break; - } - - return 0; - } - - internal static float GetElement(Quaternion q, int index) - { - switch (index) - { - case 0: - return q.X; - case 1: - return q.Y; - case 2: - return q.Z; - default: - return q.W; - } - } - - internal static float GetElement(Matrix mat, int index) - { - int row = index % 3; - int col = index / 3; - - return GetElement(mat, row, col); - } - - internal static float GetElement(Matrix mat, int row, int col) - { - switch (row) - { - case 0: - switch (col) - { - case 0: - return mat.M11; - case 1: - return mat.M12; - case 2: - return mat.M13; - } break; - case 1: - switch (col) - { - case 0: - return mat.M21; - case 1: - return mat.M22; - case 2: - return mat.M23; - } break; - case 2: - switch (col) - { - case 0: - return mat.M31; - case 1: - return mat.M32; - case 2: - return mat.M33; - } break; - } - - return 0; - } - - internal static float GetElement(Vector3 v, int index) - { - if (index == 0) - return v.X; - if (index == 1) - return v.Y; - if (index == 2) - return v.Z; - - throw new ArgumentOutOfRangeException("index"); - } - - internal static void SetElement(ref Vector3 v, int index, float value) - { - if (index == 0) - v.X = value; - else if (index == 1) - v.Y = value; - else if (index == 2) - v.Z = value; - else - throw new ArgumentOutOfRangeException("index"); - } - - public static Matrix InvertMatrix(Matrix m) - { - Vector3 pos = m.Translation; - m.Translation = Vector3.Zero; - Matrix inv = Matrix.Transpose(m); - pos = Vector3.Transform(-pos, m); - inv.Translation = pos; - return inv; - } - - public static Matrix GetDisplayMatrix(Matrix m) - { - Matrix displayMatrix = m; - displayMatrix.Translation = Vector3.Zero; - displayMatrix = Matrix.Transpose(displayMatrix); - displayMatrix.Translation = m.Translation; - return displayMatrix; - } - - internal static Vector3 Transform(Vector3 position, Matrix matrix) - { - Vector3 vector = new Vector3(); - vector.X = (((position.X * matrix.M11) + (position.Y * matrix.M12)) + (position.Z * matrix.M13)) + matrix.M41; - vector.Y = (((position.X * matrix.M21) + (position.Y * matrix.M22)) + (position.Z * matrix.M23)) + matrix.M42; - vector.Z = (((position.X * matrix.M31) + (position.Y * matrix.M32)) + (position.Z * matrix.M33)) + matrix.M43; - return vector; - } - - internal static Vector3 TransformNormal(Vector3 position, Matrix matrix) - { - Vector3 vector = new Vector3(); - vector.X = (((position.X * matrix.M11) + (position.Y * matrix.M12)) + (position.Z * matrix.M13)); - vector.Y = (((position.X * matrix.M21) + (position.Y * matrix.M22)) + (position.Z * matrix.M23)); - vector.Z = (((position.X * matrix.M31) + (position.Y * matrix.M32)) + (position.Z * matrix.M33)); - return vector; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MatrixOperations.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MatrixOperations.cs deleted file mode 100644 index 93a99f2408..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MatrixOperations.cs +++ /dev/null @@ -1,116 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - internal static class MatrixOperations - { - public static void SetRotation(ref Matrix m, Quaternion q) - { - float d = q.LengthSquared(); - BulletDebug.Assert(d != 0); - float s = 2f / d; - float xs = q.X * s, ys = q.Y * s, zs = q.Z * s; - float wx = q.W * xs, wy = q.W * ys, wz = q.W * zs; - float xx = q.X * xs, xy = q.X * ys, xz = q.X * zs; - float yy = q.Y * ys, yz = q.Y * zs, zz = q.Z * zs; - m = new Matrix(1 - (yy + zz), xy - wz, xz + wy, 0, - xy + wz, 1 - (xx + zz), yz - wx, 0, - xz - wy, yz + wx, 1 - (xx + yy), 0, - m.M41, m.M42, m.M43, 1); - } - - public static Quaternion GetRotation(Matrix m) - { - Quaternion q = new Quaternion(); - - float trace = m.M11 + m.M22 + m.M33; - - if (trace > 0) - { - float s = (float)Math.Sqrt(trace + 1); - q.W = s * 0.5f; - s = 0.5f / s; - - q.X = (m.M32 - m.M23) * s; - q.Y = (m.M13 - m.M31) * s; - q.Z = (m.M21 - m.M12) * s; - } - else - { - int i = m.M11 < m.M22 ? - (m.M22 < m.M33 ? 2 : 1) : - (m.M11 < m.M33 ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - - float s = (float)Math.Sqrt(MathHelper.GetElement(m, i, i) - MathHelper.GetElement(m, j, j) - MathHelper.GetElement(m, k, k) + 1); - MathHelper.SetElement(ref q, i, s * 0.5f); - s = 0.5f / s; - - q.W = (MathHelper.GetElement(m, k, j) - MathHelper.GetElement(m, j, k)) * s; - MathHelper.SetElement(ref q, j, (MathHelper.GetElement(m, j, i) + MathHelper.GetElement(m, i, j)) * s); - MathHelper.SetElement(ref q, k, (MathHelper.GetElement(m, k, i) + MathHelper.GetElement(m, i, k)) * s); - } - - return q; - } - - public static Matrix Scaled(Matrix m, Vector3 v) - { - return new Matrix( m.M11 * v.X, m.M12 * v.Y, m.M13 * v.Z, 0, - m.M21 * v.X, m.M22 * v.Y, m.M23 * v.Z, 0, - m.M31 * v.X, m.M32 * v.Y, m.M33 * v.Z, 0, - 0, 0, 0, 1); - } - - public static Matrix Multiply(Matrix a, Matrix b) - { - /*return btMatrix3x3( - m2.tdot(0, m1[0]), m2.tdot(1, m1[0]), m2.tdot(2, m1[0]), - m2.tdot(0, m1[1]), m2.tdot(1, m1[1]), m2.tdot(2, m1[1]), - m2.tdot(0, m1[2]), m2.tdot(1, m1[2]), m2.tdot(2, m1[2]));*/ - return new Matrix( - Dot(b, 0, MathHelper.GetRow(a, 1)), Dot(b, 1, MathHelper.GetRow(a, 1)), Dot(b, 2, MathHelper.GetRow(a, 1)), 0, - Dot(b, 0, MathHelper.GetRow(a, 2)), Dot(b, 1, MathHelper.GetRow(a, 2)), Dot(b, 2, MathHelper.GetRow(a, 2)), 0, - Dot(b, 0, MathHelper.GetRow(a, 3)), Dot(b, 1, MathHelper.GetRow(a, 3)), Dot(b, 2, MathHelper.GetRow(a, 3)), 0, - 0, 0, 0, 1); - } - - public static float Dot(Matrix m, int c, Vector3 v) - { - return MathHelper.GetElement(m, 0, c) * v.X + MathHelper.GetElement(m, 1, c) * v.Y + MathHelper.GetElement(m, 2, c) * v.Z; - } - - public static Matrix Transpose(Matrix m) - { - return new Matrix( m.M11, m.M21, m.M31, 0, - m.M12, m.M22, m.M32, 0, - m.M13, m.M23, m.M33, 0, - 0, 0, 0, 1); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MotionState.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MotionState.cs deleted file mode 100644 index 407a285af4..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/MotionState.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public abstract class MotionState - { - /*public abstract Vector3 getWorldPosition(); - public abstract Vector3 getWorldScaling(); - public abstract Quaternion getWorldOrientation(); - - public abstract void setWorldPosition(Vector3 worldPos); - public abstract void setWorldOrientation(Quaternion orn); - - public abstract void calculateWorldTransformations();*/ - - public abstract void GetWorldTransform(out Matrix worldTransform); - //Bullet only calls the update of worldtransform for active objects - public abstract void SetWorldTransform(Matrix worldTransform); - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/QuadWord.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/QuadWord.cs deleted file mode 100644 index 0f59e871f5..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/QuadWord.cs +++ /dev/null @@ -1,88 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX.LinearMath -{ - internal abstract class QuadWord - { - private float x; - private float y; - private float z; - private float w; - - public float X { get { return x; } set { x = value; } } - public float Y { get { return y; } set { y = value; } } - public float Z { get { return z; } set { z = value; } } - public float W { get { return w; } set { w = value; } } - - public QuadWord() { } - - public QuadWord(float x, float y, float z, float w) - { - X = x; - Y = y; - Z = z; - W = w; - } - - public QuadWord(float x, float y, float z) - { - X = x; - Y = y; - Z = z; - W = 0; - } - - public void SetMax(QuadWord other) - { - if (other.X > X) - X = other.X; - - if (other.Y > Y) - Y = other.Y; - - if (other.Z > Z) - Z = other.Z; - - if (other.W > W) - W = other.W; - } - - public void SetMin(QuadWord other) - { - if (other.X < X) - X = other.X; - - if (other.Y < Y) - Y = other.Y; - - if (other.Z < Z) - Z = other.Z; - - if (other.W < W) - W = other.W; - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Quaternion.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Quaternion.cs deleted file mode 100644 index 0685d4a57d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Quaternion.cs +++ /dev/null @@ -1,198 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX.LinearMath -{ - internal class Quaternion : QuadWord - { - public Quaternion() { } - - public Quaternion(float x, float y, float z, float w) - : base(x, y, z, w) { } - - public Quaternion(Vector3 axis, float angle) - { - SetRotation(axis, angle); - } - - public Quaternion(float yaw, float pitch, float roll) - { - SetEuler(yaw, pitch, roll); - } - - public void SetRotation(Vector3 axis, float angle) - { - float d = axis.Length(); - if (d == 0) throw new DivideByZeroException(); - float s = (float)Math.Sin(angle * 0.5f) / d; - X = axis.X * s; - Y = axis.Y * s; - Z = axis.Z * s; - W = (float)Math.Cos(angle * 0.5f); - } - - public void SetEuler(float yaw, float pitch, float roll) - { - float halfYaw = yaw * 0.5f; - float halfPitch = pitch * 0.5f; - float halfRoll = roll * 0.5f; - float cosYaw = (float)Math.Cos(halfYaw); - float sinYaw = (float)Math.Sin(halfYaw); - float cosPitch = (float)Math.Cos(halfPitch); - float sinPitch = (float)Math.Sin(halfPitch); - float cosRoll = (float)Math.Cos(halfRoll); - float sinRoll = (float)Math.Sin(halfRoll); - X = cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw; - Y = cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw; - Z = sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw; - W = cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw; - } - - public float LengthSquared() - { - return Dot(this, this); - } - - public float Length() - { - return (float)Math.Sqrt(LengthSquared()); - } - - public float Angle() - { - return 2f * (float)Math.Acos(W); - } - - public static float Angle(Quaternion a, Quaternion b) - { - float s = (float)Math.Sqrt(a.LengthSquared() * b.LengthSquared()); - if (s == 0) throw new DivideByZeroException(); - return (float)Math.Acos(Dot(a, b) / s); - } - - public static Quaternion Farthest(Quaternion a, Quaternion b) - { - Quaternion diff, sum; - diff = a - b; - sum = a + b; - if (Dot(diff, diff) > Dot(sum, sum)) - return b; - return -b; - } - - public static Quaternion Slerp(Quaternion a, Quaternion b, float c) - { - float theta = Angle(a, b); - if (theta != 0) - { - float d = 1f / (float)Math.Sin(theta); - float s0 = (float)Math.Sin((1f - c) * theta); - float s1 = (float)Math.Sin(c * theta); - return new Quaternion( - (a.X * s0 + b.X * s1) * d, - (a.Y * s0 + b.Y * s1) * d, - (a.Z * s0 + b.Z * s1) * d, - (a.W * s0 + b.W * s1) * d); - } - else - { - return a; - } - } - - public static Quaternion Inverse(Quaternion a) - { - return new Quaternion(a.X, a.Y, a.Z, -a.W); - } - - public static Quaternion Normalize(Quaternion a) - { - return a / a.Length(); - } - - public static float Dot(Quaternion a, Quaternion b) - { - return a.X * b.X + a.Y * b.Y + a.Z * b.Z + a.W * b.W; - } - - public static Quaternion operator +(Quaternion a, Quaternion b) - { - return new Quaternion(a.X + b.X, a.Y + b.Y, a.Z + b.Z, a.W + b.W); - } - - public static Quaternion operator -(Quaternion a, Quaternion b) - { - return new Quaternion(a.X - b.X, a.Y - b.Y, a.Z - b.Z, a.W - b.W); - } - - public static Quaternion operator -(Quaternion a) - { - return new Quaternion(-a.X, -a.Y, -a.Z, -a.W); - } - - public static Quaternion operator *(Quaternion a, float b) - { - return new Quaternion(a.X * b, a.Y * b, a.Z * b, a.W * b); - } - - public static Quaternion operator *(Quaternion a, Quaternion b) - { - return new Quaternion( - a.W * b.X + a.X * b.W + a.Y * b.Z - a.Z * b.Y, - a.W * b.Y + a.Y * b.W + a.Z * b.X - a.X * b.Z, - a.W * b.Z + a.Z * b.W + a.X * b.Y - a.Y * b.X, - a.W * b.W - a.X * b.X - a.Y * b.Y - a.Z * b.Z); - } - - public static Quaternion operator *(Quaternion a, Vector3 b) - { - return new Quaternion( - a.W * b.X + a.Y * b.Z - a.Z * b.Y, - a.W * b.Y + a.Z * b.X - a.X * b.Z, - a.W * b.Z + a.X * b.Y - a.Y * b.X, - -a.X * b.X - a.Y * b.Y - a.Z * b.Z); - } - - public static Quaternion operator *(Vector3 w, Quaternion q) - { - return new Quaternion( - w.X * q.W + w.Y * q.Z - w.Z * q.Y, - w.Y * q.W + w.Z * q.X - w.X * q.Z, - w.Z * q.W + w.X * q.Y - w.Y * q.X, - -w.X * q.X - w.Y * q.Y - w.Z * q.Z); - } - - public static Quaternion operator /(Quaternion a, float b) - { - if (b == 0) throw new DivideByZeroException(); - return new Quaternion(a.X / b, a.Y / b, a.Z / b, a.W / b); - } - - public static explicit operator MonoXnaCompactMaths.Quaternion(Quaternion a) - { - return new MonoXnaCompactMaths.Quaternion(a.X, a.Y, a.Z, a.W); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/TransformUtil.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/TransformUtil.cs deleted file mode 100644 index ccf92a06c9..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/TransformUtil.cs +++ /dev/null @@ -1,102 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; -using MonoXnaCompactMaths; - -namespace XnaDevRu.BulletX -{ - public static class TransformUtil - { - //const float AngularMotionTreshold = 0.5f * MonoXnaCompactMaths.MathHelper.PiOver2; - const float AngularMotionTreshold = 0.5f * (float)Math.PI / 2.0f; - - public static void IntegrateTransform(Matrix currentTransform, Vector3 linearVelocity, Vector3 angularVelocity, float timeStep, ref Matrix predictedTransform) - { - predictedTransform.Translation = currentTransform.Translation + linearVelocity * timeStep; - //exponential map - Vector3 axis; - float angle = angularVelocity.Length(); - //limit the angular motion - if (angle * timeStep > AngularMotionTreshold) - { - angle = AngularMotionTreshold / timeStep; - } - - if (angle < 0.001f) - { - // use Taylor's expansions of sync function - axis = angularVelocity * (0.5f * timeStep - (timeStep * timeStep * timeStep) * (0.020833333333f) * angle * angle); - } - else - { - // sync(fAngle) = sin(c*fAngle)/t - axis = angularVelocity * ((float)Math.Sin(0.5f * angle * timeStep) / angle); - } - Quaternion dorn = new Quaternion(axis.X, axis.Y, axis.Z, (float)Math.Cos(angle * timeStep * 0.5f)); - Quaternion ornA = MatrixOperations.GetRotation(currentTransform); - - Quaternion predictedOrn = dorn * ornA; - predictedOrn.Normalize(); - - MatrixOperations.SetRotation(ref predictedTransform, predictedOrn); - - Matrix test = Matrix.CreateFromQuaternion(predictedOrn); - } - - public static void CalculateVelocity(Matrix transformA, Matrix transformB, float timeStep, ref Vector3 linearVelocity, ref Vector3 angularVelocity) - { - linearVelocity = (transformB.Translation - transformA.Translation) / timeStep; - Matrix dmat = transformB * MathHelper.InvertMatrix(transformA); - Quaternion dorn = Quaternion.CreateFromRotationMatrix(dmat); - - Vector3 axis; - float angle = 2 * (float)Math.Acos(dorn.W); - axis = new Vector3(dorn.X, dorn.Y, dorn.Z); - //axis[3] = 0.f; - //check for axis length - float len = axis.LengthSquared(); - if (len < MathHelper.Epsilon * MathHelper.Epsilon) - axis = new Vector3(1f, 0f, 0f); - else - axis /= (float)Math.Sqrt(len); - - angularVelocity = axis * angle / timeStep; - } - - public static void CalculateDiffAxisAngle(Matrix transformA, Matrix transformB, out Vector3 axis, out float angle) - { - Matrix dmat = transformB * MathHelper.InvertMatrix(transformA); - Quaternion dorn = MathHelper.GetRotation(dmat); - - angle = 2f * (float)Math.Acos(dorn.W); - axis = new Vector3(dorn.X, dorn.Y, dorn.Z); - //check for axis length - float len = axis.LengthSquared(); - if (len < MathHelper.Epsilon * MathHelper.Epsilon) - axis = new Vector3(1f, 0f, 0f); - else - axis /= (float)Math.Sqrt(len); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Vector3.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Vector3.cs deleted file mode 100644 index adeec2543d..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Vector3.cs +++ /dev/null @@ -1,221 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX.LinearMath -{ - internal class Vector3 : QuadWord - { - public Vector3() { } - - public Vector3(float x, float y, float z) - : base(x, y, z) { } - - public void SetInterpolate3(Vector3 a, Vector3 b, float c) - { - float s = 1.0f - c; - X = s * a.X + c * b.X; - Y = s * a.Y + c * b.Y; - Z = s * a.Z + c * b.Z; - } - - public float LengthSquared() - { - return Dot(this, this); - } - - public float Length() - { - return (float)Math.Sqrt(LengthSquared()); - } - - public int MinAxis() - { - return X < Y ? (X < Z ? 0 : 2) : (Y < Z ? 1 : 2); - } - - public int MaxAxis() - { - return X < Y ? (Y < Z ? 2 : 1) : (X < Z ? 2 : 0); - } - - public int FurthestAxis() - { - return Absolute(this).MinAxis(); - } - - public int ClosestAxis() - { - return Absolute(this).MaxAxis(); - } - - public Vector3 Rotate(Vector3 axis, float angle) - { - Vector3 o = axis * Dot(axis, this); - Vector3 x = this - o; - Vector3 y = Cross(axis, this); - - return (o + x * (float)Math.Cos(angle) + y * (float)Math.Sin(angle)); - } - - public static Vector3 Lerp(Vector3 a, Vector3 b, float c) - { - return new Vector3( - a.X + (b.X - a.X) * c, - a.Y + (b.Y - a.Y) * c, - a.Z + (b.Z - a.Z) * c); - } - - public static float Angle(Vector3 a, Vector3 b) - { - float s = (float)Math.Sqrt(a.LengthSquared() * b.LengthSquared()); - if (s == 0) throw new DivideByZeroException(); - return (float)Math.Acos(Dot(a, b) / s); - } - - public static Vector3 Absolute(Vector3 a) - { - return new Vector3( - Math.Abs(a.X), - Math.Abs(a.Y), - Math.Abs(a.Z)); - } - - public static Vector3 Normalize(Vector3 a) - { - return a / a.Length(); - } - - public static Vector3 Cross(Vector3 a, Vector3 b) - { - return new Vector3( - a.Y * b.Z - a.Z * b.Y, - a.Z * b.X - a.X * b.Z, - a.X * b.Y - a.Y * b.X); - } - - public static float Dot(Vector3 a, Vector3 b) - { - return a.X * b.X + a.Y * b.Y + a.Z * b.Z; - } - - public static float Triple(Vector3 a, Vector3 b, Vector3 c) - { - return a.X * (b.Y * c.Z - b.Z * c.Y) + - a.Y * (b.Z * c.X - b.X * c.Z) + - a.Z * (b.X * c.Y - b.Y * c.X); - } - - public static float Distance(Vector3 a, Vector3 b) - { - return (b - a).Length(); - } - - public static float DistanceSquared(Vector3 a, Vector3 b) - { - return (b - a).LengthSquared(); - } - - public static Vector3 Rotate(Vector3 a, Vector3 axis, float angle) - { - Vector3 o = axis * Dot(axis, a); - Vector3 x = a - o; - Vector3 y = Cross(axis, a); - - return (o + x * (float)Math.Cos(angle) + y * (float)Math.Sin(angle)); - } - - public static Vector3 operator +(Vector3 a, Vector3 b) - { - return new Vector3(a.X + b.X, a.Y + b.Y, a.Z + b.Z); - } - - public static Vector3 operator -(Vector3 a, Vector3 b) - { - return new Vector3(a.X - b.X, a.Y - b.Y, a.Z - b.Z); - } - - public static Vector3 operator -(Vector3 a) - { - return new Vector3(-a.X, -a.Y, -a.Z); - } - - public static Vector3 operator *(float b, Vector3 a) - { - return new Vector3(a.X * b, a.Y * b, a.Z * b); - } - - public static Vector3 operator *(Vector3 a, float b) - { - return new Vector3(a.X * b, a.Y * b, a.Z * b); - } - - public static Vector3 operator *(Vector3 a, Vector3 b) - { - return new Vector3(a.X * b.X, a.Y * b.Y, a.Z * b.Z); - } - - public static Vector3 operator /(Vector3 a, float b) - { - if (b == 0) throw new DivideByZeroException(); - return new Vector3(a.X / b, a.Y / b, a.Z / b); - } - - public static Vector3 operator /(Vector3 a, Vector3 b) - { - if (b.X == 0 || b.Y == 0 || b.Z == 0) throw new DivideByZeroException(); - return new Vector3(a.X / b.X, a.Y / b.Y, a.Z / b.Z); - } - - public static bool operator ==(Vector3 a, Vector3 b) - { - return a.X == b.X && a.Y == b.Y && a.Z == b.Z; - } - - public static bool operator !=(Vector3 a, Vector3 b) - { - return a.X != b.X || a.Y != b.Y || a.Z != b.Z; - } - - public static explicit operator MonoXnaCompactMaths.Vector3(Vector3 a) - { - return new MonoXnaCompactMaths.Vector3(a.X, a.Y, a.Z); - } - - public override bool Equals(object obj) - { - return object.Equals(this, obj); - } - - public override int GetHashCode() - { - return X.GetHashCode() & Y.GetHashCode() & Z.GetHashCode(); - } - - public override string ToString() - { - return string.Format("{0}, {1}, {2}", X, Y, Z); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Vector4.cs b/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Vector4.cs deleted file mode 100644 index de98ccd30e..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/LinearMath/Vector4.cs +++ /dev/null @@ -1,110 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace XnaDevRu.BulletX.LinearMath -{ - internal class Vector4 : Vector3 - { - public Vector4() { } - - public Vector4(float x, float y, float z, float w) - : base(x, y, z) { W = w; } - - public static Vector4 Absolute4(Vector4 a) - { - return new Vector4( - Math.Abs(a.X), - Math.Abs(a.Y), - Math.Abs(a.Z), - Math.Abs(a.W)); - } - - public int MaxAxis4() - { - int maxIndex = -1; - float maxVal = -1e30f; - if (X > maxVal) - { - maxIndex = 0; - maxVal = X; - } - if (Y > maxVal) - { - maxIndex = 1; - maxVal = Y; - } - if (Z > maxVal) - { - maxIndex = 2; - maxVal = Z; - } - if (W > maxVal) - { - maxIndex = 3; - maxVal = W; - } - - return maxIndex; - } - - public int MinAxis4() - { - int minIndex = -1; - float minVal = 1e30f; - if (X < minVal) - { - minIndex = 0; - minVal = X; - } - if (Y < minVal) - { - minIndex = 1; - minVal = Y; - } - if (Z < minVal) - { - minIndex = 2; - minVal = Z; - } - if (W < minVal) - { - minIndex = 3; - minVal = W; - } - - return minIndex; - } - - public int ClosestAxis4() - { - return Absolute4(this).MaxAxis4(); - } - - public static explicit operator MonoXnaCompactMaths.Vector4(Vector4 a) - { - return new MonoXnaCompactMaths.Vector4(a.X, a.Y, a.Z, a.W); - } - } -} diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Modified.XnaDevRu.BulletX.csproj b/libraries/ModifiedBulletX/ModifiedBulletX/Modified.XnaDevRu.BulletX.csproj deleted file mode 100644 index 3aead7015f..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Modified.XnaDevRu.BulletX.csproj +++ /dev/null @@ -1,169 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {44270344-ACA7-4875-B585-81D5C06D0489} - Library - Properties - XnaDevRu.BulletX - Modified.XnaDevRu.BulletX - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {121147BC-B06B-406C-84E9-907F268CF0EB} - MonoXnaCompactMaths - - - - - - - - - - - \ No newline at end of file diff --git a/libraries/ModifiedBulletX/ModifiedBulletX/Properties/AssemblyInfo.cs b/libraries/ModifiedBulletX/ModifiedBulletX/Properties/AssemblyInfo.cs deleted file mode 100644 index 03d1e3e3c9..0000000000 --- a/libraries/ModifiedBulletX/ModifiedBulletX/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// La información general sobre un ensamblado se controla mediante el siguiente -// conjunto de atributos. Cambie estos atributos para modificar la información -// asociada con un ensamblado. -[assembly: AssemblyTitle("Modified.XnaDevRu.BulletX")] -[assembly: AssemblyDescription("Modified Bullet for XNA")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("XNADev.ru")] -[assembly: AssemblyProduct("Bullet for XNA")] -[assembly: AssemblyCopyright("Copyright © 2007 XNADev.ru")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Si establece ComVisible como false hace que los tipos de este ensamblado no sean visibles -// a los componentes COM. Si necesita obtener acceso a un tipo en este ensamblado desde -// COM, establezca el atributo ComVisible como true en este tipo. -[assembly: ComVisible(false)] - -// El siguiente GUID sirve como identificador de la biblioteca de tipos si este proyecto se expone a COM -[assembly: Guid("a6148224-0271-4cd8-9d0a-5d4955cd2b2c")] - -// La información de versión de un ensamblado consta de los cuatro valores siguientes: -// -// Versión principal -// Versión secundaria -// Número de versión de compilación -// Revisión -// -// Puede especificar todos los valores o puede establecer como valores predeterminados los números de revisión y generación -// mediante el asterisco ('*'), como se muestra a continuación: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Matrix.cs b/libraries/ModifiedBulletX/MonoXnaCompactMaths/Matrix.cs deleted file mode 100644 index 9b88ab3a04..0000000000 --- a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Matrix.cs +++ /dev/null @@ -1,690 +0,0 @@ -#region License -/* -MIT License -Copyright 2006 The Mono.Xna Team - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -#endregion License - -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; - -namespace MonoXnaCompactMaths -{ - [Serializable] - [StructLayout(LayoutKind.Sequential)] - //[TypeConverter(typeof(MatrixConverter))] - public struct Matrix : IEquatable - { - #region Public Constructors - - public Matrix(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, - float m32, float m33, float m34, float m41, float m42, float m43, float m44) - { - this.M11 = m11; - this.M12 = m12; - this.M13 = m13; - this.M14 = m14; - this.M21 = m21; - this.M22 = m22; - this.M23 = m23; - this.M24 = m24; - this.M31 = m31; - this.M32 = m32; - this.M33 = m33; - this.M34 = m34; - this.M41 = m41; - this.M42 = m42; - this.M43 = m43; - this.M44 = m44; - } - - #endregion Public Constructors - - - #region Public Fields - - public float M11; - public float M12; - public float M13; - public float M14; - public float M21; - public float M22; - public float M23; - public float M24; - public float M31; - public float M32; - public float M33; - public float M34; - public float M41; - public float M42; - public float M43; - public float M44; - - #endregion Public Fields - - - #region Private Members - private static Matrix identity = new Matrix(1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f); - #endregion Private Members - - - #region Public Properties - - public Vector3 Backward - { - get - { - return new Vector3(this.M31, this.M32, this.M33); - } - set - { - this.M31 = value.X; - this.M32 = value.Y; - this.M33 = value.Z; - } - } - - - public Vector3 Down - { - get - { - return new Vector3(-this.M21, -this.M22, -this.M23); - } - set - { - this.M21 = -value.X; - this.M22 = -value.Y; - this.M23 = -value.Z; - } - } - - - public Vector3 Forward - { - get - { - return new Vector3(-this.M31, -this.M32, -this.M33); - } - set - { - this.M31 = -value.X; - this.M32 = -value.Y; - this.M33 = -value.Z; - } - } - - - public static Matrix Identity - { - get { return identity; } - } - - - public Vector3 Left - { - get - { - return new Vector3(-this.M11, -this.M12, -this.M13); - } - set - { - this.M11 = -value.X; - this.M12 = -value.Y; - this.M13 = -value.Z; - } - } - - - public Vector3 Right - { - get - { - return new Vector3(this.M11, this.M12, this.M13); - } - set - { - this.M11 = value.X; - this.M12 = value.Y; - this.M13 = value.Z; - } - } - - - public Vector3 Translation - { - get - { - return new Vector3(this.M41, this.M42, this.M43); - } - set - { - this.M41 = value.X; - this.M42 = value.Y; - this.M43 = value.Z; - } - } - - - public Vector3 Up - { - get - { - return new Vector3(this.M21, this.M22, this.M23); - } - set - { - this.M21 = value.X; - this.M22 = value.Y; - this.M23 = value.Z; - } - } - #endregion Public Properties - - - #region Public Methods - - public static Matrix Add(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static void Add(ref Matrix matrix1, ref Matrix matrix2, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateBillboard(Vector3 objectPosition, Vector3 cameraPosition, - Vector3 cameraUpVector, Nullable cameraForwardVector) - { - throw new NotImplementedException(); - } - - - public static void CreateBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, - ref Vector3 cameraUpVector, Vector3? cameraForwardVector, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateConstrainedBillboard(Vector3 objectPosition, Vector3 cameraPosition, - Vector3 rotateAxis, Nullable cameraForwardVector, Nullable objectForwardVector) - { - throw new NotImplementedException(); - } - - - public static void CreateConstrainedBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, - ref Vector3 rotateAxis, Vector3? cameraForwardVector, Vector3? objectForwardVector, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateFromAxisAngle(Vector3 axis, float angle) - { - throw new NotImplementedException(); - } - - - public static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateFromQuaternion(Quaternion quaternion) - { - //--- - //http://lists.ximian.com/pipermail/mono-patches/2006-December/084667.html - float xx = quaternion.X * quaternion.X; - float xy = quaternion.X * quaternion.Y; - float xw = quaternion.X * quaternion.W; - float yy = quaternion.Y * quaternion.Y; - float yw = quaternion.Y * quaternion.W; - float yz = quaternion.Y * quaternion.Z; - float zx = quaternion.Z * quaternion.X; - float zw = quaternion.Z * quaternion.W; - float zz = quaternion.Z * quaternion.Z; - return new Matrix(1f - (2f * (yy + zz)), 2f * (xy + zw), 2f * (zx - yw), 0f, 2f * (xy - zw), - 1f - (2f * (zz + xx)), 2f * (yz + xw), 0f, 2f * (zx + yw), 2f * (yz - xw), - 1f - (2f * (yy + xx)), 0f, 0f, 0f, 0f, 1f); - //throw new NotImplementedException(); - } - - - public static void CreateFromQuaternion(ref Quaternion quaternion, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateLookAt(Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector) - { - throw new NotImplementedException(); - } - - - public static void CreateLookAt(ref Vector3 cameraPosition, ref Vector3 cameraTarget, ref Vector3 cameraUpVector, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane) - { - throw new NotImplementedException(); - } - - - public static void CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane) - { - throw new NotImplementedException(); - } - - - public static void CreateOrthographicOffCenter(float left, float right, float bottom, float top, - float zNearPlane, float zFarPlane, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreatePerspective(float width, float height, float zNearPlane, float zFarPlane) - { - throw new NotImplementedException(); - } - - - public static void CreatePerspective(float width, float height, float zNearPlane, float zFarPlane, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float zNearPlane, float zFarPlane) - { - throw new NotImplementedException(); - } - - - public static void CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane) - { - throw new NotImplementedException(); - } - - - public static void CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateRotationX(float radians) - { - throw new NotImplementedException(); - } - - - public static void CreateRotationX(float radians, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateRotationY(float radians) - { - throw new NotImplementedException(); - } - - - public static void CreateRotationY(float radians, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateRotationZ(float radians) - { - throw new NotImplementedException(); - } - - - public static void CreateRotationZ(float radians, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateScale(float scale) - { - throw new NotImplementedException(); - } - - - public static void CreateScale(float scale, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateScale(float xScale, float yScale, float zScale) - { - throw new NotImplementedException(); - } - - - public static void CreateScale(float xScale, float yScale, float zScale, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateScale(Vector3 scales) - { - throw new NotImplementedException(); - } - - - public static void CreateScale(ref Vector3 scales, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateTranslation(float xPosition, float yPosition, float zPosition) - { - throw new NotImplementedException(); - } - - - public static void CreateTranslation(ref Vector3 position, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix CreateTranslation(Vector3 position) - { - throw new NotImplementedException(); - } - - - public static void CreateTranslation(float xPosition, float yPosition, float zPosition, out Matrix result) - { - throw new NotImplementedException(); - } - - - public float Determinant() - { - throw new NotImplementedException(); - } - - - public static Matrix Divide(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static void Divide(ref Matrix matrix1, ref Matrix matrix2, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix Divide(Matrix matrix1, float divider) - { - throw new NotImplementedException(); - } - - - public static void Divide(ref Matrix matrix1, float divider, out Matrix result) - { - throw new NotImplementedException(); - } - - - public bool Equals(Matrix other) - { - throw new NotImplementedException(); - } - - - public override bool Equals(object obj) - { - throw new NotImplementedException(); - } - - - public override int GetHashCode() - { - throw new NotImplementedException(); - } - - - public static Matrix Invert(Matrix matrix) - { - throw new NotImplementedException(); - } - - - public static void Invert(ref Matrix matrix, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount) - { - throw new NotImplementedException(); - } - - - public static void Lerp(ref Matrix matrix1, ref Matrix matrix2, float amount, out Matrix result) - { - throw new NotImplementedException(); - } - - public static Matrix Multiply(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static void Multiply(ref Matrix matrix1, ref Matrix matrix2, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix Multiply(Matrix matrix1, float factor) - { - throw new NotImplementedException(); - } - - - public static void Multiply(ref Matrix matrix1, float factor, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix Negate(Matrix matrix) - { - throw new NotImplementedException(); - } - - - public static void Negate(ref Matrix matrix, out Matrix result) - { - throw new NotImplementedException(); - } - - - public static Matrix operator +(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static Matrix operator /(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static Matrix operator /(Matrix matrix1, float divider) - { - return new Matrix( - matrix1.M11 / divider, matrix1.M12 / divider, matrix1.M13 / divider, matrix1.M14 / divider, - matrix1.M21 / divider, matrix1.M22 / divider, matrix1.M23 / divider, matrix1.M24 / divider, - matrix1.M31 / divider, matrix1.M32 / divider, matrix1.M33 / divider, matrix1.M34 / divider, - matrix1.M41 / divider, matrix1.M42 / divider, matrix1.M43 / divider, matrix1.M44 / divider); - } - - - public static bool operator ==(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static bool operator !=(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static Matrix operator *(Matrix matrix1, Matrix matrix2) - { - //--- - float[, ] arrayMatrix1 = new float[4, 4]; - float[, ] arrayMatrix2 = new float[4, 4]; - float[, ] arrayMatrixProduct = new float[4, 4]; - arrayMatrix1[0, 0] = matrix1.M11; arrayMatrix1[0, 1] = matrix1.M12; arrayMatrix1[0, 2] = matrix1.M13; arrayMatrix1[0, 3] = matrix1.M14; - arrayMatrix1[1, 0] = matrix1.M21; arrayMatrix1[1, 1] = matrix1.M22; arrayMatrix1[1, 2] = matrix1.M23; arrayMatrix1[1, 3] = matrix1.M24; - arrayMatrix1[2, 0] = matrix1.M31; arrayMatrix1[2, 1] = matrix1.M32; arrayMatrix1[2, 2] = matrix1.M33; arrayMatrix1[2, 3] = matrix1.M34; - arrayMatrix1[3, 0] = matrix1.M41; arrayMatrix1[3, 1] = matrix1.M42; arrayMatrix1[3, 2] = matrix1.M43; arrayMatrix1[3, 3] = matrix1.M44; - - arrayMatrix2[0, 0] = matrix2.M11; arrayMatrix2[0, 1] = matrix2.M12; arrayMatrix2[0, 2] = matrix2.M13; arrayMatrix2[0, 3] = matrix2.M14; - arrayMatrix2[1, 0] = matrix2.M21; arrayMatrix2[1, 1] = matrix2.M22; arrayMatrix2[1, 2] = matrix2.M23; arrayMatrix2[1, 3] = matrix2.M24; - arrayMatrix2[2, 0] = matrix2.M31; arrayMatrix2[2, 1] = matrix2.M32; arrayMatrix2[2, 2] = matrix2.M33; arrayMatrix2[2, 3] = matrix2.M34; - arrayMatrix2[3, 0] = matrix2.M41; arrayMatrix2[3, 1] = matrix2.M42; arrayMatrix2[3, 2] = matrix2.M43; arrayMatrix2[3, 3] = matrix2.M44; - - int n = 4; - for (int i = 0; i < n; i++) - { - for (int j = 0; j < n; j++) - { - // (AB)[i,j] = Sum(k=0; k < 4; k++) { A[i,k] * B[k, j] } - for (int k = 0; k < n; k++) - { - arrayMatrixProduct[i, j] += arrayMatrix1[i, k] * arrayMatrix2[k, j]; - } - } - } - return new Matrix( arrayMatrixProduct[0, 0], arrayMatrixProduct[0, 1], arrayMatrixProduct[0, 2], arrayMatrixProduct[0, 3], - arrayMatrixProduct[1, 0], arrayMatrixProduct[1, 1], arrayMatrixProduct[1, 2], arrayMatrixProduct[1, 3], - arrayMatrixProduct[2, 0], arrayMatrixProduct[2, 1], arrayMatrixProduct[2, 2], arrayMatrixProduct[2, 3], - arrayMatrixProduct[3, 1], arrayMatrixProduct[3, 1], arrayMatrixProduct[3, 2], arrayMatrixProduct[3, 3]); - //--- - //throw new NotImplementedException(); - } - - - public static Matrix operator *(Matrix matrix, float scaleFactor) - { - throw new NotImplementedException(); - } - - - public static Matrix operator -(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static Matrix operator -(Matrix matrix1) - { - throw new NotImplementedException(); - } - - - public static Matrix Subtract(Matrix matrix1, Matrix matrix2) - { - throw new NotImplementedException(); - } - - - public static void Subtract(ref Matrix matrix1, ref Matrix matrix2, out Matrix result) - { - throw new NotImplementedException(); - } - - - public override string ToString() - { - return "[(" + this.M11 + ", " + this.M12 + ", " + this.M13 + ", " + this.M14 + ")\n (" - + this.M21 + ", " + this.M22 + ", " + this.M23 + ", " + this.M24 + ")\n (" - + this.M31 + ", " + this.M32 + ", " + this.M33 + ", " + this.M34 + ")\n (" - + this.M41 + ", " + this.M42 + ", " + this.M43 + ", " + this.M44 + ")]"; - } - - - public static Matrix Transpose(Matrix matrix) - { - //--- - return new Matrix( matrix.M11, matrix.M21, matrix.M31, matrix.M41, - matrix.M12, matrix.M22, matrix.M32, matrix.M42, - matrix.M13, matrix.M23, matrix.M33, matrix.M43, - matrix.M14, matrix.M24, matrix.M34, matrix.M44); - //--- - //throw new NotImplementedException(); - } - - - public static void Transpose(ref Matrix matrix, out Matrix result) - { - throw new NotImplementedException(); - } - #endregion Public Methods - } -} diff --git a/libraries/ModifiedBulletX/MonoXnaCompactMaths/MonoXnaCompactMaths.csproj b/libraries/ModifiedBulletX/MonoXnaCompactMaths/MonoXnaCompactMaths.csproj deleted file mode 100644 index 79c526383f..0000000000 --- a/libraries/ModifiedBulletX/MonoXnaCompactMaths/MonoXnaCompactMaths.csproj +++ /dev/null @@ -1,51 +0,0 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {121147BC-B06B-406C-84E9-907F268CF0EB} - Library - Properties - MonoXnaCompactMaths - MonoXnaCompactMaths - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Properties/AssemblyInfo.cs b/libraries/ModifiedBulletX/MonoXnaCompactMaths/Properties/AssemblyInfo.cs deleted file mode 100644 index 366f664b90..0000000000 --- a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// La información general sobre un ensamblado se controla mediante el siguiente -// conjunto de atributos. Cambie estos atributos para modificar la información -// asociada con un ensamblado. -[assembly: AssemblyTitle("MonoXnaCompactMaths")] -[assembly: AssemblyDescription("MonoXnaCompactMaths (Vector3, Vector4, Quaternion and Matrix)")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright 2006 - 2007 The Mono.Xna Team")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Si establece ComVisible como false hace que los tipos de este ensamblado no sean visibles -// a los componentes COM. Si necesita obtener acceso a un tipo en este ensamblado desde -// COM, establezca el atributo ComVisible como true en este tipo. -[assembly: ComVisible(false)] - -// El siguiente GUID sirve como identificador de la biblioteca de tipos si este proyecto se expone a COM -[assembly: Guid("79f9dfd1-60f8-44b8-ab08-6f6e341976b7")] - -// La información de versión de un ensamblado consta de los cuatro valores siguientes: -// -// Versión principal -// Versión secundaria -// Número de versión de compilación -// Revisión -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Quaternion.cs b/libraries/ModifiedBulletX/MonoXnaCompactMaths/Quaternion.cs deleted file mode 100644 index b6d9d343cd..0000000000 --- a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Quaternion.cs +++ /dev/null @@ -1,431 +0,0 @@ -#region License -/* -MIT License -Copyright 2006 The Mono.Xna Team - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -#endregion License - -using System; -using System.ComponentModel; - -namespace MonoXnaCompactMaths -{ - [Serializable] - //[TypeConverter(typeof(QuaternionConverter))] - public struct Quaternion : IEquatable - { - public float X; - public float Y; - public float Z; - public float W; - static Quaternion identity = new Quaternion(0, 0, 0, 1); - - - public Quaternion(float x, float y, float z, float w) - { - this.X = x; - this.Y = y; - this.Z = z; - this.W = w; - } - - - public Quaternion(Vector3 vectorPart, float scalarPart) - { - this.X = vectorPart.X; - this.Y = vectorPart.Y; - this.Z = vectorPart.Z; - this.W = scalarPart; - } - - public static Quaternion Identity - { - get{ return identity; } - } - - - public static Quaternion Add(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static void Add(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion CreateFromAxisAngle(Vector3 axis, float angle) - { - throw new NotImplementedException(); - } - - - public static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion CreateFromRotationMatrix(Matrix matrix) - { - float Omega2 = matrix.M44; - if (!isAprox(Omega2, 1f)) - { - //"Normalize" the Rotation matrix. Norma = M44 = Omega2 - matrix = matrix / Omega2; - } - //Deducted from: public static Matrix CreateFromQuaternion(Quaternion quaternion) - float lambda1pos, lambda2pos, lambda3pos, lambda1neg, lambda2neg, lambda3neg; - lambda1pos = (1f - matrix.M11 + matrix.M23 + matrix.M32) / 2f; - lambda2pos = (1f - matrix.M22 + matrix.M13 + matrix.M31) / 2f; - lambda3pos = (1f - matrix.M33 + matrix.M12 + matrix.M21) / 2f; - lambda1neg = (1f - matrix.M11 - matrix.M23 - matrix.M32) / 2f; - lambda2neg = (1f - matrix.M22 - matrix.M13 - matrix.M31) / 2f; - lambda3neg = (1f - matrix.M33 - matrix.M12 - matrix.M21) / 2f; - - //lambadIS = (qJ + s*qK)^2 - //q0 = w | q1 = x | q2 = y, q3 = z - //Every value of qI (I=1,2,3) has 4 possible values cause the sqrt - float[] x = new float[4]; float[] y = new float[4]; float[] z = new float[4]; - float[] sig1 = {1f, 1f, -1f, -1f}; - float[] sig2 = {1f, -1f, 1f, -1f}; - for (int i = 0; i < 4; i++) - { - x[i] = (sig1[i] * (float)Math.Sqrt(lambda1pos) + sig2[i] * (float)Math.Sqrt(lambda1neg)) / 2f; - y[i] = (sig1[i] * (float)Math.Sqrt(lambda2pos) + sig2[i] * (float)Math.Sqrt(lambda2neg)) / 2f; - z[i] = (sig1[i] * (float)Math.Sqrt(lambda3pos) + sig2[i] * (float)Math.Sqrt(lambda3neg)) / 2f; - } - - //Only a set of x, y, z are the corrects values. So it requires testing - int li_i=0, li_j=0, li_k=0; - bool lb_testL1P, lb_testL2P, lb_testL3P, lb_testL1N, lb_testL2N, lb_testL3N; - bool lb_superLambda = false; - while((li_i<4)&&(!lb_superLambda)) - { - while ((li_j < 4) && (!lb_superLambda)) - { - while ((li_k < 4) && (!lb_superLambda)) - { - lb_testL1P = isAprox((float)( - Math.Pow((double)(y[li_j] + z[li_k]), 2.0)), lambda1pos); - lb_testL2P = isAprox((float)( - Math.Pow((double)(x[li_i] + z[li_k]), 2.0)), lambda2pos); - lb_testL3P = isAprox((float)( - Math.Pow((double)(x[li_i] + y[li_j]), 2.0)), lambda3pos); - lb_testL1N = isAprox((float)( - Math.Pow((double)(y[li_j] - z[li_k]), 2.0)), lambda1neg); - lb_testL2N = isAprox((float)( - Math.Pow((double)(x[li_i] - z[li_k]), 2.0)), lambda2neg); - lb_testL3N = isAprox((float)( - Math.Pow((double)(x[li_i] - y[li_j]), 2.0)), lambda3neg); - - lb_superLambda = (lb_testL1P && lb_testL2P && lb_testL3P - && lb_testL1N && lb_testL2N && lb_testL3N); - - if (!lb_superLambda) li_k++; - } - if (!lb_superLambda) li_j++; - } - if (!lb_superLambda) li_i++; - } - - Quaternion q = new Quaternion(); - - if (lb_superLambda) - { - q.X = x[li_i]; q.Y = y[li_j]; q.Z = z[li_k]; - q.W = (matrix.M12 - 2f * q.X * q.Y) / (2f * q.Z); - - if (!isAprox(Omega2, 1f)) - { - if (Omega2 < 0) throw new Exception("Quaternion.CreateFromRotationMatrix: Omega2 is negative!"); - q = q * (float)Math.Sqrt(Omega2);//2 possibles values (+/-). For now only 1. - } - } - else - { - q = Quaternion.identity; - } - - return q; - } - private static float floatError = 0.000001f; - private static bool isAprox(float test, float realValue) - { - return (((realValue * (1f - floatError)) <= test) && (test <= (realValue * (1f + floatError)))); - } - - - public static void CreateFromRotationMatrix(ref Matrix matrix, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion Divide(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static void Divide(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static float Dot(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static void Dot(ref Quaternion quaternion1, ref Quaternion quaternion2, out float result) - { - throw new NotImplementedException(); - } - - - public override bool Equals(object obj) - { - throw new NotImplementedException(); - } - - - public bool Equals(Quaternion other) - { - throw new NotImplementedException(); - } - - - public override int GetHashCode() - { - throw new NotImplementedException(); - } - - - public static Quaternion Inverse(Quaternion quaternion) - { - throw new NotImplementedException(); - } - - - public static void Inverse(ref Quaternion quaternion, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public float Length() - { - //--- - return (float)Math.Sqrt(Math.Pow(this.W, 2.0) + Math.Pow(this.X, 2.0) + Math.Pow(this.Y, 2.0) + Math.Pow(this.Z, 2.0)); - //--- - //throw new NotImplementedException(); - } - - - public float LengthSquared() - { - //--- - return (float)(Math.Pow(this.W, 2.0) + Math.Pow(this.X, 2.0) + Math.Pow(this.Y, 2.0) + Math.Pow(this.Z, 2.0)); - //--- - //throw new NotImplementedException(); - } - - - public static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount) - { - throw new NotImplementedException(); - } - - - public static void Lerp(ref Quaternion quaternion1, ref Quaternion quaternion2, float amount, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount) - { - throw new NotImplementedException(); - } - - - public static void Slerp(ref Quaternion quaternion1, ref Quaternion quaternion2, float amount, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion Subtract(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static void Subtract(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion Multiply(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static Quaternion Multiply(Quaternion quaternion1, float scaleFactor) - { - throw new NotImplementedException(); - } - - - public static void Multiply(ref Quaternion quaternion1, float scaleFactor, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static void Multiply(ref Quaternion quaternion1, ref Quaternion quaternion2, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion Negate(Quaternion quaternion) - { - throw new NotImplementedException(); - } - - - public static void Negate(ref Quaternion quaternion, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public void Normalize() - { - //--- - this = Normalize(this); - //--- - //throw new NotImplementedException(); - } - - - public static Quaternion Normalize(Quaternion quaternion) - { - //--- - return quaternion / quaternion.Length(); - //--- - //throw new NotImplementedException(); - } - - - public static void Normalize(ref Quaternion quaternion, out Quaternion result) - { - throw new NotImplementedException(); - } - - - public static Quaternion operator +(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static Quaternion operator /(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - public static Quaternion operator /(Quaternion quaternion, float factor) - { - quaternion.W /= factor; - quaternion.X /= factor; - quaternion.Y /= factor; - quaternion.Z /= factor; - return quaternion; - } - - public static bool operator ==(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static bool operator !=(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static Quaternion operator *(Quaternion quaternion1, Quaternion quaternion2) - { - //--- - //Grassmann product - Quaternion quaternionProduct = new Quaternion(); - - quaternionProduct.W = quaternion1.W * quaternion2.W - quaternion1.X * quaternion2.X - quaternion1.Y * quaternion2.Y - quaternion1.Z * quaternion2.Z; - quaternionProduct.X = quaternion1.W * quaternion2.X + quaternion1.X * quaternion2.W + quaternion1.Y * quaternion2.Z - quaternion1.Z * quaternion2.Y; - quaternionProduct.Y = quaternion1.W * quaternion2.Y - quaternion1.X * quaternion2.Z + quaternion1.Y * quaternion2.W + quaternion1.Z * quaternion2.X; - quaternionProduct.Z = quaternion1.W * quaternion2.Z + quaternion1.X * quaternion2.Y - quaternion1.Y * quaternion2.X + quaternion1.Z * quaternion2.W; - return quaternionProduct; - //--- - //throw new NotImplementedException(); - } - - - public static Quaternion operator *(Quaternion quaternion1, float scaleFactor) - { - return new Quaternion(quaternion1.X / scaleFactor, quaternion1.Y / scaleFactor, - quaternion1.Z / scaleFactor, quaternion1.W / scaleFactor); - } - - - public static Quaternion operator -(Quaternion quaternion1, Quaternion quaternion2) - { - throw new NotImplementedException(); - } - - - public static Quaternion operator -(Quaternion quaternion) - { - throw new NotImplementedException(); - } - - - public override string ToString() - { - return "(" + this.X + ", " + this.Y + ", " + this.Z + ", " + this.W + ")"; - } - - private static void Conjugate(ref Quaternion quaternion, out Quaternion result) - { - throw new NotImplementedException(); - } - } -} diff --git a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Vector3.cs b/libraries/ModifiedBulletX/MonoXnaCompactMaths/Vector3.cs deleted file mode 100644 index f2464157c6..0000000000 --- a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Vector3.cs +++ /dev/null @@ -1,620 +0,0 @@ -#region License -/* -MIT License -Copyright 2006 The Mono.Xna Team - -All rights reserved. - -Authors: - * Alan McGovern - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -#endregion License - -using System; -using System.ComponentModel; -using System.Text; -using System.Runtime.InteropServices; - -namespace MonoXnaCompactMaths -{ - [Serializable] - [StructLayout(LayoutKind.Sequential)] - //[TypeConverter(typeof(Vector3Converter))] - public struct Vector3 : IEquatable - { - #region Private Fields - - private static Vector3 zero = new Vector3(0f, 0f, 0f); - private static Vector3 one = new Vector3(1f, 1f, 1f); - private static Vector3 unitX = new Vector3(1f, 0f, 0f); - private static Vector3 unitY = new Vector3(0f, 1f, 0f); - private static Vector3 unitZ = new Vector3(0f, 0f, 1f); - private static Vector3 up = new Vector3(0f, 1f, 0f); - private static Vector3 down = new Vector3(0f, -1f, 0f); - private static Vector3 right = new Vector3(1f, 0f, 0f); - private static Vector3 left = new Vector3(-1f, 0f, 0f); - private static Vector3 forward = new Vector3(0f, 0f, -1f); - private static Vector3 backward = new Vector3(0f, 0f, 1f); - - #endregion Private Fields - - - #region Public Fields - - public float X; - public float Y; - public float Z; - - #endregion Public Fields - - - #region Properties - - public static Vector3 Zero - { - get { return zero; } - } - - public static Vector3 One - { - get { return one; } - } - - public static Vector3 UnitX - { - get { return unitX; } - } - - public static Vector3 UnitY - { - get { return unitY; } - } - - public static Vector3 UnitZ - { - get { return unitZ; } - } - - public static Vector3 Up - { - get { return up; } - } - - public static Vector3 Down - { - get { return down; } - } - - public static Vector3 Right - { - get { return right; } - } - - public static Vector3 Left - { - get { return left; } - } - - public static Vector3 Forward - { - get { return forward; } - } - - public static Vector3 Backward - { - get { return backward; } - } - - #endregion Properties - - - #region Constructors - - public Vector3(float x, float y, float z) - { - this.X = x; - this.Y = y; - this.Z = z; - } - - - public Vector3(float value) - { - this.X = value; - this.Y = value; - this.Z = value; - } - - - /*public Vector3(Vector2 value, float z) - { - this.X = value.X; - this.Y = value.Y; - this.Z = z; - }*/ - - - #endregion Constructors - - - #region Public Methods - - public static Vector3 Add(Vector3 value1, Vector3 value2) - { - value1.X += value2.X; - value1.Y += value2.Y; - value1.Z += value2.Z; - return value1; - } - - public static void Add(ref Vector3 value1, ref Vector3 value2, out Vector3 result) - { - result.X = value1.X + value2.X; - result.Y = value1.Y + value2.Y; - result.Z = value1.Z + value2.Z; - } - - /*public static Vector3 Barycentric(Vector3 value1, Vector3 value2, Vector3 value3, float amount1, float amount2) - { - return new Vector3( - MathHelper.Barycentric(value1.X, value2.X, value3.X, amount1, amount2), - MathHelper.Barycentric(value1.Y, value2.Y, value3.Y, amount1, amount2), - MathHelper.Barycentric(value1.Z, value2.Z, value3.Z, amount1, amount2)); - }*/ - - /*public static void Barycentric(ref Vector3 value1, ref Vector3 value2, ref Vector3 value3, float amount1, float amount2, out Vector3 result) - { - result = new Vector3( - MathHelper.Barycentric(value1.X, value2.X, value3.X, amount1, amount2), - MathHelper.Barycentric(value1.Y, value2.Y, value3.Y, amount1, amount2), - MathHelper.Barycentric(value1.Z, value2.Z, value3.Z, amount1, amount2)); - }*/ - - /*public static Vector3 CatmullRom(Vector3 value1, Vector3 value2, Vector3 value3, Vector3 value4, float amount) - { - return new Vector3( - MathHelper.CatmullRom(value1.X, value2.X, value3.X, value4.X, amount), - MathHelper.CatmullRom(value1.Y, value2.Y, value3.Y, value4.Y, amount), - MathHelper.CatmullRom(value1.Z, value2.Z, value3.Z, value4.Z, amount)); - }*/ - - /*public static void CatmullRom(ref Vector3 value1, ref Vector3 value2, ref Vector3 value3, ref Vector3 value4, float amount, out Vector3 result) - { - result = new Vector3( - MathHelper.CatmullRom(value1.X, value2.X, value3.X, value4.X, amount), - MathHelper.CatmullRom(value1.Y, value2.Y, value3.Y, value4.Y, amount), - MathHelper.CatmullRom(value1.Z, value2.Z, value3.Z, value4.Z, amount)); - }*/ - - /*public static Vector3 Clamp(Vector3 value1, Vector3 min, Vector3 max) - { - return new Vector3( - MathHelper.Clamp(value1.X, min.X, max.X), - MathHelper.Clamp(value1.Y, min.Y, max.Y), - MathHelper.Clamp(value1.Z, min.Z, max.Z)); - }*/ - - /*public static void Clamp(ref Vector3 value1, ref Vector3 min, ref Vector3 max, out Vector3 result) - { - result = new Vector3( - MathHelper.Clamp(value1.X, min.X, max.X), - MathHelper.Clamp(value1.Y, min.Y, max.Y), - MathHelper.Clamp(value1.Z, min.Z, max.Z)); - }*/ - - public static Vector3 Cross(Vector3 vector1, Vector3 vector2) - { - Cross(ref vector1, ref vector2, out vector1); - return vector1; - } - - public static void Cross(ref Vector3 vector1, ref Vector3 vector2, out Vector3 result) - { - result = new Vector3(vector1.Y * vector2.Z - vector2.Y * vector1.Z, - -(vector1.X * vector2.Z - vector2.X * vector1.Z), - vector1.X * vector2.Y - vector2.X * vector1.Y); - } - - public static float Distance(Vector3 vector1, Vector3 vector2) - { - float result; - DistanceSquared(ref vector1, ref vector2, out result); - return (float)Math.Sqrt(result); - } - - public static void Distance(ref Vector3 value1, ref Vector3 value2, out float result) - { - DistanceSquared(ref value1, ref value2, out result); - result = (float)Math.Sqrt(result); - } - - public static float DistanceSquared(Vector3 value1, Vector3 value2) - { - float result; - DistanceSquared(ref value1, ref value2, out result); - return result; - } - - public static void DistanceSquared(ref Vector3 value1, ref Vector3 value2, out float result) - { - result = (value1.X - value2.X) * (value1.X - value2.X) + - (value1.Y - value2.Y) * (value1.Y - value2.Y) + - (value1.Z - value2.Z) * (value1.Z - value2.Z); - } - - public static Vector3 Divide(Vector3 value1, Vector3 value2) - { - value1.X /= value2.X; - value1.Y /= value2.Y; - value1.Z /= value2.Z; - return value1; - } - - public static Vector3 Divide(Vector3 value1, float value2) - { - float factor = 1 / value2; - value1.X *= factor; - value1.Y *= factor; - value1.Z *= factor; - return value1; - } - - public static void Divide(ref Vector3 value1, float divisor, out Vector3 result) - { - float factor = 1 / divisor; - result.X = value1.X * factor; - result.Y = value1.Y * factor; - result.Z = value1.Z * factor; - } - - public static void Divide(ref Vector3 value1, ref Vector3 value2, out Vector3 result) - { - result.X = value1.X / value2.X; - result.Y = value1.Y / value2.Y; - result.Z = value1.Z / value2.Z; - } - - public static float Dot(Vector3 vector1, Vector3 vector2) - { - return vector1.X * vector2.X + vector1.Y * vector2.Y + vector1.Z * vector2.Z; - } - - public static void Dot(ref Vector3 vector1, ref Vector3 vector2, out float result) - { - result = vector1.X * vector2.X + vector1.Y * vector2.Y + vector1.Z * vector2.Z; - } - - public override bool Equals(object obj) - { - return (obj is Vector3) ? this == (Vector3)obj : false; - } - - public bool Equals(Vector3 other) - { - return this == other; - } - - public override int GetHashCode() - { - return (int)(this.X + this.Y + this.Z); - } - - /*public static Vector3 Hermite(Vector3 value1, Vector3 tangent1, Vector3 value2, Vector3 tangent2, float amount) - { - Vector3 result = new Vector3(); - Hermite(ref value1, ref tangent1, ref value2, ref tangent2, amount, out result); - return result; - }*/ - - /*public static void Hermite(ref Vector3 value1, ref Vector3 tangent1, ref Vector3 value2, ref Vector3 tangent2, float amount, out Vector3 result) - { - result.X = MathHelper.Hermite(value1.X, tangent1.X, value2.X, tangent2.X, amount); - result.Y = MathHelper.Hermite(value1.Y, tangent1.Y, value2.Y, tangent2.Y, amount); - result.Z = MathHelper.Hermite(value1.Z, tangent1.Z, value2.Z, tangent2.Z, amount); - }*/ - - public float Length() - { - float result; - DistanceSquared(ref this, ref zero, out result); - return (float)Math.Sqrt(result); - } - - public float LengthSquared() - { - float result; - DistanceSquared(ref this, ref zero, out result); - return result; - } - - /*public static Vector3 Lerp(Vector3 value1, Vector3 value2, float amount) - { - return new Vector3( - MathHelper.Lerp(value1.X, value2.X, amount), - MathHelper.Lerp(value1.Y, value2.Y, amount), - MathHelper.Lerp(value1.Z, value2.Z, amount)); - }*/ - - /*public static void Lerp(ref Vector3 value1, ref Vector3 value2, float amount, out Vector3 result) - { - result = new Vector3( - MathHelper.Lerp(value1.X, value2.X, amount), - MathHelper.Lerp(value1.Y, value2.Y, amount), - MathHelper.Lerp(value1.Z, value2.Z, amount)); - }*/ - - /*public static Vector3 Max(Vector3 value1, Vector3 value2) - { - return new Vector3( - MathHelper.Max(value1.X, value2.X), - MathHelper.Max(value1.Y, value2.Y), - MathHelper.Max(value1.Z, value2.Z)); - }*/ - - /*public static void Max(ref Vector3 value1, ref Vector3 value2, out Vector3 result) - { - result = new Vector3( - MathHelper.Max(value1.X, value2.X), - MathHelper.Max(value1.Y, value2.Y), - MathHelper.Max(value1.Z, value2.Z)); - }*/ - - /*public static Vector3 Min(Vector3 value1, Vector3 value2) - { - return new Vector3( - MathHelper.Min(value1.X, value2.X), - MathHelper.Min(value1.Y, value2.Y), - MathHelper.Min(value1.Z, value2.Z)); - }*/ - - /*public static void Min(ref Vector3 value1, ref Vector3 value2, out Vector3 result) - { - result = new Vector3( - MathHelper.Min(value1.X, value2.X), - MathHelper.Min(value1.Y, value2.Y), - MathHelper.Min(value1.Z, value2.Z)); - }*/ - - public static Vector3 Multiply(Vector3 value1, Vector3 value2) - { - value1.X *= value2.X; - value1.Y *= value2.Y; - value1.Z *= value2.Z; - return value1; - } - - public static Vector3 Multiply(Vector3 value1, float scaleFactor) - { - value1.X *= scaleFactor; - value1.Y *= scaleFactor; - value1.Z *= scaleFactor; - return value1; - } - - public static void Multiply(ref Vector3 value1, float scaleFactor, out Vector3 result) - { - result.X = value1.X * scaleFactor; - result.Y = value1.Y * scaleFactor; - result.Z = value1.Z * scaleFactor; - } - - public static void Multiply(ref Vector3 value1, ref Vector3 value2, out Vector3 result) - { - result.X = value1.X * value2.X; - result.Y = value1.Y * value2.Y; - result.Z = value1.Z * value2.Z; - } - - public static Vector3 Negate(Vector3 value) - { - value = new Vector3(-value.X, -value.Y, -value.Z); - return value; - } - - public static void Negate(ref Vector3 value, out Vector3 result) - { - result = new Vector3(-value.X, -value.Y, -value.Z); - } - - public void Normalize() - { - Normalize(ref this, out this); - } - - public static Vector3 Normalize(Vector3 vector) - { - Normalize(ref vector, out vector); - return vector; - } - - public static void Normalize(ref Vector3 value, out Vector3 result) - { - float factor; - Distance(ref value, ref zero, out factor); - factor = 1f / factor; - result.X = value.X * factor; - result.Y = value.Y * factor; - result.Z = value.Z * factor; - } - - public static Vector3 Reflect(Vector3 vector, Vector3 normal) - { - throw new NotImplementedException(); - } - - public static void Reflect(ref Vector3 vector, ref Vector3 normal, out Vector3 result) - { - throw new NotImplementedException(); - } - - /*public static Vector3 SmoothStep(Vector3 value1, Vector3 value2, float amount) - { - return new Vector3( - MathHelper.SmoothStep(value1.X, value2.X, amount), - MathHelper.SmoothStep(value1.Y, value2.Y, amount), - MathHelper.SmoothStep(value1.Z, value2.Z, amount)); - }*/ - - /*public static void SmoothStep(ref Vector3 value1, ref Vector3 value2, float amount, out Vector3 result) - { - result = new Vector3( - MathHelper.SmoothStep(value1.X, value2.X, amount), - MathHelper.SmoothStep(value1.Y, value2.Y, amount), - MathHelper.SmoothStep(value1.Z, value2.Z, amount)); - }*/ - - public static Vector3 Subtract(Vector3 value1, Vector3 value2) - { - value1.X -= value2.X; - value1.Y -= value2.Y; - value1.Z -= value2.Z; - return value1; - } - - public static void Subtract(ref Vector3 value1, ref Vector3 value2, out Vector3 result) - { - result.X = value1.X - value2.X; - result.Y = value1.Y - value2.Y; - result.Z = value1.Z - value2.Z; - } - - public override string ToString() - { - StringBuilder sb = new StringBuilder(32); - sb.Append("{X:"); - sb.Append(this.X); - sb.Append(" Y:"); - sb.Append(this.Y); - sb.Append(" Z:"); - sb.Append(this.Z); - sb.Append("}"); - return sb.ToString(); - } - - public static Vector3 Transform(Vector3 position, Matrix matrix) - { - Transform(ref position, ref matrix, out position); - return position; - } - - public static void Transform(ref Vector3 position, ref Matrix matrix, out Vector3 result) - { - result = new Vector3((position.X * matrix.M11) + (position.Y * matrix.M21) + (position.Z * matrix.M31) + matrix.M41, - (position.X * matrix.M12) + (position.Y * matrix.M22) + (position.Z * matrix.M32) + matrix.M42, - (position.X * matrix.M13) + (position.Y * matrix.M23) + (position.Z * matrix.M33) + matrix.M43); - } - - public static Vector3 TransformNormal(Vector3 normal, Matrix matrix) - { - TransformNormal(ref normal, ref matrix, out normal); - return normal; - } - - public static void TransformNormal(ref Vector3 normal, ref Matrix matrix, out Vector3 result) - { - result = new Vector3((normal.X * matrix.M11) + (normal.Y * matrix.M21) + (normal.Z * matrix.M31), - (normal.X * matrix.M12) + (normal.Y * matrix.M22) + (normal.Z * matrix.M32), - (normal.X * matrix.M13) + (normal.Y * matrix.M23) + (normal.Z * matrix.M33)); - } - - #endregion Public methods - - - #region Operators - - public static bool operator ==(Vector3 value1, Vector3 value2) - { - return value1.X == value2.X - && value1.Y == value2.Y - && value1.Z == value2.Z; - } - - public static bool operator !=(Vector3 value1, Vector3 value2) - { - return !(value1 == value2); - } - - public static Vector3 operator +(Vector3 value1, Vector3 value2) - { - value1.X += value2.X; - value1.Y += value2.Y; - value1.Z += value2.Z; - return value1; - } - - public static Vector3 operator -(Vector3 value) - { - value = new Vector3(-value.X, -value.Y, -value.Z); - return value; - } - - public static Vector3 operator -(Vector3 value1, Vector3 value2) - { - value1.X -= value2.X; - value1.Y -= value2.Y; - value1.Z -= value2.Z; - return value1; - } - - public static Vector3 operator *(Vector3 value1, Vector3 value2) - { - value1.X *= value2.X; - value1.Y *= value2.Y; - value1.Z *= value2.Z; - return value1; - } - - public static Vector3 operator *(Vector3 value, float scaleFactor) - { - value.X *= scaleFactor; - value.Y *= scaleFactor; - value.Z *= scaleFactor; - return value; - } - - public static Vector3 operator *(float scaleFactor, Vector3 value) - { - value.X *= scaleFactor; - value.Y *= scaleFactor; - value.Z *= scaleFactor; - return value; - } - - public static Vector3 operator /(Vector3 value1, Vector3 value2) - { - value1.X /= value2.X; - value1.Y /= value2.Y; - value1.Z /= value2.Z; - return value1; - } - - public static Vector3 operator /(Vector3 value, float divider) - { - float factor = 1 / divider; - value.X *= factor; - value.Y *= factor; - value.Z *= factor; - return value; - } - - #endregion - } -} diff --git a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Vector4.cs b/libraries/ModifiedBulletX/MonoXnaCompactMaths/Vector4.cs deleted file mode 100644 index abb30a8aa2..0000000000 --- a/libraries/ModifiedBulletX/MonoXnaCompactMaths/Vector4.cs +++ /dev/null @@ -1,630 +0,0 @@ -#region License -/* -MIT License -Copyright 2006 The Mono.Xna Team - -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -#endregion License - -using System; -using System.ComponentModel; -using System.Text; -using System.Runtime.InteropServices; - -namespace MonoXnaCompactMaths -{ - [Serializable] - [StructLayout(LayoutKind.Sequential)] - //[TypeConverter(typeof(Vector4Converter))] - public struct Vector4 : IEquatable - { - #region Private Fields - - private static Vector4 zeroVector = new Vector4(); - private static Vector4 unitVector = new Vector4(1f, 1f, 1f, 1f); - private static Vector4 unitXVector = new Vector4(1f, 0f, 0f, 0f); - private static Vector4 unitYVector = new Vector4(0f, 1f, 0f, 0f); - private static Vector4 unitZVector = new Vector4(0f, 0f, 1f, 0f); - private static Vector4 unitWVector = new Vector4(0f, 0f, 0f, 1f); - - #endregion Private Fields - - - #region Public Fields - - public float X; - public float Y; - public float Z; - public float W; - - #endregion Public Fields - - - #region Properties - - public static Vector4 Zero - { - get { return zeroVector; } - } - - public static Vector4 One - { - get { return unitVector; } - } - - public static Vector4 UnitX - { - get { return unitXVector; } - } - - public static Vector4 UnitY - { - get { return unitYVector; } - } - - public static Vector4 UnitZ - { - get { return unitZVector; } - } - - public static Vector4 UnitW - { - get { return unitWVector; } - } - - #endregion Properties - - - #region Constructors - - public Vector4(float x, float y, float z, float w) - { - this.X = x; - this.Y = y; - this.Z = z; - this.W = w; - } - - /*public Vector4(Vector2 value, float z, float w) - { - this.X = value.X; - this.Y = value.Y; - this.Z = z; - this.W = w; - }*/ - - public Vector4(Vector3 value, float w) - { - this.X = value.X; - this.Y = value.Y; - this.Z = value.Z; - this.W = w; - } - - public Vector4(float value) - { - this.X = value; - this.Y = value; - this.Z = value; - this.W = value; - } - - #endregion - - - #region Public Methods - - public static Vector4 Add(Vector4 value1, Vector4 value2) - { - value1.W += value2.W; - value1.X += value2.X; - value1.Y += value2.Y; - value1.Z += value2.Z; - return value1; - } - - public static void Add(ref Vector4 value1, ref Vector4 value2, out Vector4 result) - { - result.W = value1.W + value2.W; - result.X = value1.X + value2.X; - result.Y = value1.Y + value2.Y; - result.Z = value1.Z + value2.Z; - } - - /*public static Vector4 Barycentric(Vector4 value1, Vector4 value2, Vector4 value3, float amount1, float amount2) - { - return new Vector4( - MathHelper.Barycentric(value1.X, value2.X, value3.X, amount1, amount2), - MathHelper.Barycentric(value1.Y, value2.Y, value3.Y, amount1, amount2), - MathHelper.Barycentric(value1.Z, value2.Z, value3.Z, amount1, amount2), - MathHelper.Barycentric(value1.W, value2.W, value3.W, amount1, amount2)); - }*/ - - /*public static void Barycentric(ref Vector4 value1, ref Vector4 value2, ref Vector4 value3, float amount1, float amount2, out Vector4 result) - { - result = new Vector4( - MathHelper.Barycentric(value1.X, value2.X, value3.X, amount1, amount2), - MathHelper.Barycentric(value1.Y, value2.Y, value3.Y, amount1, amount2), - MathHelper.Barycentric(value1.Z, value2.Z, value3.Z, amount1, amount2), - MathHelper.Barycentric(value1.W, value2.W, value3.W, amount1, amount2)); - }*/ - - /*public static Vector4 CatmullRom(Vector4 value1, Vector4 value2, Vector4 value3, Vector4 value4, float amount) - { - return new Vector4( - MathHelper.CatmullRom(value1.X, value2.X, value3.X, value4.X, amount), - MathHelper.CatmullRom(value1.Y, value2.Y, value3.Y, value4.Y, amount), - MathHelper.CatmullRom(value1.Z, value2.Z, value3.Z, value4.Z, amount), - MathHelper.CatmullRom(value1.W, value2.W, value3.W, value4.W, amount)); - }*/ - - /*public static void CatmullRom(ref Vector4 value1, ref Vector4 value2, ref Vector4 value3, ref Vector4 value4, float amount, out Vector4 result) - { - result = new Vector4( - MathHelper.CatmullRom(value1.X, value2.X, value3.X, value4.X, amount), - MathHelper.CatmullRom(value1.Y, value2.Y, value3.Y, value4.Y, amount), - MathHelper.CatmullRom(value1.Z, value2.Z, value3.Z, value4.Z, amount), - MathHelper.CatmullRom(value1.W, value2.W, value3.W, value4.W, amount)); - }*/ - - /*public static Vector4 Clamp(Vector4 value1, Vector4 min, Vector4 max) - { - return new Vector4( - MathHelper.Clamp(value1.X, min.X, max.X), - MathHelper.Clamp(value1.Y, min.Y, max.Y), - MathHelper.Clamp(value1.Z, min.Z, max.Z), - MathHelper.Clamp(value1.W, min.W, max.W)); - }*/ - - /*public static void Clamp(ref Vector4 value1, ref Vector4 min, ref Vector4 max, out Vector4 result) - { - result = new Vector4( - MathHelper.Clamp(value1.X, min.X, max.X), - MathHelper.Clamp(value1.Y, min.Y, max.Y), - MathHelper.Clamp(value1.Z, min.Z, max.Z), - MathHelper.Clamp(value1.W, min.W, max.W)); - }*/ - - public static float Distance(Vector4 value1, Vector4 value2) - { - return (float)Math.Sqrt(DistanceSquared(value1, value2)); - } - - public static void Distance(ref Vector4 value1, ref Vector4 value2, out float result) - { - result = (float)Math.Sqrt(DistanceSquared(value1, value2)); - } - - public static float DistanceSquared(Vector4 value1, Vector4 value2) - { - float result; - DistanceSquared(ref value1, ref value2, out result); - return result; - } - - public static void DistanceSquared(ref Vector4 value1, ref Vector4 value2, out float result) - { - result = (value1.W - value2.W) * (value1.W - value2.W) + - (value1.X - value2.X) * (value1.X - value2.X) + - (value1.Y - value2.Y) * (value1.Y - value2.Y) + - (value1.Z - value2.Z) * (value1.Z - value2.Z); - } - - public static Vector4 Divide(Vector4 value1, Vector4 value2) - { - value1.W /= value2.W; - value1.X /= value2.X; - value1.Y /= value2.Y; - value1.Z /= value2.Z; - return value1; - } - - public static Vector4 Divide(Vector4 value1, float divider) - { - float factor = 1f / divider; - value1.W *= factor; - value1.X *= factor; - value1.Y *= factor; - value1.Z *= factor; - return value1; - } - - public static void Divide(ref Vector4 value1, float divider, out Vector4 result) - { - float factor = 1f / divider; - result.W = value1.W * factor; - result.X = value1.X * factor; - result.Y = value1.Y * factor; - result.Z = value1.Z * factor; - } - - public static void Divide(ref Vector4 value1, ref Vector4 value2, out Vector4 result) - { - result.W = value1.W / value2.W; - result.X = value1.X / value2.X; - result.Y = value1.Y / value2.Y; - result.Z = value1.Z / value2.Z; - } - - public static float Dot(Vector4 vector1, Vector4 vector2) - { - return vector1.X * vector2.X + vector1.Y * vector2.Y + vector1.Z * vector2.Z + vector1.W * vector2.W; - } - - public static void Dot(ref Vector4 vector1, ref Vector4 vector2, out float result) - { - result = vector1.X * vector2.X + vector1.Y * vector2.Y + vector1.Z * vector2.Z + vector1.W * vector2.W; - } - - public override bool Equals(object obj) - { - return (obj is Vector4) ? this == (Vector4)obj : false; - } - - public bool Equals(Vector4 other) - { - return this.W == other.W - && this.X == other.X - && this.Y == other.Y - && this.Z == other.Z; - } - - public override int GetHashCode() - { - return (int)(this.W + this.X + this.Y + this.Y); - } - - /*public static Vector4 Hermite(Vector4 value1, Vector4 tangent1, Vector4 value2, Vector4 tangent2, float amount) - { - Vector4 result = new Vector4(); - Hermite(ref value1, ref tangent1, ref value2, ref tangent2, amount, out result); - return result; - }*/ - - /*public static void Hermite(ref Vector4 value1, ref Vector4 tangent1, ref Vector4 value2, ref Vector4 tangent2, float amount, out Vector4 result) - { - result.W = MathHelper.Hermite(value1.W, tangent1.W, value2.W, tangent2.W, amount); - result.X = MathHelper.Hermite(value1.X, tangent1.X, value2.X, tangent2.X, amount); - result.Y = MathHelper.Hermite(value1.Y, tangent1.Y, value2.Y, tangent2.Y, amount); - result.Z = MathHelper.Hermite(value1.Z, tangent1.Z, value2.Z, tangent2.Z, amount); - }*/ - - public float Length() - { - float result; - DistanceSquared(ref this, ref zeroVector, out result); - return (float)Math.Sqrt(result); - } - - public float LengthSquared() - { - float result; - DistanceSquared(ref this, ref zeroVector, out result); - return result; - } - - /*public static Vector4 Lerp(Vector4 value1, Vector4 value2, float amount) - { - return new Vector4( - MathHelper.Lerp(value1.X, value2.X, amount), - MathHelper.Lerp(value1.Y, value2.Y, amount), - MathHelper.Lerp(value1.Z, value2.Z, amount), - MathHelper.Lerp(value1.W, value2.W, amount)); - }*/ - - /*public static void Lerp(ref Vector4 value1, ref Vector4 value2, float amount, out Vector4 result) - { - result = new Vector4( - MathHelper.Lerp(value1.X, value2.X, amount), - MathHelper.Lerp(value1.Y, value2.Y, amount), - MathHelper.Lerp(value1.Z, value2.Z, amount), - MathHelper.Lerp(value1.W, value2.W, amount)); - }*/ - - /*public static Vector4 Max(Vector4 value1, Vector4 value2) - { - return new Vector4( - MathHelper.Max(value1.X, value2.X), - MathHelper.Max(value1.Y, value2.Y), - MathHelper.Max(value1.Z, value2.Z), - MathHelper.Max(value1.W, value2.W)); - }*/ - - /*public static void Max(ref Vector4 value1, ref Vector4 value2, out Vector4 result) - { - result = new Vector4( - MathHelper.Max(value1.X, value2.X), - MathHelper.Max(value1.Y, value2.Y), - MathHelper.Max(value1.Z, value2.Z), - MathHelper.Max(value1.W, value2.W)); - }*/ - - /*public static Vector4 Min(Vector4 value1, Vector4 value2) - { - return new Vector4( - MathHelper.Min(value1.X, value2.X), - MathHelper.Min(value1.Y, value2.Y), - MathHelper.Min(value1.Z, value2.Z), - MathHelper.Min(value1.W, value2.W)); - }*/ - - /*public static void Min(ref Vector4 value1, ref Vector4 value2, out Vector4 result) - { - result = new Vector4( - MathHelper.Min(value1.X, value2.X), - MathHelper.Min(value1.Y, value2.Y), - MathHelper.Min(value1.Z, value2.Z), - MathHelper.Min(value1.W, value2.W)); - }*/ - - public static Vector4 Multiply(Vector4 value1, Vector4 value2) - { - value1.W *= value2.W; - value1.X *= value2.X; - value1.Y *= value2.Y; - value1.Z *= value2.Z; - return value1; - } - - public static Vector4 Multiply(Vector4 value1, float scaleFactor) - { - value1.W *= scaleFactor; - value1.X *= scaleFactor; - value1.Y *= scaleFactor; - value1.Z *= scaleFactor; - return value1; - } - - public static void Multiply(ref Vector4 value1, float scaleFactor, out Vector4 result) - { - result.W = value1.W * scaleFactor; - result.X = value1.X * scaleFactor; - result.Y = value1.Y * scaleFactor; - result.Z = value1.Z * scaleFactor; - } - - public static void Multiply(ref Vector4 value1, ref Vector4 value2, out Vector4 result) - { - result.W = value1.W * value2.W; - result.X = value1.X * value2.X; - result.Y = value1.Y * value2.Y; - result.Z = value1.Z * value2.Z; - } - - public static Vector4 Negate(Vector4 value) - { - value = new Vector4(-value.X, -value.Y, -value.Z, -value.W); - return value; - } - - public static void Negate(ref Vector4 value, out Vector4 result) - { - result = new Vector4(-value.X, -value.Y, -value.Z,-value.W); - } - - public void Normalize() - { - Normalize(ref this, out this); - } - - public static Vector4 Normalize(Vector4 vector) - { - Normalize(ref vector, out vector); - return vector; - } - - public static void Normalize(ref Vector4 vector, out Vector4 result) - { - float factor; - DistanceSquared(ref vector, ref zeroVector, out factor); - factor = 1f / (float)Math.Sqrt(factor); - - result.W = vector.W * factor; - result.X = vector.X * factor; - result.Y = vector.Y * factor; - result.Z = vector.Z * factor; - } - - /*public static Vector4 SmoothStep(Vector4 value1, Vector4 value2, float amount) - { - return new Vector4( - MathHelper.SmoothStep(value1.X, value2.X, amount), - MathHelper.SmoothStep(value1.Y, value2.Y, amount), - MathHelper.SmoothStep(value1.Z, value2.Z, amount), - MathHelper.SmoothStep(value1.W, value2.W, amount)); - }*/ - - /*public static void SmoothStep(ref Vector4 value1, ref Vector4 value2, float amount, out Vector4 result) - { - result = new Vector4( - MathHelper.SmoothStep(value1.X, value2.X, amount), - MathHelper.SmoothStep(value1.Y, value2.Y, amount), - MathHelper.SmoothStep(value1.Z, value2.Z, amount), - MathHelper.SmoothStep(value1.W, value2.W, amount)); - }*/ - - public static Vector4 Subtract(Vector4 value1, Vector4 value2) - { - value1.W -= value2.W; - value1.X -= value2.X; - value1.Y -= value2.Y; - value1.Z -= value2.Z; - return value1; - } - - public static void Subtract(ref Vector4 value1, ref Vector4 value2, out Vector4 result) - { - result.W = value1.W - value2.W; - result.X = value1.X - value2.X; - result.Y = value1.Y - value2.Y; - result.Z = value1.Z - value2.Z; - } - - /*public static Vector4 Transform(Vector2 position, Matrix matrix) - { - Vector4 result; - Transform(ref position, ref matrix, out result); - return result; - }*/ - - public static Vector4 Transform(Vector3 position, Matrix matrix) - { - Vector4 result; - Transform(ref position, ref matrix, out result); - return result; - } - - public static Vector4 Transform(Vector4 vector, Matrix matrix) - { - Transform(ref vector, ref matrix, out vector); - return vector; - } - - /*public static void Transform(ref Vector2 position, ref Matrix matrix, out Vector4 result) - { - result = new Vector4((position.X * matrix.M11) + (position.Y * matrix.M21) + matrix.M41, - (position.X * matrix.M12) + (position.Y * matrix.M22) + matrix.M42, - (position.X * matrix.M13) + (position.Y * matrix.M23) + matrix.M43, - (position.X * matrix.M14) + (position.Y * matrix.M24) + matrix.M44); - }*/ - - public static void Transform(ref Vector3 position, ref Matrix matrix, out Vector4 result) - { - result = new Vector4((position.X * matrix.M11) + (position.Y * matrix.M21) + (position.Z * matrix.M31) + matrix.M41, - (position.X * matrix.M12) + (position.Y * matrix.M22) + (position.Z * matrix.M32) + matrix.M42, - (position.X * matrix.M13) + (position.Y * matrix.M23) + (position.Z * matrix.M33) + matrix.M43, - (position.X * matrix.M14) + (position.Y * matrix.M24) + (position.Z * matrix.M34) + matrix.M44); - } - - public static void Transform(ref Vector4 vector, ref Matrix matrix, out Vector4 result) - { - result = new Vector4((vector.X * matrix.M11) + (vector.Y * matrix.M21) + (vector.Z * matrix.M31) + (vector.W * matrix.M41), - (vector.X * matrix.M12) + (vector.Y * matrix.M22) + (vector.Z * matrix.M32) + (vector.W * matrix.M42), - (vector.X * matrix.M13) + (vector.Y * matrix.M23) + (vector.Z * matrix.M33) + (vector.W * matrix.M43), - (vector.X * matrix.M14) + (vector.Y * matrix.M24) + (vector.Z * matrix.M34) + (vector.W * matrix.M44)); - } - - public override string ToString() - { - StringBuilder sb = new StringBuilder(32); - sb.Append("{X:"); - sb.Append(this.X); - sb.Append(" Y:"); - sb.Append(this.Y); - sb.Append(" Z:"); - sb.Append(this.Z); - sb.Append(" W:"); - sb.Append(this.W); - sb.Append("}"); - return sb.ToString(); - } - - #endregion Public Methods - - - #region Operators - - public static Vector4 operator -(Vector4 value) - { - return new Vector4(-value.X, -value.Y, -value.Z, -value.W); - } - - public static bool operator ==(Vector4 value1, Vector4 value2) - { - return value1.W == value2.W - && value1.X == value2.X - && value1.Y == value2.Y - && value1.Z == value2.Z; - } - - public static bool operator !=(Vector4 value1, Vector4 value2) - { - return !(value1 == value2); - } - - public static Vector4 operator +(Vector4 value1, Vector4 value2) - { - value1.W += value2.W; - value1.X += value2.X; - value1.Y += value2.Y; - value1.Z += value2.Z; - return value1; - } - - public static Vector4 operator -(Vector4 value1, Vector4 value2) - { - value1.W -= value2.W; - value1.X -= value2.X; - value1.Y -= value2.Y; - value1.Z -= value2.Z; - return value1; - } - - public static Vector4 operator *(Vector4 value1, Vector4 value2) - { - value1.W *= value2.W; - value1.X *= value2.X; - value1.Y *= value2.Y; - value1.Z *= value2.Z; - return value1; - } - - public static Vector4 operator *(Vector4 value1, float scaleFactor) - { - value1.W *= scaleFactor; - value1.X *= scaleFactor; - value1.Y *= scaleFactor; - value1.Z *= scaleFactor; - return value1; - } - - public static Vector4 operator *(float scaleFactor, Vector4 value1) - { - value1.W *= scaleFactor; - value1.X *= scaleFactor; - value1.Y *= scaleFactor; - value1.Z *= scaleFactor; - return value1; - } - - public static Vector4 operator /(Vector4 value1, Vector4 value2) - { - value1.W /= value2.W; - value1.X /= value2.X; - value1.Y /= value2.Y; - value1.Z /= value2.Z; - return value1; - } - - public static Vector4 operator /(Vector4 value1, float divider) - { - float factor = 1f / divider; - value1.W *= factor; - value1.X *= factor; - value1.Y *= factor; - value1.Z *= factor; - return value1; - } - - #endregion Operators - } -} diff --git a/libraries/ode-0.9/CHANGELOG.txt b/libraries/ode-0.9/CHANGELOG.txt deleted file mode 100644 index a2baf4e67f..0000000000 --- a/libraries/ode-0.9/CHANGELOG.txt +++ /dev/null @@ -1,467 +0,0 @@ -ODE CHANGELOG -------------- - -the rules for this file: - * entries are sorted newest-first. - * summarize sets of changes - dont reproduce every CVS log comment here. - * don't ever delete anything. - * keep the format consistent (79 char width, M/D/Y date format). - ------------------------------------------------------------------------------- - -11/03/06 david - - * Integrated Christoph Beyer's average based sampling system for body - disabling. - -10/26/06 Francisco Leon - - * Totally refactored trimesh collision system. - Using GIMPACT instead of OPCODE. Now works correctly, and faster. - Visit http://gimpact.sourceforge.net. - - * Finally, test_moving_trimesh.exe works nicely. - - * Fixed autodisable system. Now is possible to set bigger sleeping - threshold values and objects won't be sleeping on the air. They will - rest on the floor properly. - - * dInitODE function added. - - * Is Obligatory to call dInitODE() at the beginning for initialize ODE, - and calling dCloseODE() when the program ends. - -09/20/06 bram - - * Fixed two bugs in cyl/plane collision test. - -09/13/06 remi - - * New Rotoide - Prismatic joint type - * dJointGetUniversalAngles for efficient angle retrieval. - -08/09/06 david - - * Integrated plane2d joint type which constrains bodies to z == 0. - -07/06/06 david - - * Added heightfield primitive collision code. Simple test available in - ode/test/test_heightfield - -04/03/06 rodrigo - - * Added Convex primitive collision code, - currently only convex-sphere and convex-plane work - -04/01/06 bram - - * Added program to test trimesh vs sphere: ode/test/test_basket - -03/20/06 jason379 - - * Added new autogenerated Visual Studio projects, with Premake scripts - -03/17/06 bram - - * Added plane/cyl intersection test - * Renamed CCylinder to Capsule - -02/04/06 gcarlton - - * Added support for geom offsets. - -10/26/05 rodrigo - - * Removed LIBTOOL from autotools since it was not really required. - * Added a target to build ODE as a shared library, this shared - library gets build alongside the static one, no flags required. - -10/24/05 tfautre - - (Backported patches from STABLE branch, applied by Adam) - - * dRandInt changed for a non-double all-int version. - * mics minor fixes and improvements. - -04/05/05 tfautre - - * Fixed segmentation fault with OPCODE on 64 bits systems. - -03/31/05 tfautre - - * Fixed timer.cpp compiler error on x86-64 using GCC. - -03/29/05 colin - - * Added trimesh preprocessing to mark unneeded edges and verts. Also - added support for preprocessed info to the ccylinder-trimesh - collider. - -12/07/04 adam - - * Important AMotors bugfix - -09/22/04 jeff - - * Assorted small bugfixes and tweaks for - trimesh_{box,ccylinder,trimesh} collisions - -09/21/04 jeff - - * added functions to joint.cpp to allow joint attachment to moving - geoms. - - * added malloc-based memory allocation in step.cpp & lcp.cpp (turned - on with a #define switch in common.h) - -05/29/04 russ - - * added joint feedback to the QuickStep solver - -05/18/04 russ - - * added warm starting to the QuickStep solver - -05/18/04 russ - - * added the QuickStep solver - - * added contact parameter functions. - -05/05/04 adam - - * use dRandInt instead of rand() in stepfast. - -04/21/04 russ - - * added auto-disable support from Aras Pranckevicius (with - modifications by russ). this useful feature can speed up - simulation significantly in some cases. - - * various internal tidyups. - -04/20/04 russ - - * changed the meaning of the 'index' argument to dJointGetBody(): - it was the only remaining API function that does not respect - dJOINT_REVERSE (spotted by Matthew D. Hancher). - - * updated the C++ headers: fixed two minor bugs and added - support for dQuadTreeSpace, dRay, and the dGeom::getSpace() method - (from Matthew D. Hancher). - -04/18/04 russ - - * changed the way that the dInfinity constant is implemented: now it - is #defined to be one of: FLT_MAX, DBL_MAX, HUGE_VAL, HUGE_VALF, or - a large numeric constant. previously it was a variable that was - exported from the library. this simplifies the configuration and - build process quite a bit, especially in the case of DLLs. - - * removed the old, deprecated collision system (geom.cpp,space.cpp, - geom.h,space.h,odecpp_old_collision.h). the ODE_OLD_COLLISION - configuration setting no longer has any meaning. - - * removed support for dGeomGroups, which have been deprecated for - a while and are equivalent to 'spaces' anyway. - -04/13/04 russ - - * bug fix in dMassSetCappedCylinder(), from Matthew D. Hancher. - -04/08/04 russ - - * added trimesh-CCylinder capability, from Vadim Macagon - . - -04/04/04 adam - - * yet another rewrite of triangle-box collision code, this - time based on code donated by Croteam, ported by asko@jetti.org - and tweaked by Erwin. - -04/04/04 adam - - * merged trimesh-trimesh collision code by - Jeffrey Smith . - - * changed it to not break the trimesh interface, fix - some GCC compilation problems, bring it up to date with - ODE changes from 2003-11-15 -> 2004-04-04. - - * add ability to drop meshes on meshes in test_moving_trimesh, - not as good as it could be but it's illustrative. - -01/16/04 adam - - * implement a bunch of ultra-simple TriMesh functions that were - in the headers but not in the code -- patch by - Vadim Macagon - - * disable temporal coherence on trimeshes by default, since - it has scaleability issues that don't make it a general clear win. - -12/01/03 adam - - * implement dxHashSpace::collide2(), not particularly efficiently. - -11/14/03 adam - - * applied several Trimesh fixes and improvements from - Aras Pranckevicius - -10/22/03 adam - - * apply Nguyen Binh's work for removing many dSetZero() calls - and some other extraneous initializations. - -07/29/03 martin - - * added dJointAdd*Torque/Force(). - -07/10/03 russ - - * added the StepFast code, by David Whittaker. - -07/02/03 martin - - * added dMassSet*Total(). - -07/01/03 martin - - * added joint limits and motors to universal joints. - - * reversed the polarity of the dJOINT_REVERSE flag. - -06/30/03 russ - - * added the TriMesh geom class and the quad tree space to the ODE - core. both of these were developed by Erwin de Vries. added OPCODE - to the ODE distribution, this is required by TriMesh. - -06/23/03 martin - - * added dGeomSetQuaternion() and dGeomGetQuaternion() - - * added dJointGet*Anchor2() - -05/07/03 russ - - * added dGeomGetSpace(). - -02/05/03 russ - - * added dMassSetCylinder(). - -12/07/02 russ - - * added dAreConnectedExcluding(). - -11/30/02 russ - - * added the ray geom class. - - * added the dGeomXXXPointDepth() functions. - - * added a collision test infrastructure, and some more tests. - -11/24/02 russ - - * added support for multiple box-box contacts. - -11/10/02 russ - - * added new collision system. select between the old/new system by - setting the ODE_OLD_COLLISION variable in config/user-settings. - -10/28/02 russ - - * fixed two problems in the LCP code to improve the reliability of - the dContactApprox1 contact mode. - - * added a FAQ question about rolling bodies getting stuck when they - hit multiple geoms. - -09/08/02 russ - - * added dClosestLineSegmentPoints(). - * implemented dCollideCB(). - -08/28/02 russ - - * added dJointSetFeedback() and dJointGetFeedback(). - -08/05/02 russ - - * added dGeomTransformSetInfo() and dGeomTransformGetInfo(). - -07/13/02 russ - - * added dBodySetForce(), dBodySetTorque(), dWorldImpulseToForce(), - dBodyGetPosRelPoint(), dBodyGetPosRelPoint(), dBodyVectorToWorld(), - dBodyVectorFromWorld(). - - * added dBodyGetPointVel() (thanks to Colin Reed). - - * added a new C++ interface (from Martin C. Martin, with modifications - by russ). the old C++ interface is now in odecpp_old.h. - -06/25/02 russ - - * added an additional BSD-style licensing option for ODE. - -06/23/02 russ - - * added dCloseODE(), contributed by Nate Waddoups and David McClurg. - -05/16/02 russ - - * added dSpaceQuery(), contributed by Nate Waddoups. - -04/07/02 russ - - * added a section to the documentation for universal joints. - this includes a picture of the joint. - -04/05/02 russ - - * added a universal joint class (generously contributed by - Martin C. Martin). it doesn't (yet) have a motor or joint limits, - but it does come with tests. - -03/11/02 russ - - * makefile changes to accomodate OSs with command line length - limitations (thanks to Norman Lin). - -01/06/02 russ - - * added the dBodySetGravityMode() and dBodyGetGravityMode() - functions, which change the dxBodyNoGravity body flag. - - * added support for building a DLL with MSVC - there is now a - msvc-dll target. thanks to Norman Lin for doing this. - -12/28/01 russ - - * added the dParamCFM joint parameter. - -12/24/01 russ - - * reworked the build system to make it more cross-platform. - there is now a single top-level makefile and a configurator.c - program. see the INSTALL file for details. - -12/04/01 russ - - * the "angular motor" joint has been completed, and a new section - has been added to the documentation. - -11/26/01 russ - - * added a new joint type: "angular motor". using this joint is a good - way to get ball-joint motors and limits. this is work in progress - - it has not been fully implemented or tested yet. - -11/22/01 russ - - * replaced the mmap()-based joint group stack (stack.cpp) with a - malloc()-based arena stack (obstack.cpp). this will be more - portable and should not impact performance. - -11/12/01 russ - - * changed the meaning of the 'flags' parameter to dCollide() and - related functions: now the size of the contact buffer is kept in - the lower 16 bits. this change will be backward compatible. - - * added dBodyGetFiniteRotationMode() and dBodyGetFiniteRotationAxis(). - - * added dBodyAddForceAtRelPos() function. - -11/11/01 russ - - * added the ability to manually enable and disable bodies. - see dBodyEnable(), dBodyDisable(), dBodyIsEnabled(). - - * fixed a potential bug: when a world is destroyed that contains - joints in joint groups, those joints are marked as "deactivated" in - the joint group, so when the joint group is destroyed they can be - ignored. - - * the test_boxstack demo has new options to enable and disable bodies. - - * new configuration parameter in config.h: dEFFICIENT_SIZE. - -11/11/01 russ - - * started the change log for ODE. changes older than today were added - to this file by inspecting the CVS logs. - -11/05/01 russ - - * added REAL() constructions for floating point numbers, to prevent - many warnings when compiling under VC++. - -11/03/01 russ - - * added geometry transform class, documented composite objects. - - * added collision rule: no contacts if both geoms on the same body. - this is not the best rule, may have to remove this in the future. - - * new dMassAdd() function. - - * capped cylinder to capped cylinder collision function. - -10/31/01 russ - - * increase CFM in some demos to make them more robust. - -10/29/01 russ - - * added new accessor functions. - -10/19/01 russ - - * added the dJOINT_TWOBODIES flag to the joint, that says it can not - be attached to just one body. - -10/12/01 russ - - * fixed a collision bug in dCollide() that was causing memory - corruption when multiple contacts were being returned. - -10/11/01 russ - - * joints can now return m=0 to be "inactive". added a "null" joint - to test this. - -10/09/01 russ - - * in the LCP solver, try to fail gracefully when s <= 0. - - * dAABBTestFn() API change. - -10/08/01 russ - - * fixed a contact swapping bug in dCollide(). - -10/07/01 russ - - * added capped cylinder geometry object. - -09/30/01 russ - - * the test_buggy demo now uses geometry groups. - - * added a dAABBTestFn field in the geometry classes. - -09/29/01 russ - - * added geometry groups. - -09/20/01 russ - - * added finite rotation stuff. diff --git a/libraries/ode-0.9/GIMPACT/GIMPACT-LICENSE-BSD.TXT b/libraries/ode-0.9/GIMPACT/GIMPACT-LICENSE-BSD.TXT deleted file mode 100644 index 95545aac2c..0000000000 --- a/libraries/ode-0.9/GIMPACT/GIMPACT-LICENSE-BSD.TXT +++ /dev/null @@ -1,29 +0,0 @@ -GIMPACT : Geometric tools for VR. - -Copyright (c) 2006 , Francisco Len. -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 GIMPACT 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. \ No newline at end of file diff --git a/libraries/ode-0.9/GIMPACT/GIMPACT-LICENSE-LGPL.TXT b/libraries/ode-0.9/GIMPACT/GIMPACT-LICENSE-LGPL.TXT deleted file mode 100644 index 60b81560d8..0000000000 --- a/libraries/ode-0.9/GIMPACT/GIMPACT-LICENSE-LGPL.TXT +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_boxpruning.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_boxpruning.h deleted file mode 100644 index 68b68d073e..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_boxpruning.h +++ /dev/null @@ -1,323 +0,0 @@ -#ifndef GIM_BOXPRUNING_H_INCLUDED -#define GIM_BOXPRUNING_H_INCLUDED - -/*! \file gim_boxpruning.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include "GIMPACT/gim_radixsort.h" -#include "GIMPACT/gim_geometry.h" - -/*! \defgroup BOX_PRUNNING - -\brief -Tools for find overlapping objects on a scenary. These functions sort boxes for faster collisioin queries, using radix sort or quick sort as convenience. See \ref SORTING . -
    -
  • For using these collision routines, you must create a \ref GIM_AABB_SET by using this function : \ref gim_aabbset_alloc. -
  • The GIM_AABB_SET objects must be updated on their boxes on each query, and they must be update by calling \ref gim_aabbset_update -
  • Before calling collision functions, you must create a pair set with \ref GIM_CREATE_PAIR_SET -
  • For finding collision pairs on a scene (common space for objects), call \ref gim_aabbset_self_intersections -
  • For finding collision pairs between two box sets , call \ref gim_aabbset_box_collision -
  • After using collision routines, you must destroy the pairset with \ref GIM_DESTROY_PAIR_SET -
  • When the box set is no longer used, you must destroy it by calling \ref gim_aabbset_destroy -
-*/ -//! @{ -//! Overlapping pair -struct GIM_PAIR -{ - GUINT m_index1; - GUINT m_index2; -}; -//typedef struct _GIM_PAIR GIM_PAIR; - -//! Box container -struct GIM_AABB_SET -{ - GUINT m_count; - aabb3f m_global_bound;//!< Global calculated bound of all boxes - aabb3f * m_boxes; - GUINT * m_maxcoords;//!m_sorted_mincoords == 0, then it allocs the sorted coordinates -*/ -void gim_aabbset_sort(GIM_AABB_SET * aabbset, char calc_global_bound); - -//! log(N) Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. -/*! -\pre aabbset must be allocated and sorted, the boxes must be already set. -\param aabbset Must be sorted. Global bound isn't required -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_self_intersections_sorted(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs); - -//! NxN Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. -/*! -\pre aabbset must be allocated, the boxes must be already set. -\param aabbset Global bound isn't required. Doen't need to be sorted. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_self_intersections_brute_force(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs); - -//! log(N) Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. -/*! -\pre aabbset1 and aabbset2 must be allocated and sorted, the boxes must be already set. -\param aabbset1 Must be sorted, Global bound is required. -\param aabbset2 Must be sorted, Global bound is required. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_bipartite_intersections_sorted(GIM_AABB_SET * aabbset1, GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs); - -//! NxM Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. -/*! -\pre aabbset1 and aabbset2 must be allocated and sorted, the boxes must be already set. -\param aabbset1 Must be sorted, Global bound is required. -\param aabbset2 Must be sorted, Global bound is required. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_bipartite_intersections_brute_force(GIM_AABB_SET * aabbset1,GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs); - - -/* - Brute-Force Vs Sorted pruning -Different approaches must be applied when colliding sets with different number of -elements. When sets have less of 100 boxes, is often better to apply force brute -approach instead of sorted methods, because at lowlevel bruteforce routines gives -better perormance and consumes less resources, due of their simplicity. -But when sets are larger, the complexiity of bruteforce increases exponencially. -In the case of large sets, sorted approach is applied. So GIMPACT has the following -strategies: - -On Sorting sets: -!) When sets have more of 140 boxes, the boxes are sorted by its coded min coord -and the global box is calculated. But when sets are smaller (less of 140 boxes), -Is convenient to apply brute force approach. - -*******************************************************************************/ - -//! Constant for apply approaches between brute force and sorted pruning on bipartite queries -#define GIM_MIN_SORTED_BIPARTITE_PRUNING_BOXES 600 -//! Constant for apply approaches between brute force and sorted pruning for box collision -#define GIM_MIN_SORTED_PRUNING_BOXES 140 - - -//Use these functions for general initialization - -//! Initalizes the set. Sort Boxes if needed. -/*! -\pre aabbset must be allocated. And the boxes must be already set. -\post If the set has less of GIM_MIN_SORTED_BIPARTITE_PRUNING_BOXES boxes, only calcs the global box, - else it Sorts the entire set( Only applicable for large sets) -*/ -void gim_aabbset_update(GIM_AABB_SET * aabbset); - -///Use these functions for general collision - -//! Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. -/*! -This function sorts the set and then it calls to gim_aabbset_self_intersections_brute_force or gim_aabbset_self_intersections_sorted. This is an example of how to use this function: -\code -//Create contact list -GDYNAMIC_ARRAY collision_pairs; -GIM_CREATE_PAIR_SET(collision_pairs); -//Do collision -gim_aabbset_self_intersections(&aabbset,&collision_pairs); -if(collision_pairs.m_size==0) -{ - GIM_DYNARRAY_DESTROY(collision_pairs);// - return; //no collisioin -} - -//pair pointer -GIM_PAIR *pairs = GIM_DYNARRAY_POINTER(GIM_PAIR,collision_pairs); -GUINT i, ti1,ti2; -for (i=0;im_count >= GIM_MIN_SORTED_PRUNING_BOXES, then it calls to gim_aabbset_sort and then to gim_aabbset_self_intersections_sorted. Global box won't be calculated. -*/ -void gim_aabbset_self_intersections(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs); - -//! Collides two sets. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. -/*! -\pre aabbset1 and aabbset2 must be allocated and updated. See gim_aabbset_update. -\param aabbset1 Must be updated. -\param aabbset2 Must be updated. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_bipartite_intersections(GIM_AABB_SET * aabbset1, GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs); - -///Function for create Box collision result set - -#define GIM_CREATE_BOXQUERY_LIST(dynarray) GIM_DYNARRAY_CREATE(GUINT,dynarray,G_ARRAY_GROW_SIZE) - -//! Finds intersections between a box and a set. Return the colliding boxes of the set -/*! -\pre aabbset must be allocated and initialized. -\param test_aabb Box for collision query -\param aabbset Set of boxes .Global bound is required. -\param collided Array of GUINT elements, indices of boxes. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_box_collision(aabb3f *test_aabb, GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collided); - -//! Finds intersections between a box and a set. Return the colliding boxes of the set -/*! -\pre aabbset must be allocated and initialized. -\param vorigin Origin point of ray. -\param vdir Direction vector of ray. -\param tmax Max distance param for ray. -\param aabbset Set of boxes .Global bound is required. -\param collided Array of GUINT elements, indices of boxes. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_ray_collision(vec3f vorigin,vec3f vdir, GREAL tmax, GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collided); - - -/* -For sorting, each box corner must be discretized to a 32 bit integer. -For this, we take the x and z coordinates from the box corner (a vector vec3f) -Then convert the (x,z) pair to an integer. For convenience, we choose an error -constant for converting the coordinates (0.05). -*******************************************************************************/ - -/** - For fitting the coordinate to an integer, we need to constraint the range of its values. So each coord component (x, z) must lie between 0 and 65536. - 20 give us a 0.05 floating point error -*/ -#define ERROR_AABB 20.0f - -/** -An error of 0.05 allows to make coordinates up to 1638.0f and no less of -1638.0f. -So the maximum size of a room should be about 3276x3276 . Its dimensions must lie between [-1638,1638.0f] -*/ -#define MAX_AABB_SIZE 1638.0f - -//! Converts a vector coordinate to an integer for box sorting -/*! -\param vx X component -\param vz Z component -\param uint_key a GUINT -*/ -#define GIM_CONVERT_VEC3F_GUINT_XZ(vx,vz,uint_key)\ -{\ - GUINT _z = ((GUINT)(vz*ERROR_AABB))+32768;\ - uint_key = ((GUINT)(vx*ERROR_AABB))+32768;\ - uint_key = (uint_key<<16) + _z;\ -}\ - -//! Converts a vector coordinate to an integer for box sorting,rounding to the upper int -/*! -\param vx X component -\param vz Z component -\param uint_key a GUINT -*/ -#define GIM_CONVERT_VEC3F_GUINT_XZ_UPPER(vx,vz,uint_key)\ -{\ - GUINT _z = ((GUINT)ceilf(vz*ERROR_AABB))+32768;\ - uint_key = ((GUINT)ceilf(vx*ERROR_AABB))+32768;\ - uint_key = (uint_key<<16) + _z;\ -}\ - - -//! Converts a vector coordinate to an integer for box sorting. Secure clamped -/*! -\param vx X component -\param vz Z component -\param uint_key a GUINT -*/ -#define GIM_CONVERT_VEC3F_GUINT_XZ_CLAMPED(vx,vz,uint_key)\ -{\ - GREAL _cx = CLAMP(vx,-MAX_AABB_SIZE,MAX_AABB_SIZE);\ - GREAL _cz = CLAMP(vz,-MAX_AABB_SIZE,MAX_AABB_SIZE);\ - GUINT _z = ((GUINT)(_cz*ERROR_AABB))+32768;\ - uint_key = ((GUINT)(_cx*ERROR_AABB))+32768;\ - uint_key = (uint_key<<16) + _z;\ -}\ - -//! Converts a vector coordinate to an integer for box sorting. Secure clamped, rounded -/*! -\param vx X component -\param vz Z component -\param uint_key a GUINT -*/ -#define GIM_CONVERT_VEC3F_GUINT_XZ_UPPER_CLAMPED(vx,vz,uint_key)\ -{\ - GREAL _cx = CLAMP(vx,-MAX_AABB_SIZE,MAX_AABB_SIZE);\ - GREAL _cz = CLAMP(vz,-MAX_AABB_SIZE,MAX_AABB_SIZE);\ - GUINT _z = ((GUINT)ceilf(_cz*ERROR_AABB))+32768;\ - uint_key = ((GUINT)ceilf(_cx*ERROR_AABB))+32768;\ - uint_key = (uint_key<<16) + _z;\ -}\ - -//! @} - -#endif // GIM_BOXPRUNING_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_contact.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_contact.h deleted file mode 100644 index bad8f0f3ec..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_contact.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef GIM_CONTACT_H_INCLUDED -#define GIM_CONTACT_H_INCLUDED - -/*! \file gim_contact.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include "GIMPACT/gim_geometry.h" -#include "GIMPACT/gim_radixsort.h" - -/*! \defgroup CONTACTS -\brief -Functions for managing and sorting contacts resulting from a collision query. -
    -
  • Contact lists must be create by calling \ref GIM_CREATE_CONTACT_LIST -
  • After querys, contact lists must be destroy by calling \ref GIM_DYNARRAY_DESTROY -
  • Contacts can be merge for avoid duplicate results by calling \ref gim_merge_contacts -
- -*/ -//! @{ -/// Structure for collision results -struct GIM_CONTACT -{ - vec3f m_point; - vec3f m_normal; - GREAL m_depth;//Positive value indicates interpenetration - void * m_handle1; - void * m_handle2; - GUINT m_feature1;//Face number - GUINT m_feature2;//Face number -}; -//typedef struct _GIM_CONTACT GIM_CONTACT; - -#define CONTACT_DIFF_EPSILON 0.00001f - -#define GIM_CALC_KEY_CONTACT(pos,hash)\ -{\ - GINT _coords[] = {(GINT)(pos[0]*1000.0f+1.0f),(GINT)(pos[1]*1333.0f),(GINT)(pos[2]*2133.0f+3.0f)};\ - GUINT _hash=0;\ - GUINT *_uitmp = (GUINT *)(&_coords[0]);\ - _hash = *_uitmp;\ - _uitmp++;\ - _hash += (*_uitmp)<<4;\ - _uitmp++;\ - _hash += (*_uitmp)<<8;\ - hash = _hash;\ -}\ - -///Creates a contact list for queries -#define GIM_CREATE_CONTACT_LIST(contact_array) GIM_DYNARRAY_CREATE(GIM_CONTACT,contact_array,100) - -#define GIM_PUSH_CONTACT(contact_array, point, normal, deep,handle1, handle2, feat1, feat2)\ -{\ - GIM_DYNARRAY_PUSH_EMPTY(GIM_CONTACT,contact_array);\ - GIM_CONTACT * _last = GIM_DYNARRAY_POINTER_LAST(GIM_CONTACT,contact_array);\ - VEC_COPY(_last->m_point,point);\ - VEC_COPY(_last->m_normal,normal);\ - _last->m_depth = deep;\ - _last->m_handle1 = handle1;\ - _last->m_handle2 = handle2;\ - _last->m_feature1 = feat1;\ - _last->m_feature2 = feat2;\ -}\ - -///Receive pointer to contacts -#define GIM_COPY_CONTACTS(dest_contact, source_contact)\ -{\ - VEC_COPY(dest_contact->m_point,source_contact->m_point);\ - VEC_COPY(dest_contact->m_normal,source_contact->m_normal);\ - dest_contact->m_depth = source_contact->m_depth;\ - dest_contact->m_handle1 = source_contact->m_handle1;\ - dest_contact->m_handle2 = source_contact->m_handle2;\ - dest_contact->m_feature1 = source_contact->m_feature1;\ - dest_contact->m_feature2 = source_contact->m_feature2;\ -}\ - -//! Merges duplicate contacts with minimum depth criterion -void gim_merge_contacts(GDYNAMIC_ARRAY * source_contacts, - GDYNAMIC_ARRAY * dest_contacts); - - -//! Merges to an unique contact -void gim_merge_contacts_unique(GDYNAMIC_ARRAY * source_contacts, - GDYNAMIC_ARRAY * dest_contacts); - -//! @} -#endif // GIM_CONTACT_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_geometry.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_geometry.h deleted file mode 100644 index 6d89a949aa..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_geometry.h +++ /dev/null @@ -1,1872 +0,0 @@ -#ifndef GIM_VECTOR_H_INCLUDED -#define GIM_VECTOR_H_INCLUDED - -/*! \file gim_geometry.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include "GIMPACT/gim_math.h" - -/*! \defgroup GEOMETRIC_TYPES -\brief -Basic types and constants for geometry -*/ -//! @{ - -//! Integer vector 2D -typedef GINT vec2i[2]; -//! Integer vector 3D -typedef GINT vec3i[3]; -//! Integer vector 4D -typedef GINT vec4i[4]; - -//! Float vector 2D -typedef GREAL vec2f[2]; -//! Float vector 3D -typedef GREAL vec3f[3]; -//! Float vector 4D -typedef GREAL vec4f[4]; - -//! Matrix 2D, row ordered -typedef GREAL mat2f[2][2]; -//! Matrix 3D, row ordered -typedef GREAL mat3f[3][3]; -//! Matrix 4D, row ordered -typedef GREAL mat4f[4][4]; - -//! Quaternion -typedef GREAL quatf[4]; - -//! Axis aligned box -struct aabb3f{ - GREAL minX; - GREAL maxX; - GREAL minY; - GREAL maxY; - GREAL minZ; - GREAL maxZ; -}; -//typedef struct _aabb3f aabb3f; -//! @} - - -/*! \defgroup VECTOR_OPERATIONS -Operations for vectors : vec2f,vec3f and vec4f -*/ -//! @{ - -//! Zero out a 2D vector -#define VEC_ZERO_2(a) \ -{ \ - (a)[0] = (a)[1] = 0.0f; \ -}\ - - -//! Zero out a 3D vector -#define VEC_ZERO(a) \ -{ \ - (a)[0] = (a)[1] = (a)[2] = 0.0f; \ -}\ - - -/// Zero out a 4D vector -#define VEC_ZERO_4(a) \ -{ \ - (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \ -}\ - - -/// Vector copy -#define VEC_COPY_2(b,a) \ -{ \ - (b)[0] = (a)[0]; \ - (b)[1] = (a)[1]; \ -}\ - - -/// Copy 3D vector -#define VEC_COPY(b,a) \ -{ \ - (b)[0] = (a)[0]; \ - (b)[1] = (a)[1]; \ - (b)[2] = (a)[2]; \ -}\ - - -/// Copy 4D vector -#define VEC_COPY_4(b,a) \ -{ \ - (b)[0] = (a)[0]; \ - (b)[1] = (a)[1]; \ - (b)[2] = (a)[2]; \ - (b)[3] = (a)[3]; \ -}\ - - -/// Vector difference -#define VEC_DIFF_2(v21,v2,v1) \ -{ \ - (v21)[0] = (v2)[0] - (v1)[0]; \ - (v21)[1] = (v2)[1] - (v1)[1]; \ -}\ - - -/// Vector difference -#define VEC_DIFF(v21,v2,v1) \ -{ \ - (v21)[0] = (v2)[0] - (v1)[0]; \ - (v21)[1] = (v2)[1] - (v1)[1]; \ - (v21)[2] = (v2)[2] - (v1)[2]; \ -}\ - - -/// Vector difference -#define VEC_DIFF_4(v21,v2,v1) \ -{ \ - (v21)[0] = (v2)[0] - (v1)[0]; \ - (v21)[1] = (v2)[1] - (v1)[1]; \ - (v21)[2] = (v2)[2] - (v1)[2]; \ - (v21)[3] = (v2)[3] - (v1)[3]; \ -}\ - - -/// Vector sum -#define VEC_SUM_2(v21,v2,v1) \ -{ \ - (v21)[0] = (v2)[0] + (v1)[0]; \ - (v21)[1] = (v2)[1] + (v1)[1]; \ -}\ - - -/// Vector sum -#define VEC_SUM(v21,v2,v1) \ -{ \ - (v21)[0] = (v2)[0] + (v1)[0]; \ - (v21)[1] = (v2)[1] + (v1)[1]; \ - (v21)[2] = (v2)[2] + (v1)[2]; \ -}\ - - -/// Vector sum -#define VEC_SUM_4(v21,v2,v1) \ -{ \ - (v21)[0] = (v2)[0] + (v1)[0]; \ - (v21)[1] = (v2)[1] + (v1)[1]; \ - (v21)[2] = (v2)[2] + (v1)[2]; \ - (v21)[3] = (v2)[3] + (v1)[3]; \ -}\ - - -/// scalar times vector -#define VEC_SCALE_2(c,a,b) \ -{ \ - (c)[0] = (a)*(b)[0]; \ - (c)[1] = (a)*(b)[1]; \ -}\ - - -/// scalar times vector -#define VEC_SCALE(c,a,b) \ -{ \ - (c)[0] = (a)*(b)[0]; \ - (c)[1] = (a)*(b)[1]; \ - (c)[2] = (a)*(b)[2]; \ -}\ - - -/// scalar times vector -#define VEC_SCALE_4(c,a,b) \ -{ \ - (c)[0] = (a)*(b)[0]; \ - (c)[1] = (a)*(b)[1]; \ - (c)[2] = (a)*(b)[2]; \ - (c)[3] = (a)*(b)[3]; \ -}\ - - -/// accumulate scaled vector -#define VEC_ACCUM_2(c,a,b) \ -{ \ - (c)[0] += (a)*(b)[0]; \ - (c)[1] += (a)*(b)[1]; \ -}\ - - -/// accumulate scaled vector -#define VEC_ACCUM(c,a,b) \ -{ \ - (c)[0] += (a)*(b)[0]; \ - (c)[1] += (a)*(b)[1]; \ - (c)[2] += (a)*(b)[2]; \ -}\ - - -/// accumulate scaled vector -#define VEC_ACCUM_4(c,a,b) \ -{ \ - (c)[0] += (a)*(b)[0]; \ - (c)[1] += (a)*(b)[1]; \ - (c)[2] += (a)*(b)[2]; \ - (c)[3] += (a)*(b)[3]; \ -}\ - - -/// Vector dot product -#define VEC_DOT_2(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1]) - - -/// Vector dot product -#define VEC_DOT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2]) - -/// Vector dot product -#define VEC_DOT_4(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3]) - -/// vector impact parameter (squared) -#define VEC_IMPACT_SQ(bsq,direction,position) {\ - GREAL _llel_ = VEC_DOT(direction, position);\ - bsq = VEC_DOT(position, position) - _llel_*_llel_;\ -}\ - - -/// vector impact parameter -#define VEC_IMPACT(bsq,direction,position) {\ - VEC_IMPACT_SQ(bsq,direction,position); \ - GIM_SQRT(bsq,bsq); \ -}\ - -/// Vector length -#define VEC_LENGTH_2(a,l)\ -{\ - GREAL _pp = VEC_DOT_2(a,a);\ - GIM_SQRT(_pp,l);\ -}\ - - -/// Vector length -#define VEC_LENGTH(a,l)\ -{\ - GREAL _pp = VEC_DOT(a,a);\ - GIM_SQRT(_pp,l);\ -}\ - - -/// Vector length -#define VEC_LENGTH_4(a,l)\ -{\ - GREAL _pp = VEC_DOT_4(a,a);\ - GIM_SQRT(_pp,l);\ -}\ - -/// Vector inv length -#define VEC_INV_LENGTH_2(a,l)\ -{\ - GREAL _pp = VEC_DOT_2(a,a);\ - GIM_INV_SQRT(_pp,l);\ -}\ - - -/// Vector inv length -#define VEC_INV_LENGTH(a,l)\ -{\ - GREAL _pp = VEC_DOT(a,a);\ - GIM_INV_SQRT(_pp,l);\ -}\ - - -/// Vector inv length -#define VEC_INV_LENGTH_4(a,l)\ -{\ - GREAL _pp = VEC_DOT_4(a,a);\ - GIM_INV_SQRT(_pp,l);\ -}\ - - - -/// distance between two points -#define VEC_DISTANCE(_len,_va,_vb) {\ - vec3f _tmp_; \ - VEC_DIFF(_tmp_, _vb, _va); \ - VEC_LENGTH(_tmp_,_len); \ -}\ - - -/// Vector length -#define VEC_CONJUGATE_LENGTH(a,l)\ -{\ - GREAL _pp = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\ - GIM_SQRT(_pp,l);\ -}\ - - -/// Vector length -#define VEC_NORMALIZE(a) { \ - GREAL len;\ - VEC_INV_LENGTH(a,len); \ - if(len -Last column is added as the position -*/ -#define MAT_DOT_VEC_3X4(p,m,v) \ -{ \ - p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]; \ - p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]; \ - p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]; \ -}\ - -/*! vector transpose times matrix */ -/*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */ -#define VEC_DOT_MAT_3X3(p,v,m) \ -{ \ - p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0]; \ - p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1]; \ - p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2]; \ -}\ - - -/*! affine matrix times vector */ -/** The matrix is assumed to be an affine matrix, with last two - * entries representing a translation */ -#define MAT_DOT_VEC_2X3(p,m,v) \ -{ \ - p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]; \ - p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]; \ -}\ - - -/** inverse transpose of matrix times vector - * - * This macro computes inverse transpose of matrix m, - * and multiplies vector v into it, to yeild vector p - * - * DANGER !!! Do Not use this on normal vectors!!! - * It will leave normals the wrong length !!! - * See macro below for use on normals. - */ -#define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v) \ -{ \ - GREAL det; \ - \ - det = m[0][0]*m[1][1] - m[0][1]*m[1][0]; \ - p[0] = m[1][1]*v[0] - m[1][0]*v[1]; \ - p[1] = - m[0][1]*v[0] + m[0][0]*v[1]; \ - \ - /* if matrix not singular, and not orthonormal, then renormalize */ \ - if ((det!=1.0f) && (det != 0.0f)) { \ - det = 1.0f / det; \ - p[0] *= det; \ - p[1] *= det; \ - } \ -}\ - - -/** transform normal vector by inverse transpose of matrix - * and then renormalize the vector - * - * This macro computes inverse transpose of matrix m, - * and multiplies vector v into it, to yeild vector p - * Vector p is then normalized. - */ -#define NORM_XFORM_2X2(p,m,v) \ -{ \ - double len; \ - \ - /* do nothing if off-diagonals are zero and diagonals are \ - * equal */ \ - if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \ - p[0] = m[1][1]*v[0] - m[1][0]*v[1]; \ - p[1] = - m[0][1]*v[0] + m[0][0]*v[1]; \ - \ - len = p[0]*p[0] + p[1]*p[1]; \ - GIM_INV_SQRT(len,len); \ - p[0] *= len; \ - p[1] *= len; \ - } else { \ - VEC_COPY_2 (p, v); \ - } \ -}\ - - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define OUTER_PRODUCT_2X2(m,v,t) \ -{ \ - m[0][0] = v[0] * t[0]; \ - m[0][1] = v[0] * t[1]; \ - \ - m[1][0] = v[1] * t[0]; \ - m[1][1] = v[1] * t[1]; \ -}\ - - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define OUTER_PRODUCT_3X3(m,v,t) \ -{ \ - m[0][0] = v[0] * t[0]; \ - m[0][1] = v[0] * t[1]; \ - m[0][2] = v[0] * t[2]; \ - \ - m[1][0] = v[1] * t[0]; \ - m[1][1] = v[1] * t[1]; \ - m[1][2] = v[1] * t[2]; \ - \ - m[2][0] = v[2] * t[0]; \ - m[2][1] = v[2] * t[1]; \ - m[2][2] = v[2] * t[2]; \ -}\ - - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define OUTER_PRODUCT_4X4(m,v,t) \ -{ \ - m[0][0] = v[0] * t[0]; \ - m[0][1] = v[0] * t[1]; \ - m[0][2] = v[0] * t[2]; \ - m[0][3] = v[0] * t[3]; \ - \ - m[1][0] = v[1] * t[0]; \ - m[1][1] = v[1] * t[1]; \ - m[1][2] = v[1] * t[2]; \ - m[1][3] = v[1] * t[3]; \ - \ - m[2][0] = v[2] * t[0]; \ - m[2][1] = v[2] * t[1]; \ - m[2][2] = v[2] * t[2]; \ - m[2][3] = v[2] * t[3]; \ - \ - m[3][0] = v[3] * t[0]; \ - m[3][1] = v[3] * t[1]; \ - m[3][2] = v[3] * t[2]; \ - m[3][3] = v[3] * t[3]; \ -}\ - - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define ACCUM_OUTER_PRODUCT_2X2(m,v,t) \ -{ \ - m[0][0] += v[0] * t[0]; \ - m[0][1] += v[0] * t[1]; \ - \ - m[1][0] += v[1] * t[0]; \ - m[1][1] += v[1] * t[1]; \ -}\ - - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define ACCUM_OUTER_PRODUCT_3X3(m,v,t) \ -{ \ - m[0][0] += v[0] * t[0]; \ - m[0][1] += v[0] * t[1]; \ - m[0][2] += v[0] * t[2]; \ - \ - m[1][0] += v[1] * t[0]; \ - m[1][1] += v[1] * t[1]; \ - m[1][2] += v[1] * t[2]; \ - \ - m[2][0] += v[2] * t[0]; \ - m[2][1] += v[2] * t[1]; \ - m[2][2] += v[2] * t[2]; \ -}\ - - -/** outer product of vector times vector transpose - * - * The outer product of vector v and vector transpose t yeilds - * dyadic matrix m. - */ -#define ACCUM_OUTER_PRODUCT_4X4(m,v,t) \ -{ \ - m[0][0] += v[0] * t[0]; \ - m[0][1] += v[0] * t[1]; \ - m[0][2] += v[0] * t[2]; \ - m[0][3] += v[0] * t[3]; \ - \ - m[1][0] += v[1] * t[0]; \ - m[1][1] += v[1] * t[1]; \ - m[1][2] += v[1] * t[2]; \ - m[1][3] += v[1] * t[3]; \ - \ - m[2][0] += v[2] * t[0]; \ - m[2][1] += v[2] * t[1]; \ - m[2][2] += v[2] * t[2]; \ - m[2][3] += v[2] * t[3]; \ - \ - m[3][0] += v[3] * t[0]; \ - m[3][1] += v[3] * t[1]; \ - m[3][2] += v[3] * t[2]; \ - m[3][3] += v[3] * t[3]; \ -}\ - - -/** determinant of matrix - * - * Computes determinant of matrix m, returning d - */ -#define DETERMINANT_2X2(d,m) \ -{ \ - d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \ -}\ - - -/** determinant of matrix - * - * Computes determinant of matrix m, returning d - */ -#define DETERMINANT_3X3(d,m) \ -{ \ - d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]); \ - d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]); \ - d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]); \ -}\ - - -/** i,j,th cofactor of a 4x4 matrix - * - */ -#define COFACTOR_4X4_IJ(fac,m,i,j) \ -{ \ - int __ii[4], __jj[4], __k; \ - \ - for (__k=0; __k (aabb2).maxX ||\ - (aabb1).maxX < (aabb2).minX ||\ - (aabb1).minY > (aabb2).maxY ||\ - (aabb1).maxY < (aabb2).minY ||\ - (aabb1).minZ > (aabb2).maxZ ||\ - (aabb1).maxZ < (aabb2).minZ )\ - {\ - intersected = 0;\ - }\ -}\ - -#define AXIS_INTERSECT(min,max, a, d,tfirst, tlast,is_intersected) {\ - if(IS_ZERO(d))\ - {\ - is_intersected = !(a < min || a > max);\ - }\ - else\ - {\ - GREAL a0, a1;\ - a0 = (min - a) / (d);\ - a1 = (max - a) / (d);\ - if(a0 > a1) SWAP_NUMBERS(a0, a1);\ - tfirst = MAX(a0, tfirst);\ - tlast = MIN(a1, tlast);\ - if (tlast < tfirst)\ - {\ - is_intersected = 0;\ - }\ - else\ - {\ - is_intersected = 1;\ - }\ - }\ -}\ - -/*! \brief Finds the Ray intersection parameter. - -\param aabb Aligned box -\param vorigin A vec3f with the origin of the ray -\param vdir A vec3f with the direction of the ray -\param tparam Output parameter -\param tmax Max lenght of the ray -\param is_intersected 1 if the ray collides the box, else false - -*/ -#define BOX_INTERSECTS_RAY(aabb, vorigin, vdir, tparam, tmax,is_intersected) { \ - GREAL _tfirst = 0.0f, _tlast = tmax;\ - AXIS_INTERSECT(aabb.minX,aabb.maxX,vorigin[0], vdir[0], _tfirst, _tlast,is_intersected);\ - if(is_intersected)\ - {\ - AXIS_INTERSECT(aabb.minY,aabb.maxY,vorigin[1], vdir[1], _tfirst, _tlast,is_intersected);\ - }\ - if(is_intersected)\ - {\ - AXIS_INTERSECT(aabb.minZ,aabb.maxZ,vorigin[2], vdir[2], _tfirst, _tlast,is_intersected);\ - }\ - tparam = _tfirst;\ -}\ - -#define AABB_PROJECTION_INTERVAL(aabb,direction, vmin, vmax)\ -{\ - GREAL _center[] = {(aabb.minX + aabb.maxX)*0.5f, (aabb.minY + aabb.maxY)*0.5f, (aabb.minZ + aabb.maxZ)*0.5f};\ - \ - GREAL _extend[] = {aabb.maxX-_center[0],aabb.maxY-_center[1],aabb.maxZ-_center[2]};\ - GREAL _fOrigin = VEC_DOT(direction,_center);\ - GREAL _fMaximumExtent = _extend[0]*fabsf(direction[0]) + \ - _extend[1]*fabsf(direction[1]) + \ - _extend[2]*fabsf(direction[2]); \ -\ - vmin = _fOrigin - _fMaximumExtent; \ - vmax = _fOrigin + _fMaximumExtent; \ -}\ - -/*! -classify values: -
    -
  1. 0 : In back of plane -
  2. 1 : Spanning -
  3. 2 : In front of -
-*/ -#define PLANE_CLASSIFY_BOX(plane,aabb,classify)\ -{\ - GREAL _fmin,_fmax; \ - AABB_PROJECTION_INTERVAL(aabb,plane, _fmin, _fmax); \ - if(plane[3] >= _fmax) \ - { \ - classify = 0;/*In back of*/ \ - } \ - else \ - { \ - if(plane[3]+0.000001f>=_fmin) \ - { \ - classify = 1;/*Spanning*/ \ - } \ - else \ - { \ - classify = 2;/*In front of*/ \ - } \ - } \ -}\ -//! @} - -/*! \defgroup GEOMETRIC_OPERATIONS -*/ -//! @{ - - -#define PLANEDIREPSILON 0.0000001f -#define PARALELENORMALS 0.000001f - -#define TRIANGLE_NORMAL(v1,v2,v3,n){\ - vec3f _dif1,_dif2; \ - VEC_DIFF(_dif1,v2,v1); \ - VEC_DIFF(_dif2,v3,v1); \ - VEC_CROSS(n,_dif1,_dif2); \ - VEC_NORMALIZE(n); \ -}\ - -/// plane is a vec4f -#define TRIANGLE_PLANE(v1,v2,v3,plane) {\ - TRIANGLE_NORMAL(v1,v2,v3,plane);\ - plane[3] = VEC_DOT(v1,plane);\ -}\ - -/// Calc a plane from an edge an a normal. plane is a vec4f -#define EDGE_PLANE(e1,e2,n,plane) {\ - vec3f _dif; \ - VEC_DIFF(_dif,e2,e1); \ - VEC_CROSS(plane,_dif,n); \ - VEC_NORMALIZE(plane); \ - plane[3] = VEC_DOT(e1,plane);\ -}\ - -#define DISTANCE_PLANE_POINT(plane,point) (VEC_DOT(plane,point) - plane[3]) - -#define PROJECT_POINT_PLANE(point,plane,projected) {\ - GREAL _dis;\ - _dis = DISTANCE_PLANE_POINT(plane,point);\ - VEC_SCALE(projected,-_dis,plane);\ - VEC_SUM(projected,projected,point); \ -}\ - -#define POINT_IN_HULL(point,planes,plane_count,outside)\ -{\ - GREAL _dis;\ - outside = 0;\ - GUINT _i = 0;\ - do\ - {\ - _dis = DISTANCE_PLANE_POINT(planes[_i],point);\ - if(_dis>0.0f) outside = 1;\ - _i++;\ - }while(_i -
  • 0 : Segment in front of plane, s1 closest -
  • 1 : Segment in front of plane, s2 closest -
  • 2 : Segment in back of plane, s1 closest -
  • 3 : Segment in back of plane, s2 closest -
  • 4 : Segment collides plane, s1 in back -
  • 5 : Segment collides plane, s2 in back - -*/ -#define PLANE_CLIP_SEGMENT2(s1,s2,plane,clipped,intersection_type) \ -{\ - GREAL _dis1,_dis2;\ - _dis1 = DISTANCE_PLANE_POINT(plane,s1);\ - _dis2 = DISTANCE_PLANE_POINT(plane,s2);\ - if(_dis1 >-G_EPSILON && _dis2 >-G_EPSILON)\ - {\ - if(_dis1<_dis2) intersection_type = 0;\ - else intersection_type = 1;\ - }\ - else if(_dis1 _dis2) intersection_type = 2;\ - else intersection_type = 3; \ - }\ - else\ - {\ - if(_dis1<_dis2) intersection_type = 4;\ - else intersection_type = 5;\ - VEC_DIFF(clipped,s2,s1);\ - _dis2 = VEC_DOT(clipped,plane);\ - VEC_SCALE(clipped,-_dis1/_dis2,clipped);\ - VEC_SUM(clipped,clipped,s1); \ - }\ -}\ - -//! Confirms if the plane intersect the edge or not -/*! -clipped1 and clipped2 are the vertices behind the plane. -clipped1 is the closest - -intersection_type must have the following values -
      -
    • 0 : Segment in front of plane, s1 closest -
    • 1 : Segment in front of plane, s2 closest -
    • 2 : Segment in back of plane, s1 closest -
    • 3 : Segment in back of plane, s2 closest -
    • 4 : Segment collides plane, s1 in back -
    • 5 : Segment collides plane, s2 in back -
    -*/ -#define PLANE_CLIP_SEGMENT_CLOSEST(s1,s2,plane,clipped1,clipped2,intersection_type)\ -{\ - PLANE_CLIP_SEGMENT2(s1,s2,plane,clipped1,intersection_type);\ - if(intersection_type == 0)\ - {\ - VEC_COPY(clipped1,s1);\ - VEC_COPY(clipped2,s2);\ - }\ - else if(intersection_type == 1)\ - {\ - VEC_COPY(clipped1,s2);\ - VEC_COPY(clipped2,s1);\ - }\ - else if(intersection_type == 2)\ - {\ - VEC_COPY(clipped1,s1);\ - VEC_COPY(clipped2,s2);\ - }\ - else if(intersection_type == 3)\ - {\ - VEC_COPY(clipped1,s2);\ - VEC_COPY(clipped2,s1);\ - }\ - else if(intersection_type == 4)\ - { \ - VEC_COPY(clipped2,s1);\ - }\ - else if(intersection_type == 5)\ - { \ - VEC_COPY(clipped2,s2);\ - }\ -}\ - - -//! Finds the 2 smallest cartesian coordinates of a plane normal -#define PLANE_MINOR_AXES(plane, i0, i1)\ -{\ - GREAL A[] = {fabs(plane[0]),fabs(plane[1]),fabs(plane[2])};\ - if(A[0]>A[1])\ - {\ - if(A[0]>A[2])\ - {\ - i0=1; /* A[0] is greatest */ \ - i1=2;\ - }\ - else \ - {\ - i0=0; /* A[2] is greatest */ \ - i1=1; \ - }\ - }\ - else /* A[0]<=A[1] */ \ - {\ - if(A[2]>A[1]) \ - { \ - i0=0; /* A[2] is greatest */ \ - i1=1; \ - }\ - else \ - {\ - i0=0; /* A[1] is greatest */ \ - i1=2; \ - }\ - } \ -}\ - -//! Ray plane collision -#define RAY_PLANE_COLLISION(plane,vDir,vPoint,pout,tparam,does_intersect)\ -{\ - GREAL _dis,_dotdir; \ - _dotdir = VEC_DOT(plane,vDir);\ - if(_dotdir1.0f)\ - {\ - VEC_COPY(cp,e2);\ - }\ - else \ - {\ - VEC_SCALE(cp,_scalar,_n);\ - VEC_SUM(cp,cp,e1);\ - } \ -}\ - - -/*! \brief Finds the line params where these lines intersect. - -\param dir1 Direction of line 1 -\param point1 Point of line 1 -\param dir2 Direction of line 2 -\param point2 Point of line 2 -\param t1 Result Parameter for line 1 -\param t2 Result Parameter for line 2 -\param dointersect 0 if the lines won't intersect, else 1 - -*/ -#define LINE_INTERSECTION_PARAMS(dir1,point1, dir2, point2,t1,t2,dointersect) {\ - GREAL det;\ - GREAL e1e1 = VEC_DOT(dir1,dir1);\ - GREAL e1e2 = VEC_DOT(dir1,dir2);\ - GREAL e2e2 = VEC_DOT(dir2,dir2);\ - vec3f p1p2;\ - VEC_DIFF(p1p2,point1,point2);\ - GREAL p1p2e1 = VEC_DOT(p1p2,dir1);\ - GREAL p1p2e2 = VEC_DOT(p1p2,dir2);\ - det = e1e2*e1e2 - e1e1*e2e2;\ - if(IS_ZERO(det))\ - {\ - dointersect = 0;\ - }\ - else\ - {\ - t1 = (e1e2*p1p2e2 - e2e2*p1p2e1)/det;\ - t2 = (e1e1*p1p2e2 - e1e2*p1p2e1)/det;\ - dointersect = 1;\ - }\ -}\ - -//! Find closest points on segments -#define SEGMENT_COLLISION(vA1,vA2,vB1,vB2,vPointA,vPointB)\ -{\ - vec3f _AD,_BD,_N;\ - vec4f _M;\ - VEC_DIFF(_AD,vA2,vA1);\ - VEC_DIFF(_BD,vB2,vB1);\ - VEC_CROSS(_N,_AD,_BD);\ - VEC_CROSS(_M,_N,_BD);\ - _M[3] = VEC_DOT(_M,vB1);\ - float _tp; \ - LINE_PLANE_COLLISION(_M,_AD,vA1,vPointA,_tp,0.0f, 1.0f);\ - /*Closest point on segment*/ \ - VEC_DIFF(vPointB,vPointA,vB1);\ - _tp = VEC_DOT(vPointB, _BD); \ - _tp/= VEC_DOT(_BD, _BD); \ - _tp = CLAMP(_tp,0.0f,1.0f); \ - VEC_SCALE(vPointB,_tp,_BD);\ - VEC_SUM(vPointB,vPointB,vB1);\ -}\ - -//! @} - -///Additional Headers for Collision -#include "GIMPACT/gim_tri_collision.h" -#include "GIMPACT/gim_tri_sphere_collision.h" -#include "GIMPACT/gim_tri_capsule_collision.h" - -#endif // GIM_VECTOR_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_math.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_math.h deleted file mode 100644 index 68f226e98a..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_math.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef GIM_MATH_H_INCLUDED -#define GIM_MATH_H_INCLUDED - -/*! \file gim_math.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include -#include - - -/*! \defgroup BASIC_TYPES -Basic types and constants -Conventions: -Types starting with G -Constants starting with G_ -*/ -//! @{ -/*! Types */ -#define GREAL float -#define GINT long -#define GUINT unsigned long -/*! Constants for integers*/ -#define GUINT_BIT_COUNT 32 -#define GUINT_EXPONENT 5 - -#define G_FASTMATH 1 -#define G_PI 3.14159265358979f -#define G_HALF_PI 1.5707963f -//267948966 -#define G_TWO_PI 6.28318530f -//71795864 -#define G_ROOT3 1.73205f -#define G_ROOT2 1.41421f -#define G_UINT_INFINITY 65534 -#define G_REAL_INFINITY FLT_MAX -#define G_SIGN_BITMASK 0x80000000 -#define G_USE_EPSILON_TEST -#define G_EPSILON 0.0000001f -//! @} - -/*! \defgroup MATH_FUNCTIONS -mathematical functions -*/ -//! @{ -#define G_DEGTORAD(X) ((X)*3.1415926f/180.0f) -#define G_RADTODEG(X) ((X)*180.0f/3.1415926f) - -//! Integer representation of a floating-point value. -#define IR(x) ((GUINT&)(x)) - -//! Signed integer representation of a floating-point value. -#define SIR(x) ((GINT&)(x)) - -//! Absolute integer representation of a floating-point value -#define AIR(x) (IR(x)&0x7fffffff) - -//! Floating-point representation of an integer value. -#define FR(x) ((GREAL&)(x)) - -#define MAX(a,b) (ab?b:a) - -#define MAX3(a,b,c) MAX(a,MAX(b,c)) -#define MIN3(a,b,c) MIN(a,MIN(b,c)) - -#define IS_ZERO(value) (value < G_EPSILON && value > -G_EPSILON) - -#define IS_NEGATIVE(value) (value <= -G_EPSILON) - -#define IS_POSISITVE(value) (value >= G_EPSILON) - -///returns a clamped number -#define CLAMP(number,minval,maxval) (numbermaxval?maxval:number)) - -///Swap numbers -#define SWAP_NUMBERS(a,b){ \ - a = a+b; \ - b = a-b; \ - a = a-b; \ -}\ - -#define GIM_INV_SQRT(va,isva)\ -{\ - if(va<=0.0000001f)\ - {\ - isva = G_REAL_INFINITY;\ - }\ - else\ - {\ - GREAL _x = va * 0.5f;\ - GUINT _y = 0x5f3759df - ( IR(va) >> 1);\ - isva = FR(_y);\ - isva = isva * ( 1.5f - ( _x * isva * isva ) );\ - }\ -}\ - -#define GIM_SQRT(va,sva)\ -{\ - GIM_INV_SQRT(va,sva);\ - sva = 1.0f/sva;\ -}\ - -//! Computes 1.0f / sqrtf(x). Comes from Quake3. See http://www.magic-software.com/3DGEDInvSqrt.html -GREAL gim_inv_sqrt(GREAL f); - -//! Computes sqrtf(x) faster. -/*! -\sa gim_inv_sqrt -*/ -GREAL gim_sqrt(GREAL f); - -//!Initializes mathematical functions -void gim_init_math(); - -//! Generates an unit random -GREAL gim_unit_random(); -//! @} - -#endif // GIM_MATH_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_memory.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_memory.h deleted file mode 100644 index 58661f1a17..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_memory.h +++ /dev/null @@ -1,1040 +0,0 @@ -#ifndef GIM_MEMORY_H_INCLUDED -#define GIM_MEMORY_H_INCLUDED -/*! \file gim_memory.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include "GIMPACT/gim_math.h" -#include - -//#define PREFETCH 1 -//! \defgroup PREFETCH -//! @{ -#ifdef PREFETCH -#include // for prefetch -#define pfval 64 -#define pfval2 128 -//! Prefetch 64 -#define pf(_x,_i) _mm_prefetch((void *)(_x + _i + pfval), 0) -//! Prefetch 128 -#define pf2(_x,_i) _mm_prefetch((void *)(_x + _i + pfval2), 0) -#else -//! Prefetch 64 -#define pf(_x,_i) -//! Prefetch 128 -#define pf2(_x,_i) -#endif -//! @} - -/*! \defgroup ARRAY_UTILITIES -\brief -Functions for manip packed arrays of numbers -*/ -//! @{ -#define GIM_COPY_ARRAYS(dest_array,source_array,element_count)\ -{\ - GUINT _i_;\ - for (_i_=0;_i_ -
  • For initializes a dynamic array, use GIM_DYNARRAY_CREATE or GIM_DYNARRAY_CREATE_SIZED. -
  • When an array is no longer used, must be terminated with the macro GIM_DYNARRAY_DESTROY. - -*/ -//! @{ -#define G_ARRAY_GROW_SIZE 100 - -//! Dynamic array handle. -struct GDYNAMIC_ARRAY -{ - char * m_pdata; - GUINT m_size; - GUINT m_reserve_size; -}; -//typedef struct _GDYNAMIC_ARRAY GDYNAMIC_ARRAY; - -//! Creates a dynamic array zero sized -#define GIM_DYNARRAY_CREATE(type,array_data,reserve_size) \ -{ \ - array_data.m_pdata = (char *)gim_alloc(reserve_size*sizeof(type)); \ - array_data.m_size = 0; \ - array_data.m_reserve_size = reserve_size; \ -}\ - -//! Creates a dynamic array with n = size elements -#define GIM_DYNARRAY_CREATE_SIZED(type,array_data,size) \ -{ \ - array_data.m_pdata = (char *)gim_alloc(size*sizeof(type)); \ - array_data.m_size = size; \ - array_data.m_reserve_size = size; \ -}\ - -//! Reserves memory for a dynamic array. -#define GIM_DYNARRAY_RESERVE_SIZE(type,array_data,reserve_size) \ -{ \ - if(reserve_size>array_data.m_reserve_size )\ - { \ - array_data.m_pdata = (char *) gim_realloc(array_data.m_pdata,array_data.m_size*sizeof(type),reserve_size*sizeof(type));\ - array_data.m_reserve_size = reserve_size; \ - }\ -}\ - -//! Set the size of the array -#define GIM_DYNARRAY_SET_SIZE(type,array_data,size) \ -{ \ - GIM_DYNARRAY_RESERVE_SIZE(type,array_data,size);\ - array_data.m_size = size;\ -}\ - -//! Gets a pointer from the beginning of the array -#define GIM_DYNARRAY_POINTER(type,array_data) (type *)(array_data.m_pdata) - -//! Gets a pointer from the last elemento of the array -#define GIM_DYNARRAY_POINTER_LAST(type,array_data) (((type *)array_data.m_pdata)+array_data.m_size-1) - -//! Inserts an element at the last position -#define GIM_DYNARRAY_PUSH_ITEM(type,array_data,item)\ -{\ - if(array_data.m_reserve_size<=array_data.m_size)\ - {\ - GIM_DYNARRAY_RESERVE_SIZE(type,array_data,(array_data.m_size+G_ARRAY_GROW_SIZE));\ - }\ - type * _pt = GIM_DYNARRAY_POINTER(type,array_data);\ - memcpy(&_pt[array_data.m_size],&item,sizeof(type));\ - array_data.m_size++; \ -}\ - -//! Inserts an element at the last position -#define GIM_DYNARRAY_PUSH_EMPTY(type,array_data)\ -{\ - if(array_data.m_reserve_size<=array_data.m_size)\ - {\ - GIM_DYNARRAY_RESERVE_SIZE(type,array_data,(array_data.m_size+G_ARRAY_GROW_SIZE));\ - }\ - array_data.m_size++; \ -}\ - -//! Inserts an element -#define GIM_DYNARRAY_INSERT_ITEM(type,array_data,item,index) \ -{ \ - if(array_data.m_reserve_size<=array_data.m_size)\ - {\ - GIM_DYNARRAY_RESERVE_SIZE(type,array_data,(array_data.m_size+G_ARRAY_GROW_SIZE));\ - }\ - type * _pt = GIM_DYNARRAY_POINTER(type,array_data);\ - if(index0) \ - { \ - array_data.m_size--; \ - } \ -}\ - -//! Destroys the array -void GIM_DYNARRAY_DESTROY(GDYNAMIC_ARRAY & array_data); -//! @} - -/*! \defgroup BITSET -\brief -Bitsets , based on \ref DYNAMIC_ARRAYS . -
      -
    • For initializes a bitset array, use \ref GIM_BITSET_CREATE or \ref GIM_BITSET_CREATE_SIZED. -
    • When the bitset is no longer used, must be terminated with the macro \ref GIM_DYNARRAY_DESTROY. -
    • For putting a mark on the bitset, call \ref GIM_BITSET_SET -
    • For clearing a mark on the bitset, call \ref GIM_BITSET_CLEAR -
    • For retrieving a bit value from a bitset, call \ref GIM_BITSET_GET- -
    -*/ -//! @{ - -//! Creates a bitset -#define GIM_BITSET_CREATE(array_data) GIM_DYNARRAY_CREATE(GUINT,array_data,G_ARRAY_GROW_SIZE) - -//! Creates a bitset, with their bits set to 0. -#define GIM_BITSET_CREATE_SIZED(array_data,bits_count)\ -{\ - array_data.m_size = bits_count/GUINT_BIT_COUNT + 1;\ - GIM_DYNARRAY_CREATE(GUINT,array_data,array_data.m_size);\ - GUINT * _pt = GIM_DYNARRAY_POINTER(GUINT,array_data);\ - memset(_pt,0,sizeof(GUINT)*(array_data.m_size));\ -}\ - -//! Gets the bitset bit count. -#define GIM_BITSET_SIZE(array_data) (array_data.m_size*GUINT_BIT_COUNT) - -//! Resizes a bitset, with their bits set to 0. -#define GIM_BITSET_RESIZE(array_data,new_bits_count)\ -{ \ - GUINT _oldsize = array_data.m_size;\ - array_data.m_size = new_bits_count/GUINT_BIT_COUNT + 1; \ - if(_oldsize array_data.m_reserve_size)\ - {\ - GIM_DYNARRAY_RESERVE_SIZE(GUINT,array_data,array_data.m_size+G_ARRAY_GROW_SIZE);\ - }\ - GUINT * _pt = GIM_DYNARRAY_POINTER(GUINT,array_data);\ - memset(&_pt[_oldsize],0,sizeof(GUINT)*(array_data.m_size-_oldsize));\ - }\ -}\ - -//! Sets all bitset bit to 0. -#define GIM_BITSET_CLEAR_ALL(array_data)\ -{\ - memset(array_data.m_pdata,0,sizeof(GUINT)*array_data.m_size);\ -}\ - -//! Sets all bitset bit to 1. -#define GIM_BITSET_SET_ALL(array_data)\ -{\ - memset(array_data.m_pdata,0xFF,sizeof(GUINT)*array_data.m_size);\ -}\ - -///Sets the desired bit to 1 -#define GIM_BITSET_SET(array_data,bit_index)\ -{\ - if(bit_index>=GIM_BITSET_SIZE(array_data))\ - {\ - GIM_BITSET_RESIZE(array_data,bit_index);\ - }\ - GUINT * _pt = GIM_DYNARRAY_POINTER(GUINT,array_data);\ - _pt[bit_index >> GUINT_EXPONENT] |= (1 << (bit_index & (GUINT_BIT_COUNT-1)));\ -}\ - -///Return 0 or 1 -#define GIM_BITSET_GET(array_data,bit_index,get_value) \ -{\ - if(bit_index>=GIM_BITSET_SIZE(array_data))\ - {\ - get_value = 0;\ - }\ - else\ - {\ - GUINT * _pt = GIM_DYNARRAY_POINTER(GUINT,array_data);\ - get_value = _pt[bit_index >> GUINT_EXPONENT] & (1 << (bit_index & (GUINT_BIT_COUNT-1)));\ - }\ -}\ - -///Sets the desired bit to 0 -#define GIM_BITSET_CLEAR(array_data,bit_index) \ -{\ - if(bit_index> GUINT_EXPONENT] &= ~(1 << (bit_index & (GUINT_BIT_COUNT-1)));\ - }\ -}\ -//! @} - -/*! \defgroup MEMORY_ACCESS_CONSTANTS -\brief -Memory Access constants. -\sa BUFFERS -*/ -//! @{ -#define G_MA_READ_ONLY 1 -#define G_MA_WRITE_ONLY 2 -#define G_MA_READ_WRITE 3 -//! @} - -/*! \defgroup MEMORY_USAGE_CONSTANTS -\brief -Memory usage constants. -\sa BUFFERS -*/ -//! @{ -/// Don't care how memory is used -#define G_MU_EITHER 0 -/// specified once, doesn't allow read information -#define G_MU_STATIC_WRITE 1 -/// specified once, allows to read information from a shadow buffer -#define G_MU_STATIC_READ 2 -/// write directly on buffer, allows to read information from a shadow buffer -#define G_MU_STATIC_READ_DYNAMIC_WRITE 3 -/// upload data to buffer from the shadow buffer, allows to read information from a shadow buffer -#define G_MU_STATIC_READ_DYNAMIC_WRITE_COPY 4 -/// specified once, allows to read information directly from memory -#define G_MU_STATIC_WRITE_DYNAMIC_READ 5 -/// write directly on buffer, allows to read information directly from memory -#define G_MU_DYNAMIC_READ_WRITE 6 -//! @} - -/*! \defgroup BUFFER_ERRORS -\brief -Buffer operation errors -\sa BUFFERS -*/ -//! @{ -#define G_BUFFER_OP_SUCCESS 0 -#define G_BUFFER_OP_INVALID 1 -#define G_BUFFER_OP_STILLREFCOUNTED 2 -//! @} - -/*! \defgroup BUFFER_MANAGER_IDS -\brief -Buffer manager identifiers -\sa BUFFERS, BUFFER_MANAGERS -*/ -//! @{ -#define G_BUFFER_MANAGER_SYSTEM 0 -#define G_BUFFER_MANAGER_SHARED 1 -#define G_BUFFER_MANAGER_USER 2 -//! @} - -/*! \defgroup BUFFERS -\brief -Buffer operations and structs. -
      -
    • Before using buffers you must initializes GIMPACT buffer managers by calling \ref gimpact_init. -
    • For initializes a buffer, use \ref gim_create_buffer, \ref gim_create_buffer_from_data , \ref gim_create_common_buffer, \ref gim_create_common_buffer_from_data or \ref gim_create_shared_buffer_from_data. -
    • For accessing to the buffer memory, you must call \ref gim_lock_buffer, and then \ref gim_unlock_buffer for finish the access. -
    • When a buffer is no longer needed, you must free it by calling \ref gim_buffer_free. -
    • You must call \ref gimpact_terminate when finish your application. -
    • For a safe manipulation of buffers, use \ref BUFFER_ARRAYS -
    -\sa BUFFER_MANAGERS, BUFFER_ARRAYS -*/ -//! @{ - -//! Buffer handle. -struct GBUFFER_ID -{ - GUINT m_buffer_id; - GUINT m_buffer_manager_id; -}; -//typedef struct _GBUFFER_ID GBUFFER_ID; - -//! Buffer internal data -struct GBUFFER_DATA -{ - GUINT m_buffer_handle;//!< if 0, buffer doesn't exists - GUINT m_size; - GUINT m_usage; - GINT m_access; - GUINT m_lock_count; - char * m_mapped_pointer; - GBUFFER_ID m_shadow_buffer; - GUINT m_refcount;//! Reference counting for safe garbage collection -}; -//typedef struct _GBUFFER_DATA GBUFFER_DATA; -//! @} - -/*! \defgroup BUFFERS_MANAGER_PROTOTYPES -\brief -Function prototypes to allocate and free memory for buffers -\sa BUFFER_MANAGERS, BUFFERS -*/ -//! @{ - -//! Returns a Buffer handle -typedef GUINT gim_buffer_alloc_function(GUINT size,int usage); - -//! Returns a Buffer handle, and copies the pdata to the buffer -typedef GUINT gim_buffer_alloc_data_function(const void * pdata,GUINT size,int usage); - -//! Changes the size of the buffer preserving the content, and returns the new buffer id -typedef GUINT gim_buffer_realloc_function(GUINT buffer_handle,GUINT oldsize,int old_usage,GUINT newsize,int new_usage); - -//! It changes the m_buffer_handle member to 0/0 -typedef void gim_buffer_free_function(GUINT buffer_handle,GUINT size); - -//! It maps the m_mapped_pointer. Returns a pointer -typedef char * gim_lock_buffer_function(GUINT buffer_handle,int access); - -//! It sets the m_mapped_pointer to 0 -typedef void gim_unlock_buffer_function(GUINT buffer_handle); - -typedef void gim_download_from_buffer_function( - GUINT source_buffer_handle, - GUINT source_pos, - void * destdata, - GUINT copysize); - -typedef void gim_upload_to_buffer_function( - GUINT dest_buffer_handle, - GUINT dest_pos, - void * sourcedata, - GUINT copysize); - -typedef void gim_copy_buffers_function( - GUINT source_buffer_handle, - GUINT source_pos, - GUINT dest_buffer_handle, - GUINT dest_pos, - GUINT copysize); -//! @} - - -/*! \defgroup BUFFER_MANAGERS -\brief -Buffer Manager operations -*/ -//! @{ -//! Buffer manager prototype -struct GBUFFER_MANAGER_PROTOTYPE -{ - gim_buffer_alloc_function * alloc_fn; - gim_buffer_alloc_data_function *alloc_data_fn; - gim_buffer_realloc_function * realloc_fn; - gim_buffer_free_function * free_fn; - gim_lock_buffer_function * lock_buffer_fn; - gim_unlock_buffer_function * unlock_buffer_fn; - gim_download_from_buffer_function * download_from_buffer_fn; - gim_upload_to_buffer_function * upload_to_buffer_fn; - gim_copy_buffers_function * copy_buffers_fn; -}; -//typedef struct _GBUFFER_MANAGER_PROTOTYPE GBUFFER_MANAGER_PROTOTYPE; - -//! Buffer manager -struct GBUFFER_MANAGER_DATA -{ - GDYNAMIC_ARRAY m_buffer_array;//!< Array of GBUFFER_DATA objects - GDYNAMIC_ARRAY m_free_positions;//!< Array of GUINT elements. Free positions - GBUFFER_MANAGER_PROTOTYPE m_prototype;//! Prototype of functions - GUINT m_active; //!< 0 or 1 -}; -//typedef struct _GBUFFER_MANAGER_DATA GBUFFER_MANAGER_DATA; - -//! Adds a buffer Manager to the Memory Singleton -void gim_create_buffer_manager(GBUFFER_MANAGER_PROTOTYPE * prototype,GUINT buffer_manager_id); -//! Gets buffer manager -GUINT gim_get_buffer_manager_count(); -//! Destroys a buffer manager -void gim_destroy_buffer_manager(GUINT buffer_manager_id); -void gim_get_buffer_manager_data(GUINT buffer_manager_id,GBUFFER_MANAGER_DATA ** pbm_data); -void gim_init_buffer_managers(); -void gim_terminate_buffer_managers(); - -//! @} - - -/*! \addtogroup BUFFERS -*/ -//! @{ - -//!Creates a buffer on the buffer manager specified by buffer_manager_id -/*! -\param buffer_manager_id -\param buffer_size -\param usage An usage constant. Use G_MU_DYNAMIC_READ_WRITE as default. -\param buffer_id a pointer for receive the new buffer id -\return An error code. 0 if success. -\post m_refcount = 0 -*/ -GUINT gim_create_buffer( - GUINT buffer_manager_id, - GUINT buffer_size, - int usage, - GBUFFER_ID * buffer_id); - -//!Creates a buffer on the buffer manager specified by buffer_manager_id -/*! -\param buffer_manager_id -\param pdata Data for allocating -\param buffer_size Size of the data buffer -\param usage An usage constant. Use G_MU_DYNAMIC_READ_WRITE as default. -\param buffer_id a pointer for receive the new buffer id -\return An error code. 0 if success. -\post m_refcount = 0 -*/ -GUINT gim_create_buffer_from_data( - GUINT buffer_manager_id, - const void * pdata, - GUINT buffer_size, - int usage, - GBUFFER_ID * buffer_id); - -//!Allocates on the G_BUFFER_MANAGER_SYSTEM -GUINT gim_create_common_buffer(GUINT buffer_size, GBUFFER_ID * buffer_id); -//!Allocates on the G_BUFFER_MANAGER_SYSTEM, and copies the data -GUINT gim_create_common_buffer_from_data( - const void * pdata, GUINT buffer_size, GBUFFER_ID * buffer_id); -//!Creates a buffer with shared data -GUINT gim_create_shared_buffer_from_data( - const void * pdata, GUINT buffer_size, GBUFFER_ID * buffer_id); - - -//! Add reference counting to buffer. -GINT gim_buffer_add_ref(GBUFFER_ID * buffer_id); - -//! Function for resize buffer, preserving the content -/*! -\param buffer_id -\param newsize -\return An error code. 0 if success. -\post If m_refcount>0 then it decrements it. -*/ -GINT gim_buffer_realloc(GBUFFER_ID * buffer_id,GUINT newsize); - -//! Eliminates the buffer. -/*! -If the buffer reference counting is <= 1 and is unlocked, then it eliminates the buffer. -*/ -GINT gim_buffer_free(GBUFFER_ID * buffer_id); - -//! Locks the buffer for memory access. -/*! -\param buffer_id Id from buffer. -\param access Must have the following values: G_MA_READ_ONLY,G_MA_WRITE_ONLY or G_MA_READ_WRITE. -\param map_pointer Dest Pointer of the memory address from buffer. -\post m_lock_count increases. -*/ -GINT gim_lock_buffer(GBUFFER_ID * buffer_id,int access,char ** map_pointer); - -//! Unlocks the buffer for memory access. -GINT gim_unlock_buffer(GBUFFER_ID * buffer_id); - -//! Gets the buffer size in bytes -GINT gim_get_buffer_size(GBUFFER_ID * buffer_id,GUINT * buffer_size); - -//! Determines if the buffer is locked -GINT gim_get_buffer_is_locked(GBUFFER_ID * buffer_id,GUINT * lock_count); - -//! Copies the content of the buffer to a dest pointer -GINT gim_download_from_buffer( - GBUFFER_ID * buffer_id, - GUINT source_pos, - void * destdata, - GUINT copysize); - -//! Copies the content of a memory pointer to the buffer -GINT gim_upload_to_buffer( - GBUFFER_ID * buffer_id, - GUINT dest_pos, - void * sourcedata, - GUINT copysize); - -//! Copies two buffers. -GINT gim_copy_buffers( - GBUFFER_ID * source_buffer_id, - GUINT source_pos, - GBUFFER_ID * dest_buffer_id, - GUINT dest_pos, - GUINT copysize); -//! @} - - -/*! \defgroup BUFFER_ARRAYS - -\brief -Buffered Arrays, for manip elements on a buffer and treat it as an array. -
      -
    • Before using buffer arrays you must initializes GIMPACT buffer managers by calling gimpact_init. -
    • Before creating buffer arrays, you must create a buffer. see \ref BUFFERS. -
    • Create a buffer narray by calling \ref GIM_BUFFER_ARRAY_INIT_TYPE, \ref GIM_BUFFER_ARRAY_INIT_TYPE_OFFSET or \ref GIM_BUFFER_ARRAY_INIT_OFFSET_STRIDE. -
    • For accessing to the array elements, you must call \ref gim_buffer_array_lock, and then \ref gim_buffer_array_unlock for finish the access. -
    • When a buffer array is no longer needed, you must free it by calling \ref GIM_BUFFER_ARRAY_DESTROY. -
    -The following example shows how Buffer arrays can be used: - -\code -int main() -{ - //init gimpact - gimpact_init(); - - //Buffer handle to use - GBUFFER_ID bufferhandle; - - //Create a memory buffer of 100 float numbers - gim_create_common_buffer(100*sizeof(float), &bufferhandle); - - //Create a buffer array from the bufferhandle - GBUFFER_ARRAY buffer_float_array; - GIM_BUFFER_ARRAY_INIT_TYPE(float,buffer_float_array,bufferhandle,100); - - ////Access to the buffer data, set all elements of the array - - int i, count; - count = buffer_float_array.m_element_count; - //Locks the array - gim_buffer_array_lock(&buffer_float_array,G_MA_READ_WRITE); - float * pelements = GIM_BUFFER_ARRAY_POINTER(float, buffer_float_array, 0); // A pointer to the buffer memory - - //fill the array with random numbers - for (i = 0;i < count;i++ ) - { - pelements[i] = gim_unit_random(); - } - //unlock buffer - gim_buffer_array_unlock(&buffer_float_array); - - //Program code - .... - .... - - //Destroy array - GIM_BUFFER_ARRAY_DESTROY(buffer_float_array); - - //terminate gimpact - gimpact_terminate(); -} -\endcode - -\sa BUFFERS -*/ -//! @{ - -//! Buffer managed array struct. -struct GBUFFER_ARRAY -{ - GBUFFER_ID m_buffer_id; - char * m_buffer_data; - char m_byte_stride; - GUINT m_byte_offset; - GUINT m_element_count; -}; -//typedef struct _GBUFFER_ARRAY GBUFFER_ARRAY; - -//! Sets offset for a buffered array. -#define GIM_BUFFER_ARRAY_SET_OFFSET(_array_data,_offset) (_array_data).m_byte_offset = _offset*(_array_data).m_byte_stride; - -//! Sets offset for a buffered array. -#define GIM_BUFFER_ARRAY_GET_OFFSET(_array_data,_offset) _offset = (_array_data).m_byte_offset/(_array_data).m_byte_stride; - -//!Return a pointer of the element at the _index -#define GIM_BUFFER_ARRAY_POINTER(_type,_array_data,_index) (_type *)((_array_data).m_buffer_data + _index*(_array_data).m_byte_stride) - -//! Sets stride for a buffered array. -#define GIM_BUFFER_ARRAY_SET_STRIDE(_type,_array_data) (_array_data).m_byte_stride = sizeof(_type); - -//! Is array stride equal to the size of the type ? -#define GIM_BUFFER_ARRAY_IS_ALIGNED(_type,_array_data) ((_array_data).m_byte_stride == sizeof(_type)) - -///Verify if two arrays have the same data -#define GIM_BUFFER_ARRAY_ARE_SAME(_array_data1,_array_data2,aresame)\ -{\ - aresame = 1;\ - if((_array_data1).m_buffer_id.m_buffer_id != (_array_data2).m_buffer_id.m_buffer_id || (_array_data1).m_buffer_id.m_buffer_manager_id != (_array_data2).m_buffer_id.m_buffer_manager_id || (_array_data1).m_byte_offset != (_array_data2).m_byte_offset)\ - {\ - aresame = 0;\ - }\ -}\ - -//! Reserve size for a buffered array. -/*! -\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED ) -*/ -#define GIM_BUFFER_ARRAY_RESERVE_SIZE(type,array_data,reserve_size)\ -{ \ - if(reserve_size>(array_data).m_element_count)\ - {\ - GUINT _buffer_size,_newarray_size;\ - gim_get_buffer_size(&(array_data).m_buffer_id,_buffer_size);\ - _newarray_size = reserve_size*(array_data).m_byte_stride;\ - if(_newarray_size>_buffer_size)\ - { \ - _newarray_size += G_ARRAY_GROW_SIZE*(array_data).m_byte_stride;\ - gim_buffer_realloc(&(array_data).m_buffer_id,_newarray_size);\ - }\ - }\ -}\ - -//! Pushes an element at last position -/*! -\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED ) -*/ -#define GIM_BUFFER_ARRAY_PUSH_ITEM(type,array_data,item)\ -{\ - GIM_BUFFER_ARRAY_RESERVE_SIZE(type,array_data,(array_data).m_element_count+1);\ - gim_buffer_array_lock(&array_data,G_MA_WRITE_ONLY);\ - type * _pt = GIM_BUFFER_ARRAY_POINTER(type,array_data,(array_data).m_element_count);\ - memcpy(_pt,&item,sizeof(type));\ - gim_buffer_array_unlock(&array_data);\ - (array_data)->m_element_count++; \ -}\ - -//! Pushes a new element at last position -/*! -\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED ) -*/ -#define GIM_BUFFER_ARRAY_PUSH_EMPTY(type,array_data)\ -{\ - GIM_BUFFER_ARRAY_RESERVE_SIZE(type,array_data,(array_data).m_element_count+1);\ - array_data->m_element_count++; \ -}\ - -//! Inserts an element -/*! -\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED ) -*/ -#define GIM_BUFFER_ARRAY_INSERT_ITEM(type,array_data,item,index) \ -{ \ - GIM_BUFFER_ARRAY_RESERVE_SIZE(type,array_data,(array_data).m_element_count+1);\ - gim_buffer_array_lock(&array_data,G_MA_WRITE_ONLY);\ - type * _pt = GIM_BUFFER_ARRAY_POINTER(type,array_data,0);\ - if(index<(array_data)->m_element_count-1) \ - { \ - memcpy(&_pt[index+1],&_pt[index],((array_data).m_element_count-index)*sizeof(type));\ - } \ - memcpy(&_pt[index],&item,sizeof(type));\ - gim_buffer_array_unlock(&array_data);\ - (array_data).m_element_count++; \ -}\ - -//! Deletes an element -/*! -\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED ) -*/ -#define GIM_BUFFER_ARRAY_DELETE_ITEM(type,array_data,index) \ -{ \ - if(index<(array_data).m_element_count-1) \ - { \ - gim_buffer_array_lock(&array_data,G_MA_WRITE_ONLY);\ - type * _pt = GIM_BUFFER_ARRAY_POINTER(type,array_data,0);\ - memcpy(&_pt[index],&_pt[index+1],((array_data).m_element_count-index-1)*sizeof(type));\ - gim_buffer_array_unlock(&array_data);\ - } \ - (array_data).m_element_count--; \ -}\ - -//! Deletes an element at last position -/*! -\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED ) -*/ -#define GIM_BUFFER_ARRAY_POP_ITEM(array_data) \ -{ \ - if((array_data).m_element_count>0) \ - { \ - (array_data).m_element_count--; \ - } \ -}\ - - -//! Initializes an GBUFFER_ARRAY object from a buffer ID -/*! -m_buffer_data will be 0, for acces to the elements, you'd need to call lock_array -\param array_data Array structure to be filled -\param buffer_id A GBUFFER_ID structure which this array_daya will refer to -\param element_count Number of elements -\param offset element offset, it isn't byte offset. 0 is recomended -\param byte_stride size of each element. 0 is recomended. -\post Adds reference to the buffer -\sa gim_buffer_add_ref -*/ -#define GIM_BUFFER_ARRAY_INIT_OFFSET_STRIDE(array_data,buffer_id,element_count,offset,byte_stride)\ -{\ - (array_data).m_buffer_id.m_buffer_id = (buffer_id).m_buffer_id;\ - (array_data).m_buffer_id.m_buffer_manager_id = (buffer_id).m_buffer_manager_id;\ - (array_data).m_buffer_data = 0;\ - (array_data).m_element_count = element_count;\ - (array_data).m_byte_stride = byte_stride;\ - GIM_BUFFER_ARRAY_SET_OFFSET(array_data,offset);\ - gim_buffer_add_ref(&(buffer_id));\ -}\ - -//! Initializes an GBUFFER_ARRAY object from a buffer ID and a Given type -/*! -m_buffer_data will be 0, for acces to the elements, you'd need to call lock_array -\param type Type of the Array. It determines the stride. -\param array_data Array structure to be filled -\param buffer_id A GBUFFER_ID structure which this array_daya will refer to -\param element_count Number of elements -\param offset element offset, it isn't byte offset. 0 is recomended -\post Adds reference to the buffer -\sa gim_buffer_add_ref -*/ -#define GIM_BUFFER_ARRAY_INIT_TYPE_OFFSET(type,array_data,buffer_id,element_count,offset)\ -{\ - (array_data).m_buffer_id.m_buffer_id = (buffer_id).m_buffer_id;\ - (array_data).m_buffer_id.m_buffer_manager_id = (buffer_id).m_buffer_manager_id;\ - (array_data).m_buffer_data = 0;\ - (array_data).m_element_count = element_count;\ - GIM_BUFFER_ARRAY_SET_STRIDE(type,array_data);\ - GIM_BUFFER_ARRAY_SET_OFFSET(array_data,offset);\ - gim_buffer_add_ref(&(buffer_id));\ -}\ - -//! Initializes a buffer array giving a data type and a buffer id -/*! -m_buffer_data will be 0, for acces to the elements, you'd need to call lock_array. -\param type Type of the Array. It determines the stride. -\param array_data Array structure to be filled -\param buffer_id A GBUFFER_ID structure which this array_daya will refer to -\param element_count Number of elements -\post Adds reference to the buffer -\sa gim_buffer_add_ref -*/ -#define GIM_BUFFER_ARRAY_INIT_TYPE(type,array_data,buffer_id,element_count) GIM_BUFFER_ARRAY_INIT_TYPE_OFFSET(type,array_data,buffer_id,element_count,0) - -//! Gain access to the array buffer through the m_buffer_data element -/*! -m_buffer_data pointer will be located at the m_byte_offset position of the buffer m_buffer -Then, You'd need to call unlock_array when finish to using the array access. - -\pre if m_buffer_data != 0, the function returns -\param array_data Array structure to be locked -\param access A constant for access to the buffer. can be G_MA_READ_ONLY,G_MA_WRITE_ONLY or G_MA_READ_WRITE -\return an Buffer error code -*/ -GINT gim_buffer_array_lock(GBUFFER_ARRAY * array_data, int access); - -//! close the access to the array buffer through the m_buffer_data element -/*! -\param array_data Array structure to be locked -\return an Buffer error code -*/ -GINT gim_buffer_array_unlock(GBUFFER_ARRAY * array_data); - -//! Copy an array by reference -/*! -\post A reference to the m_buffer_id is increased. -*/ -void gim_buffer_array_copy_ref(GBUFFER_ARRAY * source_data,GBUFFER_ARRAY * dest_data); - - -//! Copy an array by value -/*! -\post A new buffer is created -*/ -void gim_buffer_array_copy_value(GBUFFER_ARRAY * source_data,GBUFFER_ARRAY * dest_data, GUINT buffer_manager_id,int usage); - -//! Destroys an GBUFFER_ARRAY object -/*! -\post Attemps to destroy the buffer, decreases reference counting -*/ -void GIM_BUFFER_ARRAY_DESTROY(GBUFFER_ARRAY & array_data); - -//! Copy the content of the array to a pointer -/*! -\pre dest_data must have the same size as the array_data -\param type -\param array_data A GBUFFERED_ARRAY structure -\param dest_data A type pointer -*/ -#define GIM_BUFFER_ARRAY_DOWNLOAD(type,array_data,dest_data)\ -{\ - if(GIM_BUFFER_ARRAY_IS_ALIGNED(type,array_data))\ - {\ - gim_download_from_buffer(&(array_data).m_buffer_id, (array_data).m_byte_offset,(void *) dest_data, (array_data).m_element_count*(array_data).m_byte_stride);\ - }\ - else\ - {\ - GUINT _k_, _ecount_= (array_data).m_element_count;\ - type * _source_vert_;\ - type * _dest_vert_ = dest_data;\ - gim_buffer_array_lock(&(array_data),G_MA_READ_ONLY);\ - for (_k_ = 0;_k_< _ecount_; _k_++)\ - {\ - _source_vert_ = GIM_BUFFER_ARRAY_POINTER(type,array_data,_k_);\ - memcpy(_dest_vert_,_source_vert_,sizeof(type));\ - _dest_vert_++;\ - }\ - gim_buffer_array_unlock(&(array_data));\ - }\ -}\ - -//! Upload the content of a a pointer to a buffered array -/*! -\pre source_data must have the same size as the array_data -\param type -\param array_data A GBUFFERED_ARRAY structure -\param source_data A void pointer -*/ -#define GIM_BUFFER_ARRAY_UPLOAD(type,array_data,source_data)\ -{\ - if(GIM_BUFFER_ARRAY_IS_ALIGNED(type,array_data))\ - {\ - gim_upload_to_buffer(&(array_data).m_buffer_id, (array_data).m_byte_offset,(void *) source_data, (array_data).m_element_count*(array_data).m_byte_stride);\ - }\ - else\ - {\ - GUINT _k_, _ecount_= (array_data).m_element_count;\ - type * _source_vert_ = source_data;\ - type * _dest_vert_;\ - gim_buffer_array_lock(&(array_data),G_MA_WRITE_ONLY);\ - for (_k_ = 0;_k_< _ecount_; _k_++)\ - {\ - _dest_vert_ = GIM_BUFFER_ARRAY_POINTER(type,array_data,_k_);\ - memcpy(_dest_vert_,_source_vert_,sizeof(type));\ - _source_vert_++;\ - }\ - gim_buffer_array_unlock(&(array_data));\ - }\ -}\ - - -//!Kernel function prototype for process streams, given a buffered array as source and -/*! -\param 1 the uniform arguments -\param 2 the source stream -\param 3 the destination stream -*/ -typedef void (* gim_kernel_func)(void *,GBUFFER_ARRAY *,GBUFFER_ARRAY *); - -//! Generic Stream Processingp loop -/*! - -This macro executes a kernel macro or function for each element of the streams -\pre _src_array->m_count <= _dst_array->m_count - -\param _uniform_data An argument to be passed to the Kernel function -\param _src_array An GBUFFER_ARRAY structure passed as the source stream -\param _dst_array An GBUFFER_ARRAY structure passed as the source stream -\param _kernel Macro or function of the kernel -\param _src_type Required. Type of all elements of the source stream -\param _dst_type Required. Type of all elements of the dest stream -*/ -#define GIM_PROCESS_BUFFER_ARRAY(_uniform_data,_src_array,_dst_array,_kernel,_src_type,_dst_type) {\ -\ - gim_buffer_array_lock(&_src_array,G_MA_READ_ONLY);\ - gim_buffer_array_lock(&_dst_array,G_MA_WRITE_ONLY);\ -\ - GUINT _i_, _count_=(_src_array).m_element_count;\ -\ - _src_type * _source_vert_;\ - _dst_type * _dest_vert_;\ - if(GIM_BUFFER_ARRAY_IS_ALIGNED(_src_type,_src_array) && GIM_BUFFER_ARRAY_IS_ALIGNED(_dst_type,_dst_array))\ - {\ -\ - _source_vert_ = GIM_BUFFER_ARRAY_POINTER(_src_type,_src_array,0);\ - _dest_vert_ = GIM_BUFFER_ARRAY_POINTER(_dst_type,_dst_array,0);\ - for (_i_ = 0;_i_< _count_; _i_++)\ - {\ - _kernel(_uniform_data,(*_source_vert_),(*_dest_vert_));\ - _source_vert_++;\ - _dest_vert_++;\ - }\ - }\ - else\ - {\ - for (_i_ = 0;_i_< _count_; _i_++)\ - {\ - _source_vert_ = GIM_BUFFER_ARRAY_POINTER(_src_type,_src_array,_i_);\ - _dest_vert_ = GIM_BUFFER_ARRAY_POINTER(_dst_type,_dst_array,_i_);\ - _kernel(_uniform_data,(*_source_vert_),(*_dest_vert_));\ - }\ - }\ - gim_buffer_array_unlock(&_src_array);\ - gim_buffer_array_unlock(&_dst_array);\ -}\ - -//! @} - -#endif // GIM_MEMORY_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_radixsort.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_radixsort.h deleted file mode 100644 index a5f8e124a4..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_radixsort.h +++ /dev/null @@ -1,258 +0,0 @@ -#ifndef GIM_RADIXSORT_H_INCLUDED -#define GIM_RADIXSORT_H_INCLUDED -/*! \file gim_radixsort.h -\author Francisco Len. -Based on the work of Michael Herf : "fast floating-point radix sort" -Avaliable on http://www.stereopsis.com/radix.html -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_memory.h" - -/*! \defgroup SORTING -\brief -Macros for sorting. -*/ -//! @{ -struct GIM_RSORT_TOKEN -{ - GUINT m_key; - GUINT m_value; -}; -//typedef struct _GIM_RSORT_TOKEN GIM_RSORT_TOKEN; - -//comparator for sorting -#define RSORT_TOKEN_COMPARATOR(x, y) ((int)((x.m_key) - (y.m_key))) - -// ---- utils for accessing 11-bit quantities -#define D11_0(x) (x & 0x7FF) -#define D11_1(x) (x >> 11 & 0x7FF) -#define D11_2(x) (x >> 22 ) - - -//COMMON FUNCTIONS FOR ACCESSING THE KEY OF AN ELEMENT - - -//For the type of your array, you need to declare a macro for obtaining the key, like these: -#define SIMPLE_GET_FLOAT32KEY(e,key) {key =(GREAL)(e);} - -#define SIMPLE_GET_INTKEY(e,key) {key =(GINT)(e);} - -#define SIMPLE_GET_UINTKEY(e,key) {key =(GUINT)(e);} - -//For the type of your array, you need to declare a macro for copy elements, like this: - -#define SIMPLE_COPY_ELEMENTS(dest,src) {dest = src;} - -#define kHist 2048 - -///Radix sort for unsigned integer keys - -#define GIM_RADIX_SORT_RTOKENS(array,sorted,element_count)\ -{\ - GUINT i;\ - GUINT b0[kHist * 3];\ - GUINT *b1 = b0 + kHist;\ - GUINT *b2 = b1 + kHist;\ - for (i = 0; i < kHist * 3; i++)\ - {\ - b0[i] = 0;\ - }\ - GUINT fi;\ - GUINT pos;\ - for (i = 0; i < element_count; i++)\ - {\ - fi = array[i].m_key;\ - b0[D11_0(fi)] ++;\ - b1[D11_1(fi)] ++;\ - b2[D11_2(fi)] ++;\ - }\ - {\ - GUINT sum0 = 0, sum1 = 0, sum2 = 0;\ - GUINT tsum;\ - for (i = 0; i < kHist; i++)\ - {\ - tsum = b0[i] + sum0;\ - b0[i] = sum0 - 1;\ - sum0 = tsum;\ - tsum = b1[i] + sum1;\ - b1[i] = sum1 - 1;\ - sum1 = tsum;\ - tsum = b2[i] + sum2;\ - b2[i] = sum2 - 1;\ - sum2 = tsum;\ - }\ - }\ - for (i = 0; i < element_count; i++)\ - {\ - fi = array[i].m_key;\ - pos = D11_0(fi);\ - pos = ++b0[pos];\ - sorted[pos].m_key = array[i].m_key;\ - sorted[pos].m_value = array[i].m_value;\ - }\ - for (i = 0; i < element_count; i++)\ - {\ - fi = sorted[i].m_key;\ - pos = D11_1(fi);\ - pos = ++b1[pos];\ - array[pos].m_key = sorted[i].m_key;\ - array[pos].m_value = sorted[i].m_value;\ - }\ - for (i = 0; i < element_count; i++)\ - {\ - fi = array[i].m_key;\ - pos = D11_2(fi);\ - pos = ++b2[pos];\ - sorted[pos].m_key = array[i].m_key;\ - sorted[pos].m_value = array[i].m_value;\ - }\ -}\ - -/// Get the sorted tokens from an array. For generic use. Tokens are GIM_RSORT_TOKEN -#define GIM_RADIX_SORT_ARRAY_TOKENS(array, sorted_tokens, element_count, get_uintkey_macro)\ -{\ - GIM_RSORT_TOKEN * _unsorted = (GIM_RSORT_TOKEN *) gim_alloc(sizeof(GIM_RSORT_TOKEN )*element_count);\ - GUINT _i;\ - for (_i=0;_i 0)\ - {\ - _stack_index_ --;\ - _start_ = _start_stack_[_stack_index_];\ - _end_ = _end_stack_[_stack_index_];\ - while (_end_ - _start_ > 2)\ - {\ - _p_ = _start_;\ - _i_ = _start_ + 1;\ - _j_ = _end_ - 1;\ - while (_i_<_j_) \ - {\ - for(; _i_<=_j_ && comp_macro(((array)[_i_]),((array)[_p_]))<=0; _i_++) ;\ - if (_i_ > _j_) \ - {\ - exchange_macro(type, array, _j_, _p_);\ - _i_ = _j_;\ - }\ - else\ - {\ - for(; _i_<=_j_ && comp_macro(((array)[_j_]),((array)[_p_]))>=0; _j_--) ;\ - if (_i_ > _j_) \ - {\ - exchange_macro(type, array, _j_, _p_);\ - _i_ = _j_;\ - }\ - else if (_i_ < _j_)\ - {\ - exchange_macro(type, array, _i_, _j_);\ - if (_i_+2 < _j_) {_i_++; _j_--;}\ - else if (_i_+1 < _j_) _i_++;\ - }\ - }\ - }\ - if (_i_-_start_ > 1 && _end_-_j_ > 1) \ - {\ - if (_i_-_start_ < _end_-_j_-1) \ - {\ - _start_stack_[_stack_index_] = _j_+1;\ - _end_stack_[_stack_index_] = _end_;\ - _stack_index_ ++;\ - _end_ = _i_;\ - }\ - else\ - {\ - _start_stack_[_stack_index_] = _start_;\ - _end_stack_[_stack_index_] = _i_;\ - _stack_index_ ++;\ - _start_ = _j_+1;\ - }\ - }\ - else\ - {\ - if (_i_-_start_ > 1)\ - {\ - _end_ = _i_;\ - }\ - else \ - {\ - _start_ = _j_+1;\ - }\ - }\ - }\ - if (_end_ - _start_ == 2) \ - {\ - if (comp_macro(((array)[_start_]),((array)[_end_-1])) > 0) \ - {\ - exchange_macro(type, array, _start_, _end_-1);\ - }\ - }\ - }\ -}\ - -#define GIM_DEF_EXCHANGE_MACRO(type, _array, _i, _j)\ -{\ - type _e_tmp_ =(_array)[(_i)];\ - (_array)[(_i)]=(_array)[(_j)];\ - (_array)[(_j)]= _e_tmp_;\ -}\ - -#define GIM_COMP_MACRO(x, y) ((GINT)((x) - (y))) -//! @} -#endif // GIM_RADIXSORT_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h deleted file mode 100644 index 2b31604a48..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef GIM_TRI_CAPSULE_COLLISION_H_INCLUDED -#define GIM_TRI_CAPSULE_COLLISION_H_INCLUDED - -/*! \file gim_tri_capsule_collision.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_memory.h" - -/*! \addtogroup GEOMETRIC_OPERATIONS -*/ -//! @{ - -//! Capsule struct -struct GIM_CAPSULE_DATA -{ - GREAL m_radius; - vec3f m_point1; - vec3f m_point2; -}; -//typedef struct _GIM_CAPSULE_DATA GIM_CAPSULE_DATA; - -#define CALC_CAPSULE_AABB(capsule,aabb)\ -{\ - if(capsule.m_point1[0]G_EPSILON ?1:0; \ - if(_classif == 0) \ - { \ - if(_prevclassif==1) \ - {\ - if(clipped_count u*axe1[i1] + ((vecproj[i2] - u*axe1[i2])/axe2[i2])*axe2[i1] = vecproj[i1] - - --> u*axe1[i1] + vecproj[i2]*axe2[i1]/axe2[i2] - u*axe1[i2]*axe2[i1]/axe2[i2] = vecproj[i1] - - --> u*(axe1[i1] - axe1[i2]*axe2[i1]/axe2[i2]) = vecproj[i1] - vecproj[i2]*axe2[i1]/axe2[i2] - - --> u*((axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1])/axe2[i2]) = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1])/axe2[i2] - - --> u*(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1]) = vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1] - - --> u = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1]) /(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1]) - -if 0.0<= u+v <=1.0 then they are inside of triangle - - */ -#define TRIANGLE_GET_UVPARAMETERS(point,vec1,vec2,vec3,tri_plane,u,v,outside)\ -{\ - vec3f _axe1, _axe2, _vecproj;\ - VEC_DIFF(_axe1,vec2,vec1);\ - VEC_DIFF(_axe2,vec3,vec1);\ - VEC_DIFF(_vecproj,point,vec1);\ - GUINT _i1,_i2;\ - PLANE_MINOR_AXES(tri_plane, _i1, _i2);\ - if(fabsf(_axe2[_i2])G_EPSILON)\ - {\ - outside = 1;\ - }\ - else\ - {\ - outside = 0;\ - }\ - }\ -}\ - -//! Finds the collision of a ray and a triangle. -#define RAY_TRIANGLE_INTERSECTION(vOrigin,vDir,vec1,vec2,vec3,tri_plane,pout,u,v,tparam,tmax,does_intersect)\ -{\ - RAY_PLANE_COLLISION(tri_plane,vDir,vOrigin,pout,tparam,does_intersect);\ - if(does_intersect != 0)\ - {\ - if(tparam<-G_EPSILON||tparam>tmax+G_EPSILON)\ - {\ - does_intersect = 0;\ - }\ - else\ - {\ - TRIANGLE_GET_UVPARAMETERS(pout,vec1,vec2,vec3,tri_plane,u,v,does_intersect);\ - does_intersect = !does_intersect;\ - }\ - }\ -}\ - - -//! @} - -#endif // GIM_TRI_COLLISION_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h deleted file mode 100644 index a2a81d67fa..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef GIM_TRI_SPHERE_COLLISION_H_INCLUDED -#define GIM_TRI_SPHERE_COLLISION_H_INCLUDED - -/*! \file gim_tri_sphere_collision.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -/*! \addtogroup GEOMETRIC_OPERATIONS -*/ -//! @{ - -//! Finds the contact points from a collision of a triangle and a sphere -/*! -\param tri -\param center -\param radius -\param contact_data Contains the closest points on the Sphere, and the normal is pointing to triangle -*/ -int gim_triangle_sphere_collision( - GIM_TRIANGLE_DATA *tri, - vec3f center, GREAL radius, - GIM_TRIANGLE_CONTACT_DATA * contact_data); - -//! @} -#endif // GIM_TRI_SPHERE_COLLISION_H_INCLUDED diff --git a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_trimesh.h b/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_trimesh.h deleted file mode 100644 index b1cdf7f808..0000000000 --- a/libraries/ode-0.9/GIMPACT/include/GIMPACT/gim_trimesh.h +++ /dev/null @@ -1,539 +0,0 @@ -#ifndef GIM_TRIMESH_H_INCLUDED -#define GIM_TRIMESH_H_INCLUDED -/*! \file gim_trimesh.h -\author Francisco Len -*/ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_boxpruning.h" -#include "GIMPACT/gim_contact.h" - - -///MAsk defines -#define GIM_TRIMESH_TRANSFORMED_REPLY 1 -#define GIM_TRIMESH_NEED_UPDATE 2 - -/*! \addtogroup TRIMESH -\brief -A Trimesh is the basic geometric structure for representing solid objects. -

    CREATING TRIMESHES

    -
      -
    • For creating trimeshes, you must initialize Buffer managers by calling \ref gimpact_init -
    • Then you must define the vertex and index sources by creating them with \ref BUFFER_ARRAYS routines, and then call \ref gim_trimesh_create_from_arrays. -
    • An alternative way for creaing trimesh objects is calling \ref gim_trimesh_create_from_data. -
    • For access to the trimesh data (vertices, triangle indices), you must call \ref gim_trimesh_locks_work_data , and \ref gim_trimesh_unlocks_work_data for finish the access. -
    • Each time when the trimesh data is modified, you must call \ref gim_trimesh_update after. -
    • When a trimesh is no longer needed, you must call \ref gim_trimesh_destroy. -
    - -

    This is an example of how to create a deformable trimesh that shares vertices with the user application:

    -\code -//Declaration of vertices -vec3f trimeshvertices[200]; -//Declaration of indices -GUINT trimeshindices[100]; - -... Initializing vertices and triangle indices at beginning - -//Then create trimesh -GIM_TRIMESH mytrimesh; - -//Calling trimesh create function - -gim_trimesh_create_from_data( -&mytrimesh, -trimeshvertices,200, -0 ,//copy_vertices is 0 -trimeshindices, -100, -0, //copy_indices is 0 -0 //transformed_reply is 0 -); -\endcode -

    Note that parameter transformed_reply is 0, that means that m_transformed_vertex_buffer is a reference to m_source_vertex on the trimesh, and transformations are not avaliable. Use that configuration if you have to simulate a deformable trimesh like cloth or elastic bodies.

    -

    When the trimesh is no longer needed, destroy it safely with gim_trimesh_destroy()

    -

    UPDATING TRIMESHES

    -

    On simulation loops, is needed to update trimeshes every time for update vertices althought updating triangle boxes and planes cache. There is two ways for update trimeshes:

    -
      -
    • Updating vertices directly. You need to access to the \ref GIM_TRIMESH.m_source_vertex_buffer member; a vertex buffer which has access to the source vertices. -\code -// Access to the source vertices -gim_buffer_array_lock(&mytrimesh.m_source_vertex_buffer, G_MA_READ_WRITE); - -//Get a pointer to the vertex buffer -vec3f * vertexpointer = GIM_BUFFER_ARRAY_POINTER(vec3f,mytrimesh.m_source_vertex_buffer,0); - -//Get the amount of vertices -int veccount = mytrimesh.m_source_vertex_buffer.m_element_count; - -//Modify vertices -for (int i=0;itransformed_reply = 0. -
    -
      -
    • Aplying a transformation. Simply use \ref gim_trimesh_set_tranform . Remember that with this method trimeshes must be created with \ref gim_trimesh_create_from_data with parameter transformed_reply = 1. -
    -

    After updating vertices, you must call \ref gim_trimesh_update()

    -

    TRIMESHES COLLISION

    -

    Before collide trimeshes, you need to update them first.

    -

    Then you must use \ref gim_trimesh_trimesh_collision().

    - -*/ -//! @{ - -//! Prototype for updating vertices -typedef void * gim_update_trimesh_function(struct _GIM_TRIMESH *); - -//! Trimesh -struct GIM_TRIMESH -{ - ///Original - //@{ - GBUFFER_ARRAY m_source_vertex_buffer;//!< Buffer of vec3f coordinates - - //! (GUINT) Indices of triangles,groups of three elements. - /*! - Array of GUINT. Triangle indices. Each triple contains indices of the vertices for each triangle. - \invariant must be aligned - */ - GBUFFER_ARRAY m_tri_index_buffer; - //@} - ///Allocated - //@{ - char m_mask;//!< Don't use directly - - //! Allocated transformed vertices vec3f - /*! - Array of vec3f.If gim_trimesh_has_tranformed_reply(this) == 1 then it refers to the m_source_vertex_buffer - \invariant must be aligned - */ - GBUFFER_ARRAY m_transformed_vertex_buffer; - //@} - ///Auxiliary data - //@{ - GIM_AABB_SET m_aabbset; - GDYNAMIC_ARRAY m_planes_cache_buffer;//! Allocated GIM_TRIPLANES_CACHE - GDYNAMIC_ARRAY m_planes_cache_bitset; - gim_update_trimesh_function * m_update_callback;//! If null, then m_transform is applied. - mat4f m_transform; - //@} -}; -//typedef struct _GIM_TRIMESH GIM_TRIMESH; - -/// Info about mesh -//! Return the trimesh triangle count -GUINT gim_trimesh_get_triangle_count(GIM_TRIMESH * trimesh); - -//! Returns 1 if the m_transformed_vertex_buffer is a reply of m_source_vertex_buffer -char gim_trimesh_has_tranformed_reply(GIM_TRIMESH * trimesh); - -//! Returns 1 if the trimesh needs to update their aabbset and the planes cache. -char gim_trimesh_needs_update(GIM_TRIMESH * trimesh); - -//! Change the state of the trimesh for force it to update -/*! -Call it after made changes to the trimesh. -\post gim_trimesh_need_update(trimesh) will return 1 -\sa gim_trimesh_needs_update,gim_trimesh_has_tranformed_reply -*/ -void gim_trimesh_post_update(GIM_TRIMESH * trimesh); - -//! Creates the aabb set and the triangles cache -/*! - -\param trimesh -\param vertex_array -\param triindex_array -\param transformed_reply If 1, then the m_transformed_vertices is a reply of the source vertices. Else it just be a reference to the original array. -\post it copies the arrays by reference, and creates the auxiliary data (m_aabbset,m_planes_cache_buffer) -*/ -void gim_trimesh_create_from_arrays(GIM_TRIMESH * trimesh, GBUFFER_ARRAY * vertex_array, GBUFFER_ARRAY * triindex_array,char transformed_reply); - - - -//! Create a trimesh from vertex array and an index array -/*! -\param trimesh An uninitialized GIM_TRIMESH structure -\param vertex_array A buffer to a vec3f array -\param vertex_count -\param triindex_array -\param index_count -\param copy_vertices If 1, it copies the source vertices in another buffer. Else (0) it constructs a reference to the data. -\param copy_indices If 1, it copies the source vertices in another buffer. Else (0) it constructs a reference to the data. -\param transformed_reply If 1, then the m_transformed_vertices is a reply of the source vertices. Else it just be a reference to the original array. Use 1 if you will apply transformations to the trimesh. See \ref gim_trimesh_set_tranform(). -*/ -void gim_trimesh_create_from_data(GIM_TRIMESH * trimesh, vec3f * vertex_array, GUINT vertex_count,char copy_vertices, GUINT * triindex_array, GUINT index_count,char copy_indices,char transformed_reply); - -//! Clears auxiliary data and releases buffer arrays -void gim_trimesh_destroy(GIM_TRIMESH * trimesh); - -//! Copies two meshes -/*! -\param source_trimesh -\param dest_trimesh -\param copy_by_reference If 1, it attach a reference to the source vertices, else it copies the vertices -\param transformed_reply If 1, transformed vertices are reply of source vertives. 1 Is recommended -*/ -void gim_trimesh_copy(GIM_TRIMESH * source_trimesh,GIM_TRIMESH * dest_trimesh, char copy_by_reference, char transformed_reply); - - -//! Locks the trimesh for working with it -/*! -\post locks m_tri_index_buffer and m_transformed_vertex_buffer. -\param trimesh -*/ -void gim_trimesh_locks_work_data(GIM_TRIMESH * trimesh); - - -//! unlocks the trimesh -/*! -\post unlocks m_tri_index_buffer and m_transformed_vertex_buffer. -\param trimesh -*/ -void gim_trimesh_unlocks_work_data(GIM_TRIMESH * trimesh); - -//! Updates m_transformed_vertex_buffer -/*! -\pre m_transformed_vertex_buffer must be unlocked -*/ -void gim_trimesh_update_vertices(GIM_TRIMESH * trimesh); - -//! Updates m_aabbset and m_planes_cache_bitset -/*! -\pre gim_trimesh_locks_work_data must be called before -*/ -void gim_trimesh_update_aabbset(GIM_TRIMESH * trimesh); - -//! Calls before perfom collisions. Updates the trimesh if needed -/*! -\post If gim_trimesh_needs_update returns 1, then it calls gim_trimesh_update_vertices and gim_trimesh_update_aabbset -*/ -void gim_trimesh_update(GIM_TRIMESH * trimesh); - -//! Set the transform of a trimesh -/*! -\post This function calls to gim_trimesh_post_update -*/ -void gim_trimesh_set_tranform(GIM_TRIMESH * trimesh, mat4f transform); - -//! Fetch triangle data -/*! -\pre gim_trimesh_locks_work_data must be called before -*/ -void gim_trimesh_get_triangle_data(GIM_TRIMESH * trimesh, GUINT triangle_index, GIM_TRIANGLE_DATA * tri_data); - -//! Fetch triangle vertices -/*! -\pre gim_trimesh_locks_work_data must be called before -*/ -void gim_trimesh_get_triangle_vertices(GIM_TRIMESH * trimesh, GUINT triangle_index, vec3f v1,vec3f v2,vec3f v3); - -//! Trimesh Trimesh Collisions -/*! -Before use this function you must update each trimesh: -\code -gim_trimesh_update(TriMesh1); -gim_trimesh_update(TriMesh2); -\endcode -Then you must use the trimesh collision in this way: -\code -int collide_trimeshes(GIM_TRIMESH * TriMesh1, GIM_TRIMESH * TriMesh2) -{ - //Create contact list - GDYNAMIC_ARRAY trimeshcontacts; - GIM_CREATE_CONTACT_LIST(trimeshcontacts); - - //Collide trimeshes - gim_trimesh_trimesh_collision(TriMesh1,TriMesh2,&trimeshcontacts); - - if(trimeshcontacts.m_size == 0) //do nothing - { - GIM_DYNARRAY_DESTROY(trimeshcontacts);//clean contact array - return 0; - } - - //Getting a pointer to the contact array - GIM_CONTACT * ptrimeshcontacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,trimeshcontacts); - - int contactcount = trimeshcontacts.m_size; - int i; - //Process contacts - for (i=0;i -
  • m_handle1 points to trimesh1. -
  • m_handle2 points to trimesh2. -
  • m_feature1 Is a triangle index of trimesh1. -
  • m_feature2 Is a triangle index of trimesh2. - - -\param trimesh1 Collider -\param trimesh2 Collidee -\param contacts A GIM_CONTACT array. Must be initialized -*/ -void gim_trimesh_trimesh_collision(GIM_TRIMESH * trimesh1, GIM_TRIMESH * trimesh2, GDYNAMIC_ARRAY * contacts); - - -//! Trimesh Sphere Collisions -/*! -Before use this function you must update the trimesh: -\code -gim_trimesh_update(trimesh); -\endcode -Then you must use this function in this way: -\code -int collide_trimesh_sphere(GIM_TRIMESH * trimesh, vec3f center,GREAL radius) -{ - //Create contact list - GDYNAMIC_ARRAY trimeshcontacts; - GIM_CREATE_CONTACT_LIST(trimeshcontacts); - - //Collide trimeshes - gim_trimesh_sphere_collision(trimesh,center,radius,&trimeshcontacts); - - if(trimeshcontacts.m_size == 0) //do nothing - { - GIM_DYNARRAY_DESTROY(trimeshcontacts);//clean contact array - return 0; - } - - //Getting a pointer to the contact array - GIM_CONTACT * ptrimeshcontacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,trimeshcontacts); - - int contactcount = trimeshcontacts.m_size; - int i; - //Process contacts - for (i=0;i -
  • m_handle1 points to trimesh. -
  • m_handle2 points to NULL. -
  • m_feature1 Is a triangle index of trimesh. - - -\param trimesh -\param center -\param radius -\param contacts A GIM_CONTACT array. Must be initialized -*/ -void gim_trimesh_sphere_collision(GIM_TRIMESH * trimesh,vec3f center,GREAL radius, GDYNAMIC_ARRAY * contacts); - - -//! Trimesh Capsule collision -/*! -Find the closest primitive collided by the ray. - -Before use this function you must update the trimesh: -\code -gim_trimesh_update(trimesh); -\endcode -Then you must use this function in this way: -\code -int collide_trimesh_capsule(GIM_TRIMESH * trimesh, GIM_CAPSULE_DATA * capsule) -{ - //Create contact list - GDYNAMIC_ARRAY trimeshcontacts; - GIM_CREATE_CONTACT_LIST(trimeshcontacts); - - //Collide trimeshes - gim_trimesh_capsule_collision(trimesh,capsule,&trimeshcontacts); - - if(trimeshcontacts.m_size == 0) //do nothing - { - GIM_DYNARRAY_DESTROY(trimeshcontacts);//clean contact array - return 0; - } - - //Getting a pointer to the contact array - GIM_CONTACT * ptrimeshcontacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,trimeshcontacts); - - int contactcount = trimeshcontacts.m_size; - int i; - //Process contacts - for (i=0;i -
  • m_handle1 points to trimesh. -
  • m_handle2 points to NULL. -
  • m_feature1 Is a triangle index of trimesh. - - -\param trimesh -\param capsule -\param contacts A GIM_CONTACT array. Must be initialized -*/ -void gim_trimesh_capsule_collision(GIM_TRIMESH * trimesh, GIM_CAPSULE_DATA * capsule, GDYNAMIC_ARRAY * contacts); - - -///Function for create Trimesh Plane collision result -#define GIM_CREATE_TRIMESHPLANE_CONTACTS(dynarray) GIM_DYNARRAY_CREATE(vec4f,dynarray,G_ARRAY_GROW_SIZE) - -//! Trimesh Plane Collisions -/*! - -Before use this function you must update the trimesh: -\code -gim_trimesh_update(trimesh); -\endcode -Then you must use this function in this way: -\code -int collide_trimesh_plane(GIM_TRIMESH * trimesh, vec4f plane) -{ - //Create contact list - GDYNAMIC_ARRAY tri_plane_contacts; - GIM_CREATE_TRIMESHPLANE_CONTACTS(tri_plane_contacts); - - //Collide trimeshes - gim_trimesh_plane_collision(trimesh,plane,&tri_plane_contacts); - - if(tri_plane_contacts.m_size == 0) //do nothing - { - GIM_DYNARRAY_DESTROY(tri_plane_contacts);//clean contact array - return 0; - } - - //Getting a pointer to the contact array - vec4f * planecontacts = GIM_DYNARRAY_POINTER(vec4f,tri_plane_contacts); - - int contactcount = tri_plane_contacts.m_size; - int i; - //Process contacts - for (i=0;im_count = count; - aabbset->m_boxes = (aabb3f *)gim_alloc(sizeof(aabb3f)*count); - - if(countm_maxcoords = 0; - aabbset->m_sorted_mincoords = 0; - } - else - { - aabbset->m_maxcoords = (GUINT *)gim_alloc(sizeof(GUINT)*aabbset->m_count ); - aabbset->m_sorted_mincoords = (GIM_RSORT_TOKEN *)gim_alloc(sizeof(GIM_RSORT_TOKEN)*aabbset->m_count); - } - aabbset->m_shared = 0; - INVALIDATE_AABB(aabbset->m_global_bound); -} - -//! Destroys the aabb set. -void gim_aabbset_destroy(GIM_AABB_SET * aabbset) -{ - aabbset->m_count = 0; - if(aabbset->m_shared==0) - { - gim_free(aabbset->m_boxes,0); - gim_free(aabbset->m_maxcoords,0); - gim_free(aabbset->m_sorted_mincoords,0); - } - aabbset->m_boxes = 0; - aabbset->m_sorted_mincoords = 0; - aabbset->m_maxcoords = 0; -} - -void gim_aabbset_calc_global_bound(GIM_AABB_SET * aabbset) -{ - aabb3f * paabb = aabbset->m_boxes; - aabb3f * globalbox = &aabbset->m_global_bound; - AABB_COPY((*globalbox),(*paabb)); - - GUINT count = aabbset->m_count-1; - paabb++; - while(count) - { - MERGEBOXES(*globalbox,*paabb) - paabb++; - count--; - } -} - - -//! Sorts the boxes for box prunning. -/*! -1) find the integer representation of the aabb coords -2) Sorts the min coords -3) Calcs the global bound -\pre aabbset must be allocated. And the boxes must be already set. -\param aabbset -\param calc_global_bound If 1 , calcs the global bound -\post If aabbset->m_sorted_mincoords == 0, then it allocs the sorted coordinates -*/ -void gim_aabbset_sort(GIM_AABB_SET * aabbset, char calc_global_bound) -{ - if(aabbset->m_sorted_mincoords == 0) - {//allocate - aabbset->m_maxcoords = (GUINT *)gim_alloc(sizeof(GUINT)*aabbset->m_count ); - aabbset->m_sorted_mincoords = (GIM_RSORT_TOKEN *)gim_alloc(sizeof(GIM_RSORT_TOKEN)*aabbset->m_count); - } - - GUINT i, count = aabbset->m_count; - aabb3f * paabb = aabbset->m_boxes; - GUINT * maxcoords = aabbset->m_maxcoords; - GIM_RSORT_TOKEN * sorted_tokens = aabbset->m_sorted_mincoords; - - if(count<860)//Calibrated on a Pentium IV - { - //Sort by quick sort - //Calculate keys - for(i=0;im_index1 = i;\ - _pair->m_index2 = j;\ -} - -#define PUSH_PAIR_INV(i,j,pairset)\ -{\ - GIM_DYNARRAY_PUSH_EMPTY(GIM_PAIR,pairset);\ - GIM_PAIR * _pair = GIM_DYNARRAY_POINTER(GIM_PAIR,pairset) + (pairset).m_size - 1;\ - _pair->m_index1 = j;\ - _pair->m_index2 = i;\ -} - -#define FIND_OVERLAPPING_FOWARD(\ - curr_index,\ - test_count,\ - test_aabb,\ - max_coord_uint,\ - sorted_tokens,\ - aabbarray,\ - pairset,\ - push_pair_macro)\ -{\ - GUINT _i = test_count;\ - char _intersected;\ - GIM_RSORT_TOKEN * _psorted_tokens = sorted_tokens;\ - while(max_coord_uint >= _psorted_tokens->m_key && _i>0)\ - {\ - AABBCOLLISION(_intersected,test_aabb,aabbarray[_psorted_tokens->m_value]);\ - if(_intersected)\ - {\ - push_pair_macro(curr_index, _psorted_tokens->m_value,pairset);\ - }\ - _psorted_tokens++;\ - _i--;\ - }\ -} - -//! log(N) Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. -/*! -\pre aabbset must be allocated and sorted, the boxes must be already set. -\param aabbset Must be sorted. Global bound isn't required -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_self_intersections_sorted(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs) -{ - collision_pairs->m_size = 0; - GUINT count = aabbset->m_count; - aabb3f * paabb = aabbset->m_boxes; - GUINT * maxcoords = aabbset->m_maxcoords; - GIM_RSORT_TOKEN * sorted_tokens = aabbset->m_sorted_mincoords; - aabb3f test_aabb; - while(count>1) - { - ///current cache variables - GUINT curr_index = sorted_tokens->m_value; - GUINT max_coord_uint = maxcoords[curr_index]; - AABB_COPY(test_aabb,paabb[curr_index]); - - ///next pairs - sorted_tokens++; - count--; - FIND_OVERLAPPING_FOWARD( curr_index, count, test_aabb, max_coord_uint, sorted_tokens , paabb, (*collision_pairs),PUSH_PAIR); - } -} - -//! NxN Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. -/*! -\pre aabbset must be allocated, the boxes must be already set. -\param aabbset Global bound isn't required. Doen't need to be sorted. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_self_intersections_brute_force(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs) -{ - collision_pairs->m_size = 0; - GUINT i,j; - GUINT count = aabbset->m_count; - aabb3f * paabb = aabbset->m_boxes; - char intersected; - for (i=0;i< count-1 ;i++ ) - { - for (j=i+1;jm_size = 0; - - AABBCOLLISION(intersected,aabbset1->m_global_bound,aabbset2->m_global_bound); - if(intersected == 0) return; - - GUINT count1 = aabbset1->m_count; - aabb3f * paabb1 = aabbset1->m_boxes; - GUINT * maxcoords1 = aabbset1->m_maxcoords; - GIM_RSORT_TOKEN * sorted_tokens1 = aabbset1->m_sorted_mincoords; - - GUINT count2 = aabbset2->m_count; - aabb3f * paabb2 = aabbset2->m_boxes; - GUINT * maxcoords2 = aabbset2->m_maxcoords; - GIM_RSORT_TOKEN * sorted_tokens2 = aabbset2->m_sorted_mincoords; - - GUINT curr_index; - - GUINT max_coord_uint; - aabb3f test_aabb; - - //Classify boxes - //Find Set intersection - aabb3f int_abbb; - BOXINTERSECTION(aabbset1->m_global_bound,aabbset2->m_global_bound, int_abbb); - - //Clasify set 1 - GIM_RSORT_TOKEN * classified_tokens1 = (GIM_RSORT_TOKEN *) gim_alloc(sizeof(GIM_RSORT_TOKEN)*count1); - GUINT i,classified_count1 = 0,classified_count2 = 0; - - - for (i=0;i0&&classified_count2>0) - { - if(sorted_tokens1->m_key <= sorted_tokens2->m_key) - { - ///current cache variables - curr_index = sorted_tokens1->m_value; - max_coord_uint = maxcoords1[curr_index]; - AABB_COPY(test_aabb,paabb1[curr_index]); - ///next pairs - sorted_tokens1++; - classified_count1--; - FIND_OVERLAPPING_FOWARD( curr_index, classified_count2, test_aabb, max_coord_uint, sorted_tokens2 , paabb2, (*collision_pairs), PUSH_PAIR); - } - else ///Switch test - { - ///current cache variables - curr_index = sorted_tokens2->m_value; - max_coord_uint = maxcoords2[curr_index]; - AABB_COPY(test_aabb,paabb2[curr_index]); - ///next pairs - sorted_tokens2++; - classified_count2--; - FIND_OVERLAPPING_FOWARD( curr_index, classified_count1, test_aabb, max_coord_uint, sorted_tokens1 , paabb1, (*collision_pairs), PUSH_PAIR_INV ); - } - } - gim_free(classified_tokens1 ,0); - gim_free(classified_tokens2 ,0); -} - -//! NxM Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. -/*! -\pre aabbset1 and aabbset2 must be allocated and sorted, the boxes must be already set. -\param aabbset1 Must be sorted, Global bound is required. -\param aabbset2 Must be sorted, Global bound is required. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_bipartite_intersections_brute_force(GIM_AABB_SET * aabbset1,GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs) -{ - char intersected; - collision_pairs->m_size = 0; - AABBCOLLISION(intersected,aabbset1->m_global_bound,aabbset2->m_global_bound); - if(intersected == 0) return; - - aabb3f int_abbb; - //Find Set intersection - BOXINTERSECTION(aabbset1->m_global_bound,aabbset2->m_global_bound, int_abbb); - //Clasify set 1 - GUINT i,j; - GUINT classified_count = 0; - - GUINT count = aabbset1->m_count; - aabb3f * paabb1 = aabbset1->m_boxes; - aabb3f * paabb2 = aabbset2->m_boxes; - - GUINT * classified = (GUINT *) gim_alloc(sizeof(GUINT)*count); - - for (i=0;im_count; - for (i=0;im_count < GIM_MIN_SORTED_BIPARTITE_PRUNING_BOXES) - {//Brute force approach - gim_aabbset_calc_global_bound(aabbset); - } - else - {//Sorted force approach - gim_aabbset_sort(aabbset,1); - } -} - -//! Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. -/*! -This function sorts the set and then it calls to gim_aabbset_self_intersections_brute_force or gim_aabbset_self_intersections_sorted. - -\param aabbset Set of boxes. Sorting isn't required. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -\pre aabbset must be allocated and initialized. -\post If aabbset->m_count >= GIM_MIN_SORTED_PRUNING_BOXES, then it calls to gim_aabbset_sort and then to gim_aabbset_self_intersections_sorted. -*/ -void gim_aabbset_self_intersections(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs) -{ - if(aabbset->m_count < GIM_MIN_SORTED_PRUNING_BOXES) - {//Brute force approach - gim_aabbset_self_intersections_brute_force(aabbset,collision_pairs); - } - else - {//Sorted force approach - gim_aabbset_sort(aabbset,0); - gim_aabbset_self_intersections_sorted(aabbset,collision_pairs); - } -} - -//! Collides two sets. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. -/*! -\pre aabbset1 and aabbset2 must be allocated and updated. See . -\param aabbset1 Must be sorted, Global bound is required. -\param aabbset2 Must be sorted, Global bound is required. -\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100) -*/ -void gim_aabbset_bipartite_intersections(GIM_AABB_SET * aabbset1, GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs) -{ - if(aabbset1->m_sorted_mincoords == 0||aabbset2->m_sorted_mincoords == 0) - {//Brute force approach - gim_aabbset_bipartite_intersections_brute_force(aabbset1,aabbset2,collision_pairs); - } - else - {//Sorted force approach - gim_aabbset_bipartite_intersections_sorted(aabbset1,aabbset2,collision_pairs); - } -} - -void gim_aabbset_box_collision(aabb3f *test_aabb, GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collided) -{ - collided->m_size = 0; - char intersected; - AABBCOLLISION(intersected,aabbset->m_global_bound,(*test_aabb)); - if(intersected == 0) return; - - GUINT i; - GUINT count = aabbset->m_count; - aabb3f * paabb = aabbset->m_boxes; - aabb3f _testaabb; - AABB_COPY(_testaabb,*test_aabb); - - for (i=0;i< count;i++ ) - { - AABBCOLLISION(intersected,paabb[i],_testaabb); - if(intersected) - { - GIM_DYNARRAY_PUSH_ITEM(GUINT,(*collided),i); - } - } -} - -void gim_aabbset_ray_collision(vec3f vorigin,vec3f vdir, GREAL tmax, GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collided) -{ - collided->m_size = 0; - char intersected; - GREAL tparam = 0; - BOX_INTERSECTS_RAY(aabbset->m_global_bound, vorigin, vdir, tparam, tmax,intersected); - if(intersected==0) return; - - GUINT i; - GUINT count = aabbset->m_count; - aabb3f * paabb = aabbset->m_boxes; - - for (i=0;i< count;i++ ) - { - BOX_INTERSECTS_RAY(paabb[i], vorigin, vdir, tparam, tmax,intersected); - if(intersected) - { - GIM_DYNARRAY_PUSH_ITEM(GUINT,(*collided),i); - } - } -} diff --git a/libraries/ode-0.9/GIMPACT/src/gim_contact.cpp b/libraries/ode-0.9/GIMPACT/src/gim_contact.cpp deleted file mode 100644 index 762af06e66..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_contact.cpp +++ /dev/null @@ -1,132 +0,0 @@ - -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_contact.h" - -void gim_merge_contacts(GDYNAMIC_ARRAY * source_contacts, - GDYNAMIC_ARRAY * dest_contacts) -{ - dest_contacts->m_size = 0; - - GUINT source_count = source_contacts->m_size; - GIM_CONTACT * psource_contacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,(*source_contacts)); - //create keys - GIM_RSORT_TOKEN * keycontacts = (GIM_RSORT_TOKEN * )gim_alloc(sizeof(GIM_RSORT_TOKEN)*source_count); - - GUINT i; - for(i=0;im_size;i++) - { - key = keycontacts[i].m_key; - scontact = &psource_contacts[keycontacts[i].m_value]; - - if(i>0 && last_key == key) - { - //merge contact - if(pcontact->m_depth > scontact->m_depth + CONTACT_DIFF_EPSILON) - { - GIM_COPY_CONTACTS(pcontact, scontact); - } - } - else - {//add new contact - GIM_DYNARRAY_PUSH_EMPTY(GIM_CONTACT,(*dest_contacts)); - pcontact = GIM_DYNARRAY_POINTER_LAST(GIM_CONTACT,(*dest_contacts)); - GIM_COPY_CONTACTS(pcontact, scontact); - } - last_key = key; - } - gim_free(keycontacts,0); -} - -void gim_merge_contacts_unique(GDYNAMIC_ARRAY * source_contacts, - GDYNAMIC_ARRAY * dest_contacts) -{ - dest_contacts->m_size = 0; - //Traverse the source contacts - GUINT source_count = source_contacts->m_size; - if(source_count==0) return; - - GIM_CONTACT * psource_contacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,(*source_contacts)); - - //add the unique contact - GIM_CONTACT * pcontact = 0; - GIM_DYNARRAY_PUSH_EMPTY(GIM_CONTACT,(*dest_contacts)); - pcontact = GIM_DYNARRAY_POINTER_LAST(GIM_CONTACT,(*dest_contacts)); - //set the first contact - GIM_COPY_CONTACTS(pcontact, psource_contacts); - - if(source_count==1) return; - //scale the first contact - VEC_SCALE(pcontact->m_normal,pcontact->m_depth,pcontact->m_normal); - - psource_contacts++; - - //Average the contacts - GUINT i; - for(i=1;im_point,pcontact->m_point,psource_contacts->m_point); - VEC_ACCUM(pcontact->m_normal,psource_contacts->m_depth,psource_contacts->m_normal); - psource_contacts++; - } - - GREAL divide_average = 1.0f/((GREAL)source_count); - - VEC_SCALE(pcontact->m_point,divide_average,pcontact->m_point); - - pcontact->m_depth = VEC_DOT(pcontact->m_normal,pcontact->m_normal)*divide_average; - GIM_SQRT(pcontact->m_depth,pcontact->m_depth); - - VEC_NORMALIZE(pcontact->m_normal); - - /*GREAL normal_len; - VEC_INV_LENGTH(pcontact->m_normal,normal_len); - VEC_SCALE(pcontact->m_normal,normal_len,pcontact->m_normal); - - //Deep = LEN(normal)/SQRT(source_count) - GIM_SQRT(divide_average,divide_average); - pcontact->m_depth = divide_average/normal_len; - */ -} - - - diff --git a/libraries/ode-0.9/GIMPACT/src/gim_math.cpp b/libraries/ode-0.9/GIMPACT/src/gim_math.cpp deleted file mode 100644 index 18efb2cc8d..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_math.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include "GIMPACT/gim_math.h" -#include "stdlib.h" -#include "time.h" - - -GREAL gim_inv_sqrt(GREAL f) -{ - GREAL r; - GIM_INV_SQRT(f,r); - return r; -} - -GREAL gim_sqrt(GREAL f) -{ - GREAL r; - GIM_SQRT(f,r); - return r; -} - -//!Initializes mathematical functions -void gim_init_math() -{ - srand( static_cast< unsigned int >( time( 0 ) ) ); -} - -//! Generates an unit random -GREAL gim_unit_random() -{ - GREAL rn = static_cast< GREAL >( rand() ); - rn/=(GREAL)RAND_MAX; - return rn; -} diff --git a/libraries/ode-0.9/GIMPACT/src/gim_memory.cpp b/libraries/ode-0.9/GIMPACT/src/gim_memory.cpp deleted file mode 100644 index 247565a4e9..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_memory.cpp +++ /dev/null @@ -1,848 +0,0 @@ - -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - - -#include "GIMPACT/gim_memory.h" -#include "stdlib.h" -#include "malloc.h" -//#include "mm_malloc.h" - -static gim_alloc_function *g_allocfn = 0; -static gim_alloca_function *g_allocafn = 0; -static gim_realloc_function *g_reallocfn = 0; -static gim_free_function *g_freefn = 0; - -// buffer managers -#define MAX_BUFFER_MANAGERS 16 -static GBUFFER_MANAGER_DATA g_buffer_managers[MAX_BUFFER_MANAGERS]; -static GUINT g_buffer_managers_count = 0; - -#define VALIDATE_BUFFER_MANAGER(buffer_manager_id)\ - if(buffer_manager_id>=MAX_BUFFER_MANAGERS) return G_BUFFER_OP_INVALID;\ - GBUFFER_MANAGER_DATA * bm_data;\ - gim_get_buffer_manager_data(buffer_manager_id,&bm_data);\ - if(bm_data == 0) return G_BUFFER_OP_INVALID;\ - -#define VALIDATE_BUFFER_ID_PT(buffer_id)\ - VALIDATE_BUFFER_MANAGER(buffer_id->m_buffer_manager_id)\ - if(buffer_id->m_buffer_id>=bm_data->m_buffer_array.m_size) return G_BUFFER_OP_INVALID;\ - GBUFFER_DATA * pbuffer = GIM_DYNARRAY_POINTER(GBUFFER_DATA,bm_data->m_buffer_array);\ - pbuffer += buffer_id->m_buffer_id;\ - if(pbuffer->m_buffer_handle==0) return G_BUFFER_OP_INVALID;\ - - -void GIM_BUFFER_ARRAY_DESTROY(GBUFFER_ARRAY & array_data) -{ - gim_buffer_array_unlock(&array_data); - gim_buffer_free(&(array_data).m_buffer_id); -} - -void GIM_DYNARRAY_DESTROY(GDYNAMIC_ARRAY & array_data) -{ - if(array_data.m_pdata != 0) - { - gim_free(array_data.m_pdata,0); - array_data.m_reserve_size = 0; - array_data.m_size = 0; - array_data.m_pdata = 0; - } -} - -void gim_set_alloc_handler (gim_alloc_function *fn) -{ - g_allocfn = fn; -} - -void gim_set_alloca_handler (gim_alloca_function *fn) -{ - g_allocafn = fn; -} - -void gim_set_realloc_handler (gim_realloc_function *fn) -{ - g_reallocfn = fn; -} - -void gim_set_free_handler (gim_free_function *fn) -{ - g_freefn = fn; -} - -gim_alloc_function *gim_get_alloc_handler() -{ - return g_allocfn; -} - -gim_alloca_function *gim_get_alloca_handler() -{ - return g_allocafn; -} - - -gim_realloc_function *gim_get_realloc_handler () -{ - return g_reallocfn; -} - - -gim_free_function *gim_get_free_handler () -{ - return g_freefn; -} - - -void * gim_alloc(size_t size) -{ - void * ptr = 0; - ptr = malloc(size); - /*if (g_allocfn) ptr = g_allocfn(size); else ptr = malloc(size);//_mm_malloc(size,0);*/ - if(ptr==0) - { - float * fp = 0; - *fp = 0.0f; - } - return ptr; -} - -void * gim_alloca(size_t size) -{ - if (g_allocafn) return g_allocafn(size); else return alloca(size); -} - - -void * gim_realloc(void *ptr, size_t oldsize, size_t newsize) -{ - /*if (g_reallocfn) return g_reallocfn(ptr,oldsize,newsize); - else return realloc(ptr,newsize);*/ - //return realloc(ptr,newsize); - void * newptr = gim_alloc(newsize); - size_t copysize = newsize> oldsize? oldsize: newsize; - memcpy(newptr,ptr,copysize); - gim_free(ptr,oldsize); - return newptr; -} - -void gim_free(void *ptr, size_t size) -{ - if (!ptr) return; - if (g_freefn) - { - g_freefn(ptr,size); - } - else - { - free(ptr);//_mm_free(ptr); - } -} - -///******************************* BUFFER MANAGERS ******************************/// - -//!** Basic buffer prototyoe functions - -GUINT _system_buffer_alloc_function(GUINT size,int usage) -{ - void * newdata = gim_alloc(size); - memset(newdata,0,size); - return (GUINT)(newdata); -} - -GUINT _system_buffer_alloc_data_function(const void * pdata,GUINT size,int usage) -{ - void * newdata = gim_alloc(size); - memcpy(newdata,pdata,size); - return (GUINT)(newdata); -} - -GUINT _system_buffer_realloc_function(GUINT buffer_handle,GUINT oldsize,int old_usage,GUINT newsize,int new_usage) -{ - void * newdata = gim_realloc((void *)buffer_handle,oldsize,newsize); - return (GUINT)(newdata); -} - -void _system_buffer_free_function(GUINT buffer_handle,GUINT size) -{ - gim_free((void*)buffer_handle,size); -} - -char * _system_lock_buffer_function(GUINT buffer_handle,int access) -{ - return (char * )(buffer_handle); -} - - -void _system_unlock_buffer_function(GUINT buffer_handle) -{ -} - -void _system_download_from_buffer_function( - GUINT source_buffer_handle, - GUINT source_pos, - void * destdata, - GUINT copysize) -{ - char * pdata; - pdata = (char *)source_buffer_handle; - memcpy(destdata,pdata+source_pos,copysize); -} - -void _system_upload_to_buffer_function( - GUINT dest_buffer_handle, - GUINT dest_pos, - void * sourcedata, - GUINT copysize) -{ - char * pdata; - pdata = (char * )dest_buffer_handle; - memcpy(pdata+dest_pos,sourcedata,copysize); -} - -void _system_copy_buffers_function( - GUINT source_buffer_handle, - GUINT source_pos, - GUINT dest_buffer_handle, - GUINT dest_pos, - GUINT copysize) -{ - char * pdata1,*pdata2; - pdata1 = (char *)source_buffer_handle; - pdata2 = (char *)dest_buffer_handle; - memcpy(pdata2+dest_pos,pdata1+source_pos,copysize); -} - -GUINT _shared_buffer_alloc_function(GUINT size,int usage) -{ - return 0; -} - -GUINT _shared_buffer_alloc_data_function(const void * pdata,GUINT size,int usage) -{ - return (GUINT)pdata; -} - -GUINT _shared_buffer_realloc_function(GUINT buffer_handle,GUINT oldsize,int old_usage,GUINT newsize,int new_usage) -{ - return 0; -} - -void _shared_buffer_free_function(GUINT buffer_handle,GUINT size) -{ -} - -//!** Buffer manager operations -void gim_create_buffer_manager(GBUFFER_MANAGER_PROTOTYPE * prototype,GUINT buffer_manager_id) -{ - GBUFFER_MANAGER_DATA * bm_data; - bm_data = &g_buffer_managers[buffer_manager_id]; - - if(bm_data->m_active==0) - { - if(g_buffer_managers_count<=buffer_manager_id) - { - g_buffer_managers_count = buffer_manager_id+1; - } - } - else - { - gim_destroy_buffer_manager(buffer_manager_id); - } - bm_data->m_active = 1; - //CREATE ARRAYS - GIM_DYNARRAY_CREATE(GBUFFER_DATA,bm_data->m_buffer_array,G_ARRAY_GROW_SIZE); - GIM_DYNARRAY_CREATE(GUINT,bm_data->m_free_positions,G_ARRAY_GROW_SIZE); - //INIT PROTOTYPE - bm_data->m_prototype.alloc_data_fn = prototype->alloc_data_fn; - bm_data->m_prototype.alloc_fn = prototype->alloc_fn; - bm_data->m_prototype.copy_buffers_fn = prototype->copy_buffers_fn; - bm_data->m_prototype.download_from_buffer_fn = prototype->download_from_buffer_fn; - bm_data->m_prototype.free_fn = prototype->free_fn; - bm_data->m_prototype.lock_buffer_fn = prototype->lock_buffer_fn; - bm_data->m_prototype.realloc_fn = prototype->realloc_fn; - bm_data->m_prototype.unlock_buffer_fn = prototype->unlock_buffer_fn; - bm_data->m_prototype.upload_to_buffer_fn = prototype->upload_to_buffer_fn; -} - -GUINT gim_get_buffer_manager_count() -{ - return g_buffer_managers_count; -} -void gim_destroy_buffer_manager(GUINT buffer_manager_id) -{ - GBUFFER_MANAGER_DATA * bm_data; - gim_get_buffer_manager_data(buffer_manager_id,&bm_data); - if(bm_data == 0) return; - //Destroy all buffers - - GBUFFER_DATA * buffers = GIM_DYNARRAY_POINTER(GBUFFER_DATA,bm_data->m_buffer_array); - GUINT i, buffer_count = bm_data->m_buffer_array.m_size; - for (i=0;im_prototype.free_fn(buffers[i].m_buffer_handle,buffers[i].m_size); - } - } - - //destroy buffer array - GIM_DYNARRAY_DESTROY(bm_data->m_buffer_array); - //destroy free positions - GIM_DYNARRAY_DESTROY(bm_data->m_free_positions); - //Mark as innactive - bm_data->m_active = 0; -} -void gim_get_buffer_manager_data(GUINT buffer_manager_id,GBUFFER_MANAGER_DATA ** pbm_data) -{ - GBUFFER_MANAGER_DATA * bm_data; - bm_data = &g_buffer_managers[buffer_manager_id]; - - if(bm_data->m_active==0) - { - *pbm_data = 0; - } - else - { - *pbm_data = bm_data; - } -} - -void gim_init_buffer_managers() -{ - GUINT i; - for (i=0;im_free_positions.m_size>0)\ - { - GUINT * _pointer = GIM_DYNARRAY_POINTER(GUINT,buffer_manager->m_free_positions); - buffer_id = _pointer[buffer_manager->m_free_positions.m_size-1]; - GIM_DYNARRAY_POP_ITEM(buffer_manager->m_free_positions); - } - else - { - buffer_id = buffer_manager->m_buffer_array.m_size; - GIM_DYNARRAY_PUSH_EMPTY(GBUFFER_DATA,buffer_manager->m_buffer_array); - } -} - -GINT _validate_buffer_id(GBUFFER_ID * buffer_id,GBUFFER_DATA ** ppbuffer,GBUFFER_MANAGER_DATA ** pbm_data) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - *ppbuffer = pbuffer; - *pbm_data = bm_data; - return G_BUFFER_OP_SUCCESS; -} - -GUINT gim_create_buffer( - GUINT buffer_manager_id, - GUINT buffer_size, - int usage, - GBUFFER_ID * buffer_id) -{ - VALIDATE_BUFFER_MANAGER(buffer_manager_id) - - GUINT newbufferhandle = bm_data->m_prototype.alloc_fn(buffer_size,usage); - if(newbufferhandle==0) return G_BUFFER_OP_INVALID; - - GET_AVALIABLE_BUFFER_ID(bm_data,buffer_id->m_buffer_id); - buffer_id->m_buffer_manager_id = buffer_manager_id; - - GBUFFER_DATA * pbuffer = GIM_DYNARRAY_POINTER(GBUFFER_DATA,bm_data->m_buffer_array); - pbuffer += buffer_id->m_buffer_id ; - pbuffer->m_buffer_handle = newbufferhandle; - pbuffer->m_size = buffer_size; - pbuffer->m_usage = usage; - pbuffer->m_lock_count = 0; - pbuffer->m_refcount = 0; - pbuffer->m_mapped_pointer = 0; - - //set shadow buffer if needed - - if(usage == G_MU_STATIC_READ || - usage == G_MU_STATIC_READ_DYNAMIC_WRITE|| - usage == G_MU_STATIC_READ_DYNAMIC_WRITE_COPY) - { - gim_create_common_buffer(buffer_size,&pbuffer->m_shadow_buffer); - } - else - { - pbuffer->m_shadow_buffer.m_buffer_id = G_UINT_INFINITY; - pbuffer->m_shadow_buffer.m_buffer_manager_id = G_UINT_INFINITY; - } - return G_BUFFER_OP_SUCCESS; -} - - -GUINT gim_create_buffer_from_data( - GUINT buffer_manager_id, - const void * pdata, - GUINT buffer_size, - int usage, - GBUFFER_ID * buffer_id) -{ - VALIDATE_BUFFER_MANAGER(buffer_manager_id) - - GUINT newbufferhandle = bm_data->m_prototype.alloc_data_fn(pdata,buffer_size,usage); - if(newbufferhandle==0) return G_BUFFER_OP_INVALID; - - GET_AVALIABLE_BUFFER_ID(bm_data,buffer_id->m_buffer_id); - buffer_id->m_buffer_manager_id = buffer_manager_id; - - GBUFFER_DATA * pbuffer = GIM_DYNARRAY_POINTER(GBUFFER_DATA,bm_data->m_buffer_array); - pbuffer += buffer_id->m_buffer_id ; - pbuffer->m_buffer_handle = newbufferhandle; - pbuffer->m_size = buffer_size; - pbuffer->m_usage = usage; - pbuffer->m_lock_count = 0; - pbuffer->m_mapped_pointer = 0; - pbuffer->m_refcount = 0; - - //set shadow buffer if needed - - if(usage == G_MU_STATIC_READ || - usage == G_MU_STATIC_READ_DYNAMIC_WRITE|| - usage == G_MU_STATIC_READ_DYNAMIC_WRITE_COPY) - { - gim_create_common_buffer_from_data(pdata,buffer_size,&pbuffer->m_shadow_buffer); - } - else - { - pbuffer->m_shadow_buffer.m_buffer_id = G_UINT_INFINITY; - pbuffer->m_shadow_buffer.m_buffer_manager_id = G_UINT_INFINITY; - } - return G_BUFFER_OP_SUCCESS; -} - -GUINT gim_create_common_buffer(GUINT buffer_size, GBUFFER_ID * buffer_id) -{ - return gim_create_buffer(G_BUFFER_MANAGER_SYSTEM,buffer_size,G_MU_DYNAMIC_READ_WRITE,buffer_id); -} - -GUINT gim_create_common_buffer_from_data( - const void * pdata, GUINT buffer_size, GBUFFER_ID * buffer_id) -{ - return gim_create_buffer_from_data(G_BUFFER_MANAGER_SYSTEM,pdata,buffer_size,G_MU_DYNAMIC_READ_WRITE,buffer_id); -} - -GUINT gim_create_shared_buffer_from_data( - const void * pdata, GUINT buffer_size, GBUFFER_ID * buffer_id) -{ - return gim_create_buffer_from_data(G_BUFFER_MANAGER_SHARED,pdata,buffer_size,G_MU_DYNAMIC_READ_WRITE,buffer_id); -} - -GINT gim_buffer_realloc(GBUFFER_ID * buffer_id,GUINT newsize) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - if(pbuffer->m_lock_count>0) return G_BUFFER_OP_INVALID; - GUINT newhandle = bm_data->m_prototype.realloc_fn(pbuffer->m_buffer_handle,pbuffer->m_size,pbuffer->m_usage,newsize,pbuffer->m_usage); - if(newhandle==0) return G_BUFFER_OP_INVALID; - pbuffer->m_buffer_handle = newhandle; - //realloc shadow buffer if any - gim_buffer_realloc(&pbuffer->m_shadow_buffer,newsize); - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_buffer_add_ref(GBUFFER_ID * buffer_id) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - pbuffer->m_refcount++; - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_buffer_free(GBUFFER_ID * buffer_id) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - if(pbuffer->m_lock_count>0) return G_BUFFER_OP_INVALID; - if(pbuffer->m_refcount>0) pbuffer->m_refcount--; - if(pbuffer->m_refcount>0) return G_BUFFER_OP_STILLREFCOUNTED; - - bm_data->m_prototype.free_fn(pbuffer->m_buffer_handle,pbuffer->m_size); - //destroy shadow buffer if needed - gim_buffer_free(&pbuffer->m_shadow_buffer); - // Obtain a free slot index for a new buffer - GIM_DYNARRAY_PUSH_ITEM(GUINT,bm_data->m_free_positions,buffer_id->m_buffer_id); - pbuffer->m_buffer_handle = 0; - pbuffer->m_size = 0; - pbuffer->m_shadow_buffer.m_buffer_id = G_UINT_INFINITY; - pbuffer->m_shadow_buffer.m_buffer_manager_id = G_UINT_INFINITY; - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_lock_buffer(GBUFFER_ID * buffer_id,int access,char ** map_pointer) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - if(pbuffer->m_lock_count>0) - { - if(pbuffer->m_access!=access) return G_BUFFER_OP_INVALID; - pbuffer->m_lock_count++; - *map_pointer = pbuffer->m_mapped_pointer; - return G_BUFFER_OP_SUCCESS; - } - - pbuffer->m_access = access; - - GUINT result; - if(pbuffer->m_usage==G_MU_STATIC_WRITE) - { - *map_pointer = 0;///no access - return G_BUFFER_OP_INVALID; - } - else if(pbuffer->m_usage==G_MU_STATIC_READ) - { - if(pbuffer->m_access == G_MA_READ_ONLY) - { - result = gim_lock_buffer(&pbuffer->m_shadow_buffer,access,map_pointer); - if(result!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - pbuffer->m_mapped_pointer = *map_pointer; - pbuffer->m_lock_count++; - } - else - { - *map_pointer = 0; - return G_BUFFER_OP_INVALID; - } - } - else if(pbuffer->m_usage==G_MU_STATIC_READ_DYNAMIC_WRITE) - { - if(pbuffer->m_access == G_MA_READ_ONLY) - { - result = gim_lock_buffer(&pbuffer->m_shadow_buffer,access,map_pointer); - if(result!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - pbuffer->m_mapped_pointer = *map_pointer; - pbuffer->m_lock_count++; - } - else if(pbuffer->m_access == G_MA_WRITE_ONLY) - { - pbuffer->m_mapped_pointer = bm_data->m_prototype.lock_buffer_fn(pbuffer->m_buffer_handle,access); - *map_pointer = pbuffer->m_mapped_pointer; - pbuffer->m_lock_count++; - } - else if(pbuffer->m_access == G_MA_READ_WRITE) - { - *map_pointer = 0; - return G_BUFFER_OP_INVALID; - } - } - else if(pbuffer->m_usage==G_MU_STATIC_READ_DYNAMIC_WRITE_COPY) - { - result = gim_lock_buffer(&pbuffer->m_shadow_buffer,access,map_pointer); - if(result!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - pbuffer->m_mapped_pointer = *map_pointer; - pbuffer->m_lock_count++; - } - else if(pbuffer->m_usage==G_MU_STATIC_WRITE_DYNAMIC_READ) - { - if(pbuffer->m_access == G_MA_READ_ONLY) - { - pbuffer->m_mapped_pointer = bm_data->m_prototype.lock_buffer_fn(pbuffer->m_buffer_handle,access); - *map_pointer = pbuffer->m_mapped_pointer; - pbuffer->m_lock_count++; - } - else - { - *map_pointer = 0; - return G_BUFFER_OP_INVALID; - } - } - else if(pbuffer->m_usage==G_MU_DYNAMIC_READ_WRITE) - { - pbuffer->m_mapped_pointer = bm_data->m_prototype.lock_buffer_fn(pbuffer->m_buffer_handle,access); - *map_pointer = pbuffer->m_mapped_pointer; - pbuffer->m_lock_count++; - } - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_unlock_buffer(GBUFFER_ID * buffer_id) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - if(pbuffer->m_lock_count==0) return G_BUFFER_OP_INVALID; - - if(pbuffer->m_lock_count>1) - { - pbuffer->m_lock_count--; - return G_BUFFER_OP_SUCCESS; - } - - - GUINT result; - if(pbuffer->m_usage==G_MU_STATIC_WRITE) - { - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - return G_BUFFER_OP_INVALID; - } - else if(pbuffer->m_usage==G_MU_STATIC_READ) - { - if(pbuffer->m_access == G_MA_READ_ONLY) - { - result = gim_unlock_buffer(&pbuffer->m_shadow_buffer); - if(result!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - } - else - { - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - return G_BUFFER_OP_INVALID; - } - } - else if(pbuffer->m_usage==G_MU_STATIC_READ_DYNAMIC_WRITE) - { - if(pbuffer->m_access == G_MA_READ_ONLY) - { - result = gim_unlock_buffer(&pbuffer->m_shadow_buffer); - if(result!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - } - else if(pbuffer->m_access == G_MA_WRITE_ONLY) - { - bm_data->m_prototype.unlock_buffer_fn(pbuffer->m_buffer_handle); - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - } - else if(pbuffer->m_access == G_MA_READ_WRITE) - { - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - return G_BUFFER_OP_INVALID; - } - } - else if(pbuffer->m_usage==G_MU_STATIC_READ_DYNAMIC_WRITE_COPY) - { - result = gim_unlock_buffer(&pbuffer->m_shadow_buffer); - if(result!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - if(pbuffer->m_access == G_MA_WRITE_ONLY||pbuffer->m_access == G_MA_READ_WRITE) - { - gim_copy_buffers(&pbuffer->m_shadow_buffer,0,buffer_id,0,pbuffer->m_size); - } - } - else if(pbuffer->m_usage==G_MU_STATIC_WRITE_DYNAMIC_READ) - { - if(pbuffer->m_access == G_MA_READ_ONLY) - { - bm_data->m_prototype.unlock_buffer_fn(pbuffer->m_buffer_handle); - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - } - else - { - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - return G_BUFFER_OP_INVALID; - } - } - else if(pbuffer->m_usage==G_MU_DYNAMIC_READ_WRITE) - { - bm_data->m_prototype.unlock_buffer_fn(pbuffer->m_buffer_handle); - pbuffer->m_mapped_pointer = 0; - pbuffer->m_lock_count=0; - } - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_get_buffer_size(GBUFFER_ID * buffer_id,GUINT * buffer_size) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - *buffer_size = pbuffer->m_size; - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_get_buffer_is_locked(GBUFFER_ID * buffer_id,GUINT * lock_count) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - *lock_count = pbuffer->m_lock_count; - return G_BUFFER_OP_SUCCESS; -} - - -GINT gim_download_from_buffer( - GBUFFER_ID * buffer_id, - GUINT source_pos, - void * destdata, - GUINT copysize) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - bm_data->m_prototype.download_from_buffer_fn( - pbuffer->m_buffer_handle,source_pos,destdata,copysize); - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_upload_to_buffer( - GBUFFER_ID * buffer_id, - GUINT dest_pos, - void * sourcedata, - GUINT copysize) -{ - VALIDATE_BUFFER_ID_PT(buffer_id) - bm_data->m_prototype.upload_to_buffer_fn( - pbuffer->m_buffer_handle,dest_pos,sourcedata,copysize); - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_copy_buffers( - GBUFFER_ID * source_buffer_id, - GUINT source_pos, - GBUFFER_ID * dest_buffer_id, - GUINT dest_pos, - GUINT copysize) -{ - GBUFFER_MANAGER_DATA * bm_data1,* bm_data2; - GBUFFER_DATA * pbuffer1, * pbuffer2; - void * tempdata; - if(_validate_buffer_id(source_buffer_id,&pbuffer1,&bm_data1)!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - - if(_validate_buffer_id(dest_buffer_id,&pbuffer2,&bm_data2)!= G_BUFFER_OP_SUCCESS) return G_BUFFER_OP_INVALID; - - if((source_buffer_id->m_buffer_manager_id == dest_buffer_id->m_buffer_manager_id)|| - (source_buffer_id->m_buffer_manager_id == G_BUFFER_MANAGER_SYSTEM && dest_buffer_id->m_buffer_manager_id == G_BUFFER_MANAGER_SHARED)|| - (source_buffer_id->m_buffer_manager_id == G_BUFFER_MANAGER_SHARED && dest_buffer_id->m_buffer_manager_id == G_BUFFER_MANAGER_SYSTEM) - ) - {//smooth copy - bm_data1->m_prototype.copy_buffers_fn(pbuffer1->m_buffer_handle,source_pos,pbuffer2->m_buffer_handle,dest_pos,copysize); - } - else if(source_buffer_id->m_buffer_manager_id == G_BUFFER_MANAGER_SYSTEM || source_buffer_id->m_buffer_manager_id == G_BUFFER_MANAGER_SHARED) - { - //hard copy - tempdata = (void *)pbuffer1->m_buffer_handle; - //upload data - bm_data2->m_prototype.upload_to_buffer_fn(pbuffer2->m_buffer_handle,dest_pos, - tempdata, - copysize); - } - else - { - //very hard copy - void * tempdata = gim_alloc(copysize); - //download data - bm_data1->m_prototype.download_from_buffer_fn(pbuffer1->m_buffer_handle,source_pos, - tempdata, - copysize); - - //upload data - bm_data2->m_prototype.upload_to_buffer_fn(pbuffer2->m_buffer_handle,dest_pos, - tempdata, - copysize); - //delete temp buffer - gim_free(tempdata,copysize); - } - return G_BUFFER_OP_SUCCESS; -} - -GINT gim_buffer_array_lock(GBUFFER_ARRAY * array_data, int access) -{ - if(array_data->m_buffer_data != 0) return G_BUFFER_OP_SUCCESS; - GINT result = gim_lock_buffer(&array_data->m_buffer_id,access,&array_data->m_buffer_data); - if(result!= G_BUFFER_OP_SUCCESS) return result; - array_data->m_buffer_data += array_data->m_byte_offset; - return result; -} - -GINT gim_buffer_array_unlock(GBUFFER_ARRAY * array_data) -{ - if(array_data->m_buffer_data == 0) return G_BUFFER_OP_SUCCESS; - GINT result = gim_unlock_buffer(&array_data->m_buffer_id); - if(result!= G_BUFFER_OP_SUCCESS) return result; - array_data->m_buffer_data = 0; - return result; -} - -void gim_buffer_array_copy_ref(GBUFFER_ARRAY * source_data,GBUFFER_ARRAY * dest_data) -{ - dest_data->m_buffer_id.m_buffer_id = source_data->m_buffer_id.m_buffer_id; - dest_data->m_buffer_id.m_buffer_manager_id = source_data->m_buffer_id.m_buffer_manager_id; - dest_data->m_buffer_data = 0; - dest_data->m_byte_stride = source_data->m_byte_stride; - dest_data->m_byte_offset = source_data->m_byte_offset; - dest_data->m_element_count = source_data->m_element_count; - gim_buffer_add_ref(&dest_data->m_buffer_id); -} - -void gim_buffer_array_copy_value(GBUFFER_ARRAY * source_data,GBUFFER_ARRAY * dest_data, GUINT buffer_manager_id,int usage) -{ - //Create new buffer - GUINT buffsize = source_data->m_element_count*source_data->m_byte_stride; - gim_create_buffer(buffer_manager_id,buffsize,usage,&dest_data->m_buffer_id); - - //copy ref data - dest_data->m_buffer_data = 0; - dest_data->m_byte_stride = source_data->m_byte_stride; - dest_data->m_byte_offset = 0; - dest_data->m_element_count = source_data->m_element_count; - gim_buffer_add_ref(&dest_data->m_buffer_id); - //copy buffers - gim_copy_buffers(&source_data->m_buffer_id,source_data->m_byte_offset,&dest_data->m_buffer_id,0,buffsize); -} diff --git a/libraries/ode-0.9/GIMPACT/src/gim_tri_tri_overlap.cpp b/libraries/ode-0.9/GIMPACT/src/gim_tri_tri_overlap.cpp deleted file mode 100644 index 5b4e08d314..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_tri_tri_overlap.cpp +++ /dev/null @@ -1,251 +0,0 @@ - -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_trimesh.h" - - -#define FABS(x) (float(fabs(x))) /* implement as is fastest on your machine */ - -/* some macros */ - -#define CLASSIFY_TRIPOINTS_BY_FACE(v1,v2,v3,faceplane,out_of_face)\ -{ \ - _distances[0] = DISTANCE_PLANE_POINT(faceplane,v1);\ - _distances[1] = _distances[0] * DISTANCE_PLANE_POINT(faceplane,v2);\ - _distances[2] = _distances[0] * DISTANCE_PLANE_POINT(faceplane,v3); \ - if(_distances[1]>0.0f && _distances[2]>0.0f)\ - {\ - out_of_face = 1;\ - }\ - else\ - {\ - out_of_face = 0;\ - }\ -}\ - -/* sort so that a<=b */ -#define SORT(a,b) \ - if(a>b) \ - { \ - float c; \ - c=a; \ - a=b; \ - b=c; \ - } - - -/* this edge to edge test is based on Franlin Antonio's gem: - "Faster Line Segment Intersection", in Graphics Gems III, - pp. 199-202 */ -#define EDGE_EDGE_TEST(V0,U0,U1) \ - Bx=U0[i0]-U1[i0]; \ - By=U0[i1]-U1[i1]; \ - Cx=V0[i0]-U0[i0]; \ - Cy=V0[i1]-U0[i1]; \ - f=Ay*Bx-Ax*By; \ - d=By*Cx-Bx*Cy; \ - if((f>0 && d>=0 && d<=f) || (f<0 && d<=0 && d>=f)) \ - { \ - e=Ax*Cy-Ay*Cx; \ - if(f>0) \ - { \ - if(e>=0 && e<=f) return 1; \ - } \ - else \ - { \ - if(e<=0 && e>=f) return 1; \ - } \ - } - -#define EDGE_AGAINST_TRI_EDGES(V0,V1,U0,U1,U2) \ -{ \ - float Ax,Ay,Bx,By,Cx,Cy,e,d,f; \ - Ax=V1[i0]-V0[i0]; \ - Ay=V1[i1]-V0[i1]; \ - /* test edge U0,U1 against V0,V1 */ \ - EDGE_EDGE_TEST(V0,U0,U1); \ - /* test edge U1,U2 against V0,V1 */ \ - EDGE_EDGE_TEST(V0,U1,U2); \ - /* test edge U2,U1 against V0,V1 */ \ - EDGE_EDGE_TEST(V0,U2,U0); \ -} - -#define POINT_IN_TRI(V0,U0,U1,U2) \ -{ \ - float a,b,c,d0,d1,d2; \ - /* is T1 completly inside T2? */ \ - /* check if V0 is inside tri(U0,U1,U2) */ \ - a=U1[i1]-U0[i1]; \ - b=-(U1[i0]-U0[i0]); \ - c=-a*U0[i0]-b*U0[i1]; \ - d0=a*V0[i0]+b*V0[i1]+c; \ - \ - a=U2[i1]-U1[i1]; \ - b=-(U2[i0]-U1[i0]); \ - c=-a*U1[i0]-b*U1[i1]; \ - d1=a*V0[i0]+b*V0[i1]+c; \ - \ - a=U0[i1]-U2[i1]; \ - b=-(U0[i0]-U2[i0]); \ - c=-a*U2[i0]-b*U2[i1]; \ - d2=a*V0[i0]+b*V0[i1]+c; \ - if(d0*d1>0.0) \ - { \ - if(d0*d2>0.0) return 1; \ - } \ -} - -int coplanar_tri_tri(GIM_TRIANGLE_DATA *tri1, - GIM_TRIANGLE_DATA *tri2) -{ - short i0,i1; - /* first project onto an axis-aligned plane, that maximizes the area */ - /* of the triangles, compute indices: i0,i1. */ - PLANE_MINOR_AXES(tri1->m_planes.m_planes[0], i0, i1); - - /* test all edges of triangle 1 against the edges of triangle 2 */ - EDGE_AGAINST_TRI_EDGES(tri1->m_vertices[0],tri1->m_vertices[1],tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2]); - EDGE_AGAINST_TRI_EDGES(tri1->m_vertices[1],tri1->m_vertices[2],tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2]); - EDGE_AGAINST_TRI_EDGES(tri1->m_vertices[2],tri1->m_vertices[0],tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2]); - - /* finally, test if tri1 is totally contained in tri2 or vice versa */ - POINT_IN_HULL(tri1->m_vertices[0],(&tri2->m_planes.m_planes[1]),3,i0); - if(i0==0) return 1; - - POINT_IN_HULL(tri2->m_vertices[0],(&tri1->m_planes.m_planes[1]),3,i0); - if(i0==0) return 1; - - return 0; -} - - - -#define NEWCOMPUTE_INTERVALS(VV0,VV1,VV2,D0,D1,D2,D0D1,D0D2,A,B,C,X0,X1) \ -{ \ - if(D0D1>0.0f) \ - { \ - /* here we know that D0D2<=0.0 */ \ - /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ - A=VV2; B=(VV0-VV2)*D2; C=(VV1-VV2)*D2; X0=D2-D0; X1=D2-D1; \ - } \ - else if(D0D2>0.0f)\ - { \ - /* here we know that d0d1<=0.0 */ \ - A=VV1; B=(VV0-VV1)*D1; C=(VV2-VV1)*D1; X0=D1-D0; X1=D1-D2; \ - } \ - else if(D1*D2>0.0f || D0!=0.0f) \ - { \ - /* here we know that d0d1<=0.0 or that D0!=0.0 */ \ - A=VV0; B=(VV1-VV0)*D0; C=(VV2-VV0)*D0; X0=D0-D1; X1=D0-D2; \ - } \ - else if(D1!=0.0f) \ - { \ - A=VV1; B=(VV0-VV1)*D1; C=(VV2-VV1)*D1; X0=D1-D0; X1=D1-D2; \ - } \ - else if(D2!=0.0f) \ - { \ - A=VV2; B=(VV0-VV2)*D2; C=(VV1-VV2)*D2; X0=D2-D0; X1=D2-D1; \ - } \ - else \ - { \ - /* triangles are coplanar */ \ - return coplanar_tri_tri(tri1,tri2); \ - } \ -}\ - - - -int gim_triangle_triangle_overlap( - GIM_TRIANGLE_DATA *tri1, - GIM_TRIANGLE_DATA *tri2) -{ - vec3f _distances; - char out_of_face; - CLASSIFY_TRIPOINTS_BY_FACE(tri1->m_vertices[0],tri1->m_vertices[1],tri1->m_vertices[2],tri2->m_planes.m_planes[0],out_of_face); - if(out_of_face==1) return 0; - - CLASSIFY_TRIPOINTS_BY_FACE(tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2],tri1->m_planes.m_planes[0],out_of_face); - if(out_of_face==1) return 0; - - - float du0=0,du1=0,du2=0,dv0=0,dv1=0,dv2=0; - float D[3]; - float isect1[2], isect2[2]; - float du0du1=0,du0du2=0,dv0dv1=0,dv0dv2=0; - short index; - float vp0,vp1,vp2; - float up0,up1,up2; - float bb,cc,max; - - /* compute direction of intersection line */ - VEC_CROSS(D,tri1->m_planes.m_planes[0],tri2->m_planes.m_planes[0]); - - /* compute and index to the largest component of D */ - max=(float)FABS(D[0]); - index=0; - bb=(float)FABS(D[1]); - cc=(float)FABS(D[2]); - if(bb>max) max=bb,index=1; - if(cc>max) max=cc,index=2; - - /* this is the simplified projection onto L*/ - vp0= tri1->m_vertices[0][index]; - vp1= tri1->m_vertices[1][index]; - vp2= tri1->m_vertices[2][index]; - - up0= tri2->m_vertices[0][index]; - up1= tri2->m_vertices[1][index]; - up2= tri2->m_vertices[2][index]; - - /* compute interval for triangle 1 */ - float a,b,c,x0,x1; - NEWCOMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,a,b,c,x0,x1); - - /* compute interval for triangle 2 */ - float d,e,f,y0,y1; - NEWCOMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,d,e,f,y0,y1); - - float xx,yy,xxyy,tmp; - xx=x0*x1; - yy=y0*y1; - xxyy=xx*yy; - - tmp=a*xxyy; - isect1[0]=tmp+b*x1*yy; - isect1[1]=tmp+c*x0*yy; - - tmp=d*xxyy; - isect2[0]=tmp+e*xx*y1; - isect2[1]=tmp+f*xx*y0; - - SORT(isect1[0],isect1[1]); - SORT(isect2[0],isect2[1]); - - if(isect1[1] -#include "GIMPACT/gim_trimesh.h" - -GUINT gim_trimesh_get_triangle_count(GIM_TRIMESH * trimesh) -{ - return trimesh->m_tri_index_buffer.m_element_count/3; -} - -//! Creates the aabb set and the triangles cache -/*! - -\param trimesh -\param vertex_array -\param triindex_array -\param transformed_reply If 1, then the m_transformed_vertices is a reply of the source vertices. Else it just be a reference to the original array. -\post it copies the arrays by reference, and creates the auxiliary data (m_aabbset,m_planes_cache_buffer) -*/ -void gim_trimesh_create_from_arrays(GIM_TRIMESH * trimesh, GBUFFER_ARRAY * vertex_array, GBUFFER_ARRAY * triindex_array,char transformed_reply) -{ - assert(trimesh); - assert(vertex_array); - assert(triindex_array); - gim_buffer_array_copy_ref(vertex_array,&trimesh->m_source_vertex_buffer); - gim_buffer_array_copy_ref(triindex_array,&trimesh->m_tri_index_buffer); - - trimesh->m_mask = GIM_TRIMESH_NEED_UPDATE;//needs update - //Create the transformed vertices - if(transformed_reply==1) - { - trimesh->m_mask |= GIM_TRIMESH_TRANSFORMED_REPLY; - gim_buffer_array_copy_value(vertex_array,&trimesh->m_transformed_vertex_buffer,G_BUFFER_MANAGER_SYSTEM,G_MU_DYNAMIC_READ_WRITE); - } - else - { - gim_buffer_array_copy_ref(vertex_array,&trimesh->m_transformed_vertex_buffer); - } - //create the box set - GUINT facecount = gim_trimesh_get_triangle_count(trimesh); - - gim_aabbset_alloc(&trimesh->m_aabbset,facecount); - //create the planes cache - GIM_DYNARRAY_CREATE_SIZED(GIM_TRIPLANES_CACHE,trimesh->m_planes_cache_buffer,facecount); - //Create the bitset - GIM_BITSET_CREATE_SIZED(trimesh->m_planes_cache_bitset,facecount); - //Callback is 0 - trimesh->m_update_callback = 0; - //set to identity - IDENTIFY_MATRIX_4X4(trimesh->m_transform); -} - - - -//! Create a trimesh from vertex array and an index array -/*! - -\param trimesh An uninitialized GIM_TRIMESH structure -\param vertex_array A buffer to a vec3f array -\param vertex_count -\param triindex_array -\param index_count -\param copy_vertices If 1, it copies the source vertices in another buffer. Else (0) it constructs a reference to the data. -\param copy_indices If 1, it copies the source vertices in another buffer. Else (0) it constructs a reference to the data. -\param transformed_reply If , then the m_transformed_vertices is a reply of the source vertices. Else it just be a reference to the original array. -*/ -void gim_trimesh_create_from_data(GIM_TRIMESH * trimesh, vec3f * vertex_array, GUINT vertex_count,char copy_vertices, GUINT * triindex_array, GUINT index_count,char copy_indices,char transformed_reply) -{ - GBUFFER_ARRAY buffer_vertex_array; - GBUFFER_ARRAY buffer_triindex_array; - - //Create vertices - if(copy_vertices == 1) - { - gim_create_common_buffer_from_data(vertex_array, vertex_count*sizeof(vec3f), &buffer_vertex_array.m_buffer_id); - } - else//Create a shared buffer - { - gim_create_shared_buffer_from_data(vertex_array, vertex_count*sizeof(vec3f), &buffer_vertex_array.m_buffer_id); - } - GIM_BUFFER_ARRAY_INIT_TYPE(vec3f,buffer_vertex_array,buffer_vertex_array.m_buffer_id,vertex_count); - - - //Create vertices - if(copy_indices == 1) - { - gim_create_common_buffer_from_data(triindex_array, index_count*sizeof(GUINT), &buffer_triindex_array.m_buffer_id); - } - else//Create a shared buffer - { - gim_create_shared_buffer_from_data(triindex_array, index_count*sizeof(GUINT), &buffer_triindex_array.m_buffer_id); - } - GIM_BUFFER_ARRAY_INIT_TYPE(GUINT,buffer_triindex_array,buffer_triindex_array.m_buffer_id,index_count); - - gim_trimesh_create_from_arrays(trimesh, &buffer_vertex_array, &buffer_triindex_array,transformed_reply); - - ///always call this after create a buffer_array - GIM_BUFFER_ARRAY_DESTROY(buffer_vertex_array); - GIM_BUFFER_ARRAY_DESTROY(buffer_triindex_array); -} - -//! Clears auxiliary data and releases buffer arrays -void gim_trimesh_destroy(GIM_TRIMESH * trimesh) -{ - gim_aabbset_destroy(&trimesh->m_aabbset); - - GIM_DYNARRAY_DESTROY(trimesh->m_planes_cache_buffer); - GIM_DYNARRAY_DESTROY(trimesh->m_planes_cache_bitset); - - GIM_BUFFER_ARRAY_DESTROY(trimesh->m_transformed_vertex_buffer); - GIM_BUFFER_ARRAY_DESTROY(trimesh->m_source_vertex_buffer); - GIM_BUFFER_ARRAY_DESTROY(trimesh->m_tri_index_buffer); -} - -//! Copies two meshes -/*! -\pre dest_trimesh shouldn't be created -\post dest_trimesh will be created -\param source_trimesh -\param dest_trimesh -\param copy_by_reference If 1, it attach a reference to the source vertices, else it copies the vertices -\param transformed_reply IF 1, then it forces the m_trasnformed_vertices to be a reply of the source vertices -*/ -void gim_trimesh_copy(GIM_TRIMESH * source_trimesh,GIM_TRIMESH * dest_trimesh, char copy_by_reference, char transformed_reply) -{ - if(copy_by_reference==1) - { - gim_trimesh_create_from_arrays(dest_trimesh, &source_trimesh->m_source_vertex_buffer, &source_trimesh->m_tri_index_buffer,transformed_reply); - } - else - { - GBUFFER_ARRAY buffer_vertex_array; - GBUFFER_ARRAY buffer_triindex_array; - - gim_buffer_array_copy_value(&source_trimesh->m_source_vertex_buffer,&buffer_vertex_array,G_BUFFER_MANAGER_SYSTEM,G_MU_DYNAMIC_READ_WRITE); - - gim_buffer_array_copy_value(&source_trimesh->m_tri_index_buffer,&buffer_triindex_array,G_BUFFER_MANAGER_SYSTEM,G_MU_DYNAMIC_READ_WRITE); - - gim_trimesh_create_from_arrays(dest_trimesh, &buffer_vertex_array, &buffer_triindex_array,transformed_reply); - - ///always call this after create a buffer_array - GIM_BUFFER_ARRAY_DESTROY(buffer_vertex_array); - GIM_BUFFER_ARRAY_DESTROY(buffer_triindex_array); - } -} - -//! Locks the trimesh for working with it -/*! -\post locks m_tri_index_buffer and m_transformed_vertex_buffer. -\param trimesh -*/ -void gim_trimesh_locks_work_data(GIM_TRIMESH * trimesh) -{ - GINT res; - res=gim_buffer_array_lock(&trimesh->m_tri_index_buffer,G_MA_READ_ONLY); - assert(res==G_BUFFER_OP_SUCCESS); - res=gim_buffer_array_lock(&trimesh->m_transformed_vertex_buffer,G_MA_READ_ONLY); - assert(res==G_BUFFER_OP_SUCCESS); -} - -//! unlocks the trimesh -/*! -\post unlocks m_tri_index_buffer and m_transformed_vertex_buffer. -\param trimesh -*/ -void gim_trimesh_unlocks_work_data(GIM_TRIMESH * trimesh) -{ - gim_buffer_array_unlock(&trimesh->m_tri_index_buffer); - gim_buffer_array_unlock(&trimesh->m_transformed_vertex_buffer); -} - - -//! Returns 1 if the m_transformed_vertex_buffer is a reply of m_source_vertex_buffer -char gim_trimesh_has_tranformed_reply(GIM_TRIMESH * trimesh) -{ - if(trimesh->m_mask&GIM_TRIMESH_TRANSFORMED_REPLY) return 1; - return 0; -} - -//! Returns 1 if the trimesh needs to update their aabbset and the planes cache. -char gim_trimesh_needs_update(GIM_TRIMESH * trimesh) -{ - if(trimesh->m_mask&GIM_TRIMESH_NEED_UPDATE) return 1; - return 0; -} - -//! Change the state of the trimesh for force it to update -/*! -Call it after made changes to the trimesh. -\post gim_trimesh_need_update(trimesh) will return 1 -*/ -void gim_trimesh_post_update(GIM_TRIMESH * trimesh) -{ - trimesh->m_mask |= GIM_TRIMESH_NEED_UPDATE; -} - -//kernel -#define MULT_MAT_VEC4_KERNEL(_mat,_src,_dst) MAT_DOT_VEC_3X4((_dst),(_mat),(_src)) - -//! Updates m_transformed_vertex_buffer -/*! -\pre m_transformed_vertex_buffer must be unlocked -*/ -void gim_trimesh_update_vertices(GIM_TRIMESH * trimesh) -{ - if(gim_trimesh_has_tranformed_reply(trimesh) == 0) return; //Don't perform transformation - - //Vertices - GBUFFER_ARRAY * psource_vertex_buffer = &trimesh->m_source_vertex_buffer; - GBUFFER_ARRAY * ptransformed_vertex_buffer = &trimesh->m_transformed_vertex_buffer; - //Temp transform - mat4f transform; - COPY_MATRIX_4X4(transform,trimesh->m_transform); - - GIM_PROCESS_BUFFER_ARRAY(transform,(*psource_vertex_buffer),(*ptransformed_vertex_buffer),MULT_MAT_VEC4_KERNEL,vec3f,vec3f); -} - -//! Updates m_aabbset and m_planes_cache_bitset -/*! -\pre gim_trimesh_locks_work_data must be called before -*/ -void gim_trimesh_update_aabbset(GIM_TRIMESH * trimesh) -{ - vec3f * transformed_vertices = GIM_BUFFER_ARRAY_POINTER(vec3f,trimesh->m_transformed_vertex_buffer,0); - assert(transformed_vertices); - - GUINT * triangle_indices = GIM_BUFFER_ARRAY_POINTER(GUINT,trimesh->m_tri_index_buffer,0); - assert(triangle_indices); - // box set - aabb3f * paabb = trimesh->m_aabbset.m_boxes; - GUINT triangle_count = gim_trimesh_get_triangle_count(trimesh); - float * v1,*v2,*v3; - GUINT i; - for (i=0; im_planes_cache_bitset); - //Sorts set - gim_aabbset_update(&trimesh->m_aabbset); -} - -//! Updates the trimesh if needed -/*! -\post If gim_trimesh_needs_update returns 1, then it calls gim_trimesh_update_vertices and gim_trimesh_update_aabbset -*/ -void gim_trimesh_update(GIM_TRIMESH * trimesh) -{ - if(gim_trimesh_needs_update(trimesh)==0) return; - gim_trimesh_update_vertices(trimesh); - gim_trimesh_locks_work_data(trimesh); - gim_trimesh_update_aabbset(trimesh); - gim_trimesh_unlocks_work_data(trimesh); - - //Clear update flag - trimesh->m_mask &= ~GIM_TRIMESH_NEED_UPDATE; -} - -void gim_trimesh_set_tranform(GIM_TRIMESH * trimesh, mat4f transform) -{ - GREAL diff = 0.0f; - float * originaltrans = &trimesh->m_transform[0][0]; - float * newtrans = &transform[0][0]; - GUINT i; - for (i=0;i<16;i++) - { - diff += fabs(originaltrans[i]-newtrans[i]); - } - -// if(IS_ZERO(diff)) return ;///don't need to update - if(diff< 0.00001f) return ;///don't need to update - - COPY_MATRIX_4X4(trimesh->m_transform,transform); - - gim_trimesh_post_update(trimesh); -} - -void gim_trimesh_get_triangle_data(GIM_TRIMESH * trimesh, GUINT triangle_index, GIM_TRIANGLE_DATA * tri_data) -{ - vec3f * transformed_vertices = GIM_BUFFER_ARRAY_POINTER(vec3f,trimesh->m_transformed_vertex_buffer,0); - - GUINT * triangle_indices = GIM_BUFFER_ARRAY_POINTER(GUINT,trimesh->m_tri_index_buffer,triangle_index*3); - - - //Copy the vertices - VEC_COPY(tri_data->m_vertices[0],transformed_vertices[triangle_indices[0]]); - VEC_COPY(tri_data->m_vertices[1],transformed_vertices[triangle_indices[1]]); - VEC_COPY(tri_data->m_vertices[2],transformed_vertices[triangle_indices[2]]); - - //Get the planes - GIM_TRIPLANES_CACHE * planes = GIM_DYNARRAY_POINTER(GIM_TRIPLANES_CACHE,trimesh->m_planes_cache_buffer); - planes += triangle_index; - - //verify planes cache - GUINT bit_eval; - GIM_BITSET_GET(trimesh->m_planes_cache_bitset,triangle_index,bit_eval); - if(bit_eval == 0)// Needs to calc the planes - { - //Calc the face plane - TRIANGLE_PLANE(tri_data->m_vertices[0],tri_data->m_vertices[1],tri_data->m_vertices[2],planes->m_planes[0]); - //Calc the edge 1 - EDGE_PLANE(tri_data->m_vertices[0],tri_data->m_vertices[1],(planes->m_planes[0]),(planes->m_planes[1])); - - //Calc the edge 2 - EDGE_PLANE(tri_data->m_vertices[1],tri_data->m_vertices[2],(planes->m_planes[0]),(planes->m_planes[2])); - - //Calc the edge 3 - EDGE_PLANE(tri_data->m_vertices[2],tri_data->m_vertices[0],(planes->m_planes[0]), (planes->m_planes[3])); - - //mark - GIM_BITSET_SET(trimesh->m_planes_cache_bitset,triangle_index); - } - - - VEC_COPY_4((tri_data->m_planes.m_planes[0]),(planes->m_planes[0]));//face plane - VEC_COPY_4((tri_data->m_planes.m_planes[1]),(planes->m_planes[1]));//edge1 - VEC_COPY_4((tri_data->m_planes.m_planes[2]),(planes->m_planes[2]));//edge2 - VEC_COPY_4((tri_data->m_planes.m_planes[3]),(planes->m_planes[3]));//edge3 -} - -void gim_trimesh_get_triangle_vertices(GIM_TRIMESH * trimesh, GUINT triangle_index, vec3f v1,vec3f v2,vec3f v3) -{ - vec3f * transformed_vertices = GIM_BUFFER_ARRAY_POINTER(vec3f,trimesh->m_transformed_vertex_buffer,0); - - GUINT * triangle_indices = GIM_BUFFER_ARRAY_POINTER(GUINT,trimesh->m_tri_index_buffer,triangle_index*3); - - //Copy the vertices - VEC_COPY(v1,transformed_vertices[triangle_indices[0]]); - VEC_COPY(v2,transformed_vertices[triangle_indices[1]]); - VEC_COPY(v3,transformed_vertices[triangle_indices[2]]); -} diff --git a/libraries/ode-0.9/GIMPACT/src/gim_trimesh_capsule_collision.cpp b/libraries/ode-0.9/GIMPACT/src/gim_trimesh_capsule_collision.cpp deleted file mode 100644 index d1f7ca3864..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_trimesh_capsule_collision.cpp +++ /dev/null @@ -1,279 +0,0 @@ - -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_trimesh.h" - -//! Utility function for find the closest point between a segment and a triangle -/*! - -\param triangle -\param s1 -\param s2 -\param contacts Contains the closest points on the segment (1,2), and the normal points to segment, and m_depth contains the distance - -\post The contacts array is not set to 0. It adds aditional contacts -*/ -void gim_closest_point_triangle_segment(GIM_TRIANGLE_DATA * triangle, vec3f s1,vec3f s2, GDYNAMIC_ARRAY * contacts) -{ - vec3f segment_points[4]; - vec3f closest_points[2]; - GUINT intersection_type, out_edge= 10; - GREAL dis, dis_temp,perpend; - vec4f sdiff; - - dis = DISTANCE_PLANE_POINT(triangle->m_planes.m_planes[0],s1); - dis_temp = DISTANCE_PLANE_POINT(triangle->m_planes.m_planes[0],s2); - - if(dis<=0.0f && dis_temp<=0.0f) return; - - VEC_DIFF(sdiff,s2,s1); - perpend = VEC_DOT(sdiff,triangle->m_planes.m_planes[0]); - - if(!IS_ZERO(perpend)) // Not perpendicular - { - if(dis=0.0f && dis_temp>=0.0f) - { - POINT_IN_HULL(closest_points[0],(&triangle->m_planes.m_planes[1]),3,out_edge); - - if(out_edge==0)//Point over face - { - GIM_PUSH_CONTACT((*contacts),closest_points[0] ,triangle->m_planes.m_planes[0] ,dis,0, 0, 0,0); - return; - } - } - else - { - - PLANE_CLIP_SEGMENT(s1,s2,triangle->m_planes.m_planes[0],closest_points[1]); - - POINT_IN_HULL(closest_points[1],(&triangle->m_planes.m_planes[1]),3,out_edge); - - if(out_edge==0)//Point over face - { - GIM_PUSH_CONTACT((*contacts),closest_points[0] ,triangle->m_planes.m_planes[0] ,dis,0, 0, 0,0); - return; - } - } - - } - else // Perpendicular Face - { - //out_edge=10 - //Clip segment by triangle - // Edge1 - PLANE_CLIP_SEGMENT_CLOSEST(s1,s2,triangle->m_planes.m_planes[1],segment_points[0],segment_points[1],intersection_type); - if(intersection_type==0||intersection_type==1) - { - out_edge = 0; - VEC_COPY(closest_points[0],segment_points[0]); - } - else - { - //Edge2 - PLANE_CLIP_SEGMENT_CLOSEST(segment_points[0],segment_points[1],triangle->m_planes.m_planes[2],segment_points[2],segment_points[3],intersection_type); - if(intersection_type==0||intersection_type==1) - { - out_edge = 1; - VEC_COPY(closest_points[0],segment_points[3]); - } - else - { - //Edge3 - PLANE_CLIP_SEGMENT_CLOSEST(segment_points[2],segment_points[3],triangle->m_planes.m_planes[3],closest_points[0],closest_points[1],intersection_type); - if(intersection_type==0||intersection_type==1) - { - out_edge = 2; - } - } - } - //POST closest_points[0] and closest_points[1] are inside the triangle, if out_edge>2 - if(out_edge>2) // Over triangle - { - dis = VEC_DOT(closest_points[0],triangle->m_planes.m_planes[0]); - GIM_PUSH_CONTACT((*contacts),closest_points[0] ,triangle->m_planes.m_planes[0] ,dis,0, 0, 0,0); - GIM_PUSH_CONTACT((*contacts),closest_points[1] ,triangle->m_planes.m_planes[0] ,dis,0, 0, 0,0); - return; - } - } - - //Find closest edges - out_edge = 10; - dis = G_REAL_INFINITY; - GUINT i; - for(i=0;i<3;i++) - { - SEGMENT_COLLISION(s1,s2,triangle->m_vertices[i],triangle->m_vertices[(i+1)%3],segment_points[0],segment_points[1]); - VEC_DIFF(sdiff,segment_points[0],segment_points[1]); - dis_temp = VEC_DOT(sdiff,sdiff); - if(dis_temp< dis) - { - dis = dis_temp; - out_edge = i; - VEC_COPY(closest_points[0],segment_points[0]); - VEC_COPY(closest_points[1],sdiff);//normal - } - } - if(out_edge>2) return ;// ???? ASSERT this please - - if(IS_ZERO(dis)) - { - //Set face plane - GIM_PUSH_CONTACT((*contacts),closest_points[0] ,triangle->m_planes.m_planes[0] ,0.0f,0, 0, 0,0); - - } - else - { - GIM_SQRT(dis,dis); - VEC_SCALE(closest_points[1],(1.0f/dis),closest_points[1]);//normal - GIM_PUSH_CONTACT((*contacts),closest_points[0] ,closest_points[1],dis,0, 0, 0,0); - } -} - - -//! Utility function for find the closest point between a capsule and a triangle -/*! - -\param triangle -\param capsule -\param contacts Contains the closest points on the capsule, and the normal points to triangle - -\post The contacts array is not set to 0. It adds aditional contacts -*/ -int gim_triangle_capsule_collision(GIM_TRIANGLE_DATA * triangle, GIM_CAPSULE_DATA * capsule, GDYNAMIC_ARRAY * contacts) -{ - GUINT old_contact_size = contacts->m_size; - gim_closest_point_triangle_segment(triangle,capsule->m_point1,capsule->m_point2,contacts); - GIM_CONTACT * pcontact = GIM_DYNARRAY_POINTER(GIM_CONTACT ,(*contacts)); - pcontact+= old_contact_size; - - if(pcontact->m_depth > capsule->m_radius) - { - contacts->m_size = old_contact_size; - return 0; - } - - vec3f vec; - while(old_contact_sizem_size) - { - //Scale the normal for pointing to triangle - VEC_SCALE(pcontact->m_normal,-1.0f,pcontact->m_normal); - //Fix the contact point - VEC_SCALE(vec,capsule->m_radius,pcontact->m_normal); - VEC_SUM(pcontact->m_point,vec,pcontact->m_point); - //Fix the depth - pcontact->m_depth = capsule->m_radius - pcontact->m_depth; - - pcontact++; - old_contact_size++; - } - - return 1; -} - - -//! Trimesh Capsule collision -/*! -Find the closest primitive collided by the ray -\param trimesh -\param capsule -\param contact -\param contacts A GIM_CONTACT array. Must be initialized -*/ -void gim_trimesh_capsule_collision(GIM_TRIMESH * trimesh, GIM_CAPSULE_DATA * capsule, GDYNAMIC_ARRAY * contacts) -{ - contacts->m_size = 0; - - aabb3f test_aabb; - CALC_CAPSULE_AABB((*capsule),test_aabb); - - GDYNAMIC_ARRAY collision_result; - GIM_CREATE_BOXQUERY_LIST(collision_result); - - gim_aabbset_box_collision(&test_aabb, &trimesh->m_aabbset , &collision_result); - - if(collision_result.m_size==0) - { - GIM_DYNARRAY_DESTROY(collision_result); - } - - //collide triangles - //Locks trimesh - gim_trimesh_locks_work_data(trimesh); - //dummy contacts - GDYNAMIC_ARRAY dummycontacts; - GIM_CREATE_CONTACT_LIST(dummycontacts); - - int cresult; - unsigned int i; - GUINT * boxesresult = GIM_DYNARRAY_POINTER(GUINT,collision_result); - GIM_TRIANGLE_DATA tri_data; - GUINT old_contact_size; - GIM_CONTACT * pcontact; - - for(i=0;im_handle1 = trimesh; - pcontact->m_handle2 = capsule; - pcontact->m_feature1 = boxesresult[i]; - pcontact->m_feature2 = 0; - pcontact++; - old_contact_size++; - } - } - } - ///unlocks - gim_trimesh_unlocks_work_data(trimesh); - ///Destroy box result - GIM_DYNARRAY_DESTROY(collision_result); - - //merge contacts - gim_merge_contacts(&dummycontacts,contacts); - - //Destroy dummy - GIM_DYNARRAY_DESTROY(dummycontacts); -} diff --git a/libraries/ode-0.9/GIMPACT/src/gim_trimesh_ray_collision.cpp b/libraries/ode-0.9/GIMPACT/src/gim_trimesh_ray_collision.cpp deleted file mode 100644 index 0c10fe1964..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_trimesh_ray_collision.cpp +++ /dev/null @@ -1,140 +0,0 @@ - -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_trimesh.h" - - -//! Trimesh Ray Collisions -/*! - -\param trimesh -\param contact -\return 1 if the ray collides, else 0 -*/ -int gim_trimesh_ray_collision(GIM_TRIMESH * trimesh,vec3f origin,vec3f dir, GREAL tmax, GIM_TRIANGLE_RAY_CONTACT_DATA * contact) -{ - GDYNAMIC_ARRAY collision_result; - GIM_CREATE_BOXQUERY_LIST(collision_result); - - gim_aabbset_ray_collision(origin,dir,tmax,&trimesh->m_aabbset,&collision_result); - - if(collision_result.m_size==0) - { - GIM_DYNARRAY_DESTROY(collision_result); - return 0; - } - - //collide triangles - - GUINT * boxesresult = GIM_DYNARRAY_POINTER(GUINT,collision_result); - GIM_TRIANGLE_DATA tridata; - vec3f pout; - GREAL tparam,u,v; - char does_intersect; - - gim_trimesh_locks_work_data(trimesh); - - for(unsigned int i=0;itparam = tparam; - contact->u = u; - contact->v = v; - contact->m_face_id = boxesresult[i]; - VEC_COPY(contact->m_point,pout); - VEC_COPY(contact->m_normal,tridata.m_planes.m_planes[0]); - - gim_trimesh_unlocks_work_data(trimesh); - GIM_DYNARRAY_DESTROY(collision_result); - return 1; - } - } - - gim_trimesh_unlocks_work_data(trimesh); - GIM_DYNARRAY_DESTROY(collision_result); - return 0;//no collisiion -} - - -//! Trimesh Ray Collisions closest -/*! -Find the closest primitive collided by the ray -\param trimesh -\param contact -\return 1 if the ray collides, else 0 -*/ -int gim_trimesh_ray_closest_collision(GIM_TRIMESH * trimesh,vec3f origin,vec3f dir, GREAL tmax, GIM_TRIANGLE_RAY_CONTACT_DATA * contact) -{ - GDYNAMIC_ARRAY collision_result; - GIM_CREATE_BOXQUERY_LIST(collision_result); - - gim_aabbset_ray_collision(origin,dir,tmax,&trimesh->m_aabbset,&collision_result); - - if(collision_result.m_size==0) - { - GIM_DYNARRAY_DESTROY(collision_result); - return 0; - } - - //collide triangles - - GUINT * boxesresult = GIM_DYNARRAY_POINTER(GUINT,collision_result); - GIM_TRIANGLE_DATA tridata; - vec3f pout; - GREAL tparam,u,v; - char does_intersect; - contact->tparam = tmax + 0.1f; - - - gim_trimesh_locks_work_data(trimesh); - - for(unsigned int i=0;itparam)) - { - contact->tparam = tparam; - contact->u = u; - contact->v = v; - contact->m_face_id = boxesresult[i]; - VEC_COPY(contact->m_point,pout); - VEC_COPY(contact->m_normal,tridata.m_planes.m_planes[0]); - } - } - - gim_trimesh_unlocks_work_data(trimesh); - GIM_DYNARRAY_DESTROY(collision_result); - if(contact->tparam > tmax) return 0; - return 1; -} diff --git a/libraries/ode-0.9/GIMPACT/src/gim_trimesh_sphere_collision.cpp b/libraries/ode-0.9/GIMPACT/src/gim_trimesh_sphere_collision.cpp deleted file mode 100644 index 60444fb607..0000000000 --- a/libraries/ode-0.9/GIMPACT/src/gim_trimesh_sphere_collision.cpp +++ /dev/null @@ -1,196 +0,0 @@ - -/* ------------------------------------------------------------------------------ -This source file is part of GIMPACT Library. - -For the latest info, see http://gimpact.sourceforge.net/ - -Copyright (c) 2006 Francisco Leon. C.C. 80087371. -email: projectileman@yahoo.com - - This library is free software; you can redistribute it and/or - modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file GIMPACT-LICENSE-LGPL.TXT. - (2) The BSD-style license that is included with this library in - the file GIMPACT-LICENSE-BSD.TXT. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details. - ------------------------------------------------------------------------------ -*/ - -#include "GIMPACT/gim_trimesh.h" - -int gim_triangle_sphere_collision( - GIM_TRIANGLE_DATA *tri, - vec3f center, GREAL radius, - GIM_TRIANGLE_CONTACT_DATA * contact_data) -{ - contact_data->m_point_count = 0; - - //Find Face plane distance - GREAL dis = DISTANCE_PLANE_POINT(tri->m_planes.m_planes[0],center); - if(dis>radius) return 0; //out - if(dis<-radius) return 0;//Out of triangle - contact_data->m_penetration_depth = dis; - - //Find the most edge - GUINT most_edge = 4;//no edge - GREAL max_dis = 0.0f; - dis = DISTANCE_PLANE_POINT(tri->m_planes.m_planes[1],center); - if(dis>radius) return 0;//Out of triangle - if(dis>0.0f) - { - max_dis = dis; - most_edge = 0; - } - - dis = DISTANCE_PLANE_POINT(tri->m_planes.m_planes[2],center); - if(dis>radius) return 0;//Out of triangle - if(dis>max_dis)// && dis>0.0f) - { - max_dis = dis; - most_edge = 1; - } - - dis = DISTANCE_PLANE_POINT(tri->m_planes.m_planes[3],center); - if(dis>radius) return 0;//Out of triangle - if(dis>max_dis)// && dis>0.0f) - { - max_dis = dis; - most_edge = 2; - } - - if(most_edge == 4) //Box is into triangle - { - //contact_data->m_penetration_depth = dis is set above - //Find Face plane point - VEC_COPY(contact_data->m_separating_normal,tri->m_planes.m_planes[0]); - //Find point projection on plane - if(contact_data->m_penetration_depth>=0.0f) - { - VEC_SCALE(contact_data->m_points[0],-radius,contact_data->m_separating_normal); - } - else - { - VEC_SCALE(contact_data->m_points[0],radius,contact_data->m_separating_normal); - } - contact_data->m_penetration_depth = radius - contact_data->m_penetration_depth; - - VEC_SUM(contact_data->m_points[0],contact_data->m_points[0],center); - //Scale normal for pointing to triangle - VEC_SCALE(contact_data->m_separating_normal,-1.0f,contact_data->m_separating_normal); - contact_data->m_point_count = 1; - return 1; - } - //find the edge - vec3f e1,e2; - VEC_COPY(e1,tri->m_vertices[most_edge]); - VEC_COPY(e2,tri->m_vertices[(most_edge+1)%3]); - - CLOSEST_POINT_ON_SEGMENT(contact_data->m_points[0],center,e1,e2); - //find distance - VEC_DIFF(e1,center,contact_data->m_points[0]); - VEC_LENGTH(e1,dis); - if(dis>radius) return 0; - - contact_data->m_penetration_depth = radius - dis; - - if(IS_ZERO(dis)) - { - VEC_COPY(contact_data->m_separating_normal,tri->m_planes.m_planes[most_edge+1]); - VEC_SCALE(contact_data->m_points[0],-radius,contact_data->m_separating_normal); - VEC_SUM(contact_data->m_points[0],contact_data->m_points[0],center); - } - else - { - VEC_SCALE(contact_data->m_separating_normal,1.0f/dis,e1); - VEC_SCALE(contact_data->m_points[0],-radius,contact_data->m_separating_normal); - VEC_SUM(contact_data->m_points[0],contact_data->m_points[0],center); - } - - //Scale normal for pointing to triangle - VEC_SCALE(contact_data->m_separating_normal,-1.0f,contact_data->m_separating_normal); - - contact_data->m_point_count = 1; - return 1; - -} - -//! Trimesh Sphere Collisions -/*! -In each contact -
      -
    • m_handle1 points to trimesh. -
    • m_handle2 points to NULL. -
    • m_feature1 Is a triangle index of trimesh. -
    - -\param trimesh -\param center -\param radius -\param contacts A GIM_CONTACT array. Must be initialized -*/ -void gim_trimesh_sphere_collision(GIM_TRIMESH * trimesh,vec3f center,GREAL radius, GDYNAMIC_ARRAY * contacts) -{ - contacts->m_size = 0; - - aabb3f test_aabb; - test_aabb.minX = center[0]-radius; - test_aabb.maxX = center[0]+radius; - test_aabb.minY = center[1]-radius; - test_aabb.maxY = center[1]+radius; - test_aabb.minZ = center[2]-radius; - test_aabb.maxZ = center[2]+radius; - - GDYNAMIC_ARRAY collision_result; - GIM_CREATE_BOXQUERY_LIST(collision_result); - - gim_aabbset_box_collision(&test_aabb, &trimesh->m_aabbset , &collision_result); - - if(collision_result.m_size==0) - { - GIM_DYNARRAY_DESTROY(collision_result); - } - - //collide triangles - //Locks trimesh - gim_trimesh_locks_work_data(trimesh); - //dummy contacts - GDYNAMIC_ARRAY dummycontacts; - GIM_CREATE_CONTACT_LIST(dummycontacts); - - int cresult; - unsigned int i; - GUINT * boxesresult = GIM_DYNARRAY_POINTER(GUINT,collision_result); - GIM_TRIANGLE_CONTACT_DATA tri_contact_data; - GIM_TRIANGLE_DATA tri_data; - - for(i=0;i0.0f && _distances[2]>0.0f)\ - {\ - out_of_face = 1;\ - }\ - else\ - {\ - out_of_face = 0;\ - }\ -}\ - - -//! Receives the 3 edge planes -#define MOST_DEEP_POINTS(plane,points,point_count,deep_points,deep_points_count,maxdeep)\ -{\ - maxdeep=-1000.0f;\ - GUINT _k;\ - GREAL _dist;\ - deep_points_count = 0;\ - for(_k=0;_kmaxdeep)\ - {\ - maxdeep = _dist;\ - _max_candidates[0] = _k;\ - deep_points_count=1;\ - }\ - else if((_dist+G_EPSILON)>=maxdeep)\ - {\ - _max_candidates[deep_points_count] = _k;\ - deep_points_count++;\ - }\ - }\ - if(maxdeep<0.0f)\ - {\ - deep_points_count = 0;\ - }\ - else\ - {\ - for(_k=0;_k0)\ - {\ - _temp_clip_count2 = 0;\ - PLANE_CLIP_POLYGON(tri_edge_planes[1],_temp_clip,_temp_clip_count,_temp_clip2,_temp_clip_count2,MAX_TRI_CLIPPING);\ - if(_temp_clip_count2>0)\ - {\ - PLANE_CLIP_POLYGON(tri_edge_planes[2],_temp_clip2,_temp_clip_count2,clipped_points,clipped_point_count,MAX_TRI_CLIPPING);\ - }\ - }\ -}\ - - - -int _gim_triangle_triangle_collision( - GIM_TRIANGLE_DATA *tri1, - GIM_TRIANGLE_DATA *tri2, - GIM_TRIANGLE_CONTACT_DATA * contact_data) -{ - //Cache variables for triangle intersection - GUINT _max_candidates[MAX_TRI_CLIPPING]; - vec3f _temp_clip[MAX_TRI_CLIPPING]; - GUINT _temp_clip_count = 0; - vec3f _temp_clip2[MAX_TRI_CLIPPING]; - GUINT _temp_clip_count2 = 0; - vec3f clipped_points2[MAX_TRI_CLIPPING]; - vec3f deep_points2[MAX_TRI_CLIPPING]; - vec3f clipped_points1[MAX_TRI_CLIPPING]; - vec3f deep_points1[MAX_TRI_CLIPPING]; - - - - //State variabnles - GUINT mostdir=0; - GUINT clipped2_count=0; - - //Clip tri2 by tri1 edges - - CLIP_TRI_POINTS_BY_TRI_EDGE_PLANES(tri2->m_vertices,(&tri1->m_planes.m_planes[1]), clipped_points2, clipped2_count); - - if(clipped2_count == 0 ) - { - return 0;//Reject - } - - //find most deep interval face1 - GUINT deep2_count=0; - - GREAL maxdeep; - - MOST_DEEP_POINTS((tri1->m_planes.m_planes[0]), clipped_points2, clipped2_count, deep_points2, deep2_count, maxdeep); - if(deep2_count==0) - { -// *perror = 0.0f; - return 0;//Reject - } - - //Normal pointing to triangle1 - VEC_SCALE(contact_data->m_separating_normal,-1.0f,(tri1->m_planes.m_planes[0])); - - - //Clip tri1 by tri2 edges - - GUINT clipped1_count=0; - - CLIP_TRI_POINTS_BY_TRI_EDGE_PLANES(tri1->m_vertices,(&tri2->m_planes.m_planes[1]), clipped_points1, clipped1_count); - - if(clipped2_count == 0 ) - { -// *perror = 0.0f; - return 0;//Reject - } - - - //find interval face2 - GUINT deep1_count=0; - - GREAL dist; - - MOST_DEEP_POINTS((tri2->m_planes.m_planes[0]), clipped_points1, clipped1_count, deep_points1, deep1_count, dist); - - if(deep1_count==0) - { -// *perror = 0.0f; - return 0; - } - - if(distm_separating_normal,(tri2->m_planes.m_planes[0])); - } - //set deep - contact_data->m_penetration_depth = maxdeep; - - ////check most dir for contacts - if(mostdir==0) - { - contact_data->m_point_count = deep2_count; - for(mostdir=0;mostdirm_points[mostdir] ,deep_points2[mostdir]); - } - } - else - { - contact_data->m_point_count = deep1_count; - for(mostdir=0;mostdirm_points[mostdir] ,deep_points1[mostdir]); - } - } - return 1; -} - - - -//! Finds the contact points from a collision of two triangles -/*! -Returns the contact points, the penetration depth and the separating normal of the collision -between two triangles. The normal is pointing toward triangle 1 from triangle 2 -*/ -int gim_triangle_triangle_collision( - GIM_TRIANGLE_DATA *tri1, - GIM_TRIANGLE_DATA *tri2, - GIM_TRIANGLE_CONTACT_DATA * contact_data) -{ - vec3f _distances; - char out_of_face=0; - - CLASSIFY_TRI_BY_FACE(tri1->m_vertices[0],tri1->m_vertices[1],tri1->m_vertices[2],tri2->m_planes.m_planes[0],out_of_face); - if(out_of_face==1) return 0; - - CLASSIFY_TRI_BY_FACE(tri2->m_vertices[0],tri2->m_vertices[1],tri2->m_vertices[2],tri1->m_planes.m_planes[0],out_of_face); - if(out_of_face==1) return 0; - - return _gim_triangle_triangle_collision(tri1,tri2,contact_data); -} - -//! Trimesh Trimesh Collisions -/*! - -In each contact -
      -
    • m_handle1 points to trimesh1. -
    • m_handle2 points to trimesh2. -
    • m_feature1 Is a triangle index of trimesh1. -
    • m_feature2 Is a triangle index of trimesh2. -
    - -\param trimesh1 Collider -\param trimesh2 Collidee -\param contacts A GIM_CONTACT array. Must be initialized -*/ -void gim_trimesh_trimesh_collision(GIM_TRIMESH * trimesh1, GIM_TRIMESH * trimesh2, GDYNAMIC_ARRAY * contacts) -{ - contacts->m_size = 0; - GDYNAMIC_ARRAY collision_pairs; - GIM_CREATE_PAIR_SET(collision_pairs) - - gim_aabbset_bipartite_intersections(&trimesh1->m_aabbset,&trimesh2->m_aabbset,&collision_pairs); - - if(collision_pairs.m_size==0) - { - GIM_DYNARRAY_DESTROY(collision_pairs); - return; //no collisioin - } - - //Locks meshes - gim_trimesh_locks_work_data(trimesh1); - gim_trimesh_locks_work_data(trimesh2); - - - //pair pointer - GIM_PAIR *pairs = GIM_DYNARRAY_POINTER(GIM_PAIR,collision_pairs); - //dummy contacts - GDYNAMIC_ARRAY dummycontacts; - GIM_CREATE_CONTACT_LIST(dummycontacts); - - //Auxiliary triangle data - GIM_TRIANGLE_CONTACT_DATA tri_contact_data; - GIM_TRIANGLE_DATA tri1data,tri2data; - - - GUINT i, ti1,ti2,ci; - int colresult; - for (i=0;im_size = 0; - char classify; - PLANE_CLASSIFY_BOX(plane,trimesh->m_aabbset.m_global_bound,classify); - if(classify>1) return; // in front of plane - - //Locks mesh - gim_trimesh_locks_work_data(trimesh); - //Get vertices - GUINT i, vertcount = trimesh->m_transformed_vertex_buffer.m_element_count; - vec3f * vertices = GIM_BUFFER_ARRAY_POINTER(vec3f,trimesh->m_transformed_vertex_buffer,0); - - GREAL dist; - vec4f * result_contact; - - for (i=0;i - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/libraries/ode-0.9/Makefile.am b/libraries/ode-0.9/Makefile.am deleted file mode 100644 index 4b33d05c2e..0000000000 --- a/libraries/ode-0.9/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -libtool: $(LIBTOOL_DEPS) - $(SHELL) ./config.status --recheck - -if ENABLE_DEMOS -SUBDIRS = include drawstuff ode tests -else -SUBDIRS = include ode tests -endif - -bin_SCRIPTS = ode-config - -# Utility rule for making a release -release: dist dist-bz2 dist-zip - @echo Created release packages for ${PACKAGE}-${VERSION}. - -# Rules for creating .tar.bz2 and .zip packages -dist-bz2: ${PACKAGE}-${VERSION}.tar.gz - gzip -dc ${PACKAGE}-${VERSION}.tar.gz | bzip2 > ${PACKAGE}-${VERSION}.tar.bz2 - -dist-zip: ${PACKAGE}-${VERSION}.tar.gz - tar -zxf ${PACKAGE}-${VERSION}.tar.gz && \ - zip -r ${PACKAGE}-${VERSION}.zip ${PACKAGE}-${VERSION} && \ - rm -rf ${PACKAGE}-${VERSION} - -if USE_SONAME -install-exec-hook: - ln -s $(libdir)/@ODE_SONAME@.@ODE_REVISION@.@ODE_AGE@ \ - $(libdir)/libode.so - ln -s $(libdir)/@ODE_SONAME@.@ODE_REVISION@.@ODE_AGE@ \ - $(libdir)/@ODE_SONAME@ - ln -s $(libdir)/@ODE_SONAME@.@ODE_REVISION@.@ODE_AGE@ \ - $(libdir)/@ODE_SONAME@.@ODE_REVISION@ - /sbin/ldconfig -else -install-exec-hook: -endif diff --git a/libraries/ode-0.9/Makefile.deps b/libraries/ode-0.9/Makefile.deps deleted file mode 100644 index 8d9e8ba7fc..0000000000 --- a/libraries/ode-0.9/Makefile.deps +++ /dev/null @@ -1,1845 +0,0 @@ -ode/src/array.o: \ - ode/src/array.cpp \ - include/ode/config.h \ - include/ode/memory.h \ - include/ode/error.h \ - ode/src/array.h -ode/src/error.o: \ - ode/src/error.cpp \ - include/ode/config.h \ - include/ode/error.h -ode/src/memory.o: \ - ode/src/memory.cpp \ - include/ode/config.h \ - include/ode/memory.h \ - include/ode/error.h -ode/src/obstack.o: \ - ode/src/obstack.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/memory.h \ - ode/src/obstack.h \ - ode/src/objects.h \ - include/ode/mass.h \ - ode/src/array.h -ode/src/odemath.o: \ - ode/src/odemath.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/odemath.h -ode/src/matrix.o: \ - ode/src/matrix.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/matrix.h -ode/src/misc.o: \ - ode/src/misc.cpp \ - include/ode/config.h \ - include/ode/misc.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/matrix.h -ode/src/rotation.o: \ - ode/src/rotation.cpp \ - include/ode/rotation.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/compatibility.h \ - include/ode/odemath.h -ode/src/mass.o: \ - ode/src/mass.cpp \ - include/ode/config.h \ - include/ode/mass.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/odemath.h \ - include/ode/matrix.h -ode/src/ode.o: \ - ode/src/ode.cpp \ - ode/src/objects.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - include/ode/ode.h \ - include/ode/compatibility.h \ - include/ode/contact.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - ode/src/joint.h \ - ode/src/obstack.h \ - ode/src/step.h \ - ode/src/quickstep.h \ - ode/src/util.h -ode/src/step.o: \ - ode/src/step.cpp \ - ode/src/objects.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/joint.h \ - include/ode/contact.h \ - ode/src/obstack.h \ - include/ode/odemath.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/timer.h \ - include/ode/matrix.h \ - ode/src/lcp.h \ - ode/src/util.h -ode/src/stepfast.o: \ - ode/src/stepfast.cpp \ - ode/src/objects.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/joint.h \ - include/ode/contact.h \ - ode/src/obstack.h \ - include/ode/objects.h \ - include/ode/odemath.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/timer.h \ - include/ode/matrix.h \ - include/ode/misc.h \ - ode/src/lcp.h \ - ode/src/step.h \ - ode/src/util.h -ode/src/quickstep.o: \ - ode/src/quickstep.cpp \ - ode/src/objects.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/joint.h \ - include/ode/contact.h \ - ode/src/obstack.h \ - include/ode/odemath.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/timer.h \ - include/ode/matrix.h \ - ode/src/lcp.h \ - ode/src/util.h -ode/src/util.o: \ - ode/src/util.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - ode/src/objects.h \ - ode/src/array.h \ - ode/src/joint.h \ - ode/src/obstack.h \ - ode/src/util.h -ode/src/lcp.o: \ - ode/src/lcp.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - ode/src/lcp.h \ - include/ode/matrix.h \ - include/ode/misc.h \ - ode/src/mat.h \ - include/ode/timer.h -ode/src/joint.o: \ - ode/src/joint.cpp \ - include/ode/odemath.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/matrix.h \ - ode/src/joint.h \ - ode/src/objects.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - include/ode/contact.h \ - ode/src/obstack.h -ode/src/timer.o: \ - ode/src/timer.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/timer.h -ode/src/mat.o: \ - ode/src/mat.cpp \ - include/ode/config.h \ - include/ode/misc.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/matrix.h \ - include/ode/memory.h \ - ode/src/mat.h -ode/src/testing.o: \ - ode/src/testing.cpp \ - include/ode/config.h \ - include/ode/misc.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/memory.h \ - ode/src/testing.h \ - ode/src/array.h -ode/src/export-dif.o: \ - ode/src/export-dif.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - ode/src/objects.h \ - ode/src/array.h \ - ode/src/joint.h \ - ode/src/obstack.h \ - ode/src/collision_kernel.h -ode/src/collision_kernel.o: \ - ode/src/collision_kernel.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/matrix.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/objects.h \ - include/ode/mass.h \ - include/ode/contact.h \ - ode/src/collision_kernel.h \ - include/ode/collision.h \ - include/ode/collision_space.h \ - include/ode/collision_trimesh.h \ - ode/src/objects.h \ - include/ode/memory.h \ - ode/src/array.h \ - ode/src/collision_util.h \ - ode/src/collision_std.h \ - ode/src/collision_transform.h \ - ode/src/collision_trimesh_internal.h -ode/src/collision_util.o: \ - ode/src/collision_util.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/collision.h \ - include/ode/collision_space.h \ - include/ode/contact.h \ - include/ode/collision_trimesh.h \ - include/ode/odemath.h \ - ode/src/collision_util.h -ode/src/collision_std.o: \ - ode/src/collision_std.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/collision.h \ - include/ode/collision_space.h \ - include/ode/contact.h \ - include/ode/collision_trimesh.h \ - include/ode/matrix.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/odemath.h \ - ode/src/collision_kernel.h \ - ode/src/objects.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/collision_std.h \ - ode/src/collision_util.h -ode/src/collision_space.o: \ - ode/src/collision_space.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/matrix.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/contact.h \ - include/ode/collision_trimesh.h \ - ode/src/collision_kernel.h \ - ode/src/objects.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/collision_space_internal.h -ode/src/collision_transform.o: \ - ode/src/collision_transform.cpp \ - include/ode/collision.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/collision_space.h \ - include/ode/contact.h \ - include/ode/collision_trimesh.h \ - include/ode/matrix.h \ - include/ode/rotation.h \ - include/ode/compatibility.h \ - include/ode/odemath.h \ - ode/src/collision_transform.h \ - ode/src/collision_kernel.h \ - ode/src/objects.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/collision_util.h -ode/src/collision_quadtreespace.o: \ - ode/src/collision_quadtreespace.cpp \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h \ - include/ode/matrix.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/contact.h \ - include/ode/collision_trimesh.h \ - ode/src/collision_kernel.h \ - ode/src/objects.h \ - include/ode/memory.h \ - include/ode/mass.h \ - ode/src/array.h \ - ode/src/collision_space_internal.h -ode/src/OPC_AABBCollider.o: \ - OPCODE/OPC_AABBCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_BoxBoxOverlap.h \ - OPCODE/OPC_TriBoxOverlap.h -ode/src/OPC_AABBTree.o: \ - OPCODE/OPC_AABBTree.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_BaseModel.o: \ - OPCODE/OPC_BaseModel.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_BoxPruning.o: \ - OPCODE/OPC_BoxPruning.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_Collider.o: \ - OPCODE/OPC_Collider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_Common.o: \ - OPCODE/OPC_Common.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_HybridModel.o: \ - OPCODE/OPC_HybridModel.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_LSSCollider.o: \ - OPCODE/OPC_LSSCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_LSSAABBOverlap.h \ - OPCODE/OPC_LSSTriOverlap.h -ode/src/OPC_MeshInterface.o: \ - OPCODE/OPC_MeshInterface.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_Model.o: \ - OPCODE/OPC_Model.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_OBBCollider.o: \ - OPCODE/OPC_OBBCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_BoxBoxOverlap.h \ - OPCODE/OPC_TriBoxOverlap.h -ode/src/Opcode.o: \ - OPCODE/Opcode.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_OptimizedTree.o: \ - OPCODE/OPC_OptimizedTree.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_Picking.o: \ - OPCODE/OPC_Picking.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_PlanesCollider.o: \ - OPCODE/OPC_PlanesCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_PlanesAABBOverlap.h \ - OPCODE/OPC_PlanesTriOverlap.h -ode/src/OPC_RayCollider.o: \ - OPCODE/OPC_RayCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_RayAABBOverlap.h \ - OPCODE/OPC_RayTriOverlap.h -ode/src/OPC_SphereCollider.o: \ - OPCODE/OPC_SphereCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_SphereAABBOverlap.h \ - OPCODE/OPC_SphereTriOverlap.h -ode/src/OPC_SweepAndPrune.o: \ - OPCODE/OPC_SweepAndPrune.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_TreeBuilders.o: \ - OPCODE/OPC_TreeBuilders.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/OPC_TreeCollider.o: \ - OPCODE/OPC_TreeCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h \ - OPCODE/OPC_BoxBoxOverlap.h \ - OPCODE/OPC_TriBoxOverlap.h \ - OPCODE/OPC_TriTriOverlap.h -ode/src/OPC_VolumeCollider.o: \ - OPCODE/OPC_VolumeCollider.cpp \ - OPCODE/Stdafx.h \ - OPCODE/Opcode.h \ - OPCODE/OPC_IceHook.h \ - OPCODE/Ice/IcePreprocessor.h \ - OPCODE/Ice/IceTypes.h \ - OPCODE/Ice/IceFPU.h \ - OPCODE/Ice/IceMemoryMacros.h \ - OPCODE/Ice/IceUtils.h \ - OPCODE/Ice/IceContainer.h \ - OPCODE/Ice/IcePairs.h \ - OPCODE/Ice/IceRevisitedRadix.h \ - OPCODE/Ice/IceRandom.h \ - OPCODE/Ice/IceAxes.h \ - OPCODE/Ice/IcePoint.h \ - OPCODE/Ice/IceHPoint.h \ - OPCODE/Ice/IceMatrix3x3.h \ - OPCODE/Ice/IceMatrix4x4.h \ - OPCODE/Ice/IcePlane.h \ - OPCODE/Ice/IceRay.h \ - OPCODE/Ice/IceIndexedTriangle.h \ - OPCODE/Ice/IceTriangle.h \ - OPCODE/Ice/IceTriList.h \ - OPCODE/Ice/IceAABB.h \ - OPCODE/Ice/IceOBB.h \ - OPCODE/Ice/IceBoundingSphere.h \ - OPCODE/Ice/IceSegment.h \ - OPCODE/Ice/IceLSS.h \ - OPCODE/OPC_Settings.h \ - OPCODE/OPC_Common.h \ - OPCODE/OPC_MeshInterface.h \ - OPCODE/OPC_TreeBuilders.h \ - OPCODE/OPC_AABBTree.h \ - OPCODE/OPC_OptimizedTree.h \ - OPCODE/OPC_BaseModel.h \ - OPCODE/OPC_Model.h \ - OPCODE/OPC_HybridModel.h \ - OPCODE/OPC_Collider.h \ - OPCODE/OPC_VolumeCollider.h \ - OPCODE/OPC_TreeCollider.h \ - OPCODE/OPC_RayCollider.h \ - OPCODE/OPC_SphereCollider.h \ - OPCODE/OPC_OBBCollider.h \ - OPCODE/OPC_AABBCollider.h \ - OPCODE/OPC_LSSCollider.h \ - OPCODE/OPC_PlanesCollider.h \ - OPCODE/OPC_Picking.h \ - OPCODE/OPC_BoxPruning.h \ - OPCODE/OPC_SweepAndPrune.h -ode/src/fastldlt.o: \ - ode/src/fastldlt.c \ - include/ode/matrix.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h -ode/src/fastlsolve.o: \ - ode/src/fastlsolve.c \ - include/ode/matrix.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h -ode/src/fastltsolve.o: \ - ode/src/fastltsolve.c \ - include/ode/matrix.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h -ode/src/fastdot.o: \ - ode/src/fastdot.c \ - include/ode/matrix.h \ - include/ode/common.h \ - include/ode/config.h \ - include/ode/error.h -drawstuff/src/drawstuff.o: \ - drawstuff/src/drawstuff.cpp \ - include/ode/config.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h \ - drawstuff/src/internal.h -drawstuff/src/x11.o: \ - drawstuff/src/x11.cpp \ - include/ode/config.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h \ - drawstuff/src/internal.h -ode/test/test_ode.o: \ - ode/test/test_ode.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h -ode/test/test_chain2.o: \ - ode/test/test_chain2.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_hinge.o: \ - ode/test/test_hinge.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_slider.o: \ - ode/test/test_slider.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_collision.o: \ - ode/test/test_collision.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_boxstack.o: \ - ode/test/test_boxstack.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_buggy.o: \ - ode/test/test_buggy.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_crash.o: \ - ode/test/test_crash.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_joints.o: \ - ode/test/test_joints.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_space.o: \ - ode/test/test_space.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_I.o: \ - ode/test/test_I.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_step.o: \ - ode/test/test_step.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_friction.o: \ - ode/test/test_friction.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_space_stress.o: \ - ode/test/test_space_stress.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_trimesh.o: \ - ode/test/test_trimesh.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -ode/test/test_moving_trimesh.o: \ - ode/test/test_moving_trimesh.cpp \ - include/ode/ode.h \ - include/ode/config.h \ - include/ode/compatibility.h \ - include/ode/common.h \ - include/ode/error.h \ - include/ode/contact.h \ - include/ode/memory.h \ - include/ode/odemath.h \ - include/ode/matrix.h \ - include/ode/timer.h \ - include/ode/rotation.h \ - include/ode/mass.h \ - include/ode/misc.h \ - include/ode/objects.h \ - include/ode/odecpp.h \ - include/ode/collision_space.h \ - include/ode/collision.h \ - include/ode/collision_trimesh.h \ - include/ode/odecpp_collision.h \ - include/ode/export-dif.h \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h -drawstuff/dstest/dstest.o: \ - drawstuff/dstest/dstest.cpp \ - include/drawstuff/drawstuff.h \ - include/drawstuff/version.h diff --git a/libraries/ode-0.9/Makefile.in b/libraries/ode-0.9/Makefile.in deleted file mode 100644 index 5cf28d1a86..0000000000 --- a/libraries/ode-0.9/Makefile.in +++ /dev/null @@ -1,665 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = . -DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/ode-config.in \ - $(top_srcdir)/configure config.guess config.sub depcomp \ - install-sh missing -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = ode-config -am__installdirs = "$(DESTDIR)$(bindir)" -binSCRIPT_INSTALL = $(INSTALL_SCRIPT) -SCRIPTS = $(bin_SCRIPTS) -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = include ode tests drawstuff -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -@ENABLE_DEMOS_FALSE@SUBDIRS = include ode tests -@ENABLE_DEMOS_TRUE@SUBDIRS = include drawstuff ode tests -bin_SCRIPTS = ode-config -all: all-recursive - -.SUFFIXES: -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ - cd $(srcdir) && $(AUTOMAKE) --foreign \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -ode-config: $(top_builddir)/config.status $(srcdir)/ode-config.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -install-binSCRIPTS: $(bin_SCRIPTS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_SCRIPTS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - if test -f $$d$$p; then \ - f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ - echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ - else :; fi; \ - done - -uninstall-binSCRIPTS: - @$(NORMAL_UNINSTALL) - @list='$(bin_SCRIPTS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d $(distdir) || mkdir $(distdir) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @cd $(distuninstallcheck_dir) \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile $(SCRIPTS) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: install-binSCRIPTS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-binSCRIPTS - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-exec-am install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-shar dist-tarZ dist-zip distcheck distclean \ - distclean-generic distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-binSCRIPTS install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-binSCRIPTS - -libtool: $(LIBTOOL_DEPS) - $(SHELL) ./config.status --recheck - -# Utility rule for making a release -release: dist dist-bz2 dist-zip - @echo Created release packages for ${PACKAGE}-${VERSION}. - -# Rules for creating .tar.bz2 and .zip packages -dist-bz2: ${PACKAGE}-${VERSION}.tar.gz - gzip -dc ${PACKAGE}-${VERSION}.tar.gz | bzip2 > ${PACKAGE}-${VERSION}.tar.bz2 - -dist-zip: ${PACKAGE}-${VERSION}.tar.gz - tar -zxf ${PACKAGE}-${VERSION}.tar.gz && \ - zip -r ${PACKAGE}-${VERSION}.zip ${PACKAGE}-${VERSION} && \ - rm -rf ${PACKAGE}-${VERSION} - -@USE_SONAME_TRUE@install-exec-hook: -@USE_SONAME_TRUE@ ln -s $(libdir)/@ODE_SONAME@.@ODE_REVISION@.@ODE_AGE@ \ -@USE_SONAME_TRUE@ $(libdir)/libode.so -@USE_SONAME_TRUE@ ln -s $(libdir)/@ODE_SONAME@.@ODE_REVISION@.@ODE_AGE@ \ -@USE_SONAME_TRUE@ $(libdir)/@ODE_SONAME@ -@USE_SONAME_TRUE@ ln -s $(libdir)/@ODE_SONAME@.@ODE_REVISION@.@ODE_AGE@ \ -@USE_SONAME_TRUE@ $(libdir)/@ODE_SONAME@.@ODE_REVISION@ -@USE_SONAME_TRUE@ /sbin/ldconfig -@USE_SONAME_FALSE@install-exec-hook: -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/OPCODE/Ice/IceAABB.cpp b/libraries/ode-0.9/OPCODE/Ice/IceAABB.cpp deleted file mode 100644 index d62b0ed623..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceAABB.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains AABB-related code. - * \file IceAABB.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * AABB class. - * \class AABB - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the sum of two AABBs. - * \param aabb [in] the other AABB - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABB& AABB::Add(const AABB& aabb) -{ - // Compute new min & max values - Point Min; GetMin(Min); - Point Tmp; aabb.GetMin(Tmp); - Min.Min(Tmp); - - Point Max; GetMax(Max); - aabb.GetMax(Tmp); - Max.Max(Tmp); - - // Update this - SetMinMax(Min, Max); - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Makes a cube from the AABB. - * \param cube [out] the cube AABB - * \return cube edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float AABB::MakeCube(AABB& cube) const -{ - Point Ext; GetExtents(Ext); - float Max = Ext.Max(); - - Point Cnt; GetCenter(Cnt); - cube.SetCenterExtents(Cnt, Point(Max, Max, Max)); - return Max; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Makes a sphere from the AABB. - * \param sphere [out] sphere containing the AABB - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABB::MakeSphere(Sphere& sphere) const -{ - GetExtents(sphere.mCenter); - sphere.mRadius = sphere.mCenter.Magnitude() * 1.00001f; // To make sure sphere::Contains(*this) succeeds - GetCenter(sphere.mCenter); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks a box is inside another box. - * \param box [in] the other AABB - * \return true if current box is inside input box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABB::IsInside(const AABB& box) const -{ - if(box.GetMin(0)>GetMin(0)) return false; - if(box.GetMin(1)>GetMin(1)) return false; - if(box.GetMin(2)>GetMin(2)) return false; - if(box.GetMax(0) max.x) ? 2 : 0) // 2 = right - + ((local_eye.y < min.y) ? 4 : 0) // 4 = bottom - + ((local_eye.y > max.y) ? 8 : 0) // 8 = top - + ((local_eye.z < min.z) ? 16 : 0) // 16 = front - + ((local_eye.z > max.z) ? 32 : 0); // 32 = back - - // Look up number of vertices in outline - num = (sdword)gIndexList[pos][7]; - // Zero indicates invalid case - if(!num) return null; - - return &gIndexList[pos][0]; -} - -// calculateBoxArea: computes the screen-projected 2D area of an oriented 3D bounding box - -//const Point& eye, //eye point (in bbox object coordinates) -//const AABB& box, //3d bbox -//const Matrix4x4& mat, //free transformation for bbox -//float width, float height, int& num) -float AABB::ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const -{ - const sbyte* Outline = ComputeOutline(eye, num); - if(!Outline) return -1.0f; - - // Compute box vertices - Point vertexBox[8], dst[8]; - ComputePoints(vertexBox); - - // Transform all outline corners into 2D screen space - for(sdword i=0;i GetMax(0) || p.x < GetMin(0)) return FALSE; \ - if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ - if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ - return TRUE; \ - } - - enum AABBType - { - AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. - AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. - - AABB_FORCE_DWORD = 0x7fffffff, - }; - -#ifdef USE_MINMAX - - struct ICEMATHS_API ShadowAABB - { - Point mMin; - Point mMax; - }; - - class ICEMATHS_API AABB - { - public: - //! Constructor - inline_ AABB() {} - //! Destructor - inline_ ~AABB() {} - - //! Type-independent methods - AABB_COMMON_METHODS; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from center & extents vectors. - * \param c [in] the center point - * \param e [in] the extents vector - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups a point AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetPoint(const Point& pt) { mMin = mMax = pt; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the size of the AABB. The size is defined as the longest extent. - * \return the size of the AABB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - float GetSize() const { Point e; GetExtents(e); return e.Max(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Extends the AABB. - * \param p [in] the next point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Extend(const Point& p) - { - if(p.x > mMax.x) mMax.x = p.x; - if(p.x < mMin.x) mMin.x = p.x; - - if(p.y > mMax.y) mMax.y = p.y; - if(p.y < mMin.y) mMin.y = p.y; - - if(p.z > mMax.z) mMax.z = p.z; - if(p.z < mMin.z) mMin.z = p.z; - } - // Data access - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mMin; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mMax; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mMin[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mMax[axis]; } - - //! Get box center - inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } - //! Get box extents - inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } - - //! Get component of the box's center along a given axis - inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } - //! Get component of the box's extents along a given axis - inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } - - //! Get box diagonal - inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } - inline_ float GetWidth() const { return mMax.x - mMin.x; } - inline_ float GetHeight() const { return mMax.y - mMin.y; } - inline_ float GetDepth() const { return mMax.z - mMin.z; } - - //! Volume - inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the intersection between two AABBs. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a) const - { - if(mMax.x < a.mMin.x - || a.mMax.x < mMin.x - || mMax.y < a.mMin.y - || a.mMax.y < mMin.y - || mMax.z < a.mMin.z - || a.mMax.z < mMin.z) return FALSE; - - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the 1D-intersection between two AABBs, on a given axis. - * \param a [in] the other AABB - * \param axis [in] the axis (0, 1, 2) - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a, udword axis) const - { - if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. - * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) - * \param mtx [in] the transform matrix - * \param aabb [out] the transformed AABB [can be *this] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const - { - // The three edges transformed: you can efficiently transform an X-only vector - // by just getting the "X" column of the matrix - Point vx,vy,vz; - mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); - mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); - mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); - - // Transform the min point - aabb.mMin = aabb.mMax = mMin * mtx; - - // Take the transformed min & axes and find new extents - // Using CPU code in the right place is faster... - if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; - if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; - if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; - if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; - if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; - if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; - if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; - if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; - if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the AABB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Min, Max) boxes: min < max - if(mMin.x > mMax.x) return FALSE; - if(mMin.y > mMax.y) return FALSE; - if(mMin.z > mMax.z) return FALSE; - return TRUE; - } - - //! Operator for AABB *= float. Scales the extents, keeps same center. - inline_ AABB& operator*=(float s) - { - Point Center; GetCenter(Center); - Point Extents; GetExtents(Extents); - SetCenterExtents(Center, Extents * s); - return *this; - } - - //! Operator for AABB /= float. Scales the extents, keeps same center. - inline_ AABB& operator/=(float s) - { - Point Center; GetCenter(Center); - Point Extents; GetExtents(Extents); - SetCenterExtents(Center, Extents / s); - return *this; - } - - //! Operator for AABB += Point. Translates the box. - inline_ AABB& operator+=(const Point& trans) - { - mMin+=trans; - mMax+=trans; - return *this; - } - private: - Point mMin; //!< Min point - Point mMax; //!< Max point - }; - -#else - - class ICEMATHS_API AABB - { - public: - //! Constructor - inline_ AABB() {} - //! Destructor - inline_ ~AABB() {} - - //! Type-independent methods - AABB_COMMON_METHODS; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from center & extents vectors. - * \param c [in] the center point - * \param e [in] the extents vector - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups a point AABB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the size of the AABB. The size is defined as the longest extent. - * \return the size of the AABB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - float GetSize() const { return mExtents.Max(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Extends the AABB. - * \param p [in] the next point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Extend(const Point& p) - { - Point Max = mCenter + mExtents; - Point Min = mCenter - mExtents; - - if(p.x > Max.x) Max.x = p.x; - if(p.x < Min.x) Min.x = p.x; - - if(p.y > Max.y) Max.y = p.y; - if(p.y < Min.y) Min.y = p.y; - - if(p.z > Max.z) Max.z = p.z; - if(p.z < Min.z) Min.z = p.z; - - SetMinMax(Min, Max); - } - // Data access - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } - - //! Get box center - inline_ void GetCenter(Point& center) const { center = mCenter; } - //! Get box extents - inline_ void GetExtents(Point& extents) const { extents = mExtents; } - - //! Get component of the box's center along a given axis - inline_ float GetCenter(udword axis) const { return mCenter[axis]; } - //! Get component of the box's extents along a given axis - inline_ float GetExtents(udword axis) const { return mExtents[axis]; } - - //! Get box diagonal - inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } - inline_ float GetWidth() const { return mExtents.x * 2.0f; } - inline_ float GetHeight() const { return mExtents.y * 2.0f; } - inline_ float GetDepth() const { return mExtents.z * 2.0f; } - - //! Volume - inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the intersection between two AABBs. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a) const - { - float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; - float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; - float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * The standard intersection method from Gamasutra. Just here to check its speed against the one above. - * \param a [in] the other AABB - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool GomezIntersect(const AABB& a) - { - Point T = mCenter - a.mCenter; // Vector from A to B - return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) - && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) - && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the 1D-intersection between two AABBs, on a given axis. - * \param a [in] the other AABB - * \param axis [in] the axis (0, 1, 2) - * \return true on intersection - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Intersect(const AABB& a, udword axis) const - { - float t = mCenter[axis] - a.mCenter[axis]; - float e = a.mExtents[axis] + mExtents[axis]; - if(AIR(t) > IR(e)) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. - * \param mtx [in] the transform matrix - * \param aabb [out] the transformed AABB [can be *this] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const - { - // Compute new center - aabb.mCenter = mCenter * mtx; - - // Compute new extents. FPU code & CPU code have been interleaved for improved performance. - Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); - IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; - - Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); - IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; - - Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); - IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; - - aabb.mExtents.x = Ex.x + Ey.x + Ez.x; - aabb.mExtents.y = Ex.y + Ey.y + Ez.y; - aabb.mExtents.z = Ex.z + Ey.z + Ez.z; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the AABB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Center, Extents) boxes: Extents >= 0 - if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; - if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; - if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; - return TRUE; - } - - //! Operator for AABB *= float. Scales the extents, keeps same center. - inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } - - //! Operator for AABB /= float. Scales the extents, keeps same center. - inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } - - //! Operator for AABB += Point. Translates the box. - inline_ AABB& operator+=(const Point& trans) - { - mCenter+=trans; - return *this; - } - private: - Point mCenter; //!< AABB Center - Point mExtents; //!< x, y and z extents - }; - -#endif - - inline_ void ComputeMinMax(const Point& p, Point& min, Point& max) - { - if(p.x > max.x) max.x = p.x; - if(p.x < min.x) min.x = p.x; - - if(p.y > max.y) max.y = p.y; - if(p.y < min.y) min.y = p.y; - - if(p.z > max.z) max.z = p.z; - if(p.z < min.z) min.z = p.z; - } - - inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) - { - if(list) - { - Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); - Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); - while(nb_pts--) - { -// _prefetch(list+1); // off by one ? - ComputeMinMax(*list++, Mini, Maxi); - } - aabb.SetMinMax(Mini, Maxi); - } - } - -#endif // __ICEAABB_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceAxes.h b/libraries/ode-0.9/OPCODE/Ice/IceAxes.h deleted file mode 100644 index 8af57e1e7f..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceAxes.h +++ /dev/null @@ -1,54 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains axes definition. - * \file IceAxes.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEAXES_H__ -#define __ICEAXES_H__ - - enum PointComponent - { - X = 0, - Y = 1, - Z = 2, - W = 3, - - FORCE_DWORD = 0x7fffffff - }; - - enum AxisOrder - { - AXES_XYZ = (X)|(Y<<2)|(Z<<4), - AXES_XZY = (X)|(Z<<2)|(Y<<4), - AXES_YXZ = (Y)|(X<<2)|(Z<<4), - AXES_YZX = (Y)|(Z<<2)|(X<<4), - AXES_ZXY = (Z)|(X<<2)|(Y<<4), - AXES_ZYX = (Z)|(Y<<2)|(X<<4), - - AXES_FORCE_DWORD = 0x7fffffff - }; - - class ICEMATHS_API Axes - { - public: - - inline_ Axes(AxisOrder order) - { - mAxis0 = (order ) & 3; - mAxis1 = (order>>2) & 3; - mAxis2 = (order>>4) & 3; - } - inline_ ~Axes() {} - - udword mAxis0; - udword mAxis1; - udword mAxis2; - }; - -#endif // __ICEAXES_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceBoundingSphere.h b/libraries/ode-0.9/OPCODE/Ice/IceBoundingSphere.h deleted file mode 100644 index 945d38cf89..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceBoundingSphere.h +++ /dev/null @@ -1,142 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code to compute the minimal bounding sphere. - * \file IceBoundingSphere.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEBOUNDINGSPHERE_H__ -#define __ICEBOUNDINGSPHERE_H__ - - enum BSphereMethod - { - BS_NONE, - BS_GEMS, - BS_MINIBALL, - - BS_FORCE_DWORD = 0x7fffffff - }; - - class ICEMATHS_API Sphere - { - public: - //! Constructor - inline_ Sphere() {} - //! Constructor - inline_ Sphere(const Point& center, float radius) : mCenter(center), mRadius(radius) {} - //! Constructor - Sphere(udword nb_verts, const Point* verts); - //! Copy constructor - inline_ Sphere(const Sphere& sphere) : mCenter(sphere.mCenter), mRadius(sphere.mRadius) {} - //! Destructor - inline_ ~Sphere() {} - - BSphereMethod Compute(udword nb_verts, const Point* verts); - bool FastCompute(udword nb_verts, const Point* verts); - - // Access methods - inline_ const Point& GetCenter() const { return mCenter; } - inline_ float GetRadius() const { return mRadius; } - - inline_ const Point& Center() const { return mCenter; } - inline_ float Radius() const { return mRadius; } - - inline_ Sphere& Set(const Point& center, float radius) { mCenter = center; mRadius = radius; return *this; } - inline_ Sphere& SetCenter(const Point& center) { mCenter = center; return *this; } - inline_ Sphere& SetRadius(float radius) { mRadius = radius; return *this; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a point is contained within the sphere. - * \param p [in] the point to test - * \return true if inside the sphere - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Point& p) const - { - return mCenter.SquareDistance(p) <= mRadius*mRadius; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a sphere is contained within the sphere. - * \param sphere [in] the sphere to test - * \return true if inside the sphere - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Sphere& sphere) const - { - // If our radius is the smallest, we can't possibly contain the other sphere - if(mRadius < sphere.mRadius) return false; - // So r is always positive or null now - float r = mRadius - sphere.mRadius; - return mCenter.SquareDistance(sphere.mCenter) <= r*r; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a box is contained within the sphere. - * \param aabb [in] the box to test - * \return true if inside the sphere - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Contains(const AABB& aabb) const - { - // I assume if all 8 box vertices are inside the sphere, so does the whole box. - // Sounds ok but maybe there's a better way? - float R2 = mRadius * mRadius; -#ifdef USE_MIN_MAX - const Point& Max = ((ShadowAABB&)&aabb).mMax; - const Point& Min = ((ShadowAABB&)&aabb).mMin; -#else - Point Max; aabb.GetMax(Max); - Point Min; aabb.GetMin(Min); -#endif - Point p; - p.x=Max.x; p.y=Max.y; p.z=Max.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Max.x; p.y=Max.y; p.z=Min.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; - p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; - - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if the sphere intersects another sphere - * \param sphere [in] the other sphere - * \return true if spheres overlap - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Intersect(const Sphere& sphere) const - { - float r = mRadius + sphere.mRadius; - return mCenter.SquareDistance(sphere.mCenter) <= r*r; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the sphere is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for spheres: Radius >= 0.0f - if(mRadius < 0.0f) return FALSE; - return TRUE; - } - public: - Point mCenter; //!< Sphere center - float mRadius; //!< Sphere radius - }; - -#endif // __ICEBOUNDINGSPHERE_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceContainer.cpp b/libraries/ode-0.9/OPCODE/Ice/IceContainer.cpp deleted file mode 100644 index 8a4a570223..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceContainer.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a simple container class. - * \file IceContainer.cpp - * \author Pierre Terdiman - * \date February, 5, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a list of 32-bits values. - * Use this class when you need to store an unknown number of values. The list is automatically - * resized and can contains 32-bits entities (dwords or floats) - * - * \class Container - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceCore; - -// Static members -#ifdef CONTAINER_STATS -udword Container::mNbContainers = 0; -udword Container::mUsedRam = 0; -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. No entries allocated there. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container() : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. Also allocates a given number of entries. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container(udword size, float growth_factor) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(growth_factor) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); -#endif - SetSize(size); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Copy constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::Container(const Container& object) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) -{ -#ifdef CONTAINER_STATS - mNbContainers++; - mUsedRam+=sizeof(Container); -#endif - *this = object; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. Frees everything and leaves. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container::~Container() -{ - Empty(); -#ifdef CONTAINER_STATS - mNbContainers--; - mUsedRam-=GetUsedRam(); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Clears the container. All stored values are deleted, and it frees used ram. - * \see Reset() - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Container& Container::Empty() -{ -#ifdef CONTAINER_STATS - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - DELETEARRAY(mEntries); - mCurNbEntries = mMaxNbEntries = 0; - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Resizes the container. - * \param needed [in] assume the container can be added at least "needed" values - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Container::Resize(udword needed) -{ -#ifdef CONTAINER_STATS - // Subtract previous amount of bytes - mUsedRam-=mMaxNbEntries*sizeof(udword); -#endif - - // Get more entries - mMaxNbEntries = mMaxNbEntries ? udword(float(mMaxNbEntries)*mGrowthFactor) : 2; // Default nb Entries = 2 - if(mMaxNbEntriesmMaxNbEntries) Resize(nb); - - // Add new entry - CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); - mCurNbEntries+=nb; - return *this; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * A O(1) method to add a value in the container. The container is automatically resized if needed. - * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation - * costs a lot more than the call overhead... - * - * \param entry [in] a float to store in the container - * \see Add(udword entry) - * \see Empty() - * \see Contains(udword entry) - * \return Self-Reference - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ Container& Add(float entry) - { - // Resize if needed - if(mCurNbEntries==mMaxNbEntries) Resize(); - - // Add new entry - mEntries[mCurNbEntries++] = IR(entry); - return *this; - } - - inline_ Container& Add(const float* entries, udword nb) - { - // Resize if needed - if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); - - // Add new entry - CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); - mCurNbEntries+=nb; - return *this; - } - - //! Add unique [slow] - inline_ Container& AddUnique(udword entry) - { - if(!Contains(entry)) Add(entry); - return *this; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Clears the container. All stored values are deleted, and it frees used ram. - * \see Reset() - * \return Self-Reference - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - Container& Empty(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. - * That's a kind of temporal coherence. - * \see Empty() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Reset() - { - // Avoid the write if possible - // ### CMOV - if(mCurNbEntries) mCurNbEntries = 0; - } - - // HANDLE WITH CARE - inline_ void ForceSize(udword size) - { - mCurNbEntries = size; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Sets the initial size of the container. If it already contains something, it's discarded. - * \param nb [in] Number of entries - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetSize(udword nb); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the container and get rid of unused bytes. - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Refit(); - - // Checks whether the container already contains a given value. - bool Contains(udword entry, udword* location=null) const; - // Deletes an entry - doesn't preserve insertion order. - bool Delete(udword entry); - // Deletes an entry - does preserve insertion order. - bool DeleteKeepingOrder(udword entry); - //! Deletes the very last entry. - inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } - //! Deletes the entry whose index is given - inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } - - // Helpers - Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); - Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); - // Data access. - inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. - inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry - inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. - - inline_ udword GetFirst() const { return mEntries[0]; } - inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } - - // Growth control - inline_ float GetGrowthFactor() const { return mGrowthFactor; } //!< Returns the growth factor - inline_ void SetGrowthFactor(float growth) { mGrowthFactor = growth; } //!< Sets the growth factor - inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full - inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty - - //! Read-access as an array - inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && i>31); - return (float&)y; - } - - //! Computes 1.0f / sqrtf(x). - inline_ float frsqrt(float f) - { - float x = f * 0.5f; - udword y = 0x5f3759df - ((udword&)f >> 1); - // Iteration... - (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); - // Result - return (float&)y; - } - - //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. - inline_ float InvSqrt(const float& x) - { - udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; - float y = *(float*)&tmp; - return y * (1.47f - 0.47f * x * y * y); - } - - //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. - //! See http://www.magic-software.com/3DGEDInvSqrt.html - inline_ float RSqrt(float number) - { - long i; - float x2, y; - const float threehalfs = 1.5f; - - x2 = number * 0.5f; - y = number; - i = * (long *) &y; - i = 0x5f3759df - (i >> 1); - y = * (float *) &i; - y = y * (threehalfs - (x2 * y * y)); - - return y; - } - - //! TO BE DOCUMENTED - inline_ float fsqrt(float f) - { - udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; - // Iteration...? - // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; - // Result - return (float&)y; - } - - //! Returns the float ranged espilon value. - inline_ float fepsilon(float f) - { - udword b = (udword&)f & 0xff800000; - udword a = b | 0x00000001; - (float&)a -= (float&)b; - // Result - return (float&)a; - } - - //! Is the float valid ? - inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } - inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } - inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } - inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } - - inline_ bool IsValidFloat(float value) - { - if(IsNAN(value)) return false; - if(IsIndeterminate(value)) return false; - if(IsPlusInf(value)) return false; - if(IsMinusInf(value)) return false; - return true; - } - - #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); - -/* - //! FPU precision setting function. - inline_ void SetFPU() - { - // This function evaluates whether the floating-point - // control word is set to single precision/round to nearest/ - // exceptions disabled. If these conditions don't hold, the - // function changes the control word to set them and returns - // TRUE, putting the old control word value in the passback - // location pointed to by pwOldCW. - { - uword wTemp, wSave; - - __asm fstcw wSave - if (wSave & 0x300 || // Not single mode - 0x3f != (wSave & 0x3f) || // Exceptions enabled - wSave & 0xC00) // Not round to nearest mode - { - __asm - { - mov ax, wSave - and ax, not 300h ;; single mode - or ax, 3fh ;; disable all exceptions - and ax, not 0xC00 ;; round to nearest mode - mov wTemp, ax - fldcw wTemp - } - } - } - } -*/ - //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) - inline_ float ComputeFloatEpsilon() - { - float f = 1.0f; - ((udword&)f)^=1; - return f - 1.0f; // You can check it's the same as FLT_EPSILON - } - - inline_ bool IsFloatZero(float x, float epsilon=1e-6f) - { - return x*x < epsilon; - } - - #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 - #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 - #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 - #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 - - #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 - #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 - #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 - #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 - - #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 - #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 - #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 - #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 - - #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 - #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 - #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 - #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 - - #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 - #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 - #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 - #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 - - #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 - #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 - #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 - #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 - - #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 - #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 - #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 - #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 - - #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 - #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 - #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 - #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 - - //! A global function to find MAX(a,b) using FCOMI/FCMOV - inline_ float FCMax2(float a, float b) - { -#ifdef _MSC_VER - float Res; - _asm fld [a] - _asm fld [b] - FCOMI_ST1 - FCMOVB_ST1 - _asm fstp [Res] - _asm fcomp - return Res; -#else - return (a > b) ? a : b; -#endif - } - - //! A global function to find MIN(a,b) using FCOMI/FCMOV - inline_ float FCMin2(float a, float b) - { -#ifdef _MSC_VER - float Res; - _asm fld [a] - _asm fld [b] - FCOMI_ST1 - FCMOVNB_ST1 - _asm fstp [Res] - _asm fcomp - return Res; -#else - return (a < b) ? a : b; -#endif - } - - //! A global function to find MAX(a,b,c) using FCOMI/FCMOV - inline_ float FCMax3(float a, float b, float c) - { -#ifdef _MSC_VER - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - FCOMI_ST1 - FCMOVB_ST1 - FCOMI_ST2 - FCMOVB_ST2 - _asm fstp [Res] - _asm fcompp - return Res; -#else - return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c); -#endif - } - - //! A global function to find MIN(a,b,c) using FCOMI/FCMOV - inline_ float FCMin3(float a, float b, float c) - { -#ifdef _MSC_VER - float Res; - _asm fld [a] - _asm fld [b] - _asm fld [c] - FCOMI_ST1 - FCMOVNB_ST1 - FCOMI_ST2 - FCMOVNB_ST2 - _asm fstp [Res] - _asm fcompp - return Res; -#else - return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c); -#endif - } - - inline_ int ConvertToSortable(float f) - { - int& Fi = (int&)f; - int Fmask = (Fi>>31); - Fi ^= Fmask; - Fmask &= ~(1<<31); - Fi -= Fmask; - return Fi; - } - - enum FPUMode - { - FPU_FLOOR = 0, - FPU_CEIL = 1, - FPU_BEST = 2, - - FPU_FORCE_DWORD = 0x7fffffff - }; - - FUNCTION ICECORE_API FPUMode GetFPUMode(); - FUNCTION ICECORE_API void SaveFPU(); - FUNCTION ICECORE_API void RestoreFPU(); - FUNCTION ICECORE_API void SetFPUFloorMode(); - FUNCTION ICECORE_API void SetFPUCeilMode(); - FUNCTION ICECORE_API void SetFPUBestMode(); - - FUNCTION ICECORE_API void SetFPUPrecision24(); - FUNCTION ICECORE_API void SetFPUPrecision53(); - FUNCTION ICECORE_API void SetFPUPrecision64(); - FUNCTION ICECORE_API void SetFPURoundingChop(); - FUNCTION ICECORE_API void SetFPURoundingUp(); - FUNCTION ICECORE_API void SetFPURoundingDown(); - FUNCTION ICECORE_API void SetFPURoundingNear(); - - FUNCTION ICECORE_API int intChop(const float& f); - FUNCTION ICECORE_API int intFloor(const float& f); - FUNCTION ICECORE_API int intCeil(const float& f); - -#endif // __ICEFPU_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceHPoint.cpp b/libraries/ode-0.9/OPCODE/Ice/IceHPoint.cpp deleted file mode 100644 index f806a0c9d6..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceHPoint.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for homogeneous points. - * \file IceHPoint.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Homogeneous point. - * - * Use it: - * - for clipping in homogeneous space (standard way) - * - to differentiate between points (w=1) and vectors (w=0). - * - in some cases you can also use it instead of Point for padding reasons. - * - * \class HPoint - * \author Pierre Terdiman - * \version 1.0 - * \warning No cross-product in 4D. - * \warning HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Point Mul = HPoint * Matrix3x3; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Point HPoint::operator*(const Matrix3x3& mat) const -{ - return Point( - x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0], - x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1], - x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] ); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// HPoint Mul = HPoint * Matrix4x4; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HPoint HPoint::operator*(const Matrix4x4& mat) const -{ - return HPoint( - x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0], - x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1], - x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2], - x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// HPoint *= Matrix4x4 -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HPoint& HPoint::operator*=(const Matrix4x4& mat) -{ - float xp = x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0]; - float yp = x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1]; - float zp = x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2]; - float wp = x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]; - - x = xp; y = yp; z = zp; w = wp; - - return *this; -} - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceHPoint.h b/libraries/ode-0.9/OPCODE/Ice/IceHPoint.h deleted file mode 100644 index a3770cd522..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceHPoint.h +++ /dev/null @@ -1,160 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for homogeneous points. - * \file IceHPoint.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEHPOINT_H__ -#define __ICEHPOINT_H__ - - class ICEMATHS_API HPoint : public Point - { - public: - - //! Empty constructor - inline_ HPoint() {} - //! Constructor from floats - inline_ HPoint(float xx, float yy, float zz, float ww=0.0f) : Point(xx, yy, zz), w(ww) {} - //! Constructor from array - inline_ HPoint(const float f[4]) : Point(f), w(f[3]) {} - //! Constructor from a Point - inline_ HPoint(const Point& p, float ww=0.0f) : Point(p), w(ww) {} - //! Destructor - inline_ ~HPoint() {} - - //! Clear the point - inline_ HPoint& Zero() { x = y = z = w = 0.0f; return *this; } - - //! Assignment from values - inline_ HPoint& Set(float xx, float yy, float zz, float ww ) { x = xx; y = yy; z = zz; w = ww; return *this; } - //! Assignment from array - inline_ HPoint& Set(const float f[4]) { x = f[X]; y = f[Y]; z = f[Z]; w = f[W]; return *this; } - //! Assignment from another h-point - inline_ HPoint& Set(const HPoint& src) { x = src.x; y = src.y; z = src.z; w = src.w; return *this; } - - //! Add a vector - inline_ HPoint& Add(float xx, float yy, float zz, float ww ) { x += xx; y += yy; z += zz; w += ww; return *this; } - //! Add a vector - inline_ HPoint& Add(const float f[4]) { x += f[X]; y += f[Y]; z += f[Z]; w += f[W]; return *this; } - - //! Subtract a vector - inline_ HPoint& Sub(float xx, float yy, float zz, float ww ) { x -= xx; y -= yy; z -= zz; w -= ww; return *this; } - //! Subtract a vector - inline_ HPoint& Sub(const float f[4]) { x -= f[X]; y -= f[Y]; z -= f[Z]; w -= f[W]; return *this; } - - //! Multiplies by a scalar - inline_ HPoint& Mul(float s) { x *= s; y *= s; z *= s; w *= s; return *this; } - - //! Returns MIN(x, y, z, w); - float Min() const { return MIN(x, MIN(y, MIN(z, w))); } - //! Returns MAX(x, y, z, w); - float Max() const { return MAX(x, MAX(y, MAX(z, w))); } - //! Sets each element to be componentwise minimum - HPoint& Min(const HPoint& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); w = MIN(w, p.w); return *this; } - //! Sets each element to be componentwise maximum - HPoint& Max(const HPoint& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); w = MAX(w, p.w); return *this; } - - //! Computes square magnitude - inline_ float SquareMagnitude() const { return x*x + y*y + z*z + w*w; } - //! Computes magnitude - inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z + w*w); } - - //! Normalize the vector - inline_ HPoint& Normalize() - { - float M = Magnitude(); - if(M) - { - M = 1.0f / M; - x *= M; - y *= M; - z *= M; - w *= M; - } - return *this; - } - - // Arithmetic operators - //! Operator for HPoint Negate = - HPoint; - inline_ HPoint operator-() const { return HPoint(-x, -y, -z, -w); } - - //! Operator for HPoint Plus = HPoint + HPoint; - inline_ HPoint operator+(const HPoint& p) const { return HPoint(x + p.x, y + p.y, z + p.z, w + p.w); } - //! Operator for HPoint Minus = HPoint - HPoint; - inline_ HPoint operator-(const HPoint& p) const { return HPoint(x - p.x, y - p.y, z - p.z, w - p.w); } - - //! Operator for HPoint Mul = HPoint * HPoint; - inline_ HPoint operator*(const HPoint& p) const { return HPoint(x * p.x, y * p.y, z * p.z, w * p.w); } - //! Operator for HPoint Scale = HPoint * float; - inline_ HPoint operator*(float s) const { return HPoint(x * s, y * s, z * s, w * s); } - //! Operator for HPoint Scale = float * HPoint; - inline_ friend HPoint operator*(float s, const HPoint& p) { return HPoint(s * p.x, s * p.y, s * p.z, s * p.w); } - - //! Operator for HPoint Div = HPoint / HPoint; - inline_ HPoint operator/(const HPoint& p) const { return HPoint(x / p.x, y / p.y, z / p.z, w / p.w); } - //! Operator for HPoint Scale = HPoint / float; - inline_ HPoint operator/(float s) const { s = 1.0f / s; return HPoint(x * s, y * s, z * s, w * s); } - //! Operator for HPoint Scale = float / HPoint; - inline_ friend HPoint operator/(float s, const HPoint& p) { return HPoint(s / p.x, s / p.y, s / p.z, s / p.w); } - - //! Operator for float DotProd = HPoint | HPoint; - inline_ float operator|(const HPoint& p) const { return x*p.x + y*p.y + z*p.z + w*p.w; } - // No cross-product in 4D - - //! Operator for HPoint += HPoint; - inline_ HPoint& operator+=(const HPoint& p) { x += p.x; y += p.y; z += p.z; w += p.w; return *this; } - //! Operator for HPoint += float; - inline_ HPoint& operator+=(float s) { x += s; y += s; z += s; w += s; return *this; } - - //! Operator for HPoint -= HPoint; - inline_ HPoint& operator-=(const HPoint& p) { x -= p.x; y -= p.y; z -= p.z; w -= p.w; return *this; } - //! Operator for HPoint -= float; - inline_ HPoint& operator-=(float s) { x -= s; y -= s; z -= s; w -= s; return *this; } - - //! Operator for HPoint *= HPoint; - inline_ HPoint& operator*=(const HPoint& p) { x *= p.x; y *= p.y; z *= p.z; w *= p.w; return *this; } - //! Operator for HPoint *= float; - inline_ HPoint& operator*=(float s) { x*=s; y*=s; z*=s; w*=s; return *this; } - - //! Operator for HPoint /= HPoint; - inline_ HPoint& operator/=(const HPoint& p) { x /= p.x; y /= p.y; z /= p.z; w /= p.w; return *this; } - //! Operator for HPoint /= float; - inline_ HPoint& operator/=(float s) { s = 1.0f / s; x*=s; y*=s; z*=s; w*=s; return *this; } - - // Arithmetic operators - - //! Operator for Point Mul = HPoint * Matrix3x3; - Point operator*(const Matrix3x3& mat) const; - //! Operator for HPoint Mul = HPoint * Matrix4x4; - HPoint operator*(const Matrix4x4& mat) const; - - // HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 - //! Operator for HPoint *= Matrix4x4 - HPoint& operator*=(const Matrix4x4& mat); - - // Logical operators - - //! Operator for "if(HPoint==HPoint)" - inline_ bool operator==(const HPoint& p) const { return ( (x==p.x)&&(y==p.y)&&(z==p.z)&&(w==p.w)); } - //! Operator for "if(HPoint!=HPoint)" - inline_ bool operator!=(const HPoint& p) const { return ( (x!=p.x)||(y!=p.y)||(z!=p.z)||(w!=p.w)); } - - // Cast operators - - //! Cast a HPoint to a Point. w is discarded. -#ifdef _MSC_VER - inline_ operator Point() const { return Point(x, y, z); } - // gcc complains that conversion to a base class will never use a type conversion operator -#endif - - public: - float w; - }; - -#endif // __ICEHPOINT_H__ - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceIndexedTriangle.cpp b/libraries/ode-0.9/OPCODE/Ice/IceIndexedTriangle.cpp deleted file mode 100644 index db279c4587..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceIndexedTriangle.cpp +++ /dev/null @@ -1,548 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy indexed triangle class. - * \file IceIndexedTriangle.cpp - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an indexed triangle class. - * - * \class Triangle - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Flips the winding order. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::Flip() -{ - Swap(mVRef[1], mVRef[2]); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle area. - * \param verts [in] the list of indexed vertices - * \return the area - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Area(const Point* verts) const -{ - if(!verts) return 0.0f; - const Point& p0 = verts[0]; - const Point& p1 = verts[1]; - const Point& p2 = verts[2]; - return ((p0-p1)^(p0-p2)).Magnitude() * 0.5f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle perimeter. - * \param verts [in] the list of indexed vertices - * \return the perimeter - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Perimeter(const Point* verts) const -{ - if(!verts) return 0.0f; - const Point& p0 = verts[0]; - const Point& p1 = verts[1]; - const Point& p2 = verts[2]; - return p0.Distance(p1) - + p0.Distance(p2) - + p1.Distance(p2); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle compacity. - * \param verts [in] the list of indexed vertices - * \return the compacity - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Compacity(const Point* verts) const -{ - if(!verts) return 0.0f; - float P = Perimeter(verts); - if(P==0.0f) return 0.0f; - return (4.0f*PI*Area(verts)/(P*P)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle normal. - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::Normal(const Point* verts, Point& normal) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - normal = ((p2-p1)^(p0-p1)).Normalize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle denormalized normal. - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::DenormalizedNormal(const Point* verts, Point& normal) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - normal = ((p2-p1)^(p0-p1)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle center. - * \param verts [in] the list of indexed vertices - * \param center [out] the computed center - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::Center(const Point* verts, Point& center) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - center = (p0+p1+p2)*INV3; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the centered normal - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed centered normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::CenteredNormal(const Point* verts, Point& normal) const -{ - if(!verts) return; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - Point Center = (p0+p1+p2)*INV3; - normal = Center + ((p2-p1)^(p0-p1)).Normalize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a random point within the triangle. - * \param verts [in] the list of indexed vertices - * \param normal [out] the computed centered normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::RandomPoint(const Point* verts, Point& random) const -{ - if(!verts) return; - - // Random barycentric coords - float Alpha = UnitRandomFloat(); - float Beta = UnitRandomFloat(); - float Gamma = UnitRandomFloat(); - float OneOverTotal = 1.0f / (Alpha + Beta + Gamma); - Alpha *= OneOverTotal; - Beta *= OneOverTotal; - Gamma *= OneOverTotal; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - random = Alpha*p0 + Beta*p1 + Gamma*p2; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes backface culling. - * \param verts [in] the list of indexed vertices - * \param source [in] source point (in local space) from which culling must be computed - * \return true if the triangle is visible from the source point - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::IsVisible(const Point* verts, const Point& source) const -{ - // Checkings - if(!verts) return false; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - - // Compute denormalized normal - Point Normal = (p2 - p1)^(p0 - p1); - - // Backface culling - return (Normal | source) >= 0.0f; - -// Same as: -// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); -// return PL.Distance(source) > PL.d; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes backface culling. - * \param verts [in] the list of indexed vertices - * \param source [in] source point (in local space) from which culling must be computed - * \return true if the triangle is visible from the source point - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::BackfaceCulling(const Point* verts, const Point& source) const -{ - // Checkings - if(!verts) return false; - - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - - // Compute base -// Point Base = (p0 + p1 + p2)*INV3; - - // Compute denormalized normal - Point Normal = (p2 - p1)^(p0 - p1); - - // Backface culling -// return (Normal | (source - Base)) >= 0.0f; - return (Normal | (source - p0)) >= 0.0f; - -// Same as: (but a bit faster) -// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); -// return PL.Distance(source)>0.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the occlusion potential of the triangle. - * \param verts [in] the list of indexed vertices - * \param source [in] source point (in local space) from which occlusion potential must be computed - * \return the occlusion potential - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::ComputeOcclusionPotential(const Point* verts, const Point& view) const -{ - if(!verts) return 0.0f; - // Occlusion potential: -(A * (N|V) / d^2) - // A = polygon area - // N = polygon normal - // V = view vector - // d = distance viewpoint-center of polygon - - float A = Area(verts); - Point N; Normal(verts, N); - Point C; Center(verts, C); - float d = view.Distance(C); - return -(A*(N|view))/(d*d); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Replaces a vertex reference with another one. - * \param oldref [in] the vertex reference to replace - * \param newref [in] the new vertex reference - * \return true if success, else false if the input vertex reference doesn't belong to the triangle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::ReplaceVertex(udword oldref, udword newref) -{ - if(mVRef[0]==oldref) { mVRef[0] = newref; return true; } - else if(mVRef[1]==oldref) { mVRef[1] = newref; return true; } - else if(mVRef[2]==oldref) { mVRef[2] = newref; return true; } - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the triangle is degenerate or not. A degenerate triangle has two common vertex references. This is a zero-area triangle. - * \return true if the triangle is degenerate - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::IsDegenerate() const -{ - if(mVRef[0]==mVRef[1]) return true; - if(mVRef[1]==mVRef[2]) return true; - if(mVRef[2]==mVRef[0]) return true; - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the input vertex reference belongs to the triangle or not. - * \param ref [in] the vertex reference to look for - * \return true if the triangle contains the vertex reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::HasVertex(udword ref) const -{ - if(mVRef[0]==ref) return true; - if(mVRef[1]==ref) return true; - if(mVRef[2]==ref) return true; - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks whether the input vertex reference belongs to the triangle or not. - * \param ref [in] the vertex reference to look for - * \param index [out] the corresponding index in the triangle - * \return true if the triangle contains the vertex reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::HasVertex(udword ref, udword* index) const -{ - if(mVRef[0]==ref) { *index = 0; return true; } - if(mVRef[1]==ref) { *index = 1; return true; } - if(mVRef[2]==ref) { *index = 2; return true; } - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Finds an edge in a tri, given two vertex references. - * \param vref0 [in] the edge's first vertex reference - * \param vref1 [in] the edge's second vertex reference - * \return the edge number between 0 and 2, or 0xff if input refs are wrong. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -ubyte IndexedTriangle::FindEdge(udword vref0, udword vref1) const -{ - if(mVRef[0]==vref0 && mVRef[1]==vref1) return 0; - else if(mVRef[0]==vref1 && mVRef[1]==vref0) return 0; - else if(mVRef[0]==vref0 && mVRef[2]==vref1) return 1; - else if(mVRef[0]==vref1 && mVRef[2]==vref0) return 1; - else if(mVRef[1]==vref0 && mVRef[2]==vref1) return 2; - else if(mVRef[1]==vref1 && mVRef[2]==vref0) return 2; - return 0xff; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the last reference given the first two. - * \param vref0 [in] the first vertex reference - * \param vref1 [in] the second vertex reference - * \return the last reference, or INVALID_ID if input refs are wrong. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword IndexedTriangle::OppositeVertex(udword vref0, udword vref1) const -{ - if(mVRef[0]==vref0 && mVRef[1]==vref1) return mVRef[2]; - else if(mVRef[0]==vref1 && mVRef[1]==vref0) return mVRef[2]; - else if(mVRef[0]==vref0 && mVRef[2]==vref1) return mVRef[1]; - else if(mVRef[0]==vref1 && mVRef[2]==vref0) return mVRef[1]; - else if(mVRef[1]==vref0 && mVRef[2]==vref1) return mVRef[0]; - else if(mVRef[1]==vref1 && mVRef[2]==vref0) return mVRef[0]; - return INVALID_ID; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the three sorted vertex references according to an edge number. - * edgenb = 0 => edge 0-1, returns references 0, 1, 2 - * edgenb = 1 => edge 0-2, returns references 0, 2, 1 - * edgenb = 2 => edge 1-2, returns references 1, 2, 0 - * - * \param edgenb [in] the edge number, 0, 1 or 2 - * \param vref0 [out] the returned first vertex reference - * \param vref1 [out] the returned second vertex reference - * \param vref2 [out] the returned third vertex reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const -{ - if(edgenb==0) - { - vref0 = mVRef[0]; - vref1 = mVRef[1]; - vref2 = mVRef[2]; - } - else if(edgenb==1) - { - vref0 = mVRef[0]; - vref1 = mVRef[2]; - vref2 = mVRef[1]; - } - else if(edgenb==2) - { - vref0 = mVRef[1]; - vref1 = mVRef[2]; - vref2 = mVRef[0]; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's smallest edge length. - * \param verts [in] the list of indexed vertices - * \return the smallest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::MinEdgeLength(const Point* verts) const -{ - if(!verts) return 0.0f; - - float Min = MAX_FLOAT; - float Length01 = verts[0].Distance(verts[1]); - float Length02 = verts[0].Distance(verts[2]); - float Length12 = verts[1].Distance(verts[2]); - if(Length01 < Min) Min = Length01; - if(Length02 < Min) Min = Length02; - if(Length12 < Min) Min = Length12; - return Min; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's largest edge length. - * \param verts [in] the list of indexed vertices - * \return the largest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::MaxEdgeLength(const Point* verts) const -{ - if(!verts) return 0.0f; - - float Max = MIN_FLOAT; - float Length01 = verts[0].Distance(verts[1]); - float Length02 = verts[0].Distance(verts[2]); - float Length12 = verts[1].Distance(verts[2]); - if(Length01 > Max) Max = Length01; - if(Length02 > Max) Max = Length02; - if(Length12 > Max) Max = Length12; - return Max; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a point on the triangle according to the stabbing information. - * \param verts [in] the list of indexed vertices - * \param u,v [in] point's barycentric coordinates - * \param pt [out] point on triangle - * \param nearvtx [out] index of nearest vertex - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void IndexedTriangle::ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx) const -{ - // Checkings - if(!verts) return; - - // Get face in local or global space - const Point& p0 = verts[mVRef[0]]; - const Point& p1 = verts[mVRef[1]]; - const Point& p2 = verts[mVRef[2]]; - - // Compute point coordinates - pt = (1.0f - u - v)*p0 + u*p1 + v*p2; - - // Compute nearest vertex if needed - if(nearvtx) - { - // Compute distance vector - Point d(p0.SquareDistance(pt), // Distance^2 from vertex 0 to point on the face - p1.SquareDistance(pt), // Distance^2 from vertex 1 to point on the face - p2.SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face - - // Get smallest distance - *nearvtx = mVRef[d.SmallestAxis()]; - } -} - - //************************************** - // Angle between two vectors (in radians) - // we use this formula - // uv = |u||v| cos(u,v) - // u ^ v = w - // |w| = |u||v| |sin(u,v)| - //************************************** - float Angle(const Point& u, const Point& v) - { - float NormU = u.Magnitude(); // |u| - float NormV = v.Magnitude(); // |v| - float Product = NormU*NormV; // |u||v| - if(Product==0.0f) return 0.0f; - float OneOverProduct = 1.0f / Product; - - // Cosinus - float Cosinus = (u|v) * OneOverProduct; - - // Sinus - Point w = u^v; - float NormW = w.Magnitude(); - - float AbsSinus = NormW * OneOverProduct; - - // Remove degeneracy - if(AbsSinus > 1.0f) AbsSinus = 1.0f; - if(AbsSinus < -1.0f) AbsSinus = -1.0f; - - if(Cosinus>=0.0f) return asinf(AbsSinus); - else return (PI-asinf(AbsSinus)); - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the angle between two triangles. - * \param tri [in] the other triangle - * \param verts [in] the list of indexed vertices - * \return the angle in radians - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float IndexedTriangle::Angle(const IndexedTriangle& tri, const Point* verts) const -{ - // Checkings - if(!verts) return 0.0f; - - // Compute face normals - Point n0, n1; - Normal(verts, n0); - tri.Normal(verts, n1); - - // Compute angle - float dp = n0|n1; - if(dp>1.0f) return 0.0f; - if(dp<-1.0f) return PI; - return acosf(dp); - -// return ::Angle(n0,n1); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks a triangle is the same as another one. - * \param tri [in] the other triangle - * \return true if same triangle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool IndexedTriangle::Equal(const IndexedTriangle& tri) const -{ - // Test all vertex references - return (HasVertex(tri.mVRef[0]) && - HasVertex(tri.mVRef[1]) && - HasVertex(tri.mVRef[2])); -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IceIndexedTriangle.h b/libraries/ode-0.9/OPCODE/Ice/IceIndexedTriangle.h deleted file mode 100644 index b34c485d68..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceIndexedTriangle.h +++ /dev/null @@ -1,72 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy indexed triangle class. - * \file IceIndexedTriangle.h - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEINDEXEDTRIANGLE_H__ -#define __ICEINDEXEDTRIANGLE_H__ - - // Forward declarations -#ifdef _MSC_VER - enum CubeIndex; -#else - typedef int CubeIndex; -#endif - - // An indexed triangle class. - class ICEMATHS_API IndexedTriangle - { - public: - //! Constructor - inline_ IndexedTriangle() {} - //! Constructor - inline_ IndexedTriangle(udword r0, udword r1, udword r2) { mVRef[0]=r0; mVRef[1]=r1; mVRef[2]=r2; } - //! Copy constructor - inline_ IndexedTriangle(const IndexedTriangle& triangle) - { - mVRef[0] = triangle.mVRef[0]; - mVRef[1] = triangle.mVRef[1]; - mVRef[2] = triangle.mVRef[2]; - } - //! Destructor - inline_ ~IndexedTriangle() {} - //! Vertex-references - udword mVRef[3]; - - // Methods - void Flip(); - float Area(const Point* verts) const; - float Perimeter(const Point* verts) const; - float Compacity(const Point* verts) const; - void Normal(const Point* verts, Point& normal) const; - void DenormalizedNormal(const Point* verts, Point& normal) const; - void Center(const Point* verts, Point& center) const; - void CenteredNormal(const Point* verts, Point& normal) const; - void RandomPoint(const Point* verts, Point& random) const; - bool IsVisible(const Point* verts, const Point& source) const; - bool BackfaceCulling(const Point* verts, const Point& source) const; - float ComputeOcclusionPotential(const Point* verts, const Point& view) const; - bool ReplaceVertex(udword oldref, udword newref); - bool IsDegenerate() const; - bool HasVertex(udword ref) const; - bool HasVertex(udword ref, udword* index) const; - ubyte FindEdge(udword vref0, udword vref1) const; - udword OppositeVertex(udword vref0, udword vref1) const; - inline_ udword OppositeVertex(ubyte edgenb) const { return mVRef[2-edgenb]; } - void GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const; - float MinEdgeLength(const Point* verts) const; - float MaxEdgeLength(const Point* verts) const; - void ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx=null) const; - float Angle(const IndexedTriangle& tri, const Point* verts) const; - inline_ Plane PlaneEquation(const Point* verts) const { return Plane(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); } - bool Equal(const IndexedTriangle& tri) const; - CubeIndex ComputeCubeIndex(const Point* verts) const; - }; - -#endif // __ICEINDEXEDTRIANGLE_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceLSS.h b/libraries/ode-0.9/OPCODE/Ice/IceLSS.h deleted file mode 100644 index bd260c1e59..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceLSS.h +++ /dev/null @@ -1,75 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for line-swept spheres. - * \file IceLSS.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICELSS_H__ -#define __ICELSS_H__ - - class ICEMATHS_API LSS : public Segment - { - public: - //! Constructor - inline_ LSS() {} - //! Constructor - inline_ LSS(const Segment& seg, float radius) : Segment(seg), mRadius(radius) {} - //! Destructor - inline_ ~LSS() {} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes an OBB surrounding the LSS. - * \param box [out] the OBB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void ComputeOBB(OBB& box); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a point is contained within the LSS. - * \param pt [in] the point to test - * \return true if inside the LSS - * \warning point and LSS must be in same space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Point& pt) const { return SquareDistance(pt) <= mRadius*mRadius; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a sphere is contained within the LSS. - * \param sphere [in] the sphere to test - * \return true if inside the LSS - * \warning sphere and LSS must be in same space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const Sphere& sphere) - { - float d = mRadius - sphere.mRadius; - if(d>=0.0f) return SquareDistance(sphere.mCenter) <= d*d; - else return false; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if an LSS is contained within the LSS. - * \param lss [in] the LSS to test - * \return true if inside the LSS - * \warning both LSS must be in same space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ bool Contains(const LSS& lss) - { - // We check the LSS contains the two spheres at the start and end of the sweep - return Contains(Sphere(lss.mP0, lss.mRadius)) && Contains(Sphere(lss.mP0, lss.mRadius)); - } - - float mRadius; //!< Sphere radius - }; - -#endif // __ICELSS_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceMatrix3x3.cpp b/libraries/ode-0.9/OPCODE/Ice/IceMatrix3x3.cpp deleted file mode 100644 index af56d3e5c8..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceMatrix3x3.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3x3 matrices. - * \file IceMatrix3x3.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * 3x3 matrix. - * DirectX-compliant, ie row-column order, ie m[Row][Col]. - * Same as: - * m11 m12 m13 first row. - * m21 m22 m23 second row. - * m31 m32 m33 third row. - * Stored in memory as m11 m12 m13 m21... - * - * Multiplication rules: - * - * [x'y'z'] = [xyz][M] - * - * x' = x*m11 + y*m21 + z*m31 - * y' = x*m12 + y*m22 + z*m32 - * z' = x*m13 + y*m23 + z*m33 - * - * \class Matrix3x3 - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -// Cast operator -Matrix3x3::operator Matrix4x4() const -{ - return Matrix4x4( - m[0][0], m[0][1], m[0][2], 0.0f, - m[1][0], m[1][1], m[1][2], 0.0f, - m[2][0], m[2][1], m[2][2], 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f); -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IceMatrix3x3.h b/libraries/ode-0.9/OPCODE/Ice/IceMatrix3x3.h deleted file mode 100644 index a30680da6c..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceMatrix3x3.h +++ /dev/null @@ -1,496 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3x3 matrices. - * \file IceMatrix3x3.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEMATRIX3X3_H__ -#define __ICEMATRIX3X3_H__ - - // Forward declarations - class Quat; - - #define MATRIX3X3_EPSILON (1.0e-7f) - - class ICEMATHS_API Matrix3x3 - { - public: - //! Empty constructor - inline_ Matrix3x3() {} - //! Constructor from 9 values - inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; - } - //! Copy constructor - inline_ Matrix3x3(const Matrix3x3& mat) { CopyMemory(m, &mat.m, 9*sizeof(float)); } - //! Destructor - inline_ ~Matrix3x3() {} - - //! Assign values - inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; - } - - //! Sets the scale from a Point. The point is put on the diagonal. - inline_ void SetScale(const Point& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; } - - //! Sets the scale from floats. Values are put on the diagonal. - inline_ void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; } - - //! Scales from a Point. Each row is multiplied by a component. - inline_ void Scale(const Point& p) - { - m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x; - m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y; - m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z; - } - - //! Scales from floats. Each row is multiplied by a value. - inline_ void Scale(float sx, float sy, float sz) - { - m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx; - m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy; - m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz; - } - - //! Copy from a Matrix3x3 - inline_ void Copy(const Matrix3x3& source) { CopyMemory(m, source.m, 9*sizeof(float)); } - - // Row-column access - //! Returns a row. - inline_ void GetRow(const udword r, Point& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; } - //! Returns a row. - inline_ const Point& GetRow(const udword r) const { return *(const Point*)&m[r][0]; } - //! Returns a row. - inline_ Point& GetRow(const udword r) { return *(Point*)&m[r][0]; } - //! Sets a row. - inline_ void SetRow(const udword r, const Point& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; } - //! Returns a column. - inline_ void GetCol(const udword c, Point& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; } - //! Sets a column. - inline_ void SetCol(const udword c, const Point& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; } - - //! Computes the trace. The trace is the sum of the 3 diagonal components. - inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2]; } - //! Clears the matrix. - inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } - //! Sets the identity matrix. - inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; } - //! Checks for identity - inline_ bool IsIdentity() const - { - if(IR(m[0][0])!=IEEE_1_0) return false; - if(IR(m[0][1])!=0) return false; - if(IR(m[0][2])!=0) return false; - - if(IR(m[1][0])!=0) return false; - if(IR(m[1][1])!=IEEE_1_0) return false; - if(IR(m[1][2])!=0) return false; - - if(IR(m[2][0])!=0) return false; - if(IR(m[2][1])!=0) return false; - if(IR(m[2][2])!=IEEE_1_0) return false; - - return true; - } - - //! Checks matrix validity - inline_ BOOL IsValid() const - { - for(udword j=0;j<3;j++) - { - for(udword i=0;i<3;i++) - { - if(!IsValidFloat(m[j][i])) return FALSE; - } - } - return TRUE; - } - - //! Makes a skew-symmetric matrix (a.k.a. Star(*) Matrix) - //! [ 0.0 -a.z a.y ] - //! [ a.z 0.0 -a.x ] - //! [ -a.y a.x 0.0 ] - //! This is also called a "cross matrix" since for any vectors A and B, - //! A^B = Skew(A) * B = - B * Skew(A); - inline_ void SkewSymmetric(const Point& a) - { - m[0][0] = 0.0f; - m[0][1] = -a.z; - m[0][2] = a.y; - - m[1][0] = a.z; - m[1][1] = 0.0f; - m[1][2] = -a.x; - - m[2][0] = -a.y; - m[2][1] = a.x; - m[2][2] = 0.0f; - } - - //! Negates the matrix - inline_ void Neg() - { - m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2]; - m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2]; - m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2]; - } - - //! Neg from another matrix - inline_ void Neg(const Matrix3x3& mat) - { - m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2]; - m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2]; - m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2]; - } - - //! Add another matrix - inline_ void Add(const Matrix3x3& mat) - { - m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; - m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; - m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; - } - - //! Sub another matrix - inline_ void Sub(const Matrix3x3& mat) - { - m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; - m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; - m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; - } - //! Mac - inline_ void Mac(const Matrix3x3& a, const Matrix3x3& b, float s) - { - m[0][0] = a.m[0][0] + b.m[0][0] * s; - m[0][1] = a.m[0][1] + b.m[0][1] * s; - m[0][2] = a.m[0][2] + b.m[0][2] * s; - - m[1][0] = a.m[1][0] + b.m[1][0] * s; - m[1][1] = a.m[1][1] + b.m[1][1] * s; - m[1][2] = a.m[1][2] + b.m[1][2] * s; - - m[2][0] = a.m[2][0] + b.m[2][0] * s; - m[2][1] = a.m[2][1] + b.m[2][1] * s; - m[2][2] = a.m[2][2] + b.m[2][2] * s; - } - //! Mac - inline_ void Mac(const Matrix3x3& a, float s) - { - m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s; - m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s; - m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s; - } - - //! this = A * s - inline_ void Mult(const Matrix3x3& a, float s) - { - m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s; - m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s; - m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s; - } - - inline_ void Add(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] + b.m[0][0]; m[0][1] = a.m[0][1] + b.m[0][1]; m[0][2] = a.m[0][2] + b.m[0][2]; - m[1][0] = a.m[1][0] + b.m[1][0]; m[1][1] = a.m[1][1] + b.m[1][1]; m[1][2] = a.m[1][2] + b.m[1][2]; - m[2][0] = a.m[2][0] + b.m[2][0]; m[2][1] = a.m[2][1] + b.m[2][1]; m[2][2] = a.m[2][2] + b.m[2][2]; - } - - inline_ void Sub(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] - b.m[0][0]; m[0][1] = a.m[0][1] - b.m[0][1]; m[0][2] = a.m[0][2] - b.m[0][2]; - m[1][0] = a.m[1][0] - b.m[1][0]; m[1][1] = a.m[1][1] - b.m[1][1]; m[1][2] = a.m[1][2] - b.m[1][2]; - m[2][0] = a.m[2][0] - b.m[2][0]; m[2][1] = a.m[2][1] - b.m[2][1]; m[2][2] = a.m[2][2] - b.m[2][2]; - } - - //! this = a * b - inline_ void Mult(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0] + a.m[0][2] * b.m[2][0]; - m[0][1] = a.m[0][0] * b.m[0][1] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[2][1]; - m[0][2] = a.m[0][0] * b.m[0][2] + a.m[0][1] * b.m[1][2] + a.m[0][2] * b.m[2][2]; - m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[1][2] * b.m[2][0]; - m[1][1] = a.m[1][0] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[2][1]; - m[1][2] = a.m[1][0] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[1][2] * b.m[2][2]; - m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[1][0] + a.m[2][2] * b.m[2][0]; - m[2][1] = a.m[2][0] * b.m[0][1] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[2][1]; - m[2][2] = a.m[2][0] * b.m[0][2] + a.m[2][1] * b.m[1][2] + a.m[2][2] * b.m[2][2]; - } - - //! this = transpose(a) * b - inline_ void MultAtB(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] * b.m[0][0] + a.m[1][0] * b.m[1][0] + a.m[2][0] * b.m[2][0]; - m[0][1] = a.m[0][0] * b.m[0][1] + a.m[1][0] * b.m[1][1] + a.m[2][0] * b.m[2][1]; - m[0][2] = a.m[0][0] * b.m[0][2] + a.m[1][0] * b.m[1][2] + a.m[2][0] * b.m[2][2]; - m[1][0] = a.m[0][1] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[2][1] * b.m[2][0]; - m[1][1] = a.m[0][1] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[2][1] * b.m[2][1]; - m[1][2] = a.m[0][1] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[2][1] * b.m[2][2]; - m[2][0] = a.m[0][2] * b.m[0][0] + a.m[1][2] * b.m[1][0] + a.m[2][2] * b.m[2][0]; - m[2][1] = a.m[0][2] * b.m[0][1] + a.m[1][2] * b.m[1][1] + a.m[2][2] * b.m[2][1]; - m[2][2] = a.m[0][2] * b.m[0][2] + a.m[1][2] * b.m[1][2] + a.m[2][2] * b.m[2][2]; - } - - //! this = a * transpose(b) - inline_ void MultABt(const Matrix3x3& a, const Matrix3x3& b) - { - m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[0][1] + a.m[0][2] * b.m[0][2]; - m[0][1] = a.m[0][0] * b.m[1][0] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[1][2]; - m[0][2] = a.m[0][0] * b.m[2][0] + a.m[0][1] * b.m[2][1] + a.m[0][2] * b.m[2][2]; - m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[0][1] + a.m[1][2] * b.m[0][2]; - m[1][1] = a.m[1][0] * b.m[1][0] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[1][2]; - m[1][2] = a.m[1][0] * b.m[2][0] + a.m[1][1] * b.m[2][1] + a.m[1][2] * b.m[2][2]; - m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[0][1] + a.m[2][2] * b.m[0][2]; - m[2][1] = a.m[2][0] * b.m[1][0] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[1][2]; - m[2][2] = a.m[2][0] * b.m[2][0] + a.m[2][1] * b.m[2][1] + a.m[2][2] * b.m[2][2]; - } - - //! Makes a rotation matrix mapping vector "from" to vector "to". - Matrix3x3& FromTo(const Point& from, const Point& to); - - //! Set a rotation matrix around the X axis. - //! 1 0 0 - //! RX = 0 cx sx - //! 0 -sx cx - void RotX(float angle); - //! Set a rotation matrix around the Y axis. - //! cy 0 -sy - //! RY = 0 1 0 - //! sy 0 cy - void RotY(float angle); - //! Set a rotation matrix around the Z axis. - //! cz sz 0 - //! RZ = -sz cz 0 - //! 0 0 1 - void RotZ(float angle); - //! cy sx.sy -sy.cx - //! RY.RX 0 cx sx - //! sy -sx.cy cx.cy - void RotYX(float y, float x); - - //! Make a rotation matrix about an arbitrary axis - Matrix3x3& Rot(float angle, const Point& axis); - - //! Transpose the matrix. - void Transpose() - { - IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); - IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); - IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); - } - - //! this = Transpose(a) - void Transpose(const Matrix3x3& a) - { - m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0]; - m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1]; - m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2]; - } - - //! Compute the determinant of the matrix. We use the rule of Sarrus. - float Determinant() const - { - return (m[0][0]*m[1][1]*m[2][2] + m[0][1]*m[1][2]*m[2][0] + m[0][2]*m[1][0]*m[2][1]) - - (m[2][0]*m[1][1]*m[0][2] + m[2][1]*m[1][2]*m[0][0] + m[2][2]*m[1][0]*m[0][1]); - } -/* - //! Compute a cofactor. Used for matrix inversion. - float CoFactor(ubyte row, ubyte column) const - { - static sdword gIndex[3+2] = { 0, 1, 2, 0, 1 }; - return (m[gIndex[row+1]][gIndex[column+1]]*m[gIndex[row+2]][gIndex[column+2]] - m[gIndex[row+2]][gIndex[column+1]]*m[gIndex[row+1]][gIndex[column+2]]); - } -*/ - //! Invert the matrix. Determinant must be different from zero, else matrix can't be inverted. - Matrix3x3& Invert() - { - float Det = Determinant(); // Must be !=0 - float OneOverDet = 1.0f / Det; - - Matrix3x3 Temp; - Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet; - Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet; - Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet; - Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet; - Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet; - Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet; - Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet; - Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet; - Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet; - - *this = Temp; - - return *this; - } - - Matrix3x3& Normalize(); - - //! this = exp(a) - Matrix3x3& Exp(const Matrix3x3& a); - -void FromQuat(const Quat &q); -void FromQuatL2(const Quat &q, float l2); - - // Arithmetic operators - //! Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3; - inline_ Matrix3x3 operator+(const Matrix3x3& mat) const - { - return Matrix3x3( - m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2], - m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2], - m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]); - } - - //! Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3; - inline_ Matrix3x3 operator-(const Matrix3x3& mat) const - { - return Matrix3x3( - m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2], - m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2], - m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]); - } - - //! Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3; - inline_ Matrix3x3 operator*(const Matrix3x3& mat) const - { - return Matrix3x3( - m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0], - m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1], - m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2], - - m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0], - m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1], - m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2], - - m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0], - m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1], - m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]); - } - - //! Operator for Point Mul = Matrix3x3 * Point; - inline_ Point operator*(const Point& v) const { return Point(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v); } - - //! Operator for Matrix3x3 Mul = Matrix3x3 * float; - inline_ Matrix3x3 operator*(float s) const - { - return Matrix3x3( - m[0][0]*s, m[0][1]*s, m[0][2]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s); - } - - //! Operator for Matrix3x3 Mul = float * Matrix3x3; - inline_ friend Matrix3x3 operator*(float s, const Matrix3x3& mat) - { - return Matrix3x3( - s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], - s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], - s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]); - } - - //! Operator for Matrix3x3 Div = Matrix3x3 / float; - inline_ Matrix3x3 operator/(float s) const - { - if (s) s = 1.0f / s; - return Matrix3x3( - m[0][0]*s, m[0][1]*s, m[0][2]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s); - } - - //! Operator for Matrix3x3 Div = float / Matrix3x3; - inline_ friend Matrix3x3 operator/(float s, const Matrix3x3& mat) - { - return Matrix3x3( - s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], - s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], - s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]); - } - - //! Operator for Matrix3x3 += Matrix3x3 - inline_ Matrix3x3& operator+=(const Matrix3x3& mat) - { - m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; - m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; - m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; - return *this; - } - - //! Operator for Matrix3x3 -= Matrix3x3 - inline_ Matrix3x3& operator-=(const Matrix3x3& mat) - { - m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; - m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; - m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; - return *this; - } - - //! Operator for Matrix3x3 *= Matrix3x3 - inline_ Matrix3x3& operator*=(const Matrix3x3& mat) - { - Point TempRow; - - GetRow(0, TempRow); - m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; - m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; - m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; - - GetRow(1, TempRow); - m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; - m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; - m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; - - GetRow(2, TempRow); - m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; - m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; - m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; - return *this; - } - - //! Operator for Matrix3x3 *= float - inline_ Matrix3x3& operator*=(float s) - { - m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; - m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; - m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; - return *this; - } - - //! Operator for Matrix3x3 /= float - inline_ Matrix3x3& operator/=(float s) - { - if (s) s = 1.0f / s; - m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; - m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; - m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; - return *this; - } - - // Cast operators - //! Cast a Matrix3x3 to a Matrix4x4. - operator Matrix4x4() const; - //! Cast a Matrix3x3 to a Quat. - operator Quat() const; - - inline_ const Point& operator[](int row) const { return *(const Point*)&m[row][0]; } - inline_ Point& operator[](int row) { return *(Point*)&m[row][0]; } - - public: - - float m[3][3]; - }; - -#endif // __ICEMATRIX3X3_H__ - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceMatrix4x4.cpp b/libraries/ode-0.9/OPCODE/Ice/IceMatrix4x4.cpp deleted file mode 100644 index 0b258f0cdf..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceMatrix4x4.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 4x4 matrices. - * \file IceMatrix4x4.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * 4x4 matrix. - * DirectX-compliant, ie row-column order, ie m[Row][Col]. - * Same as: - * m11 m12 m13 m14 first row. - * m21 m22 m23 m24 second row. - * m31 m32 m33 m34 third row. - * m41 m42 m43 m44 fourth row. - * Translation is (m41, m42, m43), (m14, m24, m34, m44) = (0, 0, 0, 1). - * Stored in memory as m11 m12 m13 m14 m21... - * - * Multiplication rules: - * - * [x'y'z'1] = [xyz1][M] - * - * x' = x*m11 + y*m21 + z*m31 + m41 - * y' = x*m12 + y*m22 + z*m32 + m42 - * z' = x*m13 + y*m23 + z*m33 + m43 - * 1' = 0 + 0 + 0 + m44 - * - * \class Matrix4x4 - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Inverts a PR matrix. (which only contains a rotation and a translation) - * This is faster and less subject to FPU errors than the generic inversion code. - * - * \relates Matrix4x4 - * \fn InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) - * \param dest [out] destination matrix - * \param src [in] source matrix - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -ICEMATHS_API void IceMaths::InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) -{ - dest.m[0][0] = src.m[0][0]; - dest.m[1][0] = src.m[0][1]; - dest.m[2][0] = src.m[0][2]; - dest.m[3][0] = -(src.m[3][0]*src.m[0][0] + src.m[3][1]*src.m[0][1] + src.m[3][2]*src.m[0][2]); - - dest.m[0][1] = src.m[1][0]; - dest.m[1][1] = src.m[1][1]; - dest.m[2][1] = src.m[1][2]; - dest.m[3][1] = -(src.m[3][0]*src.m[1][0] + src.m[3][1]*src.m[1][1] + src.m[3][2]*src.m[1][2]); - - dest.m[0][2] = src.m[2][0]; - dest.m[1][2] = src.m[2][1]; - dest.m[2][2] = src.m[2][2]; - dest.m[3][2] = -(src.m[3][0]*src.m[2][0] + src.m[3][1]*src.m[2][1] + src.m[3][2]*src.m[2][2]); - - dest.m[0][3] = 0.0f; - dest.m[1][3] = 0.0f; - dest.m[2][3] = 0.0f; - dest.m[3][3] = 1.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compute the cofactor of the Matrix at a specified location -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Matrix4x4::CoFactor(udword row, udword col) const -{ - return (( m[(row+1)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+3)&3][(col+3)&3] + - m[(row+1)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+3)&3][(col+1)&3] + - m[(row+1)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+3)&3][(col+2)&3]) - - (m[(row+3)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+1)&3][(col+3)&3] + - m[(row+3)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+1)&3][(col+1)&3] + - m[(row+3)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+1)&3][(col+2)&3])) * ((row + col) & 1 ? -1.0f : +1.0f); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compute the determinant of the Matrix -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Matrix4x4::Determinant() const -{ - return m[0][0] * CoFactor(0, 0) + - m[0][1] * CoFactor(0, 1) + - m[0][2] * CoFactor(0, 2) + - m[0][3] * CoFactor(0, 3); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compute the inverse of the matrix -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Matrix4x4& Matrix4x4::Invert() -{ - float Det = Determinant(); - Matrix4x4 Temp; - - if(fabsf(Det) < MATRIX4X4_EPSILON) - return *this; // The matrix is not invertible! Singular case! - - float IDet = 1.0f / Det; - - Temp.m[0][0] = CoFactor(0,0) * IDet; - Temp.m[1][0] = CoFactor(0,1) * IDet; - Temp.m[2][0] = CoFactor(0,2) * IDet; - Temp.m[3][0] = CoFactor(0,3) * IDet; - Temp.m[0][1] = CoFactor(1,0) * IDet; - Temp.m[1][1] = CoFactor(1,1) * IDet; - Temp.m[2][1] = CoFactor(1,2) * IDet; - Temp.m[3][1] = CoFactor(1,3) * IDet; - Temp.m[0][2] = CoFactor(2,0) * IDet; - Temp.m[1][2] = CoFactor(2,1) * IDet; - Temp.m[2][2] = CoFactor(2,2) * IDet; - Temp.m[3][2] = CoFactor(2,3) * IDet; - Temp.m[0][3] = CoFactor(3,0) * IDet; - Temp.m[1][3] = CoFactor(3,1) * IDet; - Temp.m[2][3] = CoFactor(3,2) * IDet; - Temp.m[3][3] = CoFactor(3,3) * IDet; - - *this = Temp; - - return *this; -} - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceMatrix4x4.h b/libraries/ode-0.9/OPCODE/Ice/IceMatrix4x4.h deleted file mode 100644 index 45919be798..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceMatrix4x4.h +++ /dev/null @@ -1,455 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 4x4 matrices. - * \file IceMatrix4x4.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEMATRIX4X4_H__ -#define __ICEMATRIX4X4_H__ - - // Forward declarations - class PRS; - class PR; - - #define MATRIX4X4_EPSILON (1.0e-7f) - - class ICEMATHS_API Matrix4x4 - { -// void LUBackwardSubstitution( sdword *indx, float* b ); -// void LUDecomposition( sdword* indx, float* d ); - - public: - //! Empty constructor. - inline_ Matrix4x4() {} - //! Constructor from 16 values - inline_ Matrix4x4( float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; - m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; - } - //! Copy constructor - inline_ Matrix4x4(const Matrix4x4& mat) { CopyMemory(m, &mat.m, 16*sizeof(float)); } - //! Destructor. - inline_ ~Matrix4x4() {} - - //! Assign values (rotation only) - inline_ Matrix4x4& Set( float m00, float m01, float m02, - float m10, float m11, float m12, - float m20, float m21, float m22) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; - return *this; - } - //! Assign values - inline_ Matrix4x4& Set( float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33) - { - m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; - m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; - m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; - m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; - return *this; - } - - //! Copy from a Matrix4x4 - inline_ void Copy(const Matrix4x4& source) { CopyMemory(m, source.m, 16*sizeof(float)); } - - // Row-column access - //! Returns a row. - inline_ void GetRow(const udword r, HPoint& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; p.w=m[r][3]; } - //! Returns a row. - inline_ void GetRow(const udword r, Point& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; } - //! Returns a row. - inline_ const HPoint& GetRow(const udword r) const { return *(const HPoint*)&m[r][0]; } - //! Returns a row. - inline_ HPoint& GetRow(const udword r) { return *(HPoint*)&m[r][0]; } - //! Sets a row. - inline_ void SetRow(const udword r, const HPoint& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]=p.w; } - //! Sets a row. - inline_ void SetRow(const udword r, const Point& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]= (r!=3) ? 0.0f : 1.0f; } - //! Returns a column. - inline_ void GetCol(const udword c, HPoint& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; p.w=m[3][c]; } - //! Returns a column. - inline_ void GetCol(const udword c, Point& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; } - //! Sets a column. - inline_ void SetCol(const udword c, const HPoint& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]=p.w; } - //! Sets a column. - inline_ void SetCol(const udword c, const Point& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]= (c!=3) ? 0.0f : 1.0f; } - - // Translation - //! Returns the translation part of the matrix. - inline_ const HPoint& GetTrans() const { return GetRow(3); } - //! Gets the translation part of the matrix - inline_ void GetTrans(Point& p) const { p.x=m[3][0]; p.y=m[3][1]; p.z=m[3][2]; } - //! Sets the translation part of the matrix, from a Point. - inline_ void SetTrans(const Point& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; } - //! Sets the translation part of the matrix, from a HPoint. - inline_ void SetTrans(const HPoint& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; m[3][3]=p.w; } - //! Sets the translation part of the matrix, from floats. - inline_ void SetTrans(float tx, float ty, float tz) { m[3][0]=tx; m[3][1]=ty; m[3][2]=tz; } - - // Scale - //! Sets the scale from a Point. The point is put on the diagonal. - inline_ void SetScale(const Point& p) { m[0][0]=p.x; m[1][1]=p.y; m[2][2]=p.z; } - //! Sets the scale from floats. Values are put on the diagonal. - inline_ void SetScale(float sx, float sy, float sz) { m[0][0]=sx; m[1][1]=sy; m[2][2]=sz; } - //! Scales from a Point. Each row is multiplied by a component. - void Scale(const Point& p) - { - m[0][0] *= p.x; m[1][0] *= p.y; m[2][0] *= p.z; - m[0][1] *= p.x; m[1][1] *= p.y; m[2][1] *= p.z; - m[0][2] *= p.x; m[1][2] *= p.y; m[2][2] *= p.z; - } - //! Scales from floats. Each row is multiplied by a value. - void Scale(float sx, float sy, float sz) - { - m[0][0] *= sx; m[1][0] *= sy; m[2][0] *= sz; - m[0][1] *= sx; m[1][1] *= sy; m[2][1] *= sz; - m[0][2] *= sx; m[1][2] *= sy; m[2][2] *= sz; - } -/* - //! Returns a row. - inline_ HPoint GetRow(const udword row) const { return mRow[row]; } - //! Sets a row. - inline_ Matrix4x4& SetRow(const udword row, const HPoint& p) { mRow[row] = p; return *this; } - //! Sets a row. - Matrix4x4& SetRow(const udword row, const Point& p) - { - m[row][0] = p.x; - m[row][1] = p.y; - m[row][2] = p.z; - m[row][3] = (row != 3) ? 0.0f : 1.0f; - return *this; - } - //! Returns a column. - HPoint GetCol(const udword col) const - { - HPoint Res; - Res.x = m[0][col]; - Res.y = m[1][col]; - Res.z = m[2][col]; - Res.w = m[3][col]; - return Res; - } - //! Sets a column. - Matrix4x4& SetCol(const udword col, const HPoint& p) - { - m[0][col] = p.x; - m[1][col] = p.y; - m[2][col] = p.z; - m[3][col] = p.w; - return *this; - } - //! Sets a column. - Matrix4x4& SetCol(const udword col, const Point& p) - { - m[0][col] = p.x; - m[1][col] = p.y; - m[2][col] = p.z; - m[3][col] = (col != 3) ? 0.0f : 1.0f; - return *this; - } -*/ - //! Computes the trace. The trace is the sum of the 4 diagonal components. - inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2] + m[3][3]; } - //! Computes the trace of the upper 3x3 matrix. - inline_ float Trace3x3() const { return m[0][0] + m[1][1] + m[2][2]; } - //! Clears the matrix. - inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } - //! Sets the identity matrix. - inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f; } - //! Checks for identity - inline_ bool IsIdentity() const - { - if(IR(m[0][0])!=IEEE_1_0) return false; - if(IR(m[0][1])!=0) return false; - if(IR(m[0][2])!=0) return false; - if(IR(m[0][3])!=0) return false; - - if(IR(m[1][0])!=0) return false; - if(IR(m[1][1])!=IEEE_1_0) return false; - if(IR(m[1][2])!=0) return false; - if(IR(m[1][3])!=0) return false; - - if(IR(m[2][0])!=0) return false; - if(IR(m[2][1])!=0) return false; - if(IR(m[2][2])!=IEEE_1_0) return false; - if(IR(m[2][3])!=0) return false; - - if(IR(m[3][0])!=0) return false; - if(IR(m[3][1])!=0) return false; - if(IR(m[3][2])!=0) return false; - if(IR(m[3][3])!=IEEE_1_0) return false; - return true; - } - - //! Checks matrix validity - inline_ BOOL IsValid() const - { - for(udword j=0;j<4;j++) - { - for(udword i=0;i<4;i++) - { - if(!IsValidFloat(m[j][i])) return FALSE; - } - } - return TRUE; - } - - //! Sets a rotation matrix around the X axis. - void RotX(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[1][1] = m[2][2] = Cos; m[2][1] = -Sin; m[1][2] = Sin; } - //! Sets a rotation matrix around the Y axis. - void RotY(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[2][2] = Cos; m[2][0] = Sin; m[0][2] = -Sin; } - //! Sets a rotation matrix around the Z axis. - void RotZ(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[1][1] = Cos; m[1][0] = -Sin; m[0][1] = Sin; } - - //! Makes a rotation matrix about an arbitrary axis - Matrix4x4& Rot(float angle, Point& p1, Point& p2); - - //! Transposes the matrix. - void Transpose() - { - IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); - IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); - IR(m[3][0]) ^= IR(m[0][3]); IR(m[0][3]) ^= IR(m[3][0]); IR(m[3][0]) ^= IR(m[0][3]); - IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); - IR(m[1][3]) ^= IR(m[3][1]); IR(m[3][1]) ^= IR(m[1][3]); IR(m[1][3]) ^= IR(m[3][1]); - IR(m[2][3]) ^= IR(m[3][2]); IR(m[3][2]) ^= IR(m[2][3]); IR(m[2][3]) ^= IR(m[3][2]); - } - - //! Computes a cofactor. Used for matrix inversion. - float CoFactor(udword row, udword col) const; - //! Computes the determinant of the matrix. - float Determinant() const; - //! Inverts the matrix. Determinant must be different from zero, else matrix can't be inverted. - Matrix4x4& Invert(); -// Matrix& ComputeAxisMatrix(Point& axis, float angle); - - // Cast operators - //! Casts a Matrix4x4 to a Matrix3x3. - inline_ operator Matrix3x3() const - { - return Matrix3x3( - m[0][0], m[0][1], m[0][2], - m[1][0], m[1][1], m[1][2], - m[2][0], m[2][1], m[2][2]); - } - //! Casts a Matrix4x4 to a Quat. - operator Quat() const; - //! Casts a Matrix4x4 to a PR. - operator PR() const; - - // Arithmetic operators - //! Operator for Matrix4x4 Plus = Matrix4x4 + Matrix4x4; - inline_ Matrix4x4 operator+(const Matrix4x4& mat) const - { - return Matrix4x4( - m[0][0]+mat.m[0][0], m[0][1]+mat.m[0][1], m[0][2]+mat.m[0][2], m[0][3]+mat.m[0][3], - m[1][0]+mat.m[1][0], m[1][1]+mat.m[1][1], m[1][2]+mat.m[1][2], m[1][3]+mat.m[1][3], - m[2][0]+mat.m[2][0], m[2][1]+mat.m[2][1], m[2][2]+mat.m[2][2], m[2][3]+mat.m[2][3], - m[3][0]+mat.m[3][0], m[3][1]+mat.m[3][1], m[3][2]+mat.m[3][2], m[3][3]+mat.m[3][3]); - } - - //! Operator for Matrix4x4 Minus = Matrix4x4 - Matrix4x4; - inline_ Matrix4x4 operator-(const Matrix4x4& mat) const - { - return Matrix4x4( - m[0][0]-mat.m[0][0], m[0][1]-mat.m[0][1], m[0][2]-mat.m[0][2], m[0][3]-mat.m[0][3], - m[1][0]-mat.m[1][0], m[1][1]-mat.m[1][1], m[1][2]-mat.m[1][2], m[1][3]-mat.m[1][3], - m[2][0]-mat.m[2][0], m[2][1]-mat.m[2][1], m[2][2]-mat.m[2][2], m[2][3]-mat.m[2][3], - m[3][0]-mat.m[3][0], m[3][1]-mat.m[3][1], m[3][2]-mat.m[3][2], m[3][3]-mat.m[3][3]); - } - - //! Operator for Matrix4x4 Mul = Matrix4x4 * Matrix4x4; - inline_ Matrix4x4 operator*(const Matrix4x4& mat) const - { - return Matrix4x4( - m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0] + m[0][3]*mat.m[3][0], - m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1] + m[0][3]*mat.m[3][1], - m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2] + m[0][3]*mat.m[3][2], - m[0][0]*mat.m[0][3] + m[0][1]*mat.m[1][3] + m[0][2]*mat.m[2][3] + m[0][3]*mat.m[3][3], - - m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0] + m[1][3]*mat.m[3][0], - m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1] + m[1][3]*mat.m[3][1], - m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2] + m[1][3]*mat.m[3][2], - m[1][0]*mat.m[0][3] + m[1][1]*mat.m[1][3] + m[1][2]*mat.m[2][3] + m[1][3]*mat.m[3][3], - - m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0] + m[2][3]*mat.m[3][0], - m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1] + m[2][3]*mat.m[3][1], - m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2] + m[2][3]*mat.m[3][2], - m[2][0]*mat.m[0][3] + m[2][1]*mat.m[1][3] + m[2][2]*mat.m[2][3] + m[2][3]*mat.m[3][3], - - m[3][0]*mat.m[0][0] + m[3][1]*mat.m[1][0] + m[3][2]*mat.m[2][0] + m[3][3]*mat.m[3][0], - m[3][0]*mat.m[0][1] + m[3][1]*mat.m[1][1] + m[3][2]*mat.m[2][1] + m[3][3]*mat.m[3][1], - m[3][0]*mat.m[0][2] + m[3][1]*mat.m[1][2] + m[3][2]*mat.m[2][2] + m[3][3]*mat.m[3][2], - m[3][0]*mat.m[0][3] + m[3][1]*mat.m[1][3] + m[3][2]*mat.m[2][3] + m[3][3]*mat.m[3][3]); - } - - //! Operator for HPoint Mul = Matrix4x4 * HPoint; - inline_ HPoint operator*(const HPoint& v) const { return HPoint(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v, GetRow(3)|v); } - - //! Operator for Point Mul = Matrix4x4 * Point; - inline_ Point operator*(const Point& v) const - { - return Point( m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z + m[0][3], - m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z + m[1][3], - m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z + m[2][3] ); - } - - //! Operator for Matrix4x4 Scale = Matrix4x4 * float; - inline_ Matrix4x4 operator*(float s) const - { - return Matrix4x4( - m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, - m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); - } - - //! Operator for Matrix4x4 Scale = float * Matrix4x4; - inline_ friend Matrix4x4 operator*(float s, const Matrix4x4& mat) - { - return Matrix4x4( - s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], s*mat.m[0][3], - s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], s*mat.m[1][3], - s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2], s*mat.m[2][3], - s*mat.m[3][0], s*mat.m[3][1], s*mat.m[3][2], s*mat.m[3][3]); - } - - //! Operator for Matrix4x4 Div = Matrix4x4 / float; - inline_ Matrix4x4 operator/(float s) const - { - if(s) s = 1.0f / s; - - return Matrix4x4( - m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, - m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, - m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, - m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); - } - - //! Operator for Matrix4x4 Div = float / Matrix4x4; - inline_ friend Matrix4x4 operator/(float s, const Matrix4x4& mat) - { - return Matrix4x4( - s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], s/mat.m[0][3], - s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], s/mat.m[1][3], - s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2], s/mat.m[2][3], - s/mat.m[3][0], s/mat.m[3][1], s/mat.m[3][2], s/mat.m[3][3]); - } - - //! Operator for Matrix4x4 += Matrix4x4; - inline_ Matrix4x4& operator+=(const Matrix4x4& mat) - { - m[0][0]+=mat.m[0][0]; m[0][1]+=mat.m[0][1]; m[0][2]+=mat.m[0][2]; m[0][3]+=mat.m[0][3]; - m[1][0]+=mat.m[1][0]; m[1][1]+=mat.m[1][1]; m[1][2]+=mat.m[1][2]; m[1][3]+=mat.m[1][3]; - m[2][0]+=mat.m[2][0]; m[2][1]+=mat.m[2][1]; m[2][2]+=mat.m[2][2]; m[2][3]+=mat.m[2][3]; - m[3][0]+=mat.m[3][0]; m[3][1]+=mat.m[3][1]; m[3][2]+=mat.m[3][2]; m[3][3]+=mat.m[3][3]; - return *this; - } - - //! Operator for Matrix4x4 -= Matrix4x4; - inline_ Matrix4x4& operator-=(const Matrix4x4& mat) - { - m[0][0]-=mat.m[0][0]; m[0][1]-=mat.m[0][1]; m[0][2]-=mat.m[0][2]; m[0][3]-=mat.m[0][3]; - m[1][0]-=mat.m[1][0]; m[1][1]-=mat.m[1][1]; m[1][2]-=mat.m[1][2]; m[1][3]-=mat.m[1][3]; - m[2][0]-=mat.m[2][0]; m[2][1]-=mat.m[2][1]; m[2][2]-=mat.m[2][2]; m[2][3]-=mat.m[2][3]; - m[3][0]-=mat.m[3][0]; m[3][1]-=mat.m[3][1]; m[3][2]-=mat.m[3][2]; m[3][3]-=mat.m[3][3]; - return *this; - } - - //! Operator for Matrix4x4 *= Matrix4x4; - Matrix4x4& operator*=(const Matrix4x4& mat) - { - HPoint TempRow; - - GetRow(0, TempRow); - m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[0][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - GetRow(1, TempRow); - m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[1][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - GetRow(2, TempRow); - m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[2][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - GetRow(3, TempRow); - m[3][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; - m[3][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; - m[3][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; - m[3][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; - - return *this; - } - - //! Operator for Matrix4x4 *= float; - inline_ Matrix4x4& operator*=(float s) - { - m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; - m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; - m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; - m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; - return *this; - } - - //! Operator for Matrix4x4 /= float; - inline_ Matrix4x4& operator/=(float s) - { - if(s) s = 1.0f / s; - m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; - m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; - m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; - m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; - return *this; - } - - inline_ const HPoint& operator[](int row) const { return *(const HPoint*)&m[row][0]; } - inline_ HPoint& operator[](int row) { return *(HPoint*)&m[row][0]; } - - public: - - float m[4][4]; - }; - - //! Quickly rotates & translates a vector, using the 4x3 part of a 4x4 matrix - inline_ void TransformPoint4x3(Point& dest, const Point& source, const Matrix4x4& rot) - { - dest.x = rot.m[3][0] + source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; - dest.y = rot.m[3][1] + source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; - dest.z = rot.m[3][2] + source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; - } - - //! Quickly rotates a vector, using the 3x3 part of a 4x4 matrix - inline_ void TransformPoint3x3(Point& dest, const Point& source, const Matrix4x4& rot) - { - dest.x = source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; - dest.y = source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; - dest.z = source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; - } - - ICEMATHS_API void InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src); - -#endif // __ICEMATRIX4X4_H__ - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceMemoryMacros.h b/libraries/ode-0.9/OPCODE/Ice/IceMemoryMacros.h deleted file mode 100644 index 638633371d..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceMemoryMacros.h +++ /dev/null @@ -1,109 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains all memory macros. - * \file IceMemoryMacros.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEMEMORYMACROS_H__ -#define __ICEMEMORYMACROS_H__ - -#undef ZeroMemory -#undef CopyMemory -#undef MoveMemory -#undef FillMemory - - //! Clears a buffer. - //! \param addr [in] buffer address - //! \param size [in] buffer length - //! \see FillMemory - //! \see StoreDwords - //! \see CopyMemory - //! \see MoveMemory - inline_ void ZeroMemory(void* addr, udword size) { memset(addr, 0, size); } - - //! Fills a buffer with a given byte. - //! \param addr [in] buffer address - //! \param size [in] buffer length - //! \param val [in] the byte value - //! \see StoreDwords - //! \see ZeroMemory - //! \see CopyMemory - //! \see MoveMemory - inline_ void FillMemory(void* dest, udword size, ubyte val) { memset(dest, val, size); } - - //! Fills a buffer with a given dword. - //! \param addr [in] buffer address - //! \param nb [in] number of dwords to write - //! \param value [in] the dword value - //! \see FillMemory - //! \see ZeroMemory - //! \see CopyMemory - //! \see MoveMemory - //! \warning writes nb*4 bytes ! - inline_ void StoreDwords(udword* dest, udword nb, udword value) - { - // The asm code below **SHOULD** be equivalent to one of those C versions - // or the other if your compiled is good: (checked on VC++ 6.0) - // - // 1) while(nb--) *dest++ = value; - // - // 2) for(udword i=0;iRelease(); (x) = null; } //!< Safe D3D-style release - #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } //!< Safe ICE-style release - -#ifdef __ICEERROR_H__ - #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); //!< Standard alloc checking. HANDLE WITH CARE. -#else - #define CHECKALLOC(x) if(!x) return false; -#endif - - //! Standard allocation cycle - #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); - -#endif // __ICEMEMORYMACROS_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceOBB.cpp b/libraries/ode-0.9/OPCODE/Ice/IceOBB.cpp deleted file mode 100644 index 0b1b6f74df..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceOBB.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains OBB-related code. - * \file IceOBB.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * An Oriented Bounding Box (OBB). - * \class OBB - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Tests if a point is contained within the OBB. - * \param p [in] the world point to test - * \return true if inside the OBB - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ContainsPoint(const Point& p) const -{ - // Point in OBB test using lazy evaluation and early exits - - // Translate to box space - Point RelPoint = p - mCenter; - - // Point * mRot maps from box space to world space - // mRot * Point maps from world space to box space (what we need here) - - float f = mRot.m[0][0] * RelPoint.x + mRot.m[0][1] * RelPoint.y + mRot.m[0][2] * RelPoint.z; - if(f >= mExtents.x || f <= -mExtents.x) return false; - - f = mRot.m[1][0] * RelPoint.x + mRot.m[1][1] * RelPoint.y + mRot.m[1][2] * RelPoint.z; - if(f >= mExtents.y || f <= -mExtents.y) return false; - - f = mRot.m[2][0] * RelPoint.x + mRot.m[2][1] * RelPoint.y + mRot.m[2][2] * RelPoint.z; - if(f >= mExtents.z || f <= -mExtents.z) return false; - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds an OBB from an AABB and a world transform. - * \param aabb [in] the aabb - * \param mat [in] the world transform - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBB::Create(const AABB& aabb, const Matrix4x4& mat) -{ - // Note: must be coherent with Rotate() - - aabb.GetCenter(mCenter); - aabb.GetExtents(mExtents); - // Here we have the same as OBB::Rotate(mat) where the obb is (mCenter, mExtents, Identity). - - // So following what's done in Rotate: - // - x-form the center - mCenter *= mat; - // - combine rotation with identity, i.e. just use given matrix - mRot = mat; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the obb planes. - * \param planes [out] 6 box planes - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ComputePlanes(Plane* planes) const -{ - // Checkings - if(!planes) return false; - - Point Axis0 = mRot[0]; - Point Axis1 = mRot[1]; - Point Axis2 = mRot[2]; - - // Writes normals - planes[0].n = Axis0; - planes[1].n = -Axis0; - planes[2].n = Axis1; - planes[3].n = -Axis1; - planes[4].n = Axis2; - planes[5].n = -Axis2; - - // Compute a point on each plane - Point p0 = mCenter + Axis0 * mExtents.x; - Point p1 = mCenter - Axis0 * mExtents.x; - Point p2 = mCenter + Axis1 * mExtents.y; - Point p3 = mCenter - Axis1 * mExtents.y; - Point p4 = mCenter + Axis2 * mExtents.z; - Point p5 = mCenter - Axis2 * mExtents.z; - - // Compute d - planes[0].d = -(planes[0].n|p0); - planes[1].d = -(planes[1].n|p1); - planes[2].d = -(planes[2].n|p2); - planes[3].d = -(planes[3].n|p3); - planes[4].d = -(planes[4].n|p4); - planes[5].d = -(planes[5].n|p5); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the obb points. - * \param pts [out] 8 box points - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ComputePoints(Point* pts) const -{ - // Checkings - if(!pts) return false; - - Point Axis0 = mRot[0]; - Point Axis1 = mRot[1]; - Point Axis2 = mRot[2]; - - Axis0 *= mExtents.x; - Axis1 *= mExtents.y; - Axis2 *= mExtents.z; - - // 7+------+6 0 = --- - // /| /| 1 = +-- - // / | / | 2 = ++- - // / 4+---/--+5 3 = -+- - // 3+------+2 / y z 4 = --+ - // | / | / | / 5 = +-+ - // |/ |/ |/ 6 = +++ - // 0+------+1 *---x 7 = -++ - - pts[0] = mCenter - Axis0 - Axis1 - Axis2; - pts[1] = mCenter + Axis0 - Axis1 - Axis2; - pts[2] = mCenter + Axis0 + Axis1 - Axis2; - pts[3] = mCenter - Axis0 + Axis1 - Axis2; - pts[4] = mCenter - Axis0 - Axis1 + Axis2; - pts[5] = mCenter + Axis0 - Axis1 + Axis2; - pts[6] = mCenter + Axis0 + Axis1 + Axis2; - pts[7] = mCenter - Axis0 + Axis1 + Axis2; - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes vertex normals. - * \param pts [out] 8 box points - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBB::ComputeVertexNormals(Point* pts) const -{ - static float VertexNormals[] = - { - -INVSQRT3, -INVSQRT3, -INVSQRT3, - INVSQRT3, -INVSQRT3, -INVSQRT3, - INVSQRT3, INVSQRT3, -INVSQRT3, - -INVSQRT3, INVSQRT3, -INVSQRT3, - -INVSQRT3, -INVSQRT3, INVSQRT3, - INVSQRT3, -INVSQRT3, INVSQRT3, - INVSQRT3, INVSQRT3, INVSQRT3, - -INVSQRT3, INVSQRT3, INVSQRT3 - }; - - if(!pts) return false; - - const Point* VN = (const Point*)VertexNormals; - for(udword i=0;i<8;i++) - { - pts[i] = VN[i] * mRot; - } - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Returns edges. - * \return 24 indices (12 edges) indexing the list returned by ComputePoints() - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const udword* OBB::GetEdges() const -{ - static udword Indices[] = { - 0, 1, 1, 2, 2, 3, 3, 0, - 7, 6, 6, 5, 5, 4, 4, 7, - 1, 5, 6, 2, - 3, 7, 4, 0 - }; - return Indices; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Returns local edge normals. - * \return edge normals in local space - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const Point* OBB::GetLocalEdgeNormals() const -{ - static float EdgeNormals[] = - { - 0, -INVSQRT2, -INVSQRT2, // 0-1 - INVSQRT2, 0, -INVSQRT2, // 1-2 - 0, INVSQRT2, -INVSQRT2, // 2-3 - -INVSQRT2, 0, -INVSQRT2, // 3-0 - - 0, INVSQRT2, INVSQRT2, // 7-6 - INVSQRT2, 0, INVSQRT2, // 6-5 - 0, -INVSQRT2, INVSQRT2, // 5-4 - -INVSQRT2, 0, INVSQRT2, // 4-7 - - INVSQRT2, -INVSQRT2, 0, // 1-5 - INVSQRT2, INVSQRT2, 0, // 6-2 - -INVSQRT2, INVSQRT2, 0, // 3-7 - -INVSQRT2, -INVSQRT2, 0 // 4-0 - }; - return (const Point*)EdgeNormals; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Returns world edge normal - * \param edge_index [in] 0 <= edge index < 12 - * \param world_normal [out] edge normal in world space - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBB::ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const -{ - ASSERT(edge_index<12); - world_normal = GetLocalEdgeNormals()[edge_index] * mRot; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes an LSS surrounding the OBB. - * \param lss [out] the LSS - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBB::ComputeLSS(LSS& lss) const -{ - Point Axis0 = mRot[0]; - Point Axis1 = mRot[1]; - Point Axis2 = mRot[2]; - - switch(mExtents.LargestAxis()) - { - case 0: - lss.mRadius = (mExtents.y + mExtents.z)*0.5f; - lss.mP0 = mCenter + Axis0 * (mExtents.x - lss.mRadius); - lss.mP1 = mCenter - Axis0 * (mExtents.x - lss.mRadius); - break; - case 1: - lss.mRadius = (mExtents.x + mExtents.z)*0.5f; - lss.mP0 = mCenter + Axis1 * (mExtents.y - lss.mRadius); - lss.mP1 = mCenter - Axis1 * (mExtents.y - lss.mRadius); - break; - case 2: - lss.mRadius = (mExtents.x + mExtents.y)*0.5f; - lss.mP0 = mCenter + Axis2 * (mExtents.z - lss.mRadius); - lss.mP1 = mCenter - Axis2 * (mExtents.z - lss.mRadius); - break; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the OBB is inside another OBB. - * \param box [in] the other OBB - * \return TRUE if we're inside the other box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL OBB::IsInside(const OBB& box) const -{ - // Make a 4x4 from the box & inverse it - Matrix4x4 M0Inv; - { - Matrix4x4 M0 = box.mRot; - M0.SetTrans(box.mCenter); - InvertPRMatrix(M0Inv, M0); - } - - // With our inversed 4x4, create box1 in space of box0 - OBB _1in0; - Rotate(M0Inv, _1in0); - - // This should cancel out box0's rotation, i.e. it's now an AABB. - // => Center(0,0,0), Rot(identity) - - // The two boxes are in the same space so now we can compare them. - - // Create the AABB of (box1 in space of box0) - const Matrix3x3& mtx = _1in0.mRot; - - float f = fabsf(mtx.m[0][0] * mExtents.x) + fabsf(mtx.m[1][0] * mExtents.y) + fabsf(mtx.m[2][0] * mExtents.z) - box.mExtents.x; - if(f > _1in0.mCenter.x) return FALSE; - if(-f < _1in0.mCenter.x) return FALSE; - - f = fabsf(mtx.m[0][1] * mExtents.x) + fabsf(mtx.m[1][1] * mExtents.y) + fabsf(mtx.m[2][1] * mExtents.z) - box.mExtents.y; - if(f > _1in0.mCenter.y) return FALSE; - if(-f < _1in0.mCenter.y) return FALSE; - - f = fabsf(mtx.m[0][2] * mExtents.x) + fabsf(mtx.m[1][2] * mExtents.y) + fabsf(mtx.m[2][2] * mExtents.z) - box.mExtents.z; - if(f > _1in0.mCenter.z) return FALSE; - if(-f < _1in0.mCenter.z) return FALSE; - - return TRUE; -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IceOBB.h b/libraries/ode-0.9/OPCODE/Ice/IceOBB.h deleted file mode 100644 index d6cf43e061..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceOBB.h +++ /dev/null @@ -1,177 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains OBB-related code. (oriented bounding box) - * \file IceOBB.h - * \author Pierre Terdiman - * \date January, 13, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEOBB_H__ -#define __ICEOBB_H__ - - // Forward declarations - class LSS; - - class ICEMATHS_API OBB - { - public: - //! Constructor - inline_ OBB() {} - //! Constructor - inline_ OBB(const Point& center, const Point& extents, const Matrix3x3& rot) : mCenter(center), mExtents(extents), mRot(rot) {} - //! Destructor - inline_ ~OBB() {} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an empty OBB. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void SetEmpty() - { - mCenter.Zero(); - mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); - mRot.Identity(); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Tests if a point is contained within the OBB. - * \param p [in] the world point to test - * \return true if inside the OBB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ContainsPoint(const Point& p) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds an OBB from an AABB and a world transform. - * \param aabb [in] the aabb - * \param mat [in] the world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void Create(const AABB& aabb, const Matrix4x4& mat); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Recomputes the OBB after an arbitrary transform by a 4x4 matrix. - * \param mtx [in] the transform matrix - * \param obb [out] the transformed OBB - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void Rotate(const Matrix4x4& mtx, OBB& obb) const - { - // The extents remain constant - obb.mExtents = mExtents; - // The center gets x-formed - obb.mCenter = mCenter * mtx; - // Combine rotations - obb.mRot = mRot * Matrix3x3(mtx); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the OBB is valid. - * \return true if the box is valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsValid() const - { - // Consistency condition for (Center, Extents) boxes: Extents >= 0.0f - if(mExtents.x < 0.0f) return FALSE; - if(mExtents.y < 0.0f) return FALSE; - if(mExtents.z < 0.0f) return FALSE; - return TRUE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the obb planes. - * \param planes [out] 6 box planes - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ComputePlanes(Plane* planes) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes the obb points. - * \param pts [out] 8 box points - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ComputePoints(Point* pts) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes vertex normals. - * \param pts [out] 8 box points - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool ComputeVertexNormals(Point* pts) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns edges. - * \return 24 indices (12 edges) indexing the list returned by ComputePoints() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const udword* GetEdges() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns local edge normals. - * \return edge normals in local space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - const Point* GetLocalEdgeNormals() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns world edge normal - * \param edge_index [in] 0 <= edge index < 12 - * \param world_normal [out] edge normal in world space - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes an LSS surrounding the OBB. - * \param lss [out] the LSS - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - void ComputeLSS(LSS& lss) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the OBB is inside another OBB. - * \param box [in] the other OBB - * \return TRUE if we're inside the other box - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - BOOL IsInside(const OBB& box) const; - - inline_ const Point& GetCenter() const { return mCenter; } - inline_ const Point& GetExtents() const { return mExtents; } - inline_ const Matrix3x3& GetRot() const { return mRot; } - - inline_ void GetRotatedExtents(Matrix3x3& extents) const - { - extents = mRot; - extents.Scale(mExtents); - } - - Point mCenter; //!< B for Box - Point mExtents; //!< B for Bounding - Matrix3x3 mRot; //!< O for Oriented - - // Orientation is stored in row-major format, - // i.e. rows = eigen vectors of the covariance matrix - }; - -#endif // __ICEOBB_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IcePairs.h b/libraries/ode-0.9/OPCODE/Ice/IcePairs.h deleted file mode 100644 index 2c09b92975..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IcePairs.h +++ /dev/null @@ -1,45 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a simple pair class. - * \file IcePairs.h - * \author Pierre Terdiman - * \date January, 13, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPAIRS_H__ -#define __ICEPAIRS_H__ - - //! A generic couple structure - struct ICECORE_API Pair - { - inline_ Pair() {} - inline_ Pair(udword i0, udword i1) : id0(i0), id1(i1) {} - - udword id0; //!< First index of the pair - udword id1; //!< Second index of the pair - }; - - class ICECORE_API Pairs : private Container - { - public: - // Constructor / Destructor - Pairs() {} - ~Pairs() {} - - inline_ udword GetNbPairs() const { return GetNbEntries()>>1; } - inline_ const Pair* GetPairs() const { return (const Pair*)GetEntries(); } - inline_ const Pair* GetPair(udword i) const { return (const Pair*)&GetEntries()[i+i]; } - - inline_ BOOL HasPairs() const { return IsNotEmpty(); } - - inline_ void ResetPairs() { Reset(); } - inline_ void DeleteLastPair() { DeleteLastEntry(); DeleteLastEntry(); } - - inline_ void AddPair(const Pair& p) { Add(p.id0).Add(p.id1); } - inline_ void AddPair(udword id0, udword id1) { Add(id0).Add(id1); } - }; - -#endif // __ICEPAIRS_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IcePlane.cpp b/libraries/ode-0.9/OPCODE/Ice/IcePlane.cpp deleted file mode 100644 index 394b31bf82..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IcePlane.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for planes. - * \file IcePlane.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Plane class. - * \class Plane - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the plane equation from 3 points. - * \param p0 [in] first point - * \param p1 [in] second point - * \param p2 [in] third point - * \return Self-reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Plane& Plane::Set(const Point& p0, const Point& p1, const Point& p2) -{ - Point Edge0 = p1 - p0; - Point Edge1 = p2 - p0; - - n = Edge0 ^ Edge1; - n.Normalize(); - - d = -(p0 | n); - - return *this; -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IcePlane.h b/libraries/ode-0.9/OPCODE/Ice/IcePlane.h deleted file mode 100644 index 4d47081415..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IcePlane.h +++ /dev/null @@ -1,113 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for planes. - * \file IcePlane.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPLANE_H__ -#define __ICEPLANE_H__ - - #define PLANE_EPSILON (1.0e-7f) - - class ICEMATHS_API Plane - { - public: - //! Constructor - inline_ Plane() { } - //! Constructor from a normal and a distance - inline_ Plane(float nx, float ny, float nz, float d) { Set(nx, ny, nz, d); } - //! Constructor from a point on the plane and a normal - inline_ Plane(const Point& p, const Point& n) { Set(p, n); } - //! Constructor from three points - inline_ Plane(const Point& p0, const Point& p1, const Point& p2) { Set(p0, p1, p2); } - //! Constructor from a normal and a distance - inline_ Plane(const Point& _n, float _d) { n = _n; d = _d; } - //! Copy constructor - inline_ Plane(const Plane& plane) : n(plane.n), d(plane.d) { } - //! Destructor - inline_ ~Plane() { } - - inline_ Plane& Zero() { n.Zero(); d = 0.0f; return *this; } - inline_ Plane& Set(float nx, float ny, float nz, float _d) { n.Set(nx, ny, nz); d = _d; return *this; } - inline_ Plane& Set(const Point& p, const Point& _n) { n = _n; d = - p | _n; return *this; } - Plane& Set(const Point& p0, const Point& p1, const Point& p2); - - inline_ float Distance(const Point& p) const { return (p | n) + d; } - inline_ bool Belongs(const Point& p) const { return fabsf(Distance(p)) < PLANE_EPSILON; } - - inline_ void Normalize() - { - float Denom = 1.0f / n.Magnitude(); - n.x *= Denom; - n.y *= Denom; - n.z *= Denom; - d *= Denom; - } - public: - // Members - Point n; //!< The normal to the plane - float d; //!< The distance from the origin - - // Cast operators - inline_ operator Point() const { return n; } - inline_ operator HPoint() const { return HPoint(n, d); } - - // Arithmetic operators - inline_ Plane operator*(const Matrix4x4& m) const - { - // Old code from Irion. Kept for reference. - Plane Ret(*this); - return Ret *= m; - } - - inline_ Plane& operator*=(const Matrix4x4& m) - { - // Old code from Irion. Kept for reference. - Point n2 = HPoint(n, 0.0f) * m; - d = -((Point) (HPoint( -d*n, 1.0f ) * m) | n2); - n = n2; - return *this; - } - }; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. - * \param transformed [out] transformed plane - * \param plane [in] source plane - * \param transform [in] transform matrix - * \warning the plane normal must be unit-length - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void TransformPlane(Plane& transformed, const Plane& plane, const Matrix4x4& transform) - { - // Rotate the normal using the rotation part of the 4x4 matrix - transformed.n = plane.n * Matrix3x3(transform); - - // Compute new d - transformed.d = plane.d - (Point(transform.GetTrans())|transformed.n); - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. - * \param plane [in/out] source plane (transformed on return) - * \param transform [in] transform matrix - * \warning the plane normal must be unit-length - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void TransformPlane(Plane& plane, const Matrix4x4& transform) - { - // Rotate the normal using the rotation part of the 4x4 matrix - plane.n *= Matrix3x3(transform); - - // Compute new d - plane.d -= Point(transform.GetTrans())|plane.n; - } - -#endif // __ICEPLANE_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IcePoint.cpp b/libraries/ode-0.9/OPCODE/Ice/IcePoint.cpp deleted file mode 100644 index e715055b8a..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IcePoint.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3D vectors. - * \file IcePoint.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * 3D point. - * - * The name is "Point" instead of "Vector" since a vector is N-dimensional, whereas a point is an implicit "vector of dimension 3". - * So the choice was between "Point" and "Vector3", the first one looked better (IMHO). - * - * Some people, then, use a typedef to handle both points & vectors using the same class: typedef Point Vector3; - * This is bad since it opens the door to a lot of confusion while reading the code. I know it may sounds weird but check this out: - * - * \code - * Point P0,P1 = some 3D points; - * Point Delta = P1 - P0; - * \endcode - * - * This compiles fine, although you should have written: - * - * \code - * Point P0,P1 = some 3D points; - * Vector3 Delta = P1 - P0; - * \endcode - * - * Subtle things like this are not caught at compile-time, and when you find one in the code, you never know whether it's a mistake - * from the author or something you don't get. - * - * One way to handle it at compile-time would be to use different classes for Point & Vector3, only overloading operator "-" for vectors. - * But then, you get a lot of redundant code in thoses classes, and basically it's really a lot of useless work. - * - * Another way would be to use homogeneous points: w=1 for points, w=0 for vectors. That's why the HPoint class exists. Now, to store - * your model's vertices and in most cases, you really want to use Points to save ram. - * - * \class Point - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Creates a positive unit random vector. - * \return Self-reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Point& Point::PositiveUnitRandomVector() -{ - x = UnitRandomFloat(); - y = UnitRandomFloat(); - z = UnitRandomFloat(); - Normalize(); - return *this; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Creates a unit random vector. - * \return Self-reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Point& Point::UnitRandomVector() -{ - x = UnitRandomFloat() - 0.5f; - y = UnitRandomFloat() - 0.5f; - z = UnitRandomFloat() - 0.5f; - Normalize(); - return *this; -} - -// Cast operator -// WARNING: not inlined -Point::operator HPoint() const { return HPoint(x, y, z, 0.0f); } - -Point& Point::Refract(const Point& eye, const Point& n, float refractindex, Point& refracted) -{ - // Point EyePt = eye position - // Point p = current vertex - // Point n = vertex normal - // Point rv = refracted vector - // Eye vector - doesn't need to be normalized - Point Env; - Env.x = eye.x - x; - Env.y = eye.y - y; - Env.z = eye.z - z; - - float NDotE = n|Env; - float NDotN = n|n; - NDotE /= refractindex; - - // Refracted vector - refracted = n*NDotE - Env*NDotN; - - return *this; -} - -Point& Point::ProjectToPlane(const Plane& p) -{ - *this-= (p.d + (*this|p.n))*p.n; - return *this; -} - -void Point::ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const -{ - projected = HPoint(x, y, z, 1.0f) * mat; - projected.w = 1.0f / projected.w; - - projected.x*=projected.w; - projected.y*=projected.w; - projected.z*=projected.w; - - projected.x *= halfrenderwidth; projected.x += halfrenderwidth; - projected.y *= -halfrenderheight; projected.y += halfrenderheight; -} - -void Point::SetNotUsed() -{ - // We use a particular integer pattern : 0xffffffff everywhere. This is a NAN. - IR(x) = 0xffffffff; - IR(y) = 0xffffffff; - IR(z) = 0xffffffff; -} - -BOOL Point::IsNotUsed() const -{ - if(IR(x)!=0xffffffff) return FALSE; - if(IR(y)!=0xffffffff) return FALSE; - if(IR(z)!=0xffffffff) return FALSE; - return TRUE; -} - -Point& Point::Mult(const Matrix3x3& mat, const Point& a) -{ - x = a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; - y = a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; - z = a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; - return *this; -} - -Point& Point::Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2) -{ - x = a1.x * mat1.m[0][0] + a1.y * mat1.m[0][1] + a1.z * mat1.m[0][2] + a2.x * mat2.m[0][0] + a2.y * mat2.m[0][1] + a2.z * mat2.m[0][2]; - y = a1.x * mat1.m[1][0] + a1.y * mat1.m[1][1] + a1.z * mat1.m[1][2] + a2.x * mat2.m[1][0] + a2.y * mat2.m[1][1] + a2.z * mat2.m[1][2]; - z = a1.x * mat1.m[2][0] + a1.y * mat1.m[2][1] + a1.z * mat1.m[2][2] + a2.x * mat2.m[2][0] + a2.y * mat2.m[2][1] + a2.z * mat2.m[2][2]; - return *this; -} - -Point& Point::Mac(const Matrix3x3& mat, const Point& a) -{ - x += a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; - y += a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; - z += a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; - return *this; -} - -Point& Point::TransMult(const Matrix3x3& mat, const Point& a) -{ - x = a.x * mat.m[0][0] + a.y * mat.m[1][0] + a.z * mat.m[2][0]; - y = a.x * mat.m[0][1] + a.y * mat.m[1][1] + a.z * mat.m[2][1]; - z = a.x * mat.m[0][2] + a.y * mat.m[1][2] + a.z * mat.m[2][2]; - return *this; -} - -Point& Point::Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) -{ - x = r.x * rotpos.m[0][0] + r.y * rotpos.m[0][1] + r.z * rotpos.m[0][2] + linpos.x; - y = r.x * rotpos.m[1][0] + r.y * rotpos.m[1][1] + r.z * rotpos.m[1][2] + linpos.y; - z = r.x * rotpos.m[2][0] + r.y * rotpos.m[2][1] + r.z * rotpos.m[2][2] + linpos.z; - return *this; -} - -Point& Point::InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) -{ - float sx = r.x - linpos.x; - float sy = r.y - linpos.y; - float sz = r.z - linpos.z; - x = sx * rotpos.m[0][0] + sy * rotpos.m[1][0] + sz * rotpos.m[2][0]; - y = sx * rotpos.m[0][1] + sy * rotpos.m[1][1] + sz * rotpos.m[2][1]; - z = sx * rotpos.m[0][2] + sy * rotpos.m[1][2] + sz * rotpos.m[2][2]; - return *this; -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IcePoint.h b/libraries/ode-0.9/OPCODE/Ice/IcePoint.h deleted file mode 100644 index a97fbe6f9a..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IcePoint.h +++ /dev/null @@ -1,528 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for 3D vectors. - * \file IcePoint.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPOINT_H__ -#define __ICEPOINT_H__ - - // Forward declarations - class HPoint; - class Plane; - class Matrix3x3; - class Matrix4x4; - - #define CROSS2D(a, b) (a.x*b.y - b.x*a.y) - - const float EPSILON2 = 1.0e-20f; - - class ICEMATHS_API Point - { - public: - - //! Empty constructor - inline_ Point() {} - //! Constructor from a single float -// inline_ Point(float val) : x(val), y(val), z(val) {} -// Removed since it introduced the nasty "Point T = *Matrix4x4.GetTrans();" bug....... - //! Constructor from floats - inline_ Point(float xx, float yy, float zz) : x(xx), y(yy), z(zz) {} - //! Constructor from array - inline_ Point(const float f[3]) : x(f[X]), y(f[Y]), z(f[Z]) {} - //! Copy constructor - inline_ Point(const Point& p) : x(p.x), y(p.y), z(p.z) {} - //! Destructor - inline_ ~Point() {} - - //! Clears the vector - inline_ Point& Zero() { x = y = z = 0.0f; return *this; } - - //! + infinity - inline_ Point& SetPlusInfinity() { x = y = z = MAX_FLOAT; return *this; } - //! - infinity - inline_ Point& SetMinusInfinity() { x = y = z = MIN_FLOAT; return *this; } - - //! Sets positive unit random vector - Point& PositiveUnitRandomVector(); - //! Sets unit random vector - Point& UnitRandomVector(); - - //! Assignment from values - inline_ Point& Set(float xx, float yy, float zz) { x = xx; y = yy; z = zz; return *this; } - //! Assignment from array - inline_ Point& Set(const float f[3]) { x = f[X]; y = f[Y]; z = f[Z]; return *this; } - //! Assignment from another point - inline_ Point& Set(const Point& src) { x = src.x; y = src.y; z = src.z; return *this; } - - //! Adds a vector - inline_ Point& Add(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } - //! Adds a vector - inline_ Point& Add(float xx, float yy, float zz) { x += xx; y += yy; z += zz; return *this; } - //! Adds a vector - inline_ Point& Add(const float f[3]) { x += f[X]; y += f[Y]; z += f[Z]; return *this; } - //! Adds vectors - inline_ Point& Add(const Point& p, const Point& q) { x = p.x+q.x; y = p.y+q.y; z = p.z+q.z; return *this; } - - //! Subtracts a vector - inline_ Point& Sub(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } - //! Subtracts a vector - inline_ Point& Sub(float xx, float yy, float zz) { x -= xx; y -= yy; z -= zz; return *this; } - //! Subtracts a vector - inline_ Point& Sub(const float f[3]) { x -= f[X]; y -= f[Y]; z -= f[Z]; return *this; } - //! Subtracts vectors - inline_ Point& Sub(const Point& p, const Point& q) { x = p.x-q.x; y = p.y-q.y; z = p.z-q.z; return *this; } - - //! this = -this - inline_ Point& Neg() { x = -x; y = -y; z = -z; return *this; } - //! this = -a - inline_ Point& Neg(const Point& a) { x = -a.x; y = -a.y; z = -a.z; return *this; } - - //! Multiplies by a scalar - inline_ Point& Mult(float s) { x *= s; y *= s; z *= s; return *this; } - - //! this = a * scalar - inline_ Point& Mult(const Point& a, float scalar) - { - x = a.x * scalar; - y = a.y * scalar; - z = a.z * scalar; - return *this; - } - - //! this = a + b * scalar - inline_ Point& Mac(const Point& a, const Point& b, float scalar) - { - x = a.x + b.x * scalar; - y = a.y + b.y * scalar; - z = a.z + b.z * scalar; - return *this; - } - - //! this = this + a * scalar - inline_ Point& Mac(const Point& a, float scalar) - { - x += a.x * scalar; - y += a.y * scalar; - z += a.z * scalar; - return *this; - } - - //! this = a - b * scalar - inline_ Point& Msc(const Point& a, const Point& b, float scalar) - { - x = a.x - b.x * scalar; - y = a.y - b.y * scalar; - z = a.z - b.z * scalar; - return *this; - } - - //! this = this - a * scalar - inline_ Point& Msc(const Point& a, float scalar) - { - x -= a.x * scalar; - y -= a.y * scalar; - z -= a.z * scalar; - return *this; - } - - //! this = a + b * scalarb + c * scalarc - inline_ Point& Mac2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) - { - x = a.x + b.x * scalarb + c.x * scalarc; - y = a.y + b.y * scalarb + c.y * scalarc; - z = a.z + b.z * scalarb + c.z * scalarc; - return *this; - } - - //! this = a - b * scalarb - c * scalarc - inline_ Point& Msc2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) - { - x = a.x - b.x * scalarb - c.x * scalarc; - y = a.y - b.y * scalarb - c.y * scalarc; - z = a.z - b.z * scalarb - c.z * scalarc; - return *this; - } - - //! this = mat * a - inline_ Point& Mult(const Matrix3x3& mat, const Point& a); - - //! this = mat1 * a1 + mat2 * a2 - inline_ Point& Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2); - - //! this = this + mat * a - inline_ Point& Mac(const Matrix3x3& mat, const Point& a); - - //! this = transpose(mat) * a - inline_ Point& TransMult(const Matrix3x3& mat, const Point& a); - - //! Linear interpolate between two vectors: this = a + t * (b - a) - inline_ Point& Lerp(const Point& a, const Point& b, float t) - { - x = a.x + t * (b.x - a.x); - y = a.y + t * (b.y - a.y); - z = a.z + t * (b.z - a.z); - return *this; - } - - //! Hermite interpolate between p1 and p2. p0 and p3 are used for finding gradient at p1 and p2. - //! this = p0 * (2t^2 - t^3 - t)/2 - //! + p1 * (3t^3 - 5t^2 + 2)/2 - //! + p2 * (4t^2 - 3t^3 + t)/2 - //! + p3 * (t^3 - t^2)/2 - inline_ Point& Herp(const Point& p0, const Point& p1, const Point& p2, const Point& p3, float t) - { - float t2 = t * t; - float t3 = t2 * t; - float kp0 = (2.0f * t2 - t3 - t) * 0.5f; - float kp1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f; - float kp2 = (4.0f * t2 - 3.0f * t3 + t) * 0.5f; - float kp3 = (t3 - t2) * 0.5f; - x = p0.x * kp0 + p1.x * kp1 + p2.x * kp2 + p3.x * kp3; - y = p0.y * kp0 + p1.y * kp1 + p2.y * kp2 + p3.y * kp3; - z = p0.z * kp0 + p1.z * kp1 + p2.z * kp2 + p3.z * kp3; - return *this; - } - - //! this = rotpos * r + linpos - inline_ Point& Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); - - //! this = trans(rotpos) * (r - linpos) - inline_ Point& InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); - - //! Returns MIN(x, y, z); - inline_ float Min() const { return MIN(x, MIN(y, z)); } - //! Returns MAX(x, y, z); - inline_ float Max() const { return MAX(x, MAX(y, z)); } - //! Sets each element to be componentwise minimum - inline_ Point& Min(const Point& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); return *this; } - //! Sets each element to be componentwise maximum - inline_ Point& Max(const Point& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); return *this; } - - //! Clamps each element - inline_ Point& Clamp(float min, float max) - { - if(xmax) x=max; - if(ymax) y=max; - if(zmax) z=max; - return *this; - } - - //! Computes square magnitude - inline_ float SquareMagnitude() const { return x*x + y*y + z*z; } - //! Computes magnitude - inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z); } - //! Computes volume - inline_ float Volume() const { return x * y * z; } - - //! Checks the point is near zero - inline_ bool ApproxZero() const { return SquareMagnitude() < EPSILON2; } - - //! Tests for exact zero vector - inline_ BOOL IsZero() const - { - if(IR(x) || IR(y) || IR(z)) return FALSE; - return TRUE; - } - - //! Checks point validity - inline_ BOOL IsValid() const - { - if(!IsValidFloat(x)) return FALSE; - if(!IsValidFloat(y)) return FALSE; - if(!IsValidFloat(z)) return FALSE; - return TRUE; - } - - //! Slighty moves the point - void Tweak(udword coord_mask, udword tweak_mask) - { - if(coord_mask&1) { udword Dummy = IR(x); Dummy^=tweak_mask; x = FR(Dummy); } - if(coord_mask&2) { udword Dummy = IR(y); Dummy^=tweak_mask; y = FR(Dummy); } - if(coord_mask&4) { udword Dummy = IR(z); Dummy^=tweak_mask; z = FR(Dummy); } - } - - #define TWEAKMASK 0x3fffff - #define TWEAKNOTMASK ~TWEAKMASK - //! Slighty moves the point out - inline_ void TweakBigger() - { - udword Dummy = (IR(x)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); - Dummy = (IR(y)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); - Dummy = (IR(z)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); - } - - //! Slighty moves the point in - inline_ void TweakSmaller() - { - udword Dummy = (IR(x)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); - Dummy = (IR(y)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); - Dummy = (IR(z)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); - } - - //! Normalizes the vector - inline_ Point& Normalize() - { - float M = x*x + y*y + z*z; - if(M) - { - M = 1.0f / sqrtf(M); - x *= M; - y *= M; - z *= M; - } - return *this; - } - - //! Sets vector length - inline_ Point& SetLength(float length) - { - float NewLength = length / Magnitude(); - x *= NewLength; - y *= NewLength; - z *= NewLength; - return *this; - } - - //! Clamps vector length - inline_ Point& ClampLength(float limit_length) - { - if(limit_length>=0.0f) // Magnitude must be positive - { - float CurrentSquareLength = SquareMagnitude(); - - if(CurrentSquareLength > limit_length * limit_length) - { - float Coeff = limit_length / sqrtf(CurrentSquareLength); - x *= Coeff; - y *= Coeff; - z *= Coeff; - } - } - return *this; - } - - //! Computes distance to another point - inline_ float Distance(const Point& b) const - { - return sqrtf((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); - } - - //! Computes square distance to another point - inline_ float SquareDistance(const Point& b) const - { - return ((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); - } - - //! Dot product dp = this|a - inline_ float Dot(const Point& p) const { return p.x * x + p.y * y + p.z * z; } - - //! Cross product this = a x b - inline_ Point& Cross(const Point& a, const Point& b) - { - x = a.y * b.z - a.z * b.y; - y = a.z * b.x - a.x * b.z; - z = a.x * b.y - a.y * b.x; - return *this; - } - - //! Vector code ( bitmask = sign(z) | sign(y) | sign(x) ) - inline_ udword VectorCode() const - { - return (IR(x)>>31) | ((IR(y)&SIGN_BITMASK)>>30) | ((IR(z)&SIGN_BITMASK)>>29); - } - - //! Returns largest axis - inline_ PointComponent LargestAxis() const - { - const float* Vals = &x; - PointComponent m = X; - if(Vals[Y] > Vals[m]) m = Y; - if(Vals[Z] > Vals[m]) m = Z; - return m; - } - - //! Returns closest axis - inline_ PointComponent ClosestAxis() const - { - const float* Vals = &x; - PointComponent m = X; - if(AIR(Vals[Y]) > AIR(Vals[m])) m = Y; - if(AIR(Vals[Z]) > AIR(Vals[m])) m = Z; - return m; - } - - //! Returns smallest axis - inline_ PointComponent SmallestAxis() const - { - const float* Vals = &x; - PointComponent m = X; - if(Vals[Y] < Vals[m]) m = Y; - if(Vals[Z] < Vals[m]) m = Z; - return m; - } - - //! Refracts the point - Point& Refract(const Point& eye, const Point& n, float refractindex, Point& refracted); - - //! Projects the point onto a plane - Point& ProjectToPlane(const Plane& p); - - //! Projects the point onto the screen - void ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const; - - //! Unfolds the point onto a plane according to edge(a,b) - Point& Unfold(Plane& p, Point& a, Point& b); - - //! Hash function from Ville Miettinen - inline_ udword GetHashValue() const - { - const udword* h = (const udword*)(this); - udword f = (h[0]+h[1]*11-(h[2]*17)) & 0x7fffffff; // avoid problems with +-0 - return (f>>22)^(f>>12)^(f); - } - - //! Stuff magic values in the point, marking it as explicitely not used. - void SetNotUsed(); - //! Checks the point is marked as not used - BOOL IsNotUsed() const; - - // Arithmetic operators - - //! Unary operator for Point Negate = - Point - inline_ Point operator-() const { return Point(-x, -y, -z); } - - //! Operator for Point Plus = Point + Point. - inline_ Point operator+(const Point& p) const { return Point(x + p.x, y + p.y, z + p.z); } - //! Operator for Point Minus = Point - Point. - inline_ Point operator-(const Point& p) const { return Point(x - p.x, y - p.y, z - p.z); } - - //! Operator for Point Mul = Point * Point. - inline_ Point operator*(const Point& p) const { return Point(x * p.x, y * p.y, z * p.z); } - //! Operator for Point Scale = Point * float. - inline_ Point operator*(float s) const { return Point(x * s, y * s, z * s ); } - //! Operator for Point Scale = float * Point. - inline_ friend Point operator*(float s, const Point& p) { return Point(s * p.x, s * p.y, s * p.z); } - - //! Operator for Point Div = Point / Point. - inline_ Point operator/(const Point& p) const { return Point(x / p.x, y / p.y, z / p.z); } - //! Operator for Point Scale = Point / float. - inline_ Point operator/(float s) const { s = 1.0f / s; return Point(x * s, y * s, z * s); } - //! Operator for Point Scale = float / Point. - inline_ friend Point operator/(float s, const Point& p) { return Point(s / p.x, s / p.y, s / p.z); } - - //! Operator for float DotProd = Point | Point. - inline_ float operator|(const Point& p) const { return x*p.x + y*p.y + z*p.z; } - //! Operator for Point VecProd = Point ^ Point. - inline_ Point operator^(const Point& p) const - { - return Point( - y * p.z - z * p.y, - z * p.x - x * p.z, - x * p.y - y * p.x ); - } - - //! Operator for Point += Point. - inline_ Point& operator+=(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } - //! Operator for Point += float. - inline_ Point& operator+=(float s) { x += s; y += s; z += s; return *this; } - - //! Operator for Point -= Point. - inline_ Point& operator-=(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } - //! Operator for Point -= float. - inline_ Point& operator-=(float s) { x -= s; y -= s; z -= s; return *this; } - - //! Operator for Point *= Point. - inline_ Point& operator*=(const Point& p) { x *= p.x; y *= p.y; z *= p.z; return *this; } - //! Operator for Point *= float. - inline_ Point& operator*=(float s) { x *= s; y *= s; z *= s; return *this; } - - //! Operator for Point /= Point. - inline_ Point& operator/=(const Point& p) { x /= p.x; y /= p.y; z /= p.z; return *this; } - //! Operator for Point /= float. - inline_ Point& operator/=(float s) { s = 1.0f/s; x *= s; y *= s; z *= s; return *this; } - - // Logical operators - - //! Operator for "if(Point==Point)" - inline_ bool operator==(const Point& p) const { return ( (IR(x)==IR(p.x))&&(IR(y)==IR(p.y))&&(IR(z)==IR(p.z))); } - //! Operator for "if(Point!=Point)" - inline_ bool operator!=(const Point& p) const { return ( (IR(x)!=IR(p.x))||(IR(y)!=IR(p.y))||(IR(z)!=IR(p.z))); } - - // Arithmetic operators - - //! Operator for Point Mul = Point * Matrix3x3. - inline_ Point operator*(const Matrix3x3& mat) const - { - class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining - const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; - - return Point( - x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0], - x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1], - x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] ); - } - - //! Operator for Point Mul = Point * Matrix4x4. - inline_ Point operator*(const Matrix4x4& mat) const - { - class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining - const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; - - return Point( - x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0], - x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1], - x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]); - } - - //! Operator for Point *= Matrix3x3. - inline_ Point& operator*=(const Matrix3x3& mat) - { - class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining - const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; - - float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0]; - float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1]; - float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2]; - - x = xp; y = yp; z = zp; - - return *this; - } - - //! Operator for Point *= Matrix4x4. - inline_ Point& operator*=(const Matrix4x4& mat) - { - class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining - const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; - - float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0]; - float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1]; - float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]; - - x = xp; y = yp; z = zp; - - return *this; - } - - // Cast operators - - //! Cast a Point to a HPoint. w is set to zero. - operator HPoint() const; - - inline_ operator const float*() const { return &x; } - inline_ operator float*() { return &x; } - - public: - float x, y, z; - }; - - FUNCTION ICEMATHS_API void Normalize1(Point& a); - FUNCTION ICEMATHS_API void Normalize2(Point& a); - -#endif //__ICEPOINT_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IcePreprocessor.h b/libraries/ode-0.9/OPCODE/Ice/IcePreprocessor.h deleted file mode 100644 index dbeca3820d..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IcePreprocessor.h +++ /dev/null @@ -1,132 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains preprocessor stuff. This should be the first included header. - * \file IcePreprocessor.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICEPREPROCESSOR_H__ -#define __ICEPREPROCESSOR_H__ - - // Check platform - #if defined( _WIN32 ) || defined( WIN32 ) - // #pragma message("Compiling on Windows...") - #define PLATFORM_WINDOWS - #else - // don't issue pragmas on unknown platforms - // #pragma message("Compiling on unknown platform...") - #endif - - // Check compiler - #if defined(_MSC_VER) - // #pragma message("Compiling with VC++...") - #define COMPILER_VISUAL_CPP - #else - // don't issue pragmas on unknown platforms - // #pragma message("Compiling with unknown compiler...") - #endif - - // Check compiler options. If this file is included in user-apps, this - // shouldn't be needed, so that they can use what they like best. - #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS - #ifdef COMPILER_VISUAL_CPP - #if defined(_CHAR_UNSIGNED) - #endif - - #if defined(_CPPRTTI) - #error Please disable RTTI... - #endif - - #if defined(_CPPUNWIND) - #error Please disable exceptions... - #endif - - #if defined(_MT) - // Multithreading - #endif - #endif - #endif - - // Check debug mode - #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. - #ifndef _DEBUG - #define _DEBUG - #endif - #endif - - #ifdef _DEBUG - // Here you may define items for debug builds - #endif - - #ifndef THIS_FILE - #define THIS_FILE __FILE__ - #endif - - #ifndef ICE_NO_DLL - #ifdef ICECORE_EXPORTS - #define ICECORE_API __declspec(dllexport) - #else - #define ICECORE_API __declspec(dllimport) - #endif - #else - #define ICECORE_API - #endif - - // Don't override new/delete -// #define DEFAULT_NEWDELETE - #define DONT_TRACK_MEMORY_LEAKS - - #define FUNCTION extern "C" - - // Cosmetic stuff [mainly useful with multiple inheritance] - #define override(base_class) virtual - - // Our own inline keyword, so that: - // - we can switch to __forceinline to check it's really better or not - // - we can remove __forceinline if the compiler doesn't support it -// #define inline_ __forceinline -// #define inline_ inline - - // Contributed by Bruce Mitchener - #if defined(COMPILER_VISUAL_CPP) - #define inline_ __forceinline -// #define inline_ inline - #elif defined(__GNUC__) && __GNUC__ < 3 - #define inline_ inline - #elif defined(__GNUC__) - #define inline_ inline __attribute__ ((always_inline)) - #else - #define inline_ inline - #endif - - // Down the hatch -#ifdef _MSC_VER - #pragma inline_depth( 255 ) -#endif - - #ifdef COMPILER_VISUAL_CPP - #pragma intrinsic(memcmp) - #pragma intrinsic(memcpy) - #pragma intrinsic(memset) - #pragma intrinsic(strcat) - #pragma intrinsic(strcmp) - #pragma intrinsic(strcpy) - #pragma intrinsic(strlen) - #pragma intrinsic(abs) - #pragma intrinsic(labs) - #endif - - // ANSI compliance - #ifdef _DEBUG - // Remove painful warning in debug - inline_ bool __False__(){ return false; } - #define for if(__False__()){} else for - #else - #define for if(0){} else for - #endif - -#endif // __ICEPREPROCESSOR_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceRandom.cpp b/libraries/ode-0.9/OPCODE/Ice/IceRandom.cpp deleted file mode 100644 index cc63a042ca..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceRandom.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for random generators. - * \file IceRandom.cpp - * \author Pierre Terdiman - * \date August, 9, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceCore; - -void IceCore:: SRand(udword seed) -{ - srand(seed); -} - -udword IceCore::Rand() -{ - return rand(); -} - - -static BasicRandom gRandomGenerator(42); - -udword IceCore::GetRandomIndex(udword max_index) -{ - // We don't use rand() since it's limited to RAND_MAX - udword Index = gRandomGenerator.Randomize(); - return Index % max_index; -} - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceRandom.h b/libraries/ode-0.9/OPCODE/Ice/IceRandom.h deleted file mode 100644 index 3170b33de5..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceRandom.h +++ /dev/null @@ -1,42 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for random generators. - * \file IceRandom.h - * \author Pierre Terdiman - * \date August, 9, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICERANDOM_H__ -#define __ICERANDOM_H__ - - FUNCTION ICECORE_API void SRand(udword seed); - FUNCTION ICECORE_API udword Rand(); - - //! Returns a unit random floating-point value - inline_ float UnitRandomFloat() { return float(Rand()) * ONE_OVER_RAND_MAX; } - - //! Returns a random index so that 0<= index < max_index - ICECORE_API udword GetRandomIndex(udword max_index); - - class ICECORE_API BasicRandom - { - public: - - //! Constructor - inline_ BasicRandom(udword seed=0) : mRnd(seed) {} - //! Destructor - inline_ ~BasicRandom() {} - - inline_ void SetSeed(udword seed) { mRnd = seed; } - inline_ udword GetCurrentValue() const { return mRnd; } - inline_ udword Randomize() { mRnd = mRnd * 2147001325 + 715136305; return mRnd; } - - private: - udword mRnd; - }; - -#endif // __ICERANDOM_H__ - diff --git a/libraries/ode-0.9/OPCODE/Ice/IceRay.cpp b/libraries/ode-0.9/OPCODE/Ice/IceRay.cpp deleted file mode 100644 index 6cf0330bc5..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceRay.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for rays. - * \file IceRay.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Ray class. - * A ray is a half-line P(t) = mOrig + mDir * t, with 0 <= t <= +infinity - * \class Ray - * \author Pierre Terdiman - * \version 1.0 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* - O = Origin = impact point - i = normalized vector along the x axis - j = normalized vector along the y axis = actually the normal vector in O - D = Direction vector, norm |D| = 1 - N = Projection of D on y axis, norm |N| = normal reaction - T = Projection of D on x axis, norm |T| = tangential reaction - R = Reflexion vector - - ^y - | - | - | - _ _ _| _ _ _ - * * *| - \ | / - \ |N / | - R\ | /D - \ | / | - \ | / - _________\|/______*_______>x - O T - - Let define theta = angle between D and N. Then cos(theta) = |N| / |D| = |N| since D is normalized. - - j|D = |j|*|D|*cos(theta) => |N| = j|D - - Then we simply have: - - D = N + T - - To compute tangential reaction : - - T = D - N - - To compute reflexion vector : - - R = N - T = N - (D-N) = 2*N - D -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -float Ray::SquareDistance(const Point& point, float* t) const -{ - Point Diff = point - mOrig; - float fT = Diff | mDir; - - if(fT<=0.0f) - { - fT = 0.0f; - } - else - { - fT /= mDir.SquareMagnitude(); - Diff -= fT*mDir; - } - - if(t) *t = fT; - - return Diff.SquareMagnitude(); -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IceRay.h b/libraries/ode-0.9/OPCODE/Ice/IceRay.h deleted file mode 100644 index 0268287672..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceRay.h +++ /dev/null @@ -1,98 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for rays. - * \file IceRay.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICERAY_H__ -#define __ICERAY_H__ - - class ICEMATHS_API Ray - { - public: - //! Constructor - inline_ Ray() {} - //! Constructor - inline_ Ray(const Point& orig, const Point& dir) : mOrig(orig), mDir(dir) {} - //! Copy constructor - inline_ Ray(const Ray& ray) : mOrig(ray.mOrig), mDir(ray.mDir) {} - //! Destructor - inline_ ~Ray() {} - - float SquareDistance(const Point& point, float* t=null) const; - inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } - - Point mOrig; //!< Ray origin - Point mDir; //!< Normalized direction - }; - - inline_ void ComputeReflexionVector(Point& reflected, const Point& incoming_dir, const Point& outward_normal) - { - reflected = incoming_dir - outward_normal * 2.0f * (incoming_dir|outward_normal); - } - - inline_ void ComputeReflexionVector(Point& reflected, const Point& source, const Point& impact, const Point& normal) - { - Point V = impact - source; - reflected = V - normal * 2.0f * (V|normal); - } - - inline_ void DecomposeVector(Point& normal_compo, Point& tangent_compo, const Point& outward_dir, const Point& outward_normal) - { - normal_compo = outward_normal * (outward_dir|outward_normal); - tangent_compo = outward_dir - normal_compo; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a direction vector from world space to local space - * \param local_dir [out] direction vector in local space - * \param world_dir [in] direction vector in world space - * \param world [in] world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputeLocalDirection(Point& local_dir, const Point& world_dir, const Matrix4x4& world) - { - // Get world direction back in local space -// Matrix3x3 InvWorld = world; -// local_dir = InvWorld * world_dir; - local_dir = Matrix3x3(world) * world_dir; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a position vector from world space to local space - * \param local_pt [out] position vector in local space - * \param world_pt [in] position vector in world space - * \param world [in] world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputeLocalPoint(Point& local_pt, const Point& world_pt, const Matrix4x4& world) - { - // Get world vertex back in local space - Matrix4x4 InvWorld = world; - InvWorld.Invert(); - local_pt = world_pt * InvWorld; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Transforms a ray from world space to local space - * \param local_ray [out] ray in local space - * \param world_ray [in] ray in world space - * \param world [in] world transform - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputeLocalRay(Ray& local_ray, const Ray& world_ray, const Matrix4x4& world) - { - // Get world ray back in local space - ComputeLocalDirection(local_ray.mDir, world_ray.mDir, world); - ComputeLocalPoint(local_ray.mOrig, world_ray.mOrig, world); - } - -#endif // __ICERAY_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceRevisitedRadix.cpp b/libraries/ode-0.9/OPCODE/Ice/IceRevisitedRadix.cpp deleted file mode 100644 index 3e351da941..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceRevisitedRadix.cpp +++ /dev/null @@ -1,520 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains source code from the article "Radix Sort Revisited". - * \file IceRevisitedRadix.cpp - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Revisited Radix Sort. - * This is my new radix routine: - * - it uses indices and doesn't recopy the values anymore, hence wasting less ram - * - it creates all the histograms in one run instead of four - * - it sorts words faster than dwords and bytes faster than words - * - it correctly sorts negative floating-point values by patching the offsets - * - it automatically takes advantage of temporal coherence - * - multiple keys support is a side effect of temporal coherence - * - it may be worth recoding in asm... (mainly to use FCOMI, FCMOV, etc) [it's probably memory-bound anyway] - * - * History: - * - 08.15.98: very first version - * - 04.04.00: recoded for the radix article - * - 12.xx.00: code lifting - * - 09.18.01: faster CHECK_PASS_VALIDITY thanks to Mark D. Shattuck (who provided other tips, not included here) - * - 10.11.01: added local ram support - * - 01.20.02: bugfix! In very particular cases the last pass was skipped in the float code-path, leading to incorrect sorting...... - * - 01.02.02: - "mIndices" renamed => "mRanks". That's a rank sorter after all. - * - ranks are not "reset" anymore, but implicit on first calls - * - 07.05.02: - offsets rewritten with one less indirection. - * - 11.03.02: - "bool" replaced with RadixHint enum - * - * \class RadixSort - * \author Pierre Terdiman - * \version 1.4 - * \date August, 15, 1998 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* -To do: - - add an offset parameter between two input values (avoid some data recopy sometimes) - - unroll ? asm ? - - 11 bits trick & 3 passes as Michael did - - prefetch stuff the day I have a P3 - - make a version with 16-bits indices ? -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceCore; - -#define INVALIDATE_RANKS mCurrentSize|=0x80000000 -#define VALIDATE_RANKS mCurrentSize&=0x7fffffff -#define CURRENT_SIZE (mCurrentSize&0x7fffffff) -#define INVALID_RANKS (mCurrentSize&0x80000000) - -#define CHECK_RESIZE(n) \ - if(n!=mPreviousSize) \ - { \ - if(n>mCurrentSize) Resize(n); \ - else ResetRanks(); \ - mPreviousSize = n; \ - } - -#define CREATE_HISTOGRAMS(type, buffer) \ - /* Clear counters/histograms */ \ - ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ - \ - /* Prepare to count */ \ - ubyte* p = (ubyte*)input; \ - ubyte* pe = &p[nb*4]; \ - udword* h0= &mHistogram[0]; /* Histogram for first pass (LSB) */ \ - udword* h1= &mHistogram[256]; /* Histogram for second pass */ \ - udword* h2= &mHistogram[512]; /* Histogram for third pass */ \ - udword* h3= &mHistogram[768]; /* Histogram for last pass (MSB) */ \ - \ - bool AlreadySorted = true; /* Optimism... */ \ - \ - if(INVALID_RANKS) \ - { \ - /* Prepare for temporal coherence */ \ - type* Running = (type*)buffer; \ - type PrevVal = *Running; \ - \ - while(p!=pe) \ - { \ - /* Read input buffer in previous sorted order */ \ - type Val = *Running++; \ - /* Check whether already sorted or not */ \ - if(ValCurSize) Resize(nb); - mCurrentSize = nb; - INVALIDATE_RANKS; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main sort routine. - * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. - * \param input [in] a list of integer values to sort - * \param nb [in] number of values to sort, must be < 2^31 - * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values - * \return Self-Reference - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) -{ - // Checkings - if(!input || !nb || nb&0x80000000) return *this; - - // Stats - mTotalCalls++; - - // Resize lists if needed - CheckResize(nb); - -#ifdef RADIX_LOCAL_RAM - // Allocate histograms & offsets on the stack - udword mHistogram[256*4]; -// udword mOffset[256]; - udword* mLink[256]; -#endif - - // Create histograms (counters). Counters for all passes are created in one run. - // Pros: read input buffer once instead of four times - // Cons: mHistogram is 4Kb instead of 1Kb - // We must take care of signed/unsigned values for temporal coherence.... I just - // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? - if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } - else { CREATE_HISTOGRAMS(sdword, input); } - - // Compute #negative values involved if needed - udword NbNegativeValues = 0; - if(hint==RADIX_SIGNED) - { - // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 - // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, - // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. - udword* h3= &mHistogram[768]; - for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part - } - - // Radix sort, j is the pass number (0=LSB, 3=MSB) - for(udword j=0;j<4;j++) - { - CHECK_PASS_VALIDITY(j); - - // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is - // not a problem, numbers are correctly sorted anyway. - if(PerformPass) - { - // Should we care about negative values? - if(j!=3 || hint==RADIX_UNSIGNED) - { - // Here we deal with positive values only - - // Create offsets -// mOffset[0] = 0; -// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; - mLink[0] = mRanks2; - for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - } - else - { - // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. - - // Create biased offsets, in order for negative numbers to be sorted as well -// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones - mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones -// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers - for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers - - // Fixing the wrong place for negative values -// mOffset[128] = 0; - mLink[128] = mRanks2; -// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; - for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; - } - - // Perform Radix Sort - ubyte* InputBytes = (ubyte*)input; - InputBytes += j; - if(INVALID_RANKS) - { -// for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). - // ### cmp to be killed. Not good. Later. -// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above -// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order - if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above - else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order - } - VALIDATE_RANKS; - } - else - { - for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). - // ### cmp to be killed. Not good. Later. -// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above -// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order - if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above - else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order - } - } - // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. - udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp; - } - else - { - // The pass is useless, yet we still have to reverse the order of current list if all values are negative. - if(UniqueVal>=128) - { - if(INVALID_RANKS) - { - // ###Possible? - for(udword i=0;i=SqrLen) - { - fT = 1.0f; - Diff -= Dir; - } - else - { - fT /= SqrLen; - Diff -= fT*Dir; - } - } - - if(t) *t = fT; - - return Diff.SquareMagnitude(); -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IceSegment.h b/libraries/ode-0.9/OPCODE/Ice/IceSegment.h deleted file mode 100644 index 8d66322689..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceSegment.h +++ /dev/null @@ -1,55 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for segments. - * \file IceSegment.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICESEGMENT_H__ -#define __ICESEGMENT_H__ - - class ICEMATHS_API Segment - { - public: - //! Constructor - inline_ Segment() {} - //! Constructor - inline_ Segment(const Point& p0, const Point& p1) : mP0(p0), mP1(p1) {} - //! Copy constructor - inline_ Segment(const Segment& seg) : mP0(seg.mP0), mP1(seg.mP1) {} - //! Destructor - inline_ ~Segment() {} - - inline_ const Point& GetOrigin() const { return mP0; } - inline_ Point ComputeDirection() const { return mP1 - mP0; } - inline_ void ComputeDirection(Point& dir) const { dir = mP1 - mP0; } - inline_ float ComputeLength() const { return mP1.Distance(mP0); } - inline_ float ComputeSquareLength() const { return mP1.SquareDistance(mP0); } - - inline_ void SetOriginDirection(const Point& origin, const Point& direction) - { - mP0 = mP1 = origin; - mP1 += direction; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Computes a point on the segment - * \param pt [out] point on segment - * \param t [in] point's parameter [t=0 => pt = mP0, t=1 => pt = mP1] - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void ComputePoint(Point& pt, float t) const { pt = mP0 + t * (mP1 - mP0); } - - float SquareDistance(const Point& point, float* t=null) const; - inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } - - Point mP0; //!< Start of segment - Point mP1; //!< End of segment - }; - -#endif // __ICESEGMENT_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceTriList.h b/libraries/ode-0.9/OPCODE/Ice/IceTriList.h deleted file mode 100644 index b2b6ecf642..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceTriList.h +++ /dev/null @@ -1,61 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a triangle container. - * \file IceTrilist.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICETRILIST_H__ -#define __ICETRILIST_H__ - - class ICEMATHS_API TriList : public Container - { - public: - // Constructor / Destructor - TriList() {} - ~TriList() {} - - inline_ udword GetNbTriangles() const { return GetNbEntries()/9; } - inline_ Triangle* GetTriangles() const { return (Triangle*)GetEntries(); } - - void AddTri(const Triangle& tri) - { - Add(tri.mVerts[0].x).Add(tri.mVerts[0].y).Add(tri.mVerts[0].z); - Add(tri.mVerts[1].x).Add(tri.mVerts[1].y).Add(tri.mVerts[1].z); - Add(tri.mVerts[2].x).Add(tri.mVerts[2].y).Add(tri.mVerts[2].z); - } - - void AddTri(const Point& p0, const Point& p1, const Point& p2) - { - Add(p0.x).Add(p0.y).Add(p0.z); - Add(p1.x).Add(p1.y).Add(p1.z); - Add(p2.x).Add(p2.y).Add(p2.z); - } - }; - - class ICEMATHS_API TriangleList : public Container - { - public: - // Constructor / Destructor - TriangleList() {} - ~TriangleList() {} - - inline_ udword GetNbTriangles() const { return GetNbEntries()/3; } - inline_ IndexedTriangle* GetTriangles() const { return (IndexedTriangle*)GetEntries();} - - void AddTriangle(const IndexedTriangle& tri) - { - Add(tri.mVRef[0]).Add(tri.mVRef[1]).Add(tri.mVRef[2]); - } - - void AddTriangle(udword vref0, udword vref1, udword vref2) - { - Add(vref0).Add(vref1).Add(vref2); - } - }; - -#endif //__ICETRILIST_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceTriangle.cpp b/libraries/ode-0.9/OPCODE/Ice/IceTriangle.cpp deleted file mode 100644 index 4268ff4a3e..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceTriangle.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy triangle class. - * \file IceTriangle.cpp - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace IceMaths; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a triangle class. - * - * \class Tri - * \author Pierre Terdiman - * \version 1.0 - * \date 08.15.98 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -static sdword VPlaneSideEps(const Point& v, const Plane& plane, float epsilon) -{ - // Compute distance from current vertex to the plane - float Dist = plane.Distance(v); - // Compute side: - // 1 = the vertex is on the positive side of the plane - // -1 = the vertex is on the negative side of the plane - // 0 = the vertex is on the plane (within epsilon) - return Dist > epsilon ? 1 : Dist < -epsilon ? -1 : 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Flips the winding order. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::Flip() -{ - Point Tmp = mVerts[1]; - mVerts[1] = mVerts[2]; - mVerts[2] = Tmp; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle area. - * \return the area - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::Area() const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - return ((p0 - p1)^(p0 - p2)).Magnitude() * 0.5f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle perimeter. - * \return the perimeter - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::Perimeter() const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - return p0.Distance(p1) - + p0.Distance(p2) - + p1.Distance(p2); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle compacity. - * \return the compacity - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::Compacity() const -{ - float P = Perimeter(); - if(P==0.0f) return 0.0f; - return (4.0f*PI*Area()/(P*P)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle normal. - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::Normal(Point& normal) const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - normal = ((p0 - p1)^(p0 - p2)).Normalize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle denormalized normal. - * \param normal [out] the computed normal - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::DenormalizedNormal(Point& normal) const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - normal = ((p0 - p1)^(p0 - p2)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle center. - * \param center [out] the computed center - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::Center(Point& center) const -{ - const Point& p0 = mVerts[0]; - const Point& p1 = mVerts[1]; - const Point& p2 = mVerts[2]; - center = (p0 + p1 + p2)*INV3; -} - -PartVal Triangle::TestAgainstPlane(const Plane& plane, float epsilon) const -{ - bool Pos = false, Neg = false; - - // Loop through all vertices - for(udword i=0;i<3;i++) - { - // Compute side: - sdword Side = VPlaneSideEps(mVerts[i], plane, epsilon); - - if (Side < 0) Neg = true; - else if (Side > 0) Pos = true; - } - - if (!Pos && !Neg) return TRI_ON_PLANE; - else if (Pos && Neg) return TRI_INTERSECT; - else if (Pos && !Neg) return TRI_PLUS_SPACE; - else if (!Pos && Neg) return TRI_MINUS_SPACE; - - // What?! - return TRI_FORCEDWORD; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle moment. - * \param m [out] the moment - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -void Triangle::ComputeMoment(Moment& m) -{ - // Compute the area of the triangle - m.mArea = Area(); - - // Compute the centroid - Center(m.mCentroid); - - // Second-order components. Handle zero-area faces. - Point& p = mVerts[0]; - Point& q = mVerts[1]; - Point& r = mVerts[2]; - if(m.mArea==0.0f) - { - // This triangle has zero area. The second order components would be eliminated with the usual formula, so, for the - // sake of robustness we use an alternative form. These are the centroid and second-order components of the triangle's vertices. - m.mCovariance.m[0][0] = (p.x*p.x + q.x*q.x + r.x*r.x); - m.mCovariance.m[0][1] = (p.x*p.y + q.x*q.y + r.x*r.y); - m.mCovariance.m[0][2] = (p.x*p.z + q.x*q.z + r.x*r.z); - m.mCovariance.m[1][1] = (p.y*p.y + q.y*q.y + r.y*r.y); - m.mCovariance.m[1][2] = (p.y*p.z + q.y*q.z + r.y*r.z); - m.mCovariance.m[2][2] = (p.z*p.z + q.z*q.z + r.z*r.z); - m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; - m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; - m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; - } - else - { - const float OneOverTwelve = 1.0f / 12.0f; - m.mCovariance.m[0][0] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.x + p.x*p.x + q.x*q.x + r.x*r.x) * OneOverTwelve; - m.mCovariance.m[0][1] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.y + p.x*p.y + q.x*q.y + r.x*r.y) * OneOverTwelve; - m.mCovariance.m[1][1] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.y + p.y*p.y + q.y*q.y + r.y*r.y) * OneOverTwelve; - m.mCovariance.m[0][2] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.z + p.x*p.z + q.x*q.z + r.x*r.z) * OneOverTwelve; - m.mCovariance.m[1][2] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.z + p.y*p.z + q.y*q.z + r.y*r.z) * OneOverTwelve; - m.mCovariance.m[2][2] = m.mArea * (9.0f * m.mCentroid.z*m.mCentroid.z + p.z*p.z + q.z*q.z + r.z*r.z) * OneOverTwelve; - m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; - m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; - m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; - } -} -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's smallest edge length. - * \return the smallest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::MinEdgeLength() const -{ - float Min = MAX_FLOAT; - float Length01 = mVerts[0].Distance(mVerts[1]); - float Length02 = mVerts[0].Distance(mVerts[2]); - float Length12 = mVerts[1].Distance(mVerts[2]); - if(Length01 < Min) Min = Length01; - if(Length02 < Min) Min = Length02; - if(Length12 < Min) Min = Length12; - return Min; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the triangle's largest edge length. - * \return the largest edge length - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float Triangle::MaxEdgeLength() const -{ - float Max = MIN_FLOAT; - float Length01 = mVerts[0].Distance(mVerts[1]); - float Length02 = mVerts[0].Distance(mVerts[2]); - float Length12 = mVerts[1].Distance(mVerts[2]); - if(Length01 > Max) Max = Length01; - if(Length02 > Max) Max = Length02; - if(Length12 > Max) Max = Length12; - return Max; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a point on the triangle according to the stabbing information. - * \param u,v [in] point's barycentric coordinates - * \param pt [out] point on triangle - * \param nearvtx [out] index of nearest vertex - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Triangle::ComputePoint(float u, float v, Point& pt, udword* nearvtx) const -{ - // Compute point coordinates - pt = (1.0f - u - v)*mVerts[0] + u*mVerts[1] + v*mVerts[2]; - - // Compute nearest vertex if needed - if(nearvtx) - { - // Compute distance vector - Point d(mVerts[0].SquareDistance(pt), // Distance^2 from vertex 0 to point on the face - mVerts[1].SquareDistance(pt), // Distance^2 from vertex 1 to point on the face - mVerts[2].SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face - - // Get smallest distance - *nearvtx = d.SmallestAxis(); - } -} - -void Triangle::Inflate(float fat_coeff, bool constant_border) -{ - // Compute triangle center - Point TriangleCenter; - Center(TriangleCenter); - - // Don't normalize? - // Normalize => add a constant border, regardless of triangle size - // Don't => add more to big triangles - for(udword i=0;i<3;i++) - { - Point v = mVerts[i] - TriangleCenter; - - if(constant_border) v.Normalize(); - - mVerts[i] += v * fat_coeff; - } -} diff --git a/libraries/ode-0.9/OPCODE/Ice/IceTriangle.h b/libraries/ode-0.9/OPCODE/Ice/IceTriangle.h deleted file mode 100644 index a984db835a..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceTriangle.h +++ /dev/null @@ -1,68 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a handy triangle class. - * \file IceTriangle.h - * \author Pierre Terdiman - * \date January, 17, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICETRIANGLE_H__ -#define __ICETRIANGLE_H__ - - // Forward declarations - class Moment; - - // Partitioning values - enum PartVal - { - TRI_MINUS_SPACE = 0, //!< Triangle is in the negative space - TRI_PLUS_SPACE = 1, //!< Triangle is in the positive space - TRI_INTERSECT = 2, //!< Triangle intersects plane - TRI_ON_PLANE = 3, //!< Triangle and plane are coplanar - - TRI_FORCEDWORD = 0x7fffffff - }; - - // A triangle class. - class ICEMATHS_API Triangle - { - public: - //! Constructor - inline_ Triangle() {} - //! Constructor - inline_ Triangle(const Point& p0, const Point& p1, const Point& p2) { mVerts[0]=p0; mVerts[1]=p1; mVerts[2]=p2; } - //! Copy constructor - inline_ Triangle(const Triangle& triangle) - { - mVerts[0] = triangle.mVerts[0]; - mVerts[1] = triangle.mVerts[1]; - mVerts[2] = triangle.mVerts[2]; - } - //! Destructor - inline_ ~Triangle() {} - //! Vertices - Point mVerts[3]; - - // Methods - void Flip(); - float Area() const; - float Perimeter() const; - float Compacity() const; - void Normal(Point& normal) const; - void DenormalizedNormal(Point& normal) const; - void Center(Point& center) const; - inline_ Plane PlaneEquation() const { return Plane(mVerts[0], mVerts[1], mVerts[2]); } - - PartVal TestAgainstPlane(const Plane& plane, float epsilon) const; -// float Distance(Point& cp, Point& cq, Tri& tri); - void ComputeMoment(Moment& m); - float MinEdgeLength() const; - float MaxEdgeLength() const; - void ComputePoint(float u, float v, Point& pt, udword* nearvtx=null) const; - void Inflate(float fat_coeff, bool constant_border); - }; - -#endif // __ICETRIANGLE_H__ diff --git a/libraries/ode-0.9/OPCODE/Ice/IceTypes.h b/libraries/ode-0.9/OPCODE/Ice/IceTypes.h deleted file mode 100644 index 4ff71b51e3..0000000000 --- a/libraries/ode-0.9/OPCODE/Ice/IceTypes.h +++ /dev/null @@ -1,171 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains custom types. - * \file IceTypes.h - * \author Pierre Terdiman - * \date April, 4, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __ICETYPES_H__ -#define __ICETYPES_H__ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Things to help us compile on non-windows platforms - -#if defined(__MACOSX__) || defined(__APPLE__) -#undef bool -#define bool char -#undef true -#define true ((bool)-1) -#undef false -#define false ((bool)0) -#endif // mac stuff - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - #define USE_HANDLE_MANAGER - - // Constants - #define PI 3.1415926535897932384626433832795028841971693993751f //!< PI - #define HALFPI 1.57079632679489661923f //!< 0.5 * PI - #define TWOPI 6.28318530717958647692f //!< 2.0 * PI - #define INVPI 0.31830988618379067154f //!< 1.0 / PI - - #define RADTODEG 57.2957795130823208768f //!< 180.0 / PI, convert radians to degrees - #define DEGTORAD 0.01745329251994329577f //!< PI / 180.0, convert degrees to radians - - #define EXP 2.71828182845904523536f //!< e - #define INVLOG2 3.32192809488736234787f //!< 1.0 / log10(2) - #define LN2 0.693147180559945f //!< ln(2) - #define INVLN2 1.44269504089f //!< 1.0f / ln(2) - - #define INV3 0.33333333333333333333f //!< 1/3 - #define INV6 0.16666666666666666666f //!< 1/6 - #define INV7 0.14285714285714285714f //!< 1/7 - #define INV9 0.11111111111111111111f //!< 1/9 - #define INV255 0.00392156862745098039f //!< 1/255 - - #define SQRT2 1.41421356237f //!< sqrt(2) - #define INVSQRT2 0.707106781188f //!< 1 / sqrt(2) - - #define SQRT3 1.73205080757f //!< sqrt(3) - #define INVSQRT3 0.577350269189f //!< 1 / sqrt(3) - - #define null 0 //!< our own NULL pointer - - // Custom types used in ICE - typedef signed char sbyte; //!< sizeof(sbyte) must be 1 - typedef unsigned char ubyte; //!< sizeof(ubyte) must be 1 - typedef signed short sword; //!< sizeof(sword) must be 2 - typedef unsigned short uword; //!< sizeof(uword) must be 2 - typedef signed int sdword; //!< sizeof(sdword) must be 4 - typedef unsigned int udword; //!< sizeof(udword) must be 4 - typedef signed __int64 sqword; //!< sizeof(sqword) must be 8 - typedef unsigned __int64 uqword; //!< sizeof(uqword) must be 8 - typedef float float32; //!< sizeof(float32) must be 4 - typedef double float64; //!< sizeof(float64) must be 4 - - ICE_COMPILE_TIME_ASSERT(sizeof(bool)==1); // ...otherwise things might fail with VC++ 4.2 ! - ICE_COMPILE_TIME_ASSERT(sizeof(ubyte)==1); - ICE_COMPILE_TIME_ASSERT(sizeof(sbyte)==1); - ICE_COMPILE_TIME_ASSERT(sizeof(sword)==2); - ICE_COMPILE_TIME_ASSERT(sizeof(uword)==2); - ICE_COMPILE_TIME_ASSERT(sizeof(udword)==4); - ICE_COMPILE_TIME_ASSERT(sizeof(sdword)==4); - ICE_COMPILE_TIME_ASSERT(sizeof(uqword)==8); - ICE_COMPILE_TIME_ASSERT(sizeof(sqword)==8); - - //! TO BE DOCUMENTED - #define DECLARE_ICE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name - - typedef udword DynID; //!< Dynamic identifier -#ifdef USE_HANDLE_MANAGER - typedef udword KID; //!< Kernel ID -// DECLARE_ICE_HANDLE(KID); -#else - typedef uword KID; //!< Kernel ID -#endif - typedef udword RTYPE; //!< Relationship-type (!) between owners and references - #define INVALID_ID 0xffffffff //!< Invalid dword ID (counterpart of null pointers) -#ifdef USE_HANDLE_MANAGER - #define INVALID_KID 0xffffffff //!< Invalid Kernel ID -#else - #define INVALID_KID 0xffff //!< Invalid Kernel ID -#endif - #define INVALID_NUMBER 0xDEADBEEF //!< Standard junk value - - // Define BOOL if needed - #ifndef BOOL - typedef int BOOL; //!< Another boolean type. - #endif - - //! Union of a float and a sdword - typedef union { - float f; //!< The float - sdword d; //!< The integer - }scell; - - //! Union of a float and a udword - typedef union { - float f; //!< The float - udword d; //!< The integer - }ucell; - - // Type ranges - #define MAX_SBYTE 0x7f //!< max possible sbyte value - #define MIN_SBYTE 0x80 //!< min possible sbyte value - #define MAX_UBYTE 0xff //!< max possible ubyte value - #define MIN_UBYTE 0x00 //!< min possible ubyte value - #define MAX_SWORD 0x7fff //!< max possible sword value - #define MIN_SWORD 0x8000 //!< min possible sword value - #define MAX_UWORD 0xffff //!< max possible uword value - #define MIN_UWORD 0x0000 //!< min possible uword value - #define MAX_SDWORD 0x7fffffff //!< max possible sdword value - #define MIN_SDWORD 0x80000000 //!< min possible sdword value - #define MAX_UDWORD 0xffffffff //!< max possible udword value - #define MIN_UDWORD 0x00000000 //!< min possible udword value - #define MAX_FLOAT FLT_MAX //!< max possible float value - #define MIN_FLOAT (-FLT_MAX) //!< min possible loat value - #define IEEE_1_0 0x3f800000 //!< integer representation of 1.0 - #define IEEE_255_0 0x437f0000 //!< integer representation of 255.0 - #define IEEE_MAX_FLOAT 0x7f7fffff //!< integer representation of MAX_FLOAT - #define IEEE_MIN_FLOAT 0xff7fffff //!< integer representation of MIN_FLOAT - #define IEEE_UNDERFLOW_LIMIT 0x1a000000 - - #define ONE_OVER_RAND_MAX (1.0f / float(RAND_MAX)) //!< Inverse of the max possible value returned by rand() - - typedef int (__stdcall* PROC)(); //!< A standard procedure call. - typedef bool (*ENUMERATION)(udword value, udword param, udword context); //!< ICE standard enumeration call - typedef void** VTABLE; //!< A V-Table. - - #undef MIN - #undef MAX - #define MIN(a, b) ((a) < (b) ? (a) : (b)) //!< Returns the min value between a and b - #define MAX(a, b) ((a) > (b) ? (a) : (b)) //!< Returns the max value between a and b - #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c - - template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } - template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } - template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } - template inline_ void TSetMax (T& a, const T& b) { if(a> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); - n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); - n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); - n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); - n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); - // Etc for larger intergers (64 bits in Java) - // NOTE: the >> operation must be unsigned! (>>> in java) - } - - //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) - inline_ udword CountBits(udword n) - { - // This relies of the fact that the count of n bits can NOT overflow - // an n bit interger. EG: 1 bit count takes a 1 bit interger, 2 bit counts - // 2 bit interger, 3 bit count requires only a 2 bit interger. - // So we add all bit pairs, then each nible, then each byte etc... - n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); - n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); - n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); - n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); - n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); - // Etc for larger intergers (64 bits in Java) - // NOTE: the >> operation must be unsigned! (>>> in java) - return n; - } - - //! Even faster? - inline_ udword CountBits2(udword bits) - { - bits = bits - ((bits >> 1) & 0x55555555); - bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); - bits = ((bits >> 4) + bits) & 0x0F0F0F0F; - return (bits * 0x01010101) >> 24; - } - - //! Spread out bits. EG 00001111 -> 0101010101 - //! 00001010 -> 0100010000 - //! This is used to interleve to intergers to produce a `Morten Key' - //! used in Space Filling Curves (See DrDobbs Journal, July 1999) - //! Order is important. - inline_ void SpreadBits(udword& n) - { - n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); - n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); - n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); - n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); - n = ( n & 0x11111111) | (( n & 0x22222222) << 1); - } - - // Next Largest Power of 2 - // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm - // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with - // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next - // largest power of 2. For a 32-bit value: - inline_ udword nlpo2(udword x) - { - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x+1; - } - - //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) - inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } - - //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) - inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } - - //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) - inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } - - //!< Alternative min function - inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } - - // Determine if one of the bytes in a 4 byte word is zero - inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } - - // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 - inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } -// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } - - // Most Significant 1 Bit - // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) - // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. - // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. - // Bitwise AND of the original value with the complement of the "folded" value shifted down by one - // yields the most significant bit. For a 32-bit value: - inline_ udword msb32(udword x) - { - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return (x & ~(x >> 1)); - } - - /* - "Just call it repeatedly with various input values and always with the same variable as "memory". - The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 - does no filtering at all. - - I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed - to the more typical FIR (Finite Impulse Response). - - Also, I'd say that you can make more intelligent and interesting filters than this, for example filters - that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter - to be applied before this one, of course." - - (JCAB on Flipcode) - */ - inline_ float FeedbackFilter(float val, float& memory, float sharpness) - { - ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); - if(sharpness<0.0f) sharpness = 0.0f; - else if(sharpness>1.0f) sharpness = 1.0f; - return memory = val * sharpness + memory * (1.0f - sharpness); - } - - //! If you can guarantee that your input domain (i.e. value of x) is slightly - //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the - //! following code to clamp the resulting value into [-32768,+32767] range: - inline_ int ClampToInt16(int x) - { -// ASSERT(abs(x) < (int)((1<<31u)-32767)); - - int delta = 32767 - x; - x += (delta>>31) & delta; - delta = x + 32768; - x -= (delta>>31) & delta; - return x; - } - - // Generic functions - template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } - template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } - - template inline_ void TSort(Type& a, Type& b) - { - if(a>b) TSwap(a, b); - } - - template inline_ void TSort(Type& a, Type& b, Type& c) - { - if(a>b) TSwap(a, b); - if(b>c) TSwap(b, c); - if(a>b) TSwap(a, b); - if(b>c) TSwap(b, c); - } - - // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) -// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } - // ... actually this is better ! - #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); - - //! TO BE DOCUMENTED - #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) - //! TO BE DOCUMENTED - #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Returns the alignment of the input address. - * \fn Alignment() - * \param address [in] address to check - * \return the best alignment (e.g. 1 for odd addresses, etc) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - FUNCTION ICECORE_API udword Alignment(udword address); - - #define IS_ALIGNED_2(x) ((x&1)==0) - #define IS_ALIGNED_4(x) ((x&3)==0) - #define IS_ALIGNED_8(x) ((x&7)==0) - - inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } - - // Compute implicit coords from an index: - // The idea is to get back 2D coords from a 1D index. - // For example: - // - // 0 1 2 ... nbu-1 - // nbu nbu+1 i ... - // - // We have i, we're looking for the equivalent (u=2, v=1) location. - // i = u + v*nbu - // <=> i/nbu = u/nbu + v - // Since 0 <= u < nbu, u/nbu = 0 (integer) - // Hence: v = i/nbu - // Then we simply put it back in the original equation to compute u = i - v*nbu - inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) - { - v = i / nbu; - u = i - (v * nbu); - } - - // In 3D: i = u + v*nbu + w*nbu*nbv - // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w - // u/(nbu*nbv) is null since u/nbu was null already. - // v/nbv is null as well for the same reason. - // Hence w = i/(nbu*nbv) - // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu - inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) - { - w = i / (nbu_nbv); - Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); - } - -#endif // __ICEUTILS_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_AABBCollider.cpp b/libraries/ode-0.9/OPCODE/OPC_AABBCollider.cpp deleted file mode 100644 index eaaadf1003..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_AABBCollider.cpp +++ /dev/null @@ -1,696 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an AABB collider. - * \file OPC_AABBCollider.cpp - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an AABB-vs-tree collider. - * - * \class AABBCollider - * \author Pierre Terdiman - * \version 1.3 - * \date January, 1st, 2002 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_BoxBoxOverlap.h" -#include "OPC_TriBoxOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - /* Set contact status */ \ - mFlags |= flag; \ - mTouchedPrimitives->Add(udword(prim_index)); - -//! AABB-triangle test -#define AABB_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index);\ - mLeafVerts[0] = *VP.Vertex[0]; \ - mLeafVerts[1] = *VP.Vertex[1]; \ - mLeafVerts[2] = *VP.Vertex[2]; \ - /* Perform triangle-box overlap test */ \ - if(TriBoxOverlap()) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollider::AABBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollider::~AABBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision AABB in world space - * \param model [in] Opcode model to collide with - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const Model& model) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - check temporal coherence - * - * \param cache [in/out] a box cache - * \param box [in] AABB in world space - * \return TRUE if we can return immediately - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL AABBCollider::InitQuery(AABBCache& cache, const CollisionAABB& box) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Keep track of the query box - mBox = box; - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the box (and set contact status if needed) - AABB_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence : - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the box (and set contact status if needed) - AABB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): - if(IsCacheValid(cache) && mBox.IsInside(cache.FatBox)) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat box so that coherence will work for subsequent frames - mBox.mExtents *= cache.FatCoeff; - - // Update cache with query data (signature for cached faces) - cache.FatBox = mBox; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - // 5) Precompute min & max bounds if needed - mMin = box.mCenter - box.mExtents; - mMax = box.mCenter + box.mExtents; - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for vanilla AABB trees. - * \param cache [in/out] a box cache - * \param box [in] collision AABB in world space - * \param tree [in] AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree) -{ - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - if(InitQuery(cache, box)) return true; - - // Perform collision query - _Collide(tree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the AABB completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the AABB contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBCollider::AABBContainsBox(const Point& bc, const Point& be) -{ - if(mMin.x > bc.x - be.x) return FALSE; - if(mMin.y > bc.y - be.y) return FALSE; - if(mMin.z > bc.z - be.z) return FALSE; - - if(mMax.x < bc.x + be.x) return FALSE; - if(mMax.y < bc.y + be.y) return FALSE; - if(mMax.z < bc.z + be.z) return FALSE; - - return TRUE; -} - -#define TEST_BOX_IN_AABB(center, extents) \ - if(AABBContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->IsLeaf()) - { - AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform AABB-AABB overlap test - if(!AABBAABBOverlap(Extents, Center)) return; - - TEST_BOX_IN_AABB(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for vanilla AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBCollider::_Collide(const AABBTreeNode* node) -{ - // Perform AABB-AABB overlap test - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!AABBAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf() || AABBContainsBox(Center, Extents)) - { - mFlags |= OPC_CONTACT; - mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _Collide(node->GetPos()); - _Collide(node->GetNeg()); - } -} - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridAABBCollider::HybridAABBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridAABBCollider::~HybridAABBCollider() -{ -} - -bool HybridAABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - AABB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - AABB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_AABBCollider.h b/libraries/ode-0.9/OPCODE/OPC_AABBCollider.h deleted file mode 100644 index 315d2d3366..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_AABBCollider.h +++ /dev/null @@ -1,97 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an AABB collider. - * \file OPC_AABBCollider.h - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_AABBCOLLIDER_H__ -#define __OPC_AABBCOLLIDER_H__ - - struct OPCODE_API AABBCache : VolumeCache - { - AABBCache() : FatCoeff(1.1f) - { - FatBox.mCenter.Zero(); - FatBox.mExtents.Zero(); - } - - // Cached faces signature - CollisionAABB FatBox; //!< Box used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere - }; - - class OPCODE_API AABBCollider : public VolumeCollider - { - public: - // Constructor / Destructor - AABBCollider(); - virtual ~AABBCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision AABB in world space - * \param model [in] Opcode model to collide with - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(AABBCache& cache, const CollisionAABB& box, const Model& model); - // - bool Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree); - protected: - CollisionAABB mBox; //!< Query box in (center, extents) form - Point mMin; //!< Query box min point - Point mMax; //!< Query box max point - // Leaf description - Point mLeafVerts[3]; //!< Triangle vertices - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _Collide(const AABBTreeNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL AABBContainsBox(const Point& bc, const Point& be); - inline_ BOOL AABBAABBOverlap(const Point& b, const Point& Pb); - inline_ BOOL TriBoxOverlap(); - // Init methods - BOOL InitQuery(AABBCache& cache, const CollisionAABB& box); - }; - - class OPCODE_API HybridAABBCollider : public AABBCollider - { - public: - // Constructor / Destructor - HybridAABBCollider(); - virtual ~HybridAABBCollider(); - - bool Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_AABBCOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_AABBTree.cpp b/libraries/ode-0.9/OPCODE/OPC_AABBTree.cpp deleted file mode 100644 index 32214f4152..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_AABBTree.cpp +++ /dev/null @@ -1,573 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a versatile AABB tree. - * \file OPC_AABBTree.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a generic AABB tree node. - * - * \class AABBTreeNode - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a generic AABB tree. - * This is a vanilla AABB tree, without any particular optimization. It contains anonymous references to - * user-provided primitives, which can theoretically be anything - triangles, boxes, etc. Each primitive - * is surrounded by an AABB, regardless of the primitive's nature. When the primitive is a triangle, the - * resulting tree can be converted into an optimized tree. If the primitive is a box, the resulting tree - * can be used for culling - VFC or occlusion -, assuming you cull on a mesh-by-mesh basis (modern way). - * - * \class AABBTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTreeNode::AABBTreeNode() : - mPos (null), -#ifndef OPC_NO_NEG_VANILLA_TREE - mNeg (null), -#endif - mNbPrimitives (0), - mNodePrimitives (null) -{ -#ifdef OPC_USE_TREE_COHERENCE - mBitmask = 0; -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTreeNode::~AABBTreeNode() -{ - // Opcode 1.3: - const AABBTreeNode* Pos = GetPos(); - const AABBTreeNode* Neg = GetNeg(); -#ifndef OPC_NO_NEG_VANILLA_TREE - if(!(mPos&1)) DELETESINGLE(Pos); - if(!(mNeg&1)) DELETESINGLE(Neg); -#else - if(!(mPos&1)) DELETEARRAY(Pos); -#endif - mNodePrimitives = null; // This was just a shortcut to the global list => no release - mNbPrimitives = 0; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Splits the node along a given axis. - * The list of indices is reorganized according to the split values. - * \param axis [in] splitting axis index - * \param builder [in] the tree builder - * \return the number of primitives assigned to the first child - * \warning this method reorganizes the internal list of primitives - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTreeNode::Split(udword axis, AABBTreeBuilder* builder) -{ - // Get node split value - float SplitValue = builder->GetSplittingValue(mNodePrimitives, mNbPrimitives, mBV, axis); - - udword NbPos = 0; - // Loop through all node-related primitives. Their indices range from mNodePrimitives[0] to mNodePrimitives[mNbPrimitives-1]. - // Those indices map the global list in the tree builder. - for(udword i=0;iGetSplittingValue(Index, axis); - - // Reorganize the list of indices in this order: positive - negative. - if(PrimitiveValue > SplitValue) - { - // Swap entries - udword Tmp = mNodePrimitives[i]; - mNodePrimitives[i] = mNodePrimitives[NbPos]; - mNodePrimitives[NbPos] = Tmp; - // Count primitives assigned to positive space - NbPos++; - } - } - return NbPos; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Subdivides the node. - * - * N - * / \ - * / \ - * N/2 N/2 - * / \ / \ - * N/4 N/4 N/4 N/4 - * (etc) - * - * A well-balanced tree should have a O(log n) depth. - * A degenerate tree would have a O(n) depth. - * Note a perfectly-balanced tree is not well-suited to collision detection anyway. - * - * \param builder [in] the tree builder - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeNode::Subdivide(AABBTreeBuilder* builder) -{ - // Checkings - if(!builder) return false; - - // Stop subdividing if we reach a leaf node. This is always performed here, - // else we could end in trouble if user overrides this. - if(mNbPrimitives==1) return true; - - // Let the user validate the subdivision - if(!builder->ValidateSubdivision(mNodePrimitives, mNbPrimitives, mBV)) return true; - - bool ValidSplit = true; // Optimism... - udword NbPos; - if(builder->mSettings.mRules & SPLIT_LARGEST_AXIS) - { - // Find the largest axis to split along - Point Extents; mBV.GetExtents(Extents); // Box extents - udword Axis = Extents.LargestAxis(); // Index of largest axis - - // Split along the axis - NbPos = Split(Axis, builder); - - // Check split validity - if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; - } - else if(builder->mSettings.mRules & SPLIT_SPLATTER_POINTS) - { - // Compute the means - Point Means(0.0f, 0.0f, 0.0f); - for(udword i=0;iGetSplittingValue(Index, 0); - Means.y+=builder->GetSplittingValue(Index, 1); - Means.z+=builder->GetSplittingValue(Index, 2); - } - Means/=float(mNbPrimitives); - - // Compute variances - Point Vars(0.0f, 0.0f, 0.0f); - for(udword i=0;iGetSplittingValue(Index, 0); - float Cy = builder->GetSplittingValue(Index, 1); - float Cz = builder->GetSplittingValue(Index, 2); - Vars.x += (Cx - Means.x)*(Cx - Means.x); - Vars.y += (Cy - Means.y)*(Cy - Means.y); - Vars.z += (Cz - Means.z)*(Cz - Means.z); - } - Vars/=float(mNbPrimitives-1); - - // Choose axis with greatest variance - udword Axis = Vars.LargestAxis(); - - // Split along the axis - NbPos = Split(Axis, builder); - - // Check split validity - if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; - } - else if(builder->mSettings.mRules & SPLIT_BALANCED) - { - // Test 3 axis, take the best - float Results[3]; - NbPos = Split(0, builder); Results[0] = float(NbPos)/float(mNbPrimitives); - NbPos = Split(1, builder); Results[1] = float(NbPos)/float(mNbPrimitives); - NbPos = Split(2, builder); Results[2] = float(NbPos)/float(mNbPrimitives); - Results[0]-=0.5f; Results[0]*=Results[0]; - Results[1]-=0.5f; Results[1]*=Results[1]; - Results[2]-=0.5f; Results[2]*=Results[2]; - udword Min=0; - if(Results[1]mSettings.mRules & SPLIT_BEST_AXIS) - { - // Test largest, then middle, then smallest axis... - - // Sort axis - Point Extents; mBV.GetExtents(Extents); // Box extents - udword SortedAxis[] = { 0, 1, 2 }; - float* Keys = (float*)&Extents.x; - for(udword j=0;j<3;j++) - { - for(udword i=0;i<2;i++) - { - if(Keys[SortedAxis[i]]mSettings.mRules & SPLIT_FIFTY) - { - // Don't even bother splitting (mainly a performance test) - NbPos = mNbPrimitives>>1; - } - else return false; // Unknown splitting rules - - // Check the subdivision has been successful - if(!ValidSplit) - { - // Here, all boxes lie in the same sub-space. Two strategies: - // - if the tree *must* be complete, make an arbitrary 50-50 split - // - else stop subdividing -// if(builder->mSettings.mRules&SPLIT_COMPLETE) - if(builder->mSettings.mLimit==1) - { - builder->IncreaseNbInvalidSplits(); - NbPos = mNbPrimitives>>1; - } - else return true; - } - - // Now create children and assign their pointers. - if(builder->mNodeBase) - { - // We use a pre-allocated linear pool for complete trees [Opcode 1.3] - AABBTreeNode* Pool = (AABBTreeNode*)builder->mNodeBase; - udword Count = builder->GetCount() - 1; // Count begins to 1... - // Set last bit to tell it shouldn't be freed ### pretty ugly, find a better way. Maybe one bit in mNbPrimitives - ASSERT(!(udword(&Pool[Count+0])&1)); - ASSERT(!(udword(&Pool[Count+1])&1)); - mPos = size_t(&Pool[Count+0])|1; -#ifndef OPC_NO_NEG_VANILLA_TREE - mNeg = size_t(&Pool[Count+1])|1; -#endif - } - else - { - // Non-complete trees and/or Opcode 1.2 allocate nodes on-the-fly -#ifndef OPC_NO_NEG_VANILLA_TREE - mPos = (size_t)new AABBTreeNode; CHECKALLOC(mPos); - mNeg = (size_t)new AABBTreeNode; CHECKALLOC(mNeg); -#else - AABBTreeNode* PosNeg = new AABBTreeNode[2]; - CHECKALLOC(PosNeg); - mPos = (size_t)PosNeg; -#endif - } - - // Update stats - builder->IncreaseCount(2); - - // Assign children - AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); - AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); - Pos->mNodePrimitives = &mNodePrimitives[0]; - Pos->mNbPrimitives = NbPos; - Neg->mNodePrimitives = &mNodePrimitives[NbPos]; - Neg->mNbPrimitives = mNbPrimitives - NbPos; - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive hierarchy building in a top-down fashion. - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeNode::_BuildHierarchy(AABBTreeBuilder* builder) -{ - // 1) Compute the global box for current node. The box is stored in mBV. - builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); - - // 2) Subdivide current node - Subdivide(builder); - - // 3) Recurse - AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); - AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); - if(Pos) Pos->_BuildHierarchy(builder); - if(Neg) Neg->_BuildHierarchy(builder); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the tree (top-down). - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeNode::_Refit(AABBTreeBuilder* builder) -{ - // 1) Recompute the new global box for current node - builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); - - // 2) Recurse - AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); - AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); - if(Pos) Pos->_Refit(builder); - if(Neg) Neg->_Refit(builder); -} - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTree::AABBTree() : mIndices(null), mTotalNbNodes(0), mPool(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBTree::~AABBTree() -{ - Release(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Releases the tree. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTree::Release() -{ - DELETEARRAY(mPool); - DELETEARRAY(mIndices); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds a generic AABB tree from a tree builder. - * \param builder [in] the tree builder - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::Build(AABBTreeBuilder* builder) -{ - // Checkings - if(!builder || !builder->mNbPrimitives) return false; - - // Release previous tree - Release(); - - // Init stats - builder->SetCount(1); - builder->SetNbInvalidSplits(0); - - // Initialize indices. This list will be modified during build. - mIndices = new udword[builder->mNbPrimitives]; - CHECKALLOC(mIndices); - // Identity permutation - for(udword i=0;imNbPrimitives;i++) mIndices[i] = i; - - // Setup initial node. Here we have a complete permutation of the app's primitives. - mNodePrimitives = mIndices; - mNbPrimitives = builder->mNbPrimitives; - - // Use a linear array for complete trees (since we can predict the final number of nodes) [Opcode 1.3] -// if(builder->mRules&SPLIT_COMPLETE) - if(builder->mSettings.mLimit==1) - { - // Allocate a pool of nodes - mPool = new AABBTreeNode[builder->mNbPrimitives*2 - 1]; - - builder->mNodeBase = mPool; // ### ugly ! - } - - // Build the hierarchy - _BuildHierarchy(builder); - - // Get back total number of nodes - mTotalNbNodes = builder->GetCount(); - - // For complete trees, check the correct number of nodes has been created [Opcode 1.3] - if(mPool) ASSERT(mTotalNbNodes==builder->mNbPrimitives*2 - 1); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the depth of the tree. - * A well-balanced tree should have a log(n) depth. A degenerate tree O(n) depth. - * \return depth of the tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTree::ComputeDepth() const -{ - return Walk(null, null); // Use the walking code without callback -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Walks the tree, calling the user back for each node. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTree::Walk(WalkingCallback callback, void* user_data) const -{ - // Call it without callback to compute max depth - udword MaxDepth = 0; - udword CurrentDepth = 0; - - struct Local - { - static void _Walk(const AABBTreeNode* current_node, udword& max_depth, udword& current_depth, WalkingCallback callback, void* user_data) - { - // Checkings - if(!current_node) return; - // Entering a new node => increase depth - current_depth++; - // Keep track of max depth - if(current_depth>max_depth) max_depth = current_depth; - - // Callback - if(callback && !(callback)(current_node, current_depth, user_data)) return; - - // Recurse - if(current_node->GetPos()) { _Walk(current_node->GetPos(), max_depth, current_depth, callback, user_data); current_depth--; } - if(current_node->GetNeg()) { _Walk(current_node->GetNeg(), max_depth, current_depth, callback, user_data); current_depth--; } - } - }; - Local::_Walk(this, MaxDepth, CurrentDepth, callback, user_data); - return MaxDepth; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the tree in a top-down way. - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::Refit(AABBTreeBuilder* builder) -{ - if(!builder) return false; - _Refit(builder); - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the tree in a bottom-up way. - * \param builder [in] the tree builder - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::Refit2(AABBTreeBuilder* builder) -{ - // Checkings - if(!builder) return false; - - ASSERT(mPool); - - // Bottom-up update - Point Min,Max; - Point Min_,Max_; - udword Index = mTotalNbNodes; - while(Index--) - { - AABBTreeNode& Current = mPool[Index]; - - if(Current.IsLeaf()) - { - builder->ComputeGlobalBox(Current.GetPrimitives(), Current.GetNbPrimitives(), *(AABB*)Current.GetAABB()); - } - else - { - Current.GetPos()->GetAABB()->GetMin(Min); - Current.GetPos()->GetAABB()->GetMax(Max); - - Current.GetNeg()->GetAABB()->GetMin(Min_); - Current.GetNeg()->GetAABB()->GetMax(Max_); - - Min.Min(Min_); - Max.Max(Max_); - - ((AABB*)Current.GetAABB())->SetMinMax(Min, Max); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the number of bytes used by the tree. - * \return number of bytes used - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword AABBTree::GetUsedBytes() const -{ - udword TotalSize = mTotalNbNodes*GetNodeSize(); - if(mIndices) TotalSize+=mNbPrimitives*sizeof(udword); - return TotalSize; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the tree is a complete tree or not. - * A complete tree is made of 2*N-1 nodes, where N is the number of primitives in the tree. - * \return true for complete trees - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTree::IsComplete() const -{ - return (GetNbNodes()==GetNbPrimitives()*2-1); -} diff --git a/libraries/ode-0.9/OPCODE/OPC_AABBTree.h b/libraries/ode-0.9/OPCODE/OPC_AABBTree.h deleted file mode 100644 index ee2533db66..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_AABBTree.h +++ /dev/null @@ -1,137 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a versatile AABB tree. - * \file OPC_AABBTree.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_AABBTREE_H__ -#define __OPC_AABBTREE_H__ - -#ifdef OPC_NO_NEG_VANILLA_TREE - //! TO BE DOCUMENTED - #define IMPLEMENT_TREE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - base_class(); \ - ~base_class(); \ - /* Data access */ \ - inline_ const volume* Get##volume() const { return &mBV; } \ - /* Clear the last bit */ \ - inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ - inline_ const base_class* GetNeg() const { const base_class* P = GetPos(); return P ? P+1 : null;} \ - \ - /* We don't need to test both nodes since we can't have one without the other */ \ - inline_ bool IsLeaf() const { return !GetPos(); } \ - \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - protected: \ - /* Tree-independent data */ \ - /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ - /* Whatever happens we need the two children and the enclosing volume.*/ \ - volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ - size_t mPos; /* "Positive" & "Negative" children */ -#else - //! TO BE DOCUMENTED - #define IMPLEMENT_TREE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - base_class(); \ - ~base_class(); \ - /* Data access */ \ - inline_ const volume* Get##volume() const { return &mBV; } \ - /* Clear the last bit */ \ - inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ - inline_ const base_class* GetNeg() const { return (const base_class*)(mNeg&~1); } \ - \ -/* inline_ bool IsLeaf() const { return (!GetPos() && !GetNeg()); } */ \ - /* We don't need to test both nodes since we can't have one without the other */ \ - inline_ bool IsLeaf() const { return !GetPos(); } \ - \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - protected: \ - /* Tree-independent data */ \ - /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ - /* Whatever happens we need the two children and the enclosing volume.*/ \ - volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ - size_t mPos; /* "Positive" child */ \ - size_t mNeg; /* "Negative" child */ -#endif - - typedef void (*CullingCallback) (udword nb_primitives, udword* node_primitives, BOOL need_clipping, void* user_data); - - class OPCODE_API AABBTreeNode - { - IMPLEMENT_TREE(AABBTreeNode, AABB) - public: - // Data access - inline_ const udword* GetPrimitives() const { return mNodePrimitives; } - inline_ udword GetNbPrimitives() const { return mNbPrimitives; } - - protected: - // Tree-dependent data - udword* mNodePrimitives; //!< Node-related primitives (shortcut to a position in mIndices below) - udword mNbPrimitives; //!< Number of primitives for this node - // Internal methods - udword Split(udword axis, AABBTreeBuilder* builder); - bool Subdivide(AABBTreeBuilder* builder); - void _BuildHierarchy(AABBTreeBuilder* builder); - void _Refit(AABBTreeBuilder* builder); - }; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called for each node by the walking code. - * \param current [in] current node - * \param depth [in] current node's depth - * \param user_data [in] user-defined data - * \return true to recurse through children, else false to bypass them - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef bool (*WalkingCallback) (const AABBTreeNode* current, udword depth, void* user_data); - - class OPCODE_API AABBTree : public AABBTreeNode - { - public: - // Constructor / Destructor - AABBTree(); - ~AABBTree(); - // Build - bool Build(AABBTreeBuilder* builder); - void Release(); - - // Data access - inline_ const udword* GetIndices() const { return mIndices; } //!< Catch the indices - inline_ udword GetNbNodes() const { return mTotalNbNodes; } //!< Catch the number of nodes - - // Infos - bool IsComplete() const; - // Stats - udword ComputeDepth() const; - udword GetUsedBytes() const; - udword Walk(WalkingCallback callback, void* user_data) const; - - bool Refit(AABBTreeBuilder* builder); - bool Refit2(AABBTreeBuilder* builder); - private: - udword* mIndices; //!< Indices in the app list. Indices are reorganized during build (permutation). - AABBTreeNode* mPool; //!< Linear pool of nodes for complete trees. Null otherwise. [Opcode 1.3] - // Stats - udword mTotalNbNodes; //!< Number of nodes in the tree. - }; - -#endif // __OPC_AABBTREE_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_BaseModel.cpp b/libraries/ode-0.9/OPCODE/OPC_BaseModel.cpp deleted file mode 100644 index 9520d9ef3f..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_BaseModel.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base model interface. - * \file OPC_BaseModel.cpp - * \author Pierre Terdiman - * \date May, 18, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * The base class for collision models. - * - * \class BaseModel - * \author Pierre Terdiman - * \version 1.3 - * \date May, 18, 2003 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -OPCODECREATE::OPCODECREATE() -{ - mIMesh = null; - mSettings.mRules = SPLIT_SPLATTER_POINTS | SPLIT_GEOM_CENTER; - mSettings.mLimit = 1; // Mandatory for complete trees - mNoLeaf = true; - mQuantized = true; -#ifdef __MESHMERIZER_H__ - mCollisionHull = false; -#endif // __MESHMERIZER_H__ - mKeepOriginal = false; - mCanRemap = false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BaseModel::BaseModel() : mIMesh(null), mModelCode(0), mSource(null), mTree(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BaseModel::~BaseModel() -{ - ReleaseBase(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Releases everything. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void BaseModel::ReleaseBase() -{ - DELETESINGLE(mSource); - DELETESINGLE(mTree); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Creates an optimized tree according to user-settings, and setups mModelCode. - * \param no_leaf [in] true for "no leaf" tree - * \param quantized [in] true for quantized tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool BaseModel::CreateTree(bool no_leaf, bool quantized) -{ - DELETESINGLE(mTree); - - // Setup model code - if(no_leaf) mModelCode |= OPC_NO_LEAF; - else mModelCode &= ~OPC_NO_LEAF; - - if(quantized) mModelCode |= OPC_QUANTIZED; - else mModelCode &= ~OPC_QUANTIZED; - - // Create the correct class - if(mModelCode & OPC_NO_LEAF) - { - if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedNoLeafTree; - else mTree = new AABBNoLeafTree; - } - else - { - if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedTree; - else mTree = new AABBCollisionTree; - } - CHECKALLOC(mTree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool BaseModel::Refit() -{ - // Refit the optimized tree - return mTree->Refit(mIMesh); - -// Old code kept for reference : refit the source tree then rebuild ! -// if(!mSource) return false; -// // Ouch... -// mSource->Refit(&mTB); -// // Ouch... -// return mTree->Build(mSource); -} diff --git a/libraries/ode-0.9/OPCODE/OPC_BaseModel.h b/libraries/ode-0.9/OPCODE/OPC_BaseModel.h deleted file mode 100644 index c6072dbd5b..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_BaseModel.h +++ /dev/null @@ -1,175 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base model interface. - * \file OPC_BaseModel.h - * \author Pierre Terdiman - * \date May, 18, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_BASEMODEL_H__ -#define __OPC_BASEMODEL_H__ - - //! Model creation structure - struct OPCODE_API OPCODECREATE - { - //! Constructor - OPCODECREATE(); - - MeshInterface* mIMesh; //!< Mesh interface (access to triangles & vertices) (*) - BuildSettings mSettings; //!< Builder's settings - bool mNoLeaf; //!< true => discard leaf nodes (else use a normal tree) - bool mQuantized; //!< true => quantize the tree (else use a normal tree) -#ifdef __MESHMERIZER_H__ - bool mCollisionHull; //!< true => use convex hull + GJK -#endif // __MESHMERIZER_H__ - bool mKeepOriginal; //!< true => keep a copy of the original tree (debug purpose) - bool mCanRemap; //!< true => allows OPCODE to reorganize client arrays - - // (*) This pointer is saved internally and used by OPCODE until collision structures are released, - // so beware of the object's lifetime. - }; - - enum ModelFlag - { - OPC_QUANTIZED = (1<<0), //!< Compressed/uncompressed tree - OPC_NO_LEAF = (1<<1), //!< Leaf/NoLeaf tree - OPC_SINGLE_NODE = (1<<2) //!< Special case for 1-node models - }; - - class OPCODE_API BaseModel - { - public: - // Constructor/Destructor - BaseModel(); - virtual ~BaseModel(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Build(const OPCODECREATE& create) = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual udword GetUsedBytes() const = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Refit(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the source tree. - * \return generic tree - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const AABBTree* GetSourceTree() const { return mSource; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the tree. - * \return the collision tree - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const AABBOptimizedTree* GetTree() const { return mTree; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the tree. - * \return the collision tree - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ AABBOptimizedTree* GetTree() { return mTree; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of nodes in the tree. - * Should be 2*N-1 for normal trees and N-1 for optimized ones. - * \return number of nodes - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbNodes() const { return mTree->GetNbNodes(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks whether the tree has leaf nodes or not. - * \return true if the tree has leaf nodes (normal tree), else false (optimized tree) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL HasLeafNodes() const { return !(mModelCode & OPC_NO_LEAF); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks whether the tree is quantized or not. - * \return true if the tree is quantized - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsQuantized() const { return mModelCode & OPC_QUANTIZED; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks whether the model has a single node or not. This special case must be handled separately. - * \return true if the model has only 1 node - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL HasSingleNode() const { return mModelCode & OPC_SINGLE_NODE; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the model's code. - * \return model's code - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetModelCode() const { return mModelCode; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the mesh interface. - * \return mesh interface - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const MeshInterface* GetMeshInterface() const { return mIMesh; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Sets the mesh interface. - * \param imesh [in] mesh interface - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetMeshInterface(const MeshInterface* imesh) { mIMesh = imesh; } - - protected: - const MeshInterface* mIMesh; //!< User-defined mesh interface - udword mModelCode; //!< Model code = combination of ModelFlag(s) - AABBTree* mSource; //!< Original source tree - AABBOptimizedTree* mTree; //!< Optimized tree owned by the model - // Internal methods - void ReleaseBase(); - bool CreateTree(bool no_leaf, bool quantized); - }; - -#endif //__OPC_BASEMODEL_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_BoxBoxOverlap.h b/libraries/ode-0.9/OPCODE/OPC_BoxBoxOverlap.h deleted file mode 100644 index 757a17dd20..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_BoxBoxOverlap.h +++ /dev/null @@ -1,122 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * OBB-OBB overlap test using the separating axis theorem. - * - original code by Gomez / Gamasutra (similar to Gottschalk's one in RAPID) - * - optimized for AABB trees by computing the rotation matrix once (SOLID-fashion) - * - the fabs matrix is precomputed as well and epsilon-tweaked (RAPID-style, we found this almost mandatory) - * - Class III axes can be disabled... (SOLID & Intel fashion) - * - ...or enabled to perform some profiling - * - CPU comparisons used when appropriate - * - lazy evaluation sometimes saves some work in case of early exits (unlike SOLID) - * - * \param ea [in] extents from box A - * \param ca [in] center from box A - * \param eb [in] extents from box B - * \param cb [in] center from box B - * \return true if boxes overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBTreeCollider::BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb) -{ - // Stats - mNbBVBVTests++; - - float t,t2; - - // Class I : A's basis vectors - float Tx = (mR1to0.m[0][0]*cb.x + mR1to0.m[1][0]*cb.y + mR1to0.m[2][0]*cb.z) + mT1to0.x - ca.x; - t = ea.x + eb.x*mAR.m[0][0] + eb.y*mAR.m[1][0] + eb.z*mAR.m[2][0]; - if(GREATER(Tx, t)) return FALSE; - - float Ty = (mR1to0.m[0][1]*cb.x + mR1to0.m[1][1]*cb.y + mR1to0.m[2][1]*cb.z) + mT1to0.y - ca.y; - t = ea.y + eb.x*mAR.m[0][1] + eb.y*mAR.m[1][1] + eb.z*mAR.m[2][1]; - if(GREATER(Ty, t)) return FALSE; - - float Tz = (mR1to0.m[0][2]*cb.x + mR1to0.m[1][2]*cb.y + mR1to0.m[2][2]*cb.z) + mT1to0.z - ca.z; - t = ea.z + eb.x*mAR.m[0][2] + eb.y*mAR.m[1][2] + eb.z*mAR.m[2][2]; - if(GREATER(Tz, t)) return FALSE; - - // Class II : B's basis vectors - t = Tx*mR1to0.m[0][0] + Ty*mR1to0.m[0][1] + Tz*mR1to0.m[0][2]; t2 = ea.x*mAR.m[0][0] + ea.y*mAR.m[0][1] + ea.z*mAR.m[0][2] + eb.x; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mR1to0.m[1][0] + Ty*mR1to0.m[1][1] + Tz*mR1to0.m[1][2]; t2 = ea.x*mAR.m[1][0] + ea.y*mAR.m[1][1] + ea.z*mAR.m[1][2] + eb.y; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mR1to0.m[2][0] + Ty*mR1to0.m[2][1] + Tz*mR1to0.m[2][2]; t2 = ea.x*mAR.m[2][0] + ea.y*mAR.m[2][1] + ea.z*mAR.m[2][2] + eb.z; - if(GREATER(t, t2)) return FALSE; - - // Class III : 9 cross products - // Cool trick: always perform the full test for first level, regardless of settings. - // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! - if(mFullBoxBoxTest || mNbBVBVTests==1) - { - t = Tz*mR1to0.m[0][1] - Ty*mR1to0.m[0][2]; t2 = ea.y*mAR.m[0][2] + ea.z*mAR.m[0][1] + eb.y*mAR.m[2][0] + eb.z*mAR.m[1][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 - t = Tz*mR1to0.m[1][1] - Ty*mR1to0.m[1][2]; t2 = ea.y*mAR.m[1][2] + ea.z*mAR.m[1][1] + eb.x*mAR.m[2][0] + eb.z*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 - t = Tz*mR1to0.m[2][1] - Ty*mR1to0.m[2][2]; t2 = ea.y*mAR.m[2][2] + ea.z*mAR.m[2][1] + eb.x*mAR.m[1][0] + eb.y*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 - t = Tx*mR1to0.m[0][2] - Tz*mR1to0.m[0][0]; t2 = ea.x*mAR.m[0][2] + ea.z*mAR.m[0][0] + eb.y*mAR.m[2][1] + eb.z*mAR.m[1][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 - t = Tx*mR1to0.m[1][2] - Tz*mR1to0.m[1][0]; t2 = ea.x*mAR.m[1][2] + ea.z*mAR.m[1][0] + eb.x*mAR.m[2][1] + eb.z*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 - t = Tx*mR1to0.m[2][2] - Tz*mR1to0.m[2][0]; t2 = ea.x*mAR.m[2][2] + ea.z*mAR.m[2][0] + eb.x*mAR.m[1][1] + eb.y*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 - t = Ty*mR1to0.m[0][0] - Tx*mR1to0.m[0][1]; t2 = ea.x*mAR.m[0][1] + ea.y*mAR.m[0][0] + eb.y*mAR.m[2][2] + eb.z*mAR.m[1][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 - t = Ty*mR1to0.m[1][0] - Tx*mR1to0.m[1][1]; t2 = ea.x*mAR.m[1][1] + ea.y*mAR.m[1][0] + eb.x*mAR.m[2][2] + eb.z*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 - t = Ty*mR1to0.m[2][0] - Tx*mR1to0.m[2][1]; t2 = ea.x*mAR.m[2][1] + ea.y*mAR.m[2][0] + eb.x*mAR.m[1][2] + eb.y*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 - } - return TRUE; -} - -//! A dedicated version when one box is constant -inline_ BOOL OBBCollider::BoxBoxOverlap(const Point& extents, const Point& center) -{ - // Stats - mNbVolumeBVTests++; - - float t,t2; - - // Class I : A's basis vectors - float Tx = mTBoxToModel.x - center.x; t = extents.x + mBBx1; if(GREATER(Tx, t)) return FALSE; - float Ty = mTBoxToModel.y - center.y; t = extents.y + mBBy1; if(GREATER(Ty, t)) return FALSE; - float Tz = mTBoxToModel.z - center.z; t = extents.z + mBBz1; if(GREATER(Tz, t)) return FALSE; - - // Class II : B's basis vectors - t = Tx*mRBoxToModel.m[0][0] + Ty*mRBoxToModel.m[0][1] + Tz*mRBoxToModel.m[0][2]; - t2 = extents.x*mAR.m[0][0] + extents.y*mAR.m[0][1] + extents.z*mAR.m[0][2] + mBoxExtents.x; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mRBoxToModel.m[1][0] + Ty*mRBoxToModel.m[1][1] + Tz*mRBoxToModel.m[1][2]; - t2 = extents.x*mAR.m[1][0] + extents.y*mAR.m[1][1] + extents.z*mAR.m[1][2] + mBoxExtents.y; - if(GREATER(t, t2)) return FALSE; - - t = Tx*mRBoxToModel.m[2][0] + Ty*mRBoxToModel.m[2][1] + Tz*mRBoxToModel.m[2][2]; - t2 = extents.x*mAR.m[2][0] + extents.y*mAR.m[2][1] + extents.z*mAR.m[2][2] + mBoxExtents.z; - if(GREATER(t, t2)) return FALSE; - - // Class III : 9 cross products - // Cool trick: always perform the full test for first level, regardless of settings. - // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! - if(mFullBoxBoxTest || mNbVolumeBVTests==1) - { - t = Tz*mRBoxToModel.m[0][1] - Ty*mRBoxToModel.m[0][2]; t2 = extents.y*mAR.m[0][2] + extents.z*mAR.m[0][1] + mBB_1; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 - t = Tz*mRBoxToModel.m[1][1] - Ty*mRBoxToModel.m[1][2]; t2 = extents.y*mAR.m[1][2] + extents.z*mAR.m[1][1] + mBB_2; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 - t = Tz*mRBoxToModel.m[2][1] - Ty*mRBoxToModel.m[2][2]; t2 = extents.y*mAR.m[2][2] + extents.z*mAR.m[2][1] + mBB_3; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 - t = Tx*mRBoxToModel.m[0][2] - Tz*mRBoxToModel.m[0][0]; t2 = extents.x*mAR.m[0][2] + extents.z*mAR.m[0][0] + mBB_4; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 - t = Tx*mRBoxToModel.m[1][2] - Tz*mRBoxToModel.m[1][0]; t2 = extents.x*mAR.m[1][2] + extents.z*mAR.m[1][0] + mBB_5; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 - t = Tx*mRBoxToModel.m[2][2] - Tz*mRBoxToModel.m[2][0]; t2 = extents.x*mAR.m[2][2] + extents.z*mAR.m[2][0] + mBB_6; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 - t = Ty*mRBoxToModel.m[0][0] - Tx*mRBoxToModel.m[0][1]; t2 = extents.x*mAR.m[0][1] + extents.y*mAR.m[0][0] + mBB_7; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 - t = Ty*mRBoxToModel.m[1][0] - Tx*mRBoxToModel.m[1][1]; t2 = extents.x*mAR.m[1][1] + extents.y*mAR.m[1][0] + mBB_8; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 - t = Ty*mRBoxToModel.m[2][0] - Tx*mRBoxToModel.m[2][1]; t2 = extents.x*mAR.m[2][1] + extents.y*mAR.m[2][0] + mBB_9; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 - } - return TRUE; -} - -//! A special version for 2 axis-aligned boxes -inline_ BOOL AABBCollider::AABBAABBOverlap(const Point& extents, const Point& center) -{ - // Stats - mNbVolumeBVTests++; - - float tx = mBox.mCenter.x - center.x; float ex = extents.x + mBox.mExtents.x; if(GREATER(tx, ex)) return FALSE; - float ty = mBox.mCenter.y - center.y; float ey = extents.y + mBox.mExtents.y; if(GREATER(ty, ey)) return FALSE; - float tz = mBox.mCenter.z - center.z; float ez = extents.z + mBox.mExtents.z; if(GREATER(tz, ez)) return FALSE; - - return TRUE; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_BoxPruning.cpp b/libraries/ode-0.9/OPCODE/OPC_BoxPruning.cpp deleted file mode 100644 index 6906160773..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_BoxPruning.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for box pruning. - * \file IceBoxPruning.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - You could use a complex sweep-and-prune as implemented in I-Collide. - You could use a complex hashing scheme as implemented in V-Clip or recently in ODE it seems. - You could use a "Recursive Dimensional Clustering" algorithm as implemented in GPG2. - - Or you could use this. - Faster ? I don't know. Probably not. It would be a shame. But who knows ? - Easier ? Definitely. Enjoy the sheer simplicity. -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -*/ - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - - inline_ void FindRunningIndex(udword& index, float* array, udword* sorted, int last, float max) - { - int First=index; - while(First<=last) - { - index = (First+last)>>1; - - if(max>array[sorted[index]]) First = index+1; - else last = index-1; - } - } -// ### could be log(n) ! -// and maybe use cmp integers - -// InsertionSort has better coherence, RadixSort is better for one-shot queries. -#define PRUNING_SORTER RadixSort -//#define PRUNING_SORTER InsertionSort - -// Static for coherence -static PRUNING_SORTER* gCompletePruningSorter = null; -static PRUNING_SORTER* gBipartitePruningSorter0 = null; -static PRUNING_SORTER* gBipartitePruningSorter1 = null; -inline_ PRUNING_SORTER* GetCompletePruningSorter() -{ - if(!gCompletePruningSorter) gCompletePruningSorter = new PRUNING_SORTER; - return gCompletePruningSorter; -} -inline_ PRUNING_SORTER* GetBipartitePruningSorter0() -{ - if(!gBipartitePruningSorter0) gBipartitePruningSorter0 = new PRUNING_SORTER; - return gBipartitePruningSorter0; -} -inline_ PRUNING_SORTER* GetBipartitePruningSorter1() -{ - if(!gBipartitePruningSorter1) gBipartitePruningSorter1 = new PRUNING_SORTER; - return gBipartitePruningSorter1; -} -void ReleasePruningSorters() -{ - DELETESINGLE(gBipartitePruningSorter1); - DELETESINGLE(gBipartitePruningSorter0); - DELETESINGLE(gCompletePruningSorter); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. - * \param nb0 [in] number of boxes in the first set - * \param array0 [in] array of boxes for the first set - * \param nb1 [in] number of boxes in the second set - * \param array1 [in] array of boxes for the second set - * \param pairs [out] array of overlapping pairs - * \param axes [in] projection order (0,2,1 is often best) - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes) -{ - // Checkings - if(!nb0 || !array0 || !nb1 || !array1) return false; - - // Catch axes - udword Axis0 = axes.mAxis0; - udword Axis1 = axes.mAxis1; - udword Axis2 = axes.mAxis2; - - // Allocate some temporary data - float* MinPosList0 = new float[nb0]; - float* MinPosList1 = new float[nb1]; - - // 1) Build main lists using the primary axis - for(udword i=0;iGetMin(Axis0); - for(udword i=0;iGetMin(Axis0); - - // 2) Sort the lists - PRUNING_SORTER* RS0 = GetBipartitePruningSorter0(); - PRUNING_SORTER* RS1 = GetBipartitePruningSorter1(); - const udword* Sorted0 = RS0->Sort(MinPosList0, nb0).GetRanks(); - const udword* Sorted1 = RS1->Sort(MinPosList1, nb1).GetRanks(); - - // 3) Prune the lists - udword Index0, Index1; - - const udword* const LastSorted0 = &Sorted0[nb0]; - const udword* const LastSorted1 = &Sorted1[nb1]; - const udword* RunningAddress0 = Sorted0; - const udword* RunningAddress1 = Sorted1; - - while(RunningAddress1GetMax(Axis0)) - { - if(array0[Index0]->Intersect(*array1[Index1], Axis1)) - { - if(array0[Index0]->Intersect(*array1[Index1], Axis2)) - { - pairs.AddPair(Index0, Index1); - } - } - } - } - - //// - - while(RunningAddress0GetMax(Axis0)) - { - if(array0[Index1]->Intersect(*array1[Index0], Axis1)) - { - if(array0[Index1]->Intersect(*array1[Index0], Axis2)) - { - pairs.AddPair(Index1, Index0); - } - } - - } - } - - DELETEARRAY(MinPosList1); - DELETEARRAY(MinPosList0); - - return true; -} - -#define ORIGINAL_VERSION -//#define JOAKIM - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. - * \param nb [in] number of boxes - * \param array [in] array of boxes - * \param pairs [out] array of overlapping pairs - * \param axes [in] projection order (0,2,1 is often best) - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes) -{ - // Checkings - if(!nb || !array) return false; - - // Catch axes - udword Axis0 = axes.mAxis0; - udword Axis1 = axes.mAxis1; - udword Axis2 = axes.mAxis2; - -#ifdef ORIGINAL_VERSION - // Allocate some temporary data -// float* PosList = new float[nb]; - float* PosList = new float[nb+1]; - - // 1) Build main list using the primary axis - for(udword i=0;iGetMin(Axis0); -PosList[nb++] = MAX_FLOAT; - - // 2) Sort the list - PRUNING_SORTER* RS = GetCompletePruningSorter(); - const udword* Sorted = RS->Sort(PosList, nb).GetRanks(); - - // 3) Prune the list - const udword* const LastSorted = &Sorted[nb]; - const udword* RunningAddress = Sorted; - udword Index0, Index1; - while(RunningAddressGetMax(Axis0)) - while(PosList[Index1 = *RunningAddress2++]<=array[Index0]->GetMax(Axis0)) - { -// if(Index0!=Index1) -// { - if(array[Index0]->Intersect(*array[Index1], Axis1)) - { - if(array[Index0]->Intersect(*array[Index1], Axis2)) - { - pairs.AddPair(Index0, Index1); - } - } -// } - } - } - } - - DELETEARRAY(PosList); -#endif - -#ifdef JOAKIM - // Allocate some temporary data -// float* PosList = new float[nb]; - float* MinList = new float[nb+1]; - - // 1) Build main list using the primary axis - for(udword i=0;iGetMin(Axis0); - MinList[nb] = MAX_FLOAT; - - // 2) Sort the list - PRUNING_SORTER* RS = GetCompletePruningSorter(); - udword* Sorted = RS->Sort(MinList, nb+1).GetRanks(); - - // 3) Prune the list -// const udword* const LastSorted = &Sorted[nb]; -// const udword* const LastSorted = &Sorted[nb-1]; - const udword* RunningAddress = Sorted; - udword Index0, Index1; - -// while(RunningAddressGetMax(Axis0)) - -// float CurrentMin = array[Index0]->GetMin(Axis0); - float CurrentMax = array[Index0]->GetMax(Axis0); - - while(MinList[Index1 = *RunningAddress2] <= CurrentMax) -// while(PosList[Index1 = *RunningAddress] <= CurrentMax) - { -// if(Index0!=Index1) -// { - if(array[Index0]->Intersect(*array[Index1], Axis1)) - { - if(array[Index0]->Intersect(*array[Index1], Axis2)) - { - pairs.AddPair(Index0, Index1); - } - } -// } - - RunningAddress2++; -// RunningAddress++; - } - } - } - - DELETEARRAY(MinList); -#endif - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Brute-force versions are kept: -// - to check the optimized versions return the correct list of intersections -// - to check the speed of the optimized code against the brute-force one -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Brute-force bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. - * \param nb0 [in] number of boxes in the first set - * \param array0 [in] array of boxes for the first set - * \param nb1 [in] number of boxes in the second set - * \param array1 [in] array of boxes for the second set - * \param pairs [out] array of overlapping pairs - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs) -{ - // Checkings - if(!nb0 || !array0 || !nb1 || !array1) return false; - - // Brute-force nb0*nb1 overlap tests - for(udword i=0;iIntersect(*array1[j])) pairs.AddPair(i, j); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. - * \param nb [in] number of boxes - * \param array [in] array of boxes - * \param pairs [out] array of overlapping pairs - * \return true if success. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Opcode::BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs) -{ - // Checkings - if(!nb || !array) return false; - - // Brute-force n(n-1)/2 overlap tests - for(udword i=0;iIntersect(*array[j])) pairs.AddPair(i, j); - } - } - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_BoxPruning.h b/libraries/ode-0.9/OPCODE/OPC_BoxPruning.h deleted file mode 100644 index 2f77cd2dad..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_BoxPruning.h +++ /dev/null @@ -1,31 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for box pruning. - * \file IceBoxPruning.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_BOXPRUNING_H__ -#define __OPC_BOXPRUNING_H__ - - // Optimized versions - FUNCTION OPCODE_API bool CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes); - FUNCTION OPCODE_API bool BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes); - - // Brute-force versions - FUNCTION OPCODE_API bool BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs); - FUNCTION OPCODE_API bool BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs); - -#endif //__OPC_BOXPRUNING_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_Collider.cpp b/libraries/ode-0.9/OPCODE/OPC_Collider.cpp deleted file mode 100644 index f41fc362c9..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Collider.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base collider class. - * \file OPC_Collider.cpp - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains the abstract class for colliders. - * - * \class Collider - * \author Pierre Terdiman - * \version 1.3 - * \date June, 2, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Collider::Collider() : - mFlags (0), - mCurrentModel (null), - mIMesh (null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Collider::~Collider() -{ -} diff --git a/libraries/ode-0.9/OPCODE/OPC_Collider.h b/libraries/ode-0.9/OPCODE/OPC_Collider.h deleted file mode 100644 index d718e0298f..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Collider.h +++ /dev/null @@ -1,176 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base collider class. - * \file OPC_Collider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_COLLIDER_H__ -#define __OPC_COLLIDER_H__ - - enum CollisionFlag - { - OPC_FIRST_CONTACT = (1<<0), //!< Report all contacts (false) or only first one (true) - OPC_TEMPORAL_COHERENCE = (1<<1), //!< Use temporal coherence or not - OPC_CONTACT = (1<<2), //!< Final contact status after a collision query - OPC_TEMPORAL_HIT = (1<<3), //!< There has been an early exit due to temporal coherence - OPC_NO_PRIMITIVE_TESTS = (1<<4), //!< Keep or discard primitive-bv tests in leaf nodes (volume-mesh queries) - - OPC_CONTACT_FOUND = OPC_FIRST_CONTACT | OPC_CONTACT, - OPC_TEMPORAL_CONTACT = OPC_TEMPORAL_HIT | OPC_CONTACT, - - OPC_FORCE_DWORD = 0x7fffffff - }; - - class OPCODE_API Collider - { - public: - // Constructor / Destructor - Collider(); - virtual ~Collider(); - - // Collision report - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the last collision status after a collision query. - * \return true if a collision occured - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL GetContactStatus() const { return mFlags & OPC_CONTACT; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the "first contact" mode. - * \return true if "first contact" mode is on - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL FirstContactEnabled() const { return mFlags & OPC_FIRST_CONTACT; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the temporal coherence mode. - * \return true if temporal coherence is on - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL TemporalCoherenceEnabled() const { return mFlags & OPC_TEMPORAL_COHERENCE; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks a first contact has already been found. - * \return true if a first contact has been found and we can stop a query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL ContactFound() const { return (mFlags&OPC_CONTACT_FOUND)==OPC_CONTACT_FOUND; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks there's been an early exit due to temporal coherence; - * \return true if a temporal hit has occured - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL TemporalHit() const { return mFlags & OPC_TEMPORAL_HIT; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks primitive tests are enabled; - * \return true if primitive tests must be skipped - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL SkipPrimitiveTests() const { return mFlags & OPC_NO_PRIMITIVE_TESTS; } - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Reports all contacts (false) or first contact only (true) - * \param flag [in] true for first contact, false for all contacts - * \see SetTemporalCoherence(bool flag) - * \see ValidateSettings() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFirstContact(bool flag) - { - if(flag) mFlags |= OPC_FIRST_CONTACT; - else mFlags &= ~OPC_FIRST_CONTACT; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Enable/disable temporal coherence. - * \param flag [in] true to enable temporal coherence, false to discard it - * \see SetFirstContact(bool flag) - * \see ValidateSettings() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetTemporalCoherence(bool flag) - { - if(flag) mFlags |= OPC_TEMPORAL_COHERENCE; - else mFlags &= ~OPC_TEMPORAL_COHERENCE; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Enable/disable primitive tests. - * \param flag [in] true to enable primitive tests, false to discard them - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetPrimitiveTests(bool flag) - { - if(!flag) mFlags |= OPC_NO_PRIMITIVE_TESTS; - else mFlags &= ~OPC_NO_PRIMITIVE_TESTS; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual const char* ValidateSettings() = 0; - - protected: - udword mFlags; //!< Bit flags - const BaseModel* mCurrentModel; //!< Current model for collision query (owner of touched faces) - // User mesh interface - const MeshInterface* mIMesh; //!< User-defined mesh interface - - // Internal methods - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups current collision model - * \param model [in] current collision model - * \return TRUE if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL Setup(const BaseModel* model) - { - // Keep track of current model - mCurrentModel = model; - if(!mCurrentModel) return FALSE; - - mIMesh = model->GetMeshInterface(); - return mIMesh!=null; - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Initializes a query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual inline_ void InitQuery() { mFlags &= ~OPC_TEMPORAL_CONTACT; } - }; - -#endif // __OPC_COLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_Common.cpp b/libraries/ode-0.9/OPCODE/OPC_Common.cpp deleted file mode 100644 index 5b9a9c8021..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Common.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains common classes & defs used in OPCODE. - * \file OPC_Common.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * An AABB dedicated to collision detection. - * We don't use the generic AABB class included in ICE, since it can be a Min/Max or a Center/Extents one (depends - * on compilation flags). Since the Center/Extents model is more efficient in collision detection, it was worth - * using an extra special class. - * - * \class CollisionAABB - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A quantized AABB. - * Center/Extent model, using 16-bits integers. - * - * \class QuantizedAABB - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; diff --git a/libraries/ode-0.9/OPCODE/OPC_Common.h b/libraries/ode-0.9/OPCODE/OPC_Common.h deleted file mode 100644 index f13499030e..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Common.h +++ /dev/null @@ -1,101 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains common classes & defs used in OPCODE. - * \file OPC_Common.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_COMMON_H__ -#define __OPC_COMMON_H__ - -// [GOTTFRIED]: Just a small change for readability. -#ifdef OPC_CPU_COMPARE - #define GREATER(x, y) AIR(x) > IR(y) -#else - #define GREATER(x, y) fabsf(x) > (y) -#endif - - class OPCODE_API CollisionAABB - { - public: - //! Constructor - inline_ CollisionAABB() {} - //! Constructor - inline_ CollisionAABB(const AABB& b) { b.GetCenter(mCenter); b.GetExtents(mExtents); } - //! Destructor - inline_ ~CollisionAABB() {} - - //! Get min point of the box - inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } - //! Get max point of the box - inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } - - //! Get component of the box's min point along a given axis - inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } - //! Get component of the box's max point along a given axis - inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Setups an AABB from min & max vectors. - * \param min [in] the min point - * \param max [in] the max point - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks a box is inside another box. - * \param box [in] the other box - * \return true if current box is inside input box - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ BOOL IsInside(const CollisionAABB& box) const - { - if(box.GetMin(0)>GetMin(0)) return FALSE; - if(box.GetMin(1)>GetMin(1)) return FALSE; - if(box.GetMin(2)>GetMin(2)) return FALSE; - if(box.GetMax(0)IsValid()) return false; - - // Look for degenerate faces. - udword NbDegenerate = create.mIMesh->CheckTopology(); - if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); - // We continue nonetheless.... - - Release(); // Make sure previous tree has been discarded - - // 1-1) Setup mesh interface automatically - SetMeshInterface(create.mIMesh); - - bool Status = false; - AABBTree* LeafTree = null; - Internal Data; - - // 2) Build a generic AABB Tree. - mSource = new AABBTree; - CHECKALLOC(mSource); - - // 2-1) Setup a builder. Our primitives here are triangles from input mesh, - // so we use an AABBTreeOfTrianglesBuilder..... - { - AABBTreeOfTrianglesBuilder TB; - TB.mIMesh = create.mIMesh; - TB.mNbPrimitives = create.mIMesh->GetNbTriangles(); - TB.mSettings = create.mSettings; - TB.mSettings.mLimit = 16; // ### Hardcoded, but maybe we could let the user choose 8 / 16 / 32 ... - if(!mSource->Build(&TB)) goto FreeAndExit; - } - - // 2-2) Here's the trick : create *another* AABB tree using the leaves of the first one (which are boxes, this time) - struct Local - { - // A callback to count leaf nodes - static bool CountLeaves(const AABBTreeNode* current, udword depth, void* user_data) - { - if(current->IsLeaf()) - { - Internal* Data = (Internal*)user_data; - Data->mNbLeaves++; - } - return true; - } - - // A callback to setup leaf nodes in our internal structures - static bool SetupLeafData(const AABBTreeNode* current, udword depth, void* user_data) - { - if(current->IsLeaf()) - { - Internal* Data = (Internal*)user_data; - - // Get current leaf's box - Data->mLeaves[Data->mNbLeaves] = *current->GetAABB(); - - // Setup leaf data - udword Index = udword((size_t(current->GetPrimitives()) - size_t(Data->mBase)) / sizeof(udword)); - Data->mTriangles[Data->mNbLeaves].SetData(current->GetNbPrimitives(), Index); - - Data->mNbLeaves++; - } - return true; - } - }; - - // Walk the tree & count number of leaves - Data.mNbLeaves = 0; - mSource->Walk(Local::CountLeaves, &Data); - mNbLeaves = Data.mNbLeaves; // Keep track of it - - // Special case for 1-leaf meshes - if(mNbLeaves==1) - { - mModelCode |= OPC_SINGLE_NODE; - Status = true; - goto FreeAndExit; - } - - // Allocate our structures - Data.mLeaves = new AABB[Data.mNbLeaves]; CHECKALLOC(Data.mLeaves); - mTriangles = new LeafTriangles[Data.mNbLeaves]; CHECKALLOC(mTriangles); - - // Walk the tree again & setup leaf data - Data.mTriangles = mTriangles; - Data.mBase = mSource->GetIndices(); - Data.mNbLeaves = 0; // Reset for incoming walk - mSource->Walk(Local::SetupLeafData, &Data); - - // Handle source indices - { - bool MustKeepIndices = true; - if(create.mCanRemap) - { - // We try to get rid of source indices (saving more ram!) by reorganizing triangle arrays... - // Remap can fail when we use callbacks => keep track of indices in that case (it still - // works, only using more memory) - if(create.mIMesh->RemapClient(mSource->GetNbPrimitives(), mSource->GetIndices())) - { - MustKeepIndices = false; - } - } - - if(MustKeepIndices) - { - // Keep track of source indices (from vanilla tree) - mNbPrimitives = mSource->GetNbPrimitives(); - mIndices = new udword[mNbPrimitives]; - CopyMemory(mIndices, mSource->GetIndices(), mNbPrimitives*sizeof(udword)); - } - } - - // Now, create our optimized tree using previous leaf nodes - LeafTree = new AABBTree; - CHECKALLOC(LeafTree); - { - AABBTreeOfAABBsBuilder TB; // Now using boxes ! - TB.mSettings = create.mSettings; - TB.mSettings.mLimit = 1; // We now want a complete tree so that we can "optimize" it - TB.mNbPrimitives = Data.mNbLeaves; - TB.mAABBArray = Data.mLeaves; - if(!LeafTree->Build(&TB)) goto FreeAndExit; - } - - // 3) Create an optimized tree according to user-settings - if(!CreateTree(create.mNoLeaf, create.mQuantized)) goto FreeAndExit; - - // 3-2) Create optimized tree - if(!mTree->Build(LeafTree)) goto FreeAndExit; - - // Finally ok... - Status = true; - -FreeAndExit: // Allow me this one... - DELETESINGLE(LeafTree); - - // 3-3) Delete generic tree if needed - if(!create.mKeepOriginal) DELETESINGLE(mSource); - - return Status; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword HybridModel::GetUsedBytes() const -{ - udword UsedBytes = 0; - if(mTree) UsedBytes += mTree->GetUsedBytes(); - if(mIndices) UsedBytes += mNbPrimitives * sizeof(udword); // mIndices - if(mTriangles) UsedBytes += mNbLeaves * sizeof(LeafTriangles); // mTriangles - return UsedBytes; -} - -inline_ void ComputeMinMax(Point& min, Point& max, const VertexPointers& vp) -{ - // Compute triangle's AABB = a leaf box -#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much - min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - - min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - - min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); - max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); -#else - min = *vp.Vertex[0]; - max = *vp.Vertex[0]; - min.Min(*vp.Vertex[1]); - max.Max(*vp.Vertex[1]); - min.Min(*vp.Vertex[2]); - max.Max(*vp.Vertex[2]); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool HybridModel::Refit() -{ - if(!mIMesh) return false; - if(!mTree) return false; - - if(IsQuantized()) return false; - if(HasLeafNodes()) return false; - - const LeafTriangles* LT = GetLeafTriangles(); - const udword* Indices = GetIndices(); - - // Bottom-up update - VertexPointers VP; - Point Min,Max; - Point Min_,Max_; - udword Index = mTree->GetNbNodes(); - AABBNoLeafNode* Nodes = (AABBNoLeafNode*)((AABBNoLeafTree*)mTree)->GetNodes(); - while(Index--) - { - AABBNoLeafNode& Current = Nodes[Index]; - - if(Current.HasPosLeaf()) - { - const LeafTriangles& CurrentLeaf = LT[Current.GetPosPrimitive()]; - - Min.SetPlusInfinity(); - Max.SetMinusInfinity(); - - Point TmpMin, TmpMax; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, *T++); - ComputeMinMax(TmpMin, TmpMax, VP); - Min.Min(TmpMin); - Max.Max(TmpMax); - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, BaseIndex++); - ComputeMinMax(TmpMin, TmpMax, VP); - Min.Min(TmpMin); - Max.Max(TmpMax); - } - } - } - else - { - const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; - CurrentBox.GetMin(Min); - CurrentBox.GetMax(Max); - } - - if(Current.HasNegLeaf()) - { - const LeafTriangles& CurrentLeaf = LT[Current.GetNegPrimitive()]; - - Min_.SetPlusInfinity(); - Max_.SetMinusInfinity(); - - Point TmpMin, TmpMax; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, *T++); - ComputeMinMax(TmpMin, TmpMax, VP); - Min_.Min(TmpMin); - Max_.Max(TmpMax); - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - mIMesh->GetTriangle(VP, BaseIndex++); - ComputeMinMax(TmpMin, TmpMax, VP); - Min_.Min(TmpMin); - Max_.Max(TmpMax); - } - } - } - else - { - const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; - CurrentBox.GetMin(Min_); - CurrentBox.GetMax(Max_); - } -#ifdef OPC_USE_FCOMI - Min.x = FCMin2(Min.x, Min_.x); - Max.x = FCMax2(Max.x, Max_.x); - Min.y = FCMin2(Min.y, Min_.y); - Max.y = FCMax2(Max.y, Max_.y); - Min.z = FCMin2(Min.z, Min_.z); - Max.z = FCMax2(Max.z, Max_.z); -#else - Min.Min(Min_); - Max.Max(Max_); -#endif - Current.mAABB.SetMinMax(Min, Max); - } - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_HybridModel.h b/libraries/ode-0.9/OPCODE/OPC_HybridModel.h deleted file mode 100644 index c7eb59d4a0..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_HybridModel.h +++ /dev/null @@ -1,106 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for hybrid models. - * \file OPC_HybridModel.h - * \author Pierre Terdiman - * \date May, 18, 2003 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_HYBRIDMODEL_H__ -#define __OPC_HYBRIDMODEL_H__ - - //! Leaf descriptor - struct LeafTriangles - { - udword Data; //!< Packed data - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets number of triangles in the leaf. - * \return number of triangles N, with 0 < N <= 16 - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbTriangles() const { return (Data & 15)+1; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets triangle index for this leaf. Indexed model's array of indices retrieved with HybridModel::GetIndices() - * \return triangle index - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetTriangleIndex() const { return Data>>4; } - inline_ void SetData(udword nb, udword index) { ASSERT(nb>0 && nb<=16); nb--; Data = (index<<4)|(nb&15); } - }; - - class OPCODE_API HybridModel : public BaseModel - { - public: - // Constructor/Destructor - HybridModel(); - virtual ~HybridModel(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) bool Build(const OPCODECREATE& create); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) udword GetUsedBytes() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the collision model. This can be used to handle dynamic meshes. Usage is: - * 1. modify your mesh vertices (keep the topology constant!) - * 2. refit the tree (call this method) - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) bool Refit(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets array of triangles. - * \return array of triangles - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const LeafTriangles* GetLeafTriangles() const { return mTriangles; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets array of indices. - * \return array of indices - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const udword* GetIndices() const { return mIndices; } - - private: - udword mNbLeaves; //!< Number of leaf nodes in the model - LeafTriangles* mTriangles; //!< Array of mNbLeaves leaf descriptors - udword mNbPrimitives; //!< Number of primitives in the model - udword* mIndices; //!< Array of primitive indices - - // Internal methods - void Release(); - }; - -#endif // __OPC_HYBRIDMODEL_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_IceHook.h b/libraries/ode-0.9/OPCODE/OPC_IceHook.h deleted file mode 100644 index 62343b8fe2..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_IceHook.h +++ /dev/null @@ -1,70 +0,0 @@ - -// Should be included by Opcode.h if needed - - #define ICE_DONT_CHECK_COMPILER_OPTIONS - - // From Windows... - typedef int BOOL; - #ifndef FALSE - #define FALSE 0 - #endif - - #ifndef TRUE - #define TRUE 1 - #endif - - #include - #include - #include - #include - #include - #include - - #ifndef ASSERT - #define ASSERT(exp) {} - #endif - #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] - - #define Log {} - #define SetIceError(a,b) false - #define EC_OUTOFMEMORY "Out of memory" - - #include "Ice/IcePreprocessor.h" - - #undef ICECORE_API - #define ICECORE_API OPCODE_API - - #include "Ice/IceTypes.h" - #include "Ice/IceFPU.h" - #include "Ice/IceMemoryMacros.h" - - namespace IceCore - { - #include "Ice/IceUtils.h" - #include "Ice/IceContainer.h" - #include "Ice/IcePairs.h" - #include "Ice/IceRevisitedRadix.h" - #include "Ice/IceRandom.h" - } - using namespace IceCore; - - #define ICEMATHS_API OPCODE_API - namespace IceMaths - { - #include "Ice/IceAxes.h" - #include "Ice/IcePoint.h" - #include "Ice/IceHPoint.h" - #include "Ice/IceMatrix3x3.h" - #include "Ice/IceMatrix4x4.h" - #include "Ice/IcePlane.h" - #include "Ice/IceRay.h" - #include "Ice/IceIndexedTriangle.h" - #include "Ice/IceTriangle.h" - #include "Ice/IceTriList.h" - #include "Ice/IceAABB.h" - #include "Ice/IceOBB.h" - #include "Ice/IceBoundingSphere.h" - #include "Ice/IceSegment.h" - #include "Ice/IceLSS.h" - } - using namespace IceMaths; diff --git a/libraries/ode-0.9/OPCODE/OPC_LSSAABBOverlap.h b/libraries/ode-0.9/OPCODE/OPC_LSSAABBOverlap.h deleted file mode 100644 index 5cc50b58da..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_LSSAABBOverlap.h +++ /dev/null @@ -1,523 +0,0 @@ - -// Following code from Magic-Software (http://www.magic-software.com/) -// A bit modified for Opcode - -inline_ float OPC_PointAABBSqrDist(const Point& point, const Point& center, const Point& extents) -{ - // Compute coordinates of point in box coordinate system - Point Closest = point - center; - - float SqrDistance = 0.0f; - - if(Closest.x < -extents.x) - { - float Delta = Closest.x + extents.x; - SqrDistance += Delta*Delta; - } - else if(Closest.x > extents.x) - { - float Delta = Closest.x - extents.x; - SqrDistance += Delta*Delta; - } - - if(Closest.y < -extents.y) - { - float Delta = Closest.y + extents.y; - SqrDistance += Delta*Delta; - } - else if(Closest.y > extents.y) - { - float Delta = Closest.y - extents.y; - SqrDistance += Delta*Delta; - } - - if(Closest.z < -extents.z) - { - float Delta = Closest.z + extents.z; - SqrDistance += Delta*Delta; - } - else if(Closest.z > extents.z) - { - float Delta = Closest.z - extents.z; - SqrDistance += Delta*Delta; - } - return SqrDistance; -} - -static void Face(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, const Point& rkPmE, float* pfLParam, float& rfSqrDistance) -{ - Point kPpE; - float fLSqr, fInv, fTmp, fParam, fT, fDelta; - - kPpE[i1] = rkPnt[i1] + extents[i1]; - kPpE[i2] = rkPnt[i2] + extents[i2]; - if(rkDir[i0]*kPpE[i1] >= rkDir[i1]*rkPmE[i0]) - { - if(rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0]) - { - // v[i1] >= -e[i1], v[i2] >= -e[i2] (distance = 0) - if(pfLParam) - { - rkPnt[i0] = extents[i0]; - fInv = 1.0f/rkDir[i0]; - rkPnt[i1] -= rkDir[i1]*rkPmE[i0]*fInv; - rkPnt[i2] -= rkDir[i2]*rkPmE[i0]*fInv; - *pfLParam = -rkPmE[i0]*fInv; - } - } - else - { - // v[i1] >= -e[i1], v[i2] < -e[i2] - fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i2]*rkDir[i2]; - fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); - if(fTmp <= 2.0f*fLSqr*extents[i1]) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i1]*rkDir[i1]; - fTmp = kPpE[i1] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = fT - extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - else - { - fLSqr += rkDir[i1]*rkDir[i1]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - } - } - else - { - if ( rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0] ) - { - // v[i1] < -e[i1], v[i2] >= -e[i2] - fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; - fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); - if(fTmp <= 2.0f*fLSqr*extents[i2]) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i2]*rkDir[i2]; - fTmp = kPpE[i2] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = fT - extents[i2]; - } - } - else - { - fLSqr += rkDir[i2]*rkDir[i2]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = extents[i2]; - } - } - } - else - { - // v[i1] < -e[i1], v[i2] < -e[i2] - fLSqr = rkDir[i0]*rkDir[i0]+rkDir[i2]*rkDir[i2]; - fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); - if(fTmp >= 0.0f) - { - // v[i1]-edge is closest - if ( fTmp <= 2.0f*fLSqr*extents[i1] ) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i1]*rkDir[i1]; - fTmp = kPpE[i1] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = fT - extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - else - { - fLSqr += rkDir[i1]*rkDir[i1]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - return; - } - - fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; - fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); - if(fTmp >= 0.0f) - { - // v[i2]-edge is closest - if(fTmp <= 2.0f*fLSqr*extents[i2]) - { - fT = fTmp/fLSqr; - fLSqr += rkDir[i2]*rkDir[i2]; - fTmp = kPpE[i2] - fT; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = fT - extents[i2]; - } - } - else - { - fLSqr += rkDir[i2]*rkDir[i2]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = extents[i2]; - } - } - return; - } - - // (v[i1],v[i2])-corner is closest - fLSqr += rkDir[i2]*rkDir[i2]; - fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*kPpE[i2]; - fParam = -fDelta/fLSqr; - rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; - - if(pfLParam) - { - *pfLParam = fParam; - rkPnt[i0] = extents[i0]; - rkPnt[i1] = -extents[i1]; - rkPnt[i2] = -extents[i2]; - } - } - } -} - -static void CaseNoZeros(Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) -{ - Point kPmE(rkPnt.x - extents.x, rkPnt.y - extents.y, rkPnt.z - extents.z); - - float fProdDxPy, fProdDyPx, fProdDzPx, fProdDxPz, fProdDzPy, fProdDyPz; - - fProdDxPy = rkDir.x*kPmE.y; - fProdDyPx = rkDir.y*kPmE.x; - if(fProdDyPx >= fProdDxPy) - { - fProdDzPx = rkDir.z*kPmE.x; - fProdDxPz = rkDir.x*kPmE.z; - if(fProdDzPx >= fProdDxPz) - { - // line intersects x = e0 - Face(0, 1, 2, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - else - { - // line intersects z = e2 - Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - } - else - { - fProdDzPy = rkDir.z*kPmE.y; - fProdDyPz = rkDir.y*kPmE.z; - if(fProdDzPy >= fProdDyPz) - { - // line intersects y = e1 - Face(1, 2, 0, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - else - { - // line intersects z = e2 - Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); - } - } -} - -static void Case0(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) -{ - float fPmE0 = rkPnt[i0] - extents[i0]; - float fPmE1 = rkPnt[i1] - extents[i1]; - float fProd0 = rkDir[i1]*fPmE0; - float fProd1 = rkDir[i0]*fPmE1; - float fDelta, fInvLSqr, fInv; - - if(fProd0 >= fProd1) - { - // line intersects P[i0] = e[i0] - rkPnt[i0] = extents[i0]; - - float fPpE1 = rkPnt[i1] + extents[i1]; - fDelta = fProd0 - rkDir[i0]*fPpE1; - if(fDelta >= 0.0f) - { - fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); - rfSqrDistance += fDelta*fDelta*fInvLSqr; - if(pfLParam) - { - rkPnt[i1] = -extents[i1]; - *pfLParam = -(rkDir[i0]*fPmE0+rkDir[i1]*fPpE1)*fInvLSqr; - } - } - else - { - if(pfLParam) - { - fInv = 1.0f/rkDir[i0]; - rkPnt[i1] -= fProd0*fInv; - *pfLParam = -fPmE0*fInv; - } - } - } - else - { - // line intersects P[i1] = e[i1] - rkPnt[i1] = extents[i1]; - - float fPpE0 = rkPnt[i0] + extents[i0]; - fDelta = fProd1 - rkDir[i1]*fPpE0; - if(fDelta >= 0.0f) - { - fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); - rfSqrDistance += fDelta*fDelta*fInvLSqr; - if(pfLParam) - { - rkPnt[i0] = -extents[i0]; - *pfLParam = -(rkDir[i0]*fPpE0+rkDir[i1]*fPmE1)*fInvLSqr; - } - } - else - { - if(pfLParam) - { - fInv = 1.0f/rkDir[i1]; - rkPnt[i0] -= fProd1*fInv; - *pfLParam = -fPmE1*fInv; - } - } - } - - if(rkPnt[i2] < -extents[i2]) - { - fDelta = rkPnt[i2] + extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i2] = -extents[i2]; - } - else if ( rkPnt[i2] > extents[i2] ) - { - fDelta = rkPnt[i2] - extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i2] = extents[i2]; - } -} - -static void Case00(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) -{ - float fDelta; - - if(pfLParam) - *pfLParam = (extents[i0] - rkPnt[i0])/rkDir[i0]; - - rkPnt[i0] = extents[i0]; - - if(rkPnt[i1] < -extents[i1]) - { - fDelta = rkPnt[i1] + extents[i1]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i1] = -extents[i1]; - } - else if(rkPnt[i1] > extents[i1]) - { - fDelta = rkPnt[i1] - extents[i1]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i1] = extents[i1]; - } - - if(rkPnt[i2] < -extents[i2]) - { - fDelta = rkPnt[i2] + extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i1] = -extents[i2]; - } - else if(rkPnt[i2] > extents[i2]) - { - fDelta = rkPnt[i2] - extents[i2]; - rfSqrDistance += fDelta*fDelta; - rkPnt[i2] = extents[i2]; - } -} - -static void Case000(Point& rkPnt, const Point& extents, float& rfSqrDistance) -{ - float fDelta; - - if(rkPnt.x < -extents.x) - { - fDelta = rkPnt.x + extents.x; - rfSqrDistance += fDelta*fDelta; - rkPnt.x = -extents.x; - } - else if(rkPnt.x > extents.x) - { - fDelta = rkPnt.x - extents.x; - rfSqrDistance += fDelta*fDelta; - rkPnt.x = extents.x; - } - - if(rkPnt.y < -extents.y) - { - fDelta = rkPnt.y + extents.y; - rfSqrDistance += fDelta*fDelta; - rkPnt.y = -extents.y; - } - else if(rkPnt.y > extents.y) - { - fDelta = rkPnt.y - extents.y; - rfSqrDistance += fDelta*fDelta; - rkPnt.y = extents.y; - } - - if(rkPnt.z < -extents.z) - { - fDelta = rkPnt.z + extents.z; - rfSqrDistance += fDelta*fDelta; - rkPnt.z = -extents.z; - } - else if(rkPnt.z > extents.z) - { - fDelta = rkPnt.z - extents.z; - rfSqrDistance += fDelta*fDelta; - rkPnt.z = extents.z; - } -} - -static float SqrDistance(const Ray& rkLine, const Point& center, const Point& extents, float* pfLParam) -{ - // compute coordinates of line in box coordinate system - Point kDiff = rkLine.mOrig - center; - Point kPnt = kDiff; - Point kDir = rkLine.mDir; - - // Apply reflections so that direction vector has nonnegative components. - bool bReflect[3]; - for(int i=0;i<3;i++) - { - if(kDir[i]<0.0f) - { - kPnt[i] = -kPnt[i]; - kDir[i] = -kDir[i]; - bReflect[i] = true; - } - else - { - bReflect[i] = false; - } - } - - float fSqrDistance = 0.0f; - - if(kDir.x>0.0f) - { - if(kDir.y>0.0f) - { - if(kDir.z>0.0f) CaseNoZeros(kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,+) - else Case0(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,0) - } - else - { - if(kDir.z>0.0f) Case0(0, 2, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,+) - else Case00(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,0) - } - } - else - { - if(kDir.y>0.0f) - { - if(kDir.z>0.0f) Case0(1, 2, 0, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,+) - else Case00(1, 0, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,0) - } - else - { - if(kDir.z>0.0f) Case00(2, 0, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,0,+) - else - { - Case000(kPnt, extents, fSqrDistance); // (0,0,0) - if(pfLParam) *pfLParam = 0.0f; - } - } - } - return fSqrDistance; -} - -inline_ float OPC_SegmentOBBSqrDist(const Segment& segment, const Point& c0, const Point& e0) -{ - float fLP; - float fSqrDistance = SqrDistance(Ray(segment.GetOrigin(), segment.ComputeDirection()), c0, e0, &fLP); - if(fLP>=0.0f) - { - if(fLP<=1.0f) return fSqrDistance; - else return OPC_PointAABBSqrDist(segment.mP1, c0, e0); - } - else return OPC_PointAABBSqrDist(segment.mP0, c0, e0); -} - -inline_ BOOL LSSCollider::LSSAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbVolumeBVTests++; - - float s2 = OPC_SegmentOBBSqrDist(mSeg, center, extents); - if(s2Add(udword(prim_index)); - -//! LSS-triangle overlap test -#define LSS_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - \ - /* Perform LSS-tri overlap test */ \ - if(LSSTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -LSSCollider::LSSCollider() -{ -// mCenter.Zero(); -// mRadius2 = 0.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -LSSCollider::~LSSCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] an lss cache - * \param lss [in] collision lss in local space - * \param model [in] Opcode model to collide with - * \param worldl [in] lss world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, lss, worldl, worldm)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - check temporal coherence - * - * \param cache [in/out] an lss cache - * \param lss [in] lss in local space - * \param worldl [in] lss world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL LSSCollider::InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute LSS in model space: - // - Precompute R^2 - mRadius2 = lss.mRadius * lss.mRadius; - // - Compute segment - mSeg.mP0 = lss.mP0; - mSeg.mP1 = lss.mP1; - // -> to world space - if(worldl) - { - mSeg.mP0 *= *worldl; - mSeg.mP1 *= *worldl; - } - // -> to model space - if(worldm) - { - // Invert model matrix - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - - mSeg.mP0 *= InvWorldM; - mSeg.mP1 *= InvWorldM; - } - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the LSS (and set contact status if needed) - LSS_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence : - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the LSS (and set contact status if needed) - LSS_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // We're interested in all contacts =>test the new real LSS N(ew) against the previous fat LSS P(revious): - - // ### rewrite this - - LSS Test(mSeg, lss.mRadius); // in model space - LSS Previous(cache.Previous, sqrtf(cache.Previous.mRadius)); - -// if(cache.Previous.Contains(Test)) - if(IsCacheValid(cache) && Previous.Contains(Test)) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat sphere so that coherence will work for subsequent frames - mRadius2 *= cache.FatCoeff; -// mRadius2 = (lss.mRadius * cache.FatCoeff)*(lss.mRadius * cache.FatCoeff); - - - // Update cache with query data (signature for cached faces) - cache.Previous.mP0 = mSeg.mP0; - cache.Previous.mP1 = mSeg.mP1; - cache.Previous.mRadius = mRadius2; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for vanilla AABB trees. - * \param cache [in/out] an lss cache - * \param lss [in] collision lss in world space - * \param tree [in] AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree) -{ - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - if(InitQuery(cache, lss)) return true; - - // Perform collision query - _Collide(tree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the LSS completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the LSS contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL LSSCollider::LSSContainsBox(const Point& bc, const Point& be) -{ - // Not implemented - return FALSE; -} - -#define TEST_BOX_IN_LSS(center, extents) \ - if(LSSContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->IsLeaf()) - { - LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform LSS-AABB overlap test - if(!LSSAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_LSS(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for vanilla AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void LSSCollider::_Collide(const AABBTreeNode* node) -{ - // Perform LSS-AABB overlap test - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!LSSAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf() || LSSContainsBox(Center, Extents)) - { - mFlags |= OPC_CONTACT; - mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _Collide(node->GetPos()); - _Collide(node->GetNeg()); - } -} - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridLSSCollider::HybridLSSCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridLSSCollider::~HybridLSSCollider() -{ -} - -bool HybridLSSCollider::Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, lss, worldl, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - LSS_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - LSS_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_LSSCollider.h b/libraries/ode-0.9/OPCODE/OPC_LSSCollider.h deleted file mode 100644 index b4d0893edf..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_LSSCollider.h +++ /dev/null @@ -1,99 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an LSS collider. - * \file OPC_LSSCollider.h - * \author Pierre Terdiman - * \date December, 28, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_LSSCOLLIDER_H__ -#define __OPC_LSSCOLLIDER_H__ - - struct OPCODE_API LSSCache : VolumeCache - { - LSSCache() - { - Previous.mP0 = Point(0.0f, 0.0f, 0.0f); - Previous.mP1 = Point(0.0f, 0.0f, 0.0f); - Previous.mRadius = 0.0f; - FatCoeff = 1.1f; - } - - // Cached faces signature - LSS Previous; //!< LSS used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< mRadius2 multiplier used to create a fat LSS - }; - - class OPCODE_API LSSCollider : public VolumeCollider - { - public: - // Constructor / Destructor - LSSCollider(); - virtual ~LSSCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] an lss cache - * \param lss [in] collision lss in local space - * \param model [in] Opcode model to collide with - * \param worldl [in] lss world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); - // - bool Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree); - protected: - // LSS in model space - Segment mSeg; //!< Segment - float mRadius2; //!< LSS radius squared - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _Collide(const AABBTreeNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL LSSContainsBox(const Point& bc, const Point& be); - inline_ BOOL LSSAABBOverlap(const Point& center, const Point& extents); - inline_ BOOL LSSTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); - // Init methods - BOOL InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); - }; - - class OPCODE_API HybridLSSCollider : public LSSCollider - { - public: - // Constructor / Destructor - HybridLSSCollider(); - virtual ~HybridLSSCollider(); - - bool Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_LSSCOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_LSSTriOverlap.h b/libraries/ode-0.9/OPCODE/OPC_LSSTriOverlap.h deleted file mode 100644 index f1d17e4ae5..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_LSSTriOverlap.h +++ /dev/null @@ -1,679 +0,0 @@ -// Following code from Magic-Software (http://www.magic-software.com/) -// A bit modified for Opcode - -static const float gs_fTolerance = 1e-05f; - -static float OPC_PointTriangleSqrDist(const Point& point, const Point& p0, const Point& p1, const Point& p2) -{ - // Hook - Point TriEdge0 = p1 - p0; - Point TriEdge1 = p2 - p0; - - Point kDiff = p0 - point; - float fA00 = TriEdge0.SquareMagnitude(); - float fA01 = TriEdge0 | TriEdge1; - float fA11 = TriEdge1.SquareMagnitude(); - float fB0 = kDiff | TriEdge0; - float fB1 = kDiff | TriEdge1; - float fC = kDiff.SquareMagnitude(); - float fDet = fabsf(fA00*fA11 - fA01*fA01); - float fS = fA01*fB1-fA11*fB0; - float fT = fA01*fB0-fA00*fB1; - float fSqrDist; - - if(fS + fT <= fDet) - { - if(fS < 0.0f) - { - if(fT < 0.0f) // region 4 - { - if(fB0 < 0.0f) - { - if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - if(fB1 >= 0.0f) fSqrDist = fC; - else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - else // region 3 - { - if(fB1 >= 0.0f) fSqrDist = fC; - else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - else if(fT < 0.0f) // region 5 - { - if(fB0 >= 0.0f) fSqrDist = fC; - else if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else // region 0 - { - // minimum at interior point - if(fDet==0.0f) - { - fSqrDist = MAX_FLOAT; - } - else - { - float fInvDet = 1.0f/fDet; - fS *= fInvDet; - fT *= fInvDet; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - } - else - { - float fTmp0, fTmp1, fNumer, fDenom; - - if(fS < 0.0f) // region 2 - { - fTmp0 = fA01 + fB0; - fTmp1 = fA11 + fB1; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { - fSqrDist = fA00+2.0f*fB0+fC; - } - else - { - fS = fNumer/fDenom; - fT = 1.0f - fS; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - else - { - if(fTmp1 <= 0.0f) fSqrDist = fA11+2.0f*fB1+fC; - else if(fB1 >= 0.0f) fSqrDist = fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - else if(fT < 0.0f) // region 6 - { - fTmp0 = fA01 + fB1; - fTmp1 = fA00 + fB0; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { - fSqrDist = fA11+2.0f*fB1+fC; - } - else - { - fT = fNumer/fDenom; - fS = 1.0f - fT; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - else - { - if(fTmp1 <= 0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(fB0 >= 0.0f) fSqrDist = fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - } - else // region 1 - { - fNumer = fA11 + fB1 - fA01 - fB0; - if(fNumer <= 0.0f) - { - fSqrDist = fA11+2.0f*fB1+fC; - } - else - { - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { - fSqrDist = fA00+2.0f*fB0+fC; - } - else - { - fS = fNumer/fDenom; - fT = 1.0f - fS; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - } - } - } - return fabsf(fSqrDist); -} - -static float OPC_SegmentSegmentSqrDist(const Segment& rkSeg0, const Segment& rkSeg1) -{ - // Hook - Point rkSeg0Direction = rkSeg0.ComputeDirection(); - Point rkSeg1Direction = rkSeg1.ComputeDirection(); - - Point kDiff = rkSeg0.mP0 - rkSeg1.mP0; - float fA00 = rkSeg0Direction.SquareMagnitude(); - float fA01 = -rkSeg0Direction.Dot(rkSeg1Direction); - float fA11 = rkSeg1Direction.SquareMagnitude(); - float fB0 = kDiff.Dot(rkSeg0Direction); - float fC = kDiff.SquareMagnitude(); - float fDet = fabsf(fA00*fA11-fA01*fA01); - - float fB1, fS, fT, fSqrDist, fTmp; - - if(fDet>=gs_fTolerance) - { - // line segments are not parallel - fB1 = -kDiff.Dot(rkSeg1Direction); - fS = fA01*fB1-fA11*fB0; - fT = fA01*fB0-fA00*fB1; - - if(fS >= 0.0f) - { - if(fS <= fDet) - { - if(fT >= 0.0f) - { - if(fT <= fDet) // region 0 (interior) - { - // minimum at two interior points of 3D lines - float fInvDet = 1.0f/fDet; - fS *= fInvDet; - fT *= fInvDet; - fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; - } - else // region 3 (side) - { - fTmp = fA01+fB0; - if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; - else if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); - else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; - } - } - else // region 7 (side) - { - if(fB0>=0.0f) fSqrDist = fC; - else if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - } - else - { - if ( fT >= 0.0 ) - { - if ( fT <= fDet ) // region 1 (side) - { - fTmp = fA01+fB1; - if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); - else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; - } - else // region 2 (corner) - { - fTmp = fA01+fB0; - if ( -fTmp <= fA00 ) - { - if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; - } - else - { - fTmp = fA01+fB1; - if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); - else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; - } - } - } - else // region 8 (corner) - { - if ( -fB0 < fA00 ) - { - if(fB0>=0.0f) fSqrDist = fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - fTmp = fA01+fB1; - if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; - else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); - else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; - } - } - } - } - else - { - if ( fT >= 0.0f ) - { - if ( fT <= fDet ) // region 5 (side) - { - if(fB1>=0.0f) fSqrDist = fC; - else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - else // region 4 (corner) - { - fTmp = fA01+fB0; - if ( fTmp < 0.0f ) - { - if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); - else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; - } - else - { - if(fB1>=0.0f) fSqrDist = fC; - else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - } - else // region 6 (corner) - { - if ( fB0 < 0.0f ) - { - if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; - else fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - if(fB1>=0.0f) fSqrDist = fC; - else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; - else fSqrDist = fB1*(-fB1/fA11)+fC; - } - } - } - } - else - { - // line segments are parallel - if ( fA01 > 0.0f ) - { - // direction vectors form an obtuse angle - if ( fB0 >= 0.0f ) - { - fSqrDist = fC; - } - else if ( -fB0 <= fA00 ) - { - fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - fB1 = -kDiff.Dot(rkSeg1Direction); - fTmp = fA00+fB0; - if ( -fTmp >= fA01 ) - { - fSqrDist = fA00+fA11+fC+2.0f*(fA01+fB0+fB1); - } - else - { - fT = -fTmp/fA01; - fSqrDist = fA00+2.0f*fB0+fC+fT*(fA11*fT+2.0f*(fA01+fB1)); - } - } - } - else - { - // direction vectors form an acute angle - if ( -fB0 >= fA00 ) - { - fSqrDist = fA00+2.0f*fB0+fC; - } - else if ( fB0 <= 0.0f ) - { - fSqrDist = fB0*(-fB0/fA00)+fC; - } - else - { - fB1 = -kDiff.Dot(rkSeg1Direction); - if ( fB0 >= -fA01 ) - { - fSqrDist = fA11+2.0f*fB1+fC; - } - else - { - fT = -fB0/fA01; - fSqrDist = fC+fT*(2.0f*fB1+fA11*fT); - } - } - } - } - return fabsf(fSqrDist); -} - -inline_ float OPC_SegmentRaySqrDist(const Segment& rkSeg0, const Ray& rkSeg1) -{ - return OPC_SegmentSegmentSqrDist(rkSeg0, Segment(rkSeg1.mOrig, rkSeg1.mOrig + rkSeg1.mDir)); -} - -static float OPC_SegmentTriangleSqrDist(const Segment& segment, const Point& p0, const Point& p1, const Point& p2) -{ - // Hook - const Point TriEdge0 = p1 - p0; - const Point TriEdge1 = p2 - p0; - - const Point& rkSegOrigin = segment.GetOrigin(); - Point rkSegDirection = segment.ComputeDirection(); - - Point kDiff = p0 - rkSegOrigin; - float fA00 = rkSegDirection.SquareMagnitude(); - float fA01 = -rkSegDirection.Dot(TriEdge0); - float fA02 = -rkSegDirection.Dot(TriEdge1); - float fA11 = TriEdge0.SquareMagnitude(); - float fA12 = TriEdge0.Dot(TriEdge1); - float fA22 = TriEdge1.Dot(TriEdge1); - float fB0 = -kDiff.Dot(rkSegDirection); - float fB1 = kDiff.Dot(TriEdge0); - float fB2 = kDiff.Dot(TriEdge1); - float fCof00 = fA11*fA22-fA12*fA12; - float fCof01 = fA02*fA12-fA01*fA22; - float fCof02 = fA01*fA12-fA02*fA11; - float fDet = fA00*fCof00+fA01*fCof01+fA02*fCof02; - - Ray kTriSeg; - Point kPt; - float fSqrDist, fSqrDist0; - - if(fabsf(fDet)>=gs_fTolerance) - { - float fCof11 = fA00*fA22-fA02*fA02; - float fCof12 = fA02*fA01-fA00*fA12; - float fCof22 = fA00*fA11-fA01*fA01; - float fInvDet = 1.0f/fDet; - float fRhs0 = -fB0*fInvDet; - float fRhs1 = -fB1*fInvDet; - float fRhs2 = -fB2*fInvDet; - - float fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2; - float fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2; - float fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2; - - if ( fR < 0.0f ) - { - if ( fS+fT <= 1.0f ) - { - if ( fS < 0.0f ) - { - if ( fT < 0.0f ) // region 4m - { - // min on face s=0 or t=0 or r=0 - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge1; - fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge0; - fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); - if(fSqrDist0 1 - { - if ( fS+fT <= 1.0f ) - { - if ( fS < 0.0f ) - { - if ( fT < 0.0f ) // region 4p - { - // min on face s=0 or t=0 or r=1 - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge1; - fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); - kTriSeg.mOrig = p0; - kTriSeg.mDir = TriEdge0; - fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); - if(fSqrDist0GetTriangle(triangle_index); - * // Setup pointers to vertices for the collision system - * triangle.Vertex[0] = MyMesh->GetVertex(Tri->mVRef[0]); - * triangle.Vertex[1] = MyMesh->GetVertex(Tri->mVRef[1]); - * triangle.Vertex[2] = MyMesh->GetVertex(Tri->mVRef[2]); - * } - * - * // Setup callbacks - * MeshInterface0->SetCallback(ColCallback, udword(Mesh0)); - * MeshInterface1->SetCallback(ColCallback, udword(Mesh1)); - * \endcode - * - * Of course, you should make this callback as fast as possible. And you're also not supposed - * to modify the geometry *after* the collision trees have been built. The alternative was to - * store the geometry & topology in the collision system as well (as in RAPID) but we have found - * this approach to waste a lot of ram in many cases. - * - * - * POINTERS: - * - * If you're internally using the following canonical structures: - * - a vertex made of three 32-bits floating point values - * - a triangle made of three 32-bits integer vertex references - * ...then you may want to use pointers instead of callbacks. This is the same, except OPCODE will directly - * use provided pointers to access the topology and geometry, without using a callback. It might be faster, - * but probably not as safe. Pointers have been introduced in OPCODE 1.2. - * - * Ex: - * - * \code - * // Setup pointers - * MeshInterface0->SetPointers(Mesh0->GetFaces(), Mesh0->GetVerts()); - * MeshInterface1->SetPointers(Mesh1->GetFaces(), Mesh1->GetVerts()); - * \endcode - * - * - * STRIDES: - * - * If your vertices are D3D-like entities interleaving a position, a normal and/or texture coordinates - * (i.e. if your vertices are FVFs), you might want to use a vertex stride to skip extra data OPCODE - * doesn't need. Using a stride shouldn't be notably slower than not using it, but it might increase - * cache misses. Please also note that you *shouldn't* read from AGP or video-memory buffers ! - * - * - * In any case, compilation flags are here to select callbacks/pointers/strides at compile time, so - * choose what's best for your application. All of this has been wrapped into this MeshInterface. - * - * \class MeshInterface - * \author Pierre Terdiman - * \version 1.3 - * \date November, 27, 2002 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -Point MeshInterface::VertexCache[3]; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -MeshInterface::MeshInterface() : -#ifdef OPC_USE_CALLBACKS - mUserData (null), - mObjCallback (null), -#else - mTris (null), - mVerts (null), - #ifdef OPC_USE_STRIDE - mTriStride (sizeof(IndexedTriangle)), - mVertexStride (sizeof(Point)), - #endif -#endif - mNbTris (0), - mNbVerts (0), - - Single(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -MeshInterface::~MeshInterface() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the mesh interface is valid, i.e. things have been setup correctly. - * \return true if valid - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool MeshInterface::IsValid() const -{ - if(!mNbTris || !mNbVerts) return false; -#ifdef OPC_USE_CALLBACKS - if(!mObjCallback) return false; -#else - if(!mTris || !mVerts) return false; -#endif - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the mesh itself is valid. - * Currently we only look for degenerate faces. - * \return number of degenerate faces - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword MeshInterface::CheckTopology() const -{ - // Check topology. If the model contains degenerate faces, collision report can be wrong in some cases. - // e.g. it happens with the standard MAX teapot. So clean your meshes first... If you don't have a mesh cleaner - // you can try this: www.codercorner.com/Consolidation.zip - - udword NbDegenerate = 0; - - VertexPointers VP; - - // Using callbacks, we don't have access to vertex indices. Nevertheless we still can check for - // redundant vertex pointers, which cover all possibilities (callbacks/pointers/strides). - for(udword i=0;i= 0.0f; - } - }; - -#ifdef OPC_USE_CALLBACKS - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called by OPCODE to request vertices from the app. - * \param triangle_index [in] face index for which the system is requesting the vertices - * \param triangle [out] triangle's vertices (must be provided by the user) - * \param user_data [in] user-defined data from SetCallback() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef void (*RequestCallback) (udword triangle_index, VertexPointers& triangle, void* user_data); -#endif - - class OPCODE_API MeshInterface - { - public: - // Constructor / Destructor - MeshInterface(); - ~MeshInterface(); - // Common settings - inline_ udword GetNbTriangles() const { return mNbTris; } - inline_ udword GetNbVertices() const { return mNbVerts; } - inline_ void SetNbTriangles(udword nb) { mNbTris = nb; } - inline_ void SetNbVertices(udword nb) { mNbVerts = nb; } - -#ifdef OPC_USE_CALLBACKS - // Callback settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Callback control: setups object callback. Must provide triangle-vertices for a given triangle index. - * \param callback [in] user-defined callback - * \param user_data [in] user-defined data - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetCallback(RequestCallback callback, void* user_data); - inline_ void* GetUserData() const { return mUserData; } - inline_ RequestCallback GetCallback() const { return mObjCallback; } -#else - // Pointers settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Pointers control: setups object pointers. Must provide access to faces and vertices for a given object. - * \param tris [in] pointer to triangles - * \param verts [in] pointer to vertices - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetPointers(const IndexedTriangle* tris, const Point* verts); - inline_ const IndexedTriangle* GetTris() const { return mTris; } - inline_ const Point* GetVerts() const { return mVerts; } - - #ifdef OPC_USE_STRIDE - // Strides settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Strides control - * \param tri_stride [in] size of a triangle in bytes. The first sizeof(IndexedTriangle) bytes are used to get vertex indices. - * \param vertex_stride [in] size of a vertex in bytes. The first sizeof(Point) bytes are used to get vertex position. - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool SetStrides(udword tri_stride=sizeof(IndexedTriangle), udword vertex_stride=sizeof(Point)); - inline_ udword GetTriStride() const { return mTriStride; } - inline_ udword GetVertexStride() const { return mVertexStride; } - #endif -#endif - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Fetches a triangle given a triangle index. - * \param vp [out] required triangle's vertex pointers - * \param index [in] triangle index - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void GetTriangle(VertexPointers& vp, udword index) const - { -#ifdef OPC_USE_CALLBACKS - (mObjCallback)(index, vp, mUserData); -#else - #ifdef OPC_USE_STRIDE - const IndexedTriangle* T = (const IndexedTriangle*)(((ubyte*)mTris) + index * mTriStride); - - if (Single){ - vp.Vertex[0] = (const Point*)(((ubyte*)mVerts) + T->mVRef[0] * mVertexStride); - vp.Vertex[1] = (const Point*)(((ubyte*)mVerts) + T->mVRef[1] * mVertexStride); - vp.Vertex[2] = (const Point*)(((ubyte*)mVerts) + T->mVRef[2] * mVertexStride); - } - else{ - for (int i = 0; i < 3; i++){ - const double* v = (const double*)(((ubyte*)mVerts) + T->mVRef[i] * mVertexStride); - - VertexCache[i].x = (float)v[0]; - VertexCache[i].y = (float)v[1]; - VertexCache[i].z = (float)v[2]; - vp.Vertex[i] = &VertexCache[i]; - } - } - #else - const IndexedTriangle* T = &mTris[index]; - vp.Vertex[0] = &mVerts[T->mVRef[0]]; - vp.Vertex[1] = &mVerts[T->mVRef[1]]; - vp.Vertex[2] = &mVerts[T->mVRef[2]]; - #endif -#endif - } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Remaps client's mesh according to a permutation. - * \param nb_indices [in] number of indices in the permutation (will be checked against number of triangles) - * \param permutation [in] list of triangle indices - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool RemapClient(udword nb_indices, const udword* permutation) const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the mesh interface is valid, i.e. things have been setup correctly. - * \return true if valid - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool IsValid() const; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Checks the mesh itself is valid. - * Currently we only look for degenerate faces. - * \return number of degenerate faces - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - udword CheckTopology() const; - private: - - udword mNbTris; //!< Number of triangles in the input model - udword mNbVerts; //!< Number of vertices in the input model -#ifdef OPC_USE_CALLBACKS - // User callback - void* mUserData; //!< User-defined data sent to callback - RequestCallback mObjCallback; //!< Object callback -#else - // User pointers - const IndexedTriangle* mTris; //!< Array of indexed triangles - const Point* mVerts; //!< Array of vertices - #ifdef OPC_USE_STRIDE - udword mTriStride; //!< Possible triangle stride in bytes [Opcode 1.3] - udword mVertexStride; //!< Possible vertex stride in bytes [Opcode 1.3] - #endif - public: - bool Single; //!< Use single or double precision vertices - private: - static Point VertexCache[3]; -#endif - }; - -#endif //__OPC_MESHINTERFACE_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_Model.cpp b/libraries/ode-0.9/OPCODE/OPC_Model.cpp deleted file mode 100644 index 8b71fb18e2..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Model.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for OPCODE models. - * \file OPC_Model.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * The main collision wrapper, for all trees. Supported trees are: - * - Normal trees (2*N-1 nodes, full size) - * - No-leaf trees (N-1 nodes, full size) - * - Quantized trees (2*N-1 nodes, half size) - * - Quantized no-leaf trees (N-1 nodes, half size) - * - * Usage: - * - * 1) Create a static mesh interface using callbacks or pointers. (see OPC_MeshInterface.cpp). - * Keep it around in your app, since a pointer to this interface is saved internally and - * used until you release the collision structures. - * - * 2) Build a Model using a creation structure: - * - * \code - * Model Sample; - * - * OPCODECREATE OPCC; - * OPCC.IMesh = ...; - * OPCC.Rules = ...; - * OPCC.NoLeaf = ...; - * OPCC.Quantized = ...; - * OPCC.KeepOriginal = ...; - * bool Status = Sample.Build(OPCC); - * \endcode - * - * 3) Create a tree collider and set it up: - * - * \code - * AABBTreeCollider TC; - * TC.SetFirstContact(...); - * TC.SetFullBoxBoxTest(...); - * TC.SetFullPrimBoxTest(...); - * TC.SetTemporalCoherence(...); - * \endcode - * - * 4) Perform a collision query - * - * \code - * // Setup cache - * static BVTCache ColCache; - * ColCache.Model0 = &Model0; - * ColCache.Model1 = &Model1; - * - * // Collision query - * bool IsOk = TC.Collide(ColCache, World0, World1); - * - * // Get collision status => if true, objects overlap - * BOOL Status = TC.GetContactStatus(); - * - * // Number of colliding pairs and list of pairs - * udword NbPairs = TC.GetNbPairs(); - * const Pair* p = TC.GetPairs() - * \endcode - * - * 5) Stats - * - * \code - * Model0.GetUsedBytes() = number of bytes used for this collision tree - * TC.GetNbBVBVTests() = number of BV-BV overlap tests performed during last query - * TC.GetNbPrimPrimTests() = number of Triangle-Triangle overlap tests performed during last query - * TC.GetNbBVPrimTests() = number of Triangle-BV overlap tests performed during last query - * \endcode - * - * \class Model - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Model::Model() -{ -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - mHull = null; -#endif // __MESHMERIZER_H__ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Model::~Model() -{ - Release(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Releases the model. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void Model::Release() -{ - ReleaseBase(); -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - DELETESINGLE(mHull); -#endif // __MESHMERIZER_H__ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool Model::Build(const OPCODECREATE& create) -{ - // 1) Checkings - if(!create.mIMesh || !create.mIMesh->IsValid()) return false; - - // For this model, we only support complete trees - if(create.mSettings.mLimit!=1) return SetIceError("OPCODE WARNING: supports complete trees only! Use mLimit = 1.\n", null); - - // Look for degenerate faces. - udword NbDegenerate = create.mIMesh->CheckTopology(); - if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); - // We continue nonetheless.... - - Release(); // Make sure previous tree has been discarded [Opcode 1.3, thanks Adam] - - // 1-1) Setup mesh interface automatically [Opcode 1.3] - SetMeshInterface(create.mIMesh); - - // Special case for 1-triangle meshes [Opcode 1.3] - udword NbTris = create.mIMesh->GetNbTriangles(); - if(NbTris==1) - { - // We don't need to actually create a tree here, since we'll only have a single triangle to deal with anyway. - // It's a waste to use a "model" for this but at least it will work. - mModelCode |= OPC_SINGLE_NODE; - return true; - } - - // 2) Build a generic AABB Tree. - mSource = new AABBTree; - CHECKALLOC(mSource); - - // 2-1) Setup a builder. Our primitives here are triangles from input mesh, - // so we use an AABBTreeOfTrianglesBuilder..... - { - AABBTreeOfTrianglesBuilder TB; - TB.mIMesh = create.mIMesh; - TB.mSettings = create.mSettings; - TB.mNbPrimitives = NbTris; - if(!mSource->Build(&TB)) return false; - } - - // 3) Create an optimized tree according to user-settings - if(!CreateTree(create.mNoLeaf, create.mQuantized)) return false; - - // 3-2) Create optimized tree - if(!mTree->Build(mSource)) return false; - - // 3-3) Delete generic tree if needed - if(!create.mKeepOriginal) DELETESINGLE(mSource); - -#ifdef __MESHMERIZER_H__ - // 4) Convex hull - if(create.mCollisionHull) - { - // Create hull - mHull = new CollisionHull; - CHECKALLOC(mHull); - - CONVEXHULLCREATE CHC; - // ### doesn't work with strides - CHC.NbVerts = create.mIMesh->GetNbVertices(); - CHC.Vertices = create.mIMesh->GetVerts(); - CHC.UnifyNormals = true; - CHC.ReduceVertices = true; - CHC.WordFaces = false; - mHull->Compute(CHC); - } -#endif // __MESHMERIZER_H__ - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -udword Model::GetUsedBytes() const -{ - if(!mTree) return 0; - return mTree->GetUsedBytes(); -} diff --git a/libraries/ode-0.9/OPCODE/OPC_Model.h b/libraries/ode-0.9/OPCODE/OPC_Model.h deleted file mode 100644 index 98dee560c3..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Model.h +++ /dev/null @@ -1,65 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for OPCODE models. - * \file OPC_Model.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_MODEL_H__ -#define __OPC_MODEL_H__ - - class OPCODE_API Model : public BaseModel - { - public: - // Constructor/Destructor - Model(); - virtual ~Model(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds a collision model. - * \param create [in] model creation structure - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) bool Build(const OPCODECREATE& create); - -#ifdef __MESHMERIZER_H__ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the collision hull. - * \return the collision hull if it exists - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const CollisionHull* GetHull() const { return mHull; } -#endif // __MESHMERIZER_H__ - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of bytes used by the tree. - * \return amount of bytes used - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(BaseModel) udword GetUsedBytes() const; - - private: -#ifdef __MESHMERIZER_H__ - CollisionHull* mHull; //!< Possible convex hull -#endif // __MESHMERIZER_H__ - // Internal methods - void Release(); - }; - -#endif //__OPC_MODEL_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_OBBCollider.cpp b/libraries/ode-0.9/OPCODE/OPC_OBBCollider.cpp deleted file mode 100644 index 028d00018a..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_OBBCollider.cpp +++ /dev/null @@ -1,767 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an OBB collider. - * \file OPC_OBBCollider.cpp - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an OBB-vs-tree collider. - * - * \class OBBCollider - * \author Pierre Terdiman - * \version 1.3 - * \date January, 1st, 2002 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_BoxBoxOverlap.h" -#include "OPC_TriBoxOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - /* Set contact status */ \ - mFlags |= flag; \ - mTouchedPrimitives->Add(udword(prim_index)); - -//! OBB-triangle test -#define OBB_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - /* Transform them in a common space */ \ - TransformPoint(mLeafVerts[0], *VP.Vertex[0], mRModelToBox, mTModelToBox); \ - TransformPoint(mLeafVerts[1], *VP.Vertex[1], mRModelToBox, mTModelToBox); \ - TransformPoint(mLeafVerts[2], *VP.Vertex[2], mRModelToBox, mTModelToBox); \ - /* Perform triangle-box overlap test */ \ - if(TriBoxOverlap()) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -OBBCollider::OBBCollider() : mFullBoxBoxTest(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -OBBCollider::~OBBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Validates current settings. You should call this method after all the settings and callbacks have been defined. - * \return null if everything is ok, else a string describing the problem - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const char* OBBCollider::ValidateSettings() -{ - if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; - - return VolumeCollider::ValidateSettings(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision OBB in local space - * \param model [in] Opcode model to collide with - * \param worldb [in] OBB's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool OBBCollider::Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box, worldb, worldm)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - check temporal coherence - * - * \param cache [in/out] a box cache - * \param box [in] obb in local space - * \param worldb [in] obb's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL OBBCollider::InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute obb in world space - mBoxExtents = box.mExtents; - - Matrix4x4 WorldB; - - if(worldb) - { - WorldB = Matrix4x4( box.mRot * Matrix3x3(*worldb) ); - WorldB.SetTrans(box.mCenter * *worldb); - } - else - { - WorldB = box.mRot; - WorldB.SetTrans(box.mCenter); - } - - // Setup matrices - Matrix4x4 InvWorldB; - InvertPRMatrix(InvWorldB, WorldB); - - if(worldm) - { - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - - Matrix4x4 WorldBtoM = WorldB * InvWorldM; - Matrix4x4 WorldMtoB = *worldm * InvWorldB; - - mRModelToBox = WorldMtoB; WorldMtoB.GetTrans(mTModelToBox); - mRBoxToModel = WorldBtoM; WorldBtoM.GetTrans(mTBoxToModel); - } - else - { - mRModelToBox = InvWorldB; InvWorldB.GetTrans(mTModelToBox); - mRBoxToModel = WorldB; WorldB.GetTrans(mTBoxToModel); - } - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the box (and set contact status if needed) - OBB_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence: - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the box (and set contact status if needed) - OBB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // ### rewrite this - OBB TestBox(mTBoxToModel, mBoxExtents, mRBoxToModel); - - // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): - if(IsCacheValid(cache) && TestBox.IsInside(cache.FatBox)) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat box so that coherence will work for subsequent frames - TestBox.mExtents *= cache.FatCoeff; - mBoxExtents *= cache.FatCoeff; - - // Update cache with query data (signature for cached faces) - cache.FatBox = TestBox; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - // Now we can precompute box-box data - - // Precompute absolute box-to-model rotation matrix - for(udword i=0;i<3;i++) - { - for(udword j=0;j<3;j++) - { - // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) - mAR.m[i][j] = 1e-6f + fabsf(mRBoxToModel.m[i][j]); - } - } - - // Precompute bounds for box-in-box test - mB0 = mBoxExtents - mTModelToBox; - mB1 = - mBoxExtents - mTModelToBox; - - // Precompute box-box data - Courtesy of Erwin de Vries - mBBx1 = mBoxExtents.x*mAR.m[0][0] + mBoxExtents.y*mAR.m[1][0] + mBoxExtents.z*mAR.m[2][0]; - mBBy1 = mBoxExtents.x*mAR.m[0][1] + mBoxExtents.y*mAR.m[1][1] + mBoxExtents.z*mAR.m[2][1]; - mBBz1 = mBoxExtents.x*mAR.m[0][2] + mBoxExtents.y*mAR.m[1][2] + mBoxExtents.z*mAR.m[2][2]; - - mBB_1 = mBoxExtents.y*mAR.m[2][0] + mBoxExtents.z*mAR.m[1][0]; - mBB_2 = mBoxExtents.x*mAR.m[2][0] + mBoxExtents.z*mAR.m[0][0]; - mBB_3 = mBoxExtents.x*mAR.m[1][0] + mBoxExtents.y*mAR.m[0][0]; - mBB_4 = mBoxExtents.y*mAR.m[2][1] + mBoxExtents.z*mAR.m[1][1]; - mBB_5 = mBoxExtents.x*mAR.m[2][1] + mBoxExtents.z*mAR.m[0][1]; - mBB_6 = mBoxExtents.x*mAR.m[1][1] + mBoxExtents.y*mAR.m[0][1]; - mBB_7 = mBoxExtents.y*mAR.m[2][2] + mBoxExtents.z*mAR.m[1][2]; - mBB_8 = mBoxExtents.x*mAR.m[2][2] + mBoxExtents.z*mAR.m[0][2]; - mBB_9 = mBoxExtents.x*mAR.m[1][2] + mBoxExtents.y*mAR.m[0][2]; - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the OBB completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the OBB contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL OBBCollider::OBBContainsBox(const Point& bc, const Point& be) -{ - // I assume if all 8 box vertices are inside the OBB, so does the whole box. - // Sounds ok but maybe there's a better way? -/* -#define TEST_PT(a,b,c) \ - p.x=a; p.y=b; p.z=c; p+=bc; \ - f = p.x * mRModelToBox.m[0][0] + p.y * mRModelToBox.m[1][0] + p.z * mRModelToBox.m[2][0]; if(f>mB0.x || fmB0.y || fmB0.z || f NCx-NEx) return FALSE; - - float NCy = bc.x * mRModelToBox.m[0][1] + bc.y * mRModelToBox.m[1][1] + bc.z * mRModelToBox.m[2][1]; - float NEy = fabsf(mRModelToBox.m[0][1] * be.x) + fabsf(mRModelToBox.m[1][1] * be.y) + fabsf(mRModelToBox.m[2][1] * be.z); - - if(mB0.y < NCy+NEy) return FALSE; - if(mB1.y > NCy-NEy) return FALSE; - - float NCz = bc.x * mRModelToBox.m[0][2] + bc.y * mRModelToBox.m[1][2] + bc.z * mRModelToBox.m[2][2]; - float NEz = fabsf(mRModelToBox.m[0][2] * be.x) + fabsf(mRModelToBox.m[1][2] * be.y) + fabsf(mRModelToBox.m[2][2] * be.z); - - if(mB0.z < NCz+NEz) return FALSE; - if(mB1.z > NCz-NEz) return FALSE; - - return TRUE; -} - -#define TEST_BOX_IN_OBB(center, extents) \ - if(OBBContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->IsLeaf()) - { - OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; - - TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform OBB-AABB overlap test - if(!BoxBoxOverlap(Extents, Center)) return; - - TEST_BOX_IN_OBB(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridOBBCollider::HybridOBBCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridOBBCollider::~HybridOBBCollider() -{ -} - -bool HybridOBBCollider::Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, box, worldb, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - OBB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - OBB_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_OBBCollider.h b/libraries/ode-0.9/OPCODE/OPC_OBBCollider.h deleted file mode 100644 index a05011806b..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_OBBCollider.h +++ /dev/null @@ -1,142 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for an OBB collider. - * \file OPC_OBBCollider.h - * \author Pierre Terdiman - * \date January, 1st, 2002 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_OBBCOLLIDER_H__ -#define __OPC_OBBCOLLIDER_H__ - - struct OPCODE_API OBBCache : VolumeCache - { - OBBCache() : FatCoeff(1.1f) - { - FatBox.mCenter.Zero(); - FatBox.mExtents.Zero(); - FatBox.mRot.Identity(); - } - - // Cached faces signature - OBB FatBox; //!< Box used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< extents multiplier used to create a fat box - }; - - class OPCODE_API OBBCollider : public VolumeCollider - { - public: - // Constructor / Destructor - OBBCollider(); - virtual ~OBBCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a box cache - * \param box [in] collision OBB in local space - * \param model [in] Opcode model to collide with - * \param worldb [in] OBB's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) - * \param flag [in] true for full tests, false for coarse tests - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Precomputed data - Matrix3x3 mAR; //!< Absolute rotation matrix - Matrix3x3 mRModelToBox; //!< Rotation from model space to obb space - Matrix3x3 mRBoxToModel; //!< Rotation from obb space to model space - Point mTModelToBox; //!< Translation from model space to obb space - Point mTBoxToModel; //!< Translation from obb space to model space - - Point mBoxExtents; - Point mB0; //!< - mTModelToBox + mBoxExtents - Point mB1; //!< - mTModelToBox - mBoxExtents - - float mBBx1; - float mBBy1; - float mBBz1; - - float mBB_1; - float mBB_2; - float mBB_3; - float mBB_4; - float mBB_5; - float mBB_6; - float mBB_7; - float mBB_8; - float mBB_9; - - // Leaf description - Point mLeafVerts[3]; //!< Triangle vertices - // Settings - bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL OBBContainsBox(const Point& bc, const Point& be); - inline_ BOOL BoxBoxOverlap(const Point& extents, const Point& center); - inline_ BOOL TriBoxOverlap(); - // Init methods - BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); - }; - - class OPCODE_API HybridOBBCollider : public OBBCollider - { - public: - // Constructor / Destructor - HybridOBBCollider(); - virtual ~HybridOBBCollider(); - - bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_OBBCOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_OptimizedTree.cpp b/libraries/ode-0.9/OPCODE/OPC_OptimizedTree.cpp deleted file mode 100644 index 11b92f9313..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_OptimizedTree.cpp +++ /dev/null @@ -1,782 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for optimized trees. Implements 4 trees: - * - normal - * - no leaf - * - quantized - * - no leaf / quantized - * - * \file OPC_OptimizedTree.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A standard AABB tree. - * - * \class AABBCollisionTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A no-leaf AABB tree. - * - * \class AABBNoLeafTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A quantized AABB tree. - * - * \class AABBQuantizedTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A quantized no-leaf AABB tree. - * - * \class AABBQuantizedNoLeafTree - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -//! Compilation flag: -//! - true to fix quantized boxes (i.e. make sure they enclose the original ones) -//! - false to see the effects of quantization errors (faster, but wrong results in some cases) -static bool gFixQuantized = true; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds an implicit tree from a standard one. An implicit tree is a complete tree (2*N-1 nodes) whose negative - * box pointers and primitive pointers have been made implicit, hence packing 3 pointers in one. - * - * Layout for implicit trees: - * Node: - * - box - * - data (32-bits value) - * - * if data's LSB = 1 => remaining bits are a primitive pointer - * else remaining bits are a P-node pointer, and N = P + 1 - * - * \relates AABBCollisionNode - * \fn _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) - * \param linear [in] base address of destination nodes - * \param box_id [in] index of destination node - * \param current_id [in] current running index - * \param current_node [in] current node from input tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static void _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) -{ - // Current node from input tree is "current_node". Must be flattened into "linear[boxid]". - - // Store the AABB - current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); - current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); - // Store remaining info - if(current_node->IsLeaf()) - { - // The input tree must be complete => i.e. one primitive/leaf - ASSERT(current_node->GetNbPrimitives()==1); - // Get the primitive index from the input tree - udword PrimitiveIndex = current_node->GetPrimitives()[0]; - // Setup box data as the primitive index, marked as leaf - linear[box_id].mData = (PrimitiveIndex<<1)|1; - } - else - { - // To make the negative one implicit, we must store P and N in successive order - udword PosID = current_id++; // Get a new id for positive child - udword NegID = current_id++; // Get a new id for negative child - // Setup box data as the forthcoming new P pointer - linear[box_id].mData = (size_t)&linear[PosID]; - // Make sure it's not marked as leaf - ASSERT(!(linear[box_id].mData&1)); - // Recurse with new IDs - _BuildCollisionTree(linear, PosID, current_id, current_node->GetPos()); - _BuildCollisionTree(linear, NegID, current_id, current_node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds a "no-leaf" tree from a standard one. This is a tree whose leaf nodes have been removed. - * - * Layout for no-leaf trees: - * - * Node: - * - box - * - P pointer => a node (LSB=0) or a primitive (LSB=1) - * - N pointer => a node (LSB=0) or a primitive (LSB=1) - * - * \relates AABBNoLeafNode - * \fn _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) - * \param linear [in] base address of destination nodes - * \param box_id [in] index of destination node - * \param current_id [in] current running index - * \param current_node [in] current node from input tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -static void _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) -{ - const AABBTreeNode* P = current_node->GetPos(); - const AABBTreeNode* N = current_node->GetNeg(); - // Leaf nodes here?! - ASSERT(P); - ASSERT(N); - // Internal node => keep the box - current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); - current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); - - if(P->IsLeaf()) - { - // The input tree must be complete => i.e. one primitive/leaf - ASSERT(P->GetNbPrimitives()==1); - // Get the primitive index from the input tree - udword PrimitiveIndex = P->GetPrimitives()[0]; - // Setup prev box data as the primitive index, marked as leaf - linear[box_id].mPosData = (PrimitiveIndex<<1)|1; - } - else - { - // Get a new id for positive child - udword PosID = current_id++; - // Setup box data - linear[box_id].mPosData = (size_t)&linear[PosID]; - // Make sure it's not marked as leaf - ASSERT(!(linear[box_id].mPosData&1)); - // Recurse - _BuildNoLeafTree(linear, PosID, current_id, P); - } - - if(N->IsLeaf()) - { - // The input tree must be complete => i.e. one primitive/leaf - ASSERT(N->GetNbPrimitives()==1); - // Get the primitive index from the input tree - udword PrimitiveIndex = N->GetPrimitives()[0]; - // Setup prev box data as the primitive index, marked as leaf - linear[box_id].mNegData = (PrimitiveIndex<<1)|1; - } - else - { - // Get a new id for negative child - udword NegID = current_id++; - // Setup box data - linear[box_id].mNegData = (size_t)&linear[NegID]; - // Make sure it's not marked as leaf - ASSERT(!(linear[box_id].mNegData&1)); - // Recurse - _BuildNoLeafTree(linear, NegID, current_id, N); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollisionTree::AABBCollisionTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBCollisionTree::~AABBCollisionTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollisionTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - if(mNbNodes!=NbNodes) // Same number of nodes => keep moving - { - mNbNodes = NbNodes; - DELETEARRAY(mNodes); - mNodes = new AABBCollisionNode[mNbNodes]; - CHECKALLOC(mNodes); - } - - // Build the tree - udword CurID = 1; - _BuildCollisionTree(mNodes, 0, CurID, tree); - ASSERT(CurID==mNbNodes); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision tree after vertices have been modified. - * \param mesh_interface [in] mesh interface for current model - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollisionTree::Refit(const MeshInterface* mesh_interface) -{ - ASSERT(!"Not implemented since AABBCollisionTrees have twice as more nodes to refit as AABBNoLeafTrees!"); - return false; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Walks the tree and call the user back for each node. - * \param callback [in] walking callback - * \param user_data [in] callback's user data - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBCollisionTree::Walk(GenericWalkingCallback callback, void* user_data) const -{ - if(!callback) return false; - - struct Local - { - static void _Walk(const AABBCollisionNode* current_node, GenericWalkingCallback callback, void* user_data) - { - if(!current_node || !(callback)(current_node, user_data)) return; - - if(!current_node->IsLeaf()) - { - _Walk(current_node->GetPos(), callback, user_data); - _Walk(current_node->GetNeg(), callback, user_data); - } - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBNoLeafTree::AABBNoLeafTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBNoLeafTree::~AABBNoLeafTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBNoLeafTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - if(mNbNodes!=NbTriangles-1) // Same number of nodes => keep moving - { - mNbNodes = NbTriangles-1; - DELETEARRAY(mNodes); - mNodes = new AABBNoLeafNode[mNbNodes]; - CHECKALLOC(mNodes); - } - - // Build the tree - udword CurID = 1; - _BuildNoLeafTree(mNodes, 0, CurID, tree); - ASSERT(CurID==mNbNodes); - - return true; -} - -inline_ void ComputeMinMax(Point& min, Point& max, const VertexPointers& vp) -{ - // Compute triangle's AABB = a leaf box -#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much - min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); - - min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); - - min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); - max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); -#else - min = *vp.Vertex[0]; - max = *vp.Vertex[0]; - min.Min(*vp.Vertex[1]); - max.Max(*vp.Vertex[1]); - min.Min(*vp.Vertex[2]); - max.Max(*vp.Vertex[2]); -#endif -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Refits the collision tree after vertices have been modified. - * \param mesh_interface [in] mesh interface for current model - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBNoLeafTree::Refit(const MeshInterface* mesh_interface) -{ - // Checkings - if(!mesh_interface) return false; - - // Bottom-up update - VertexPointers VP; - Point Min,Max; - Point Min_,Max_; - udword Index = mNbNodes; - while(Index--) - { - AABBNoLeafNode& Current = mNodes[Index]; - - if(Current.HasPosLeaf()) - { - mesh_interface->GetTriangle(VP, Current.GetPosPrimitive()); - ComputeMinMax(Min, Max, VP); - } - else - { - const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; - CurrentBox.GetMin(Min); - CurrentBox.GetMax(Max); - } - - if(Current.HasNegLeaf()) - { - mesh_interface->GetTriangle(VP, Current.GetNegPrimitive()); - ComputeMinMax(Min_, Max_, VP); - } - else - { - const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; - CurrentBox.GetMin(Min_); - CurrentBox.GetMax(Max_); - } -#ifdef OPC_USE_FCOMI - Min.x = FCMin2(Min.x, Min_.x); - Max.x = FCMax2(Max.x, Max_.x); - Min.y = FCMin2(Min.y, Min_.y); - Max.y = FCMax2(Max.y, Max_.y); - Min.z = FCMin2(Min.z, Min_.z); - Max.z = FCMax2(Max.z, Max_.z); -#else - Min.Min(Min_); - Max.Max(Max_); -#endif - Current.mAABB.SetMinMax(Min, Max); - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Walks the tree and call the user back for each node. - * \param callback [in] walking callback - * \param user_data [in] callback's user data - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBNoLeafTree::Walk(GenericWalkingCallback callback, void* user_data) const -{ - if(!callback) return false; - - struct Local - { - static void _Walk(const AABBNoLeafNode* current_node, GenericWalkingCallback callback, void* user_data) - { - if(!current_node || !(callback)(current_node, user_data)) return; - - if(!current_node->HasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); - if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} - -// Quantization notes: -// - We could use the highest bits of mData to store some more quantized bits. Dequantization code -// would be slightly more complex, but number of overlap tests would be reduced (and anyhow those -// bits are currently wasted). Of course it's not possible if we move to 16 bits mData. -// - Something like "16 bits floats" could be tested, to bypass the int-to-float conversion. -// - A dedicated BV-BV test could be used, dequantizing while testing for overlap. (i.e. it's some -// lazy-dequantization which may save some work in case of early exits). At the very least some -// muls could be saved by precomputing several more matrices. But maybe not worth the pain. -// - Do we need to dequantize anyway? Not doing the extents-related muls only implies the box has -// been scaled, for example. -// - The deeper we move into the hierarchy, the smaller the extents should be. May not need a fixed -// number of quantization bits. Even better, could probably be best delta-encoded. - - -// Find max values. Some people asked why I wasn't simply using the first node. Well, I can't. -// I'm not looking for (min, max) values like in a standard AABB, I'm looking for the extremal -// centers/extents in order to quantize them. The first node would only give a single center and -// a single extents. While extents would be the biggest, the center wouldn't. -#define FIND_MAX_VALUES \ - /* Get max values */ \ - Point CMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ - Point EMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ - for(udword i=0;iCMax.x) CMax.x = fabsf(Nodes[i].mAABB.mCenter.x); \ - if(fabsf(Nodes[i].mAABB.mCenter.y)>CMax.y) CMax.y = fabsf(Nodes[i].mAABB.mCenter.y); \ - if(fabsf(Nodes[i].mAABB.mCenter.z)>CMax.z) CMax.z = fabsf(Nodes[i].mAABB.mCenter.z); \ - if(fabsf(Nodes[i].mAABB.mExtents.x)>EMax.x) EMax.x = fabsf(Nodes[i].mAABB.mExtents.x); \ - if(fabsf(Nodes[i].mAABB.mExtents.y)>EMax.y) EMax.y = fabsf(Nodes[i].mAABB.mExtents.y); \ - if(fabsf(Nodes[i].mAABB.mExtents.z)>EMax.z) EMax.z = fabsf(Nodes[i].mAABB.mExtents.z); \ - } - -#define INIT_QUANTIZATION \ - udword nbc=15; /* Keep one bit for sign */ \ - udword nbe=15; /* Keep one bit for fix */ \ - if(!gFixQuantized) nbe++; \ - \ - /* Compute quantization coeffs */ \ - Point CQuantCoeff, EQuantCoeff; \ - CQuantCoeff.x = CMax.x!=0.0f ? float((1<Min[j]) mNodes[i].mAABB.mExtents[j]++; \ - else FixMe=false; \ - /* Prevent wrapping */ \ - if(!mNodes[i].mAABB.mExtents[j]) \ - { \ - mNodes[i].mAABB.mExtents[j]=0xffff; \ - FixMe=false; \ - } \ - }while(FixMe); \ - } \ - } - -#define REMAP_DATA(member) \ - /* Fix data */ \ - Data = Nodes[i].member; \ - if(!(Data&1)) \ - { \ - /* Compute box number */ \ - size_t Nb = (Data - size_t(Nodes))/Nodes[i].GetNodeSize(); \ - Data = (size_t) &mNodes[Nb]; \ - } \ - /* ...remapped */ \ - mNodes[i].member = Data; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedTree::AABBQuantizedTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedTree::~AABBQuantizedTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBQuantizedTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - mNbNodes = NbNodes; - DELETEARRAY(mNodes); - AABBCollisionNode* Nodes = new AABBCollisionNode[mNbNodes]; - CHECKALLOC(Nodes); - - // Build the tree - udword CurID = 1; - _BuildCollisionTree(Nodes, 0, CurID, tree); - - // Quantize - { - mNodes = new AABBQuantizedNode[mNbNodes]; - CHECKALLOC(mNodes); - - // Get max values - FIND_MAX_VALUES - - // Quantization - INIT_QUANTIZATION - - // Quantize - size_t Data; - for(udword i=0;iIsLeaf()) - { - _Walk(current_node->GetPos(), callback, user_data); - _Walk(current_node->GetNeg(), callback, user_data); - } - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedNoLeafTree::AABBQuantizedNoLeafTree() : mNodes(null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -AABBQuantizedNoLeafTree::~AABBQuantizedNoLeafTree() -{ - DELETEARRAY(mNodes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBQuantizedNoLeafTree::Build(AABBTree* tree) -{ - // Checkings - if(!tree) return false; - // Check the input tree is complete - udword NbTriangles = tree->GetNbPrimitives(); - udword NbNodes = tree->GetNbNodes(); - if(NbNodes!=NbTriangles*2-1) return false; - - // Get nodes - mNbNodes = NbTriangles-1; - DELETEARRAY(mNodes); - AABBNoLeafNode* Nodes = new AABBNoLeafNode[mNbNodes]; - CHECKALLOC(Nodes); - - // Build the tree - udword CurID = 1; - _BuildNoLeafTree(Nodes, 0, CurID, tree); - ASSERT(CurID==mNbNodes); - - // Quantize - { - mNodes = new AABBQuantizedNoLeafNode[mNbNodes]; - CHECKALLOC(mNodes); - - // Get max values - FIND_MAX_VALUES - - // Quantization - INIT_QUANTIZATION - - // Quantize - size_t Data; - for(udword i=0;iHasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); - if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); - } - }; - Local::_Walk(mNodes, callback, user_data); - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_OptimizedTree.h b/libraries/ode-0.9/OPCODE/OPC_OptimizedTree.h deleted file mode 100644 index 36aea07181..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_OptimizedTree.h +++ /dev/null @@ -1,206 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for optimized trees. - * \file OPC_OptimizedTree.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_OPTIMIZEDTREE_H__ -#define __OPC_OPTIMIZEDTREE_H__ - - //! Common interface for a node of an implicit tree - #define IMPLEMENT_IMPLICIT_NODE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - inline_ base_class() : mData(0) {} \ - inline_ ~base_class() {} \ - /* Leaf test */ \ - inline_ BOOL IsLeaf() const { return (mData&1)!=0; } \ - /* Data access */ \ - inline_ const base_class* GetPos() const { return (base_class*)mData; } \ - inline_ const base_class* GetNeg() const { return ((base_class*)mData)+1; } \ - inline_ size_t GetPrimitive() const { return (mData>>1); } \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - \ - volume mAABB; \ - size_t mData; - - //! Common interface for a node of a no-leaf tree - #define IMPLEMENT_NOLEAF_NODE(base_class, volume) \ - public: \ - /* Constructor / Destructor */ \ - inline_ base_class() : mPosData(0), mNegData(0) {} \ - inline_ ~base_class() {} \ - /* Leaf tests */ \ - inline_ BOOL HasPosLeaf() const { return (mPosData&1)!=0; } \ - inline_ BOOL HasNegLeaf() const { return (mNegData&1)!=0; } \ - /* Data access */ \ - inline_ const base_class* GetPos() const { return (base_class*)mPosData; } \ - inline_ const base_class* GetNeg() const { return (base_class*)mNegData; } \ - inline_ size_t GetPosPrimitive() const { return (mPosData>>1); } \ - inline_ size_t GetNegPrimitive() const { return (mNegData>>1); } \ - /* Stats */ \ - inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ - \ - volume mAABB; \ - size_t mPosData; \ - size_t mNegData; - - class OPCODE_API AABBCollisionNode - { - IMPLEMENT_IMPLICIT_NODE(AABBCollisionNode, CollisionAABB) - - inline_ float GetVolume() const { return mAABB.mExtents.x * mAABB.mExtents.y * mAABB.mExtents.z; } - inline_ float GetSize() const { return mAABB.mExtents.SquareMagnitude(); } - inline_ udword GetRadius() const - { - udword* Bits = (udword*)&mAABB.mExtents.x; - udword Max = Bits[0]; - if(Bits[1]>Max) Max = Bits[1]; - if(Bits[2]>Max) Max = Bits[2]; - return Max; - } - - // NB: using the square-magnitude or the true volume of the box, seems to yield better results - // (assuming UNC-like informed traversal methods). I borrowed this idea from PQP. The usual "size" - // otherwise, is the largest box extent. In SOLID that extent is computed on-the-fly each time it's - // needed (the best approach IMHO). In RAPID the rotation matrix is permuted so that Extent[0] is - // always the greatest, which saves looking for it at runtime. On the other hand, it yields matrices - // whose determinant is not 1, i.e. you can't encode them anymore as unit quaternions. Not a very - // good strategy. - }; - - class OPCODE_API AABBQuantizedNode - { - IMPLEMENT_IMPLICIT_NODE(AABBQuantizedNode, QuantizedAABB) - - inline_ uword GetSize() const - { - const uword* Bits = mAABB.mExtents; - uword Max = Bits[0]; - if(Bits[1]>Max) Max = Bits[1]; - if(Bits[2]>Max) Max = Bits[2]; - return Max; - } - // NB: for quantized nodes I don't feel like computing a square-magnitude with integers all - // over the place.......! - }; - - class OPCODE_API AABBNoLeafNode - { - IMPLEMENT_NOLEAF_NODE(AABBNoLeafNode, CollisionAABB) - }; - - class OPCODE_API AABBQuantizedNoLeafNode - { - IMPLEMENT_NOLEAF_NODE(AABBQuantizedNoLeafNode, QuantizedAABB) - }; - - //! Common interface for a collision tree - #define IMPLEMENT_COLLISION_TREE(base_class, node) \ - public: \ - /* Constructor / Destructor */ \ - base_class(); \ - virtual ~base_class(); \ - /* Builds from a standard tree */ \ - override(AABBOptimizedTree) bool Build(AABBTree* tree); \ - /* Refits the tree */ \ - override(AABBOptimizedTree) bool Refit(const MeshInterface* mesh_interface); \ - /* Walks the tree */ \ - override(AABBOptimizedTree) bool Walk(GenericWalkingCallback callback, void* user_data) const; \ - /* Data access */ \ - inline_ const node* GetNodes() const { return mNodes; } \ - /* Stats */ \ - override(AABBOptimizedTree) udword GetUsedBytes() const { return mNbNodes*sizeof(node); } \ - private: \ - node* mNodes; - - typedef bool (*GenericWalkingCallback) (const void* current, void* user_data); - - class OPCODE_API AABBOptimizedTree - { - public: - // Constructor / Destructor - AABBOptimizedTree() : - mNbNodes (0) - {} - virtual ~AABBOptimizedTree() {} - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Builds the collision tree from a generic AABB tree. - * \param tree [in] generic AABB tree - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Build(AABBTree* tree) = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Refits the collision tree after vertices have been modified. - * \param mesh_interface [in] mesh interface for current model - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Refit(const MeshInterface* mesh_interface) = 0; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Walks the tree and call the user back for each node. - * \param callback [in] walking callback - * \param user_data [in] callback's user data - * \return true if success - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool Walk(GenericWalkingCallback callback, void* user_data) const = 0; - - // Data access - virtual udword GetUsedBytes() const = 0; - inline_ udword GetNbNodes() const { return mNbNodes; } - - protected: - udword mNbNodes; - }; - - class OPCODE_API AABBCollisionTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBCollisionTree, AABBCollisionNode) - }; - - class OPCODE_API AABBNoLeafTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBNoLeafTree, AABBNoLeafNode) - }; - - class OPCODE_API AABBQuantizedTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBQuantizedTree, AABBQuantizedNode) - - public: - Point mCenterCoeff; - Point mExtentsCoeff; - }; - - class OPCODE_API AABBQuantizedNoLeafTree : public AABBOptimizedTree - { - IMPLEMENT_COLLISION_TREE(AABBQuantizedNoLeafTree, AABBQuantizedNoLeafNode) - - public: - Point mCenterCoeff; - Point mExtentsCoeff; - }; - -#endif // __OPC_OPTIMIZEDTREE_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_Picking.cpp b/libraries/ode-0.9/OPCODE/OPC_Picking.cpp deleted file mode 100644 index 3b53774133..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Picking.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code to perform "picking". - * \file OPC_Picking.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#ifdef OPC_RAYHIT_CALLBACK - -/* - Possible RayCollider usages: - - boolean query (shadow feeler) - - closest hit - - all hits - - number of intersection (boolean) - -*/ - -bool Opcode::SetupAllHits(RayCollider& collider, CollisionFaces& contacts) -{ - struct Local - { - static void AllContacts(const CollisionFace& hit, void* user_data) - { - CollisionFaces* CF = (CollisionFaces*)user_data; - CF->AddFace(hit); - } - }; - - collider.SetFirstContact(false); - collider.SetHitCallback(Local::AllContacts); - collider.SetUserData(&contacts); - return true; -} - -bool Opcode::SetupClosestHit(RayCollider& collider, CollisionFace& closest_contact) -{ - struct Local - { - static void ClosestContact(const CollisionFace& hit, void* user_data) - { - CollisionFace* CF = (CollisionFace*)user_data; - if(hit.mDistancemDistance) *CF = hit; - } - }; - - collider.SetFirstContact(false); - collider.SetHitCallback(Local::ClosestContact); - collider.SetUserData(&closest_contact); - closest_contact.mDistance = MAX_FLOAT; - return true; -} - -bool Opcode::SetupShadowFeeler(RayCollider& collider) -{ - collider.SetFirstContact(true); - collider.SetHitCallback(null); - return true; -} - -bool Opcode::SetupInOutTest(RayCollider& collider) -{ - collider.SetFirstContact(false); - collider.SetHitCallback(null); - // Results with collider.GetNbIntersections() - return true; -} - -bool Opcode::Picking( -CollisionFace& picked_face, -const Ray& world_ray, const Model& model, const Matrix4x4* world, -float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data) -{ - struct Local - { - struct CullData - { - CollisionFace* Closest; - float MinLimit; - CullModeCallback Callback; - void* UserData; - Point ViewPoint; - const MeshInterface* IMesh; - }; - - // Called for each stabbed face - static void RenderCullingCallback(const CollisionFace& hit, void* user_data) - { - CullData* Data = (CullData*)user_data; - - // Discard face if we already have a closer hit - if(hit.mDistance>=Data->Closest->mDistance) return; - - // Discard face if hit point is smaller than min limit. This mainly happens when the face is in front - // of the near clip plane (or straddles it). If we keep the face nonetheless, the user can select an - // object that he may not even be able to see, which is very annoying. - if(hit.mDistance<=Data->MinLimit) return; - - // This is the index of currently stabbed triangle. - udword StabbedFaceIndex = hit.mFaceID; - - // We may keep it or not, depending on backface culling - bool KeepIt = true; - - // Catch *render* cull mode for this face - CullMode CM = (Data->Callback)(StabbedFaceIndex, Data->UserData); - - if(CM!=CULLMODE_NONE) // Don't even compute culling for double-sided triangles - { - // Compute backface culling for current face - - VertexPointers VP; - Data->IMesh->GetTriangle(VP, StabbedFaceIndex); - if(VP.BackfaceCulling(Data->ViewPoint)) - { - if(CM==CULLMODE_CW) KeepIt = false; - } - else - { - if(CM==CULLMODE_CCW) KeepIt = false; - } - } - - if(KeepIt) *Data->Closest = hit; - } - }; - - RayCollider RC; - RC.SetMaxDist(max_dist); - RC.SetTemporalCoherence(false); - RC.SetCulling(false); // We need all faces since some of them can be double-sided - RC.SetFirstContact(false); - RC.SetHitCallback(Local::RenderCullingCallback); - - picked_face.mFaceID = INVALID_ID; - picked_face.mDistance = MAX_FLOAT; - picked_face.mU = 0.0f; - picked_face.mV = 0.0f; - - Local::CullData Data; - Data.Closest = &picked_face; - Data.MinLimit = min_dist; - Data.Callback = callback; - Data.UserData = user_data; - Data.ViewPoint = view_point; - Data.IMesh = model.GetMeshInterface(); - - if(world) - { - // Get matrices - Matrix4x4 InvWorld; - InvertPRMatrix(InvWorld, *world); - - // Compute camera position in mesh space - Data.ViewPoint *= InvWorld; - } - - RC.SetUserData(&Data); - if(RC.Collide(world_ray, model, world)) - { - return picked_face.mFaceID!=INVALID_ID; - } - return false; -} - -#endif diff --git a/libraries/ode-0.9/OPCODE/OPC_Picking.h b/libraries/ode-0.9/OPCODE/OPC_Picking.h deleted file mode 100644 index d22fa38ac8..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Picking.h +++ /dev/null @@ -1,45 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code to perform "picking". - * \file OPC_Picking.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_PICKING_H__ -#define __OPC_PICKING_H__ - -#ifdef OPC_RAYHIT_CALLBACK - - enum CullMode - { - CULLMODE_NONE = 0, - CULLMODE_CW = 1, - CULLMODE_CCW = 2 - }; - - typedef CullMode (*CullModeCallback)(udword triangle_index, void* user_data); - - OPCODE_API bool SetupAllHits (RayCollider& collider, CollisionFaces& contacts); - OPCODE_API bool SetupClosestHit (RayCollider& collider, CollisionFace& closest_contact); - OPCODE_API bool SetupShadowFeeler (RayCollider& collider); - OPCODE_API bool SetupInOutTest (RayCollider& collider); - - OPCODE_API bool Picking( - CollisionFace& picked_face, - const Ray& world_ray, const Model& model, const Matrix4x4* world, - float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data); -#endif - -#endif //__OPC_PICKING_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_PlanesAABBOverlap.h b/libraries/ode-0.9/OPCODE/OPC_PlanesAABBOverlap.h deleted file mode 100644 index 5d7576e50a..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_PlanesAABBOverlap.h +++ /dev/null @@ -1,50 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Planes-AABB overlap test. - * - original code by Ville Miettinen, from Umbra/dPVS (released on the GD-Algorithms mailing list) - * - almost used "as-is", I even left the comments (hence the frustum-related notes) - * - * \param center [in] box center - * \param extents [in] box extents - * \param out_clip_mask [out] bitmask for active planes - * \param in_clip_mask [in] bitmask for active planes - * \return TRUE if boxes overlap planes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL PlanesCollider::PlanesAABBOverlap(const Point& center, const Point& extents, udword& out_clip_mask, udword in_clip_mask) -{ - // Stats - mNbVolumeBVTests++; - - const Plane* p = mPlanes; - - // Evaluate through all active frustum planes. We determine the relation - // between the AABB and a plane by using the concept of "near" and "far" - // vertices originally described by Zhang (and later by Mller). Our - // variant here uses 3 fabs ops, 6 muls, 7 adds and two floating point - // comparisons per plane. The routine early-exits if the AABB is found - // to be outside any of the planes. The loop also constructs a new output - // clip mask. Most FPUs have a native single-cycle fabsf() operation. - - udword Mask = 1; // current mask index (1,2,4,8,..) - udword TmpOutClipMask = 0; // initialize output clip mask into empty. - - while(Mask<=in_clip_mask) // keep looping while we have active planes left... - { - if(in_clip_mask & Mask) // if clip plane is active, process it.. - { - float NP = extents.x*fabsf(p->n.x) + extents.y*fabsf(p->n.y) + extents.z*fabsf(p->n.z); // ### fabsf could be precomputed - float MP = center.x*p->n.x + center.y*p->n.y + center.z*p->n.z + p->d; - - if(NP < MP) // near vertex behind the clip plane... - return FALSE; // .. so there is no intersection.. - if((-NP) < MP) // near and far vertices on different sides of plane.. - TmpOutClipMask |= Mask; // .. so update the clip mask... - } - Mask+=Mask; // mk = (1<Add(udword(prim_index)); - -//! Planes-triangle test -#define PLANES_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - mIMesh->GetTriangle(mVP, prim_index); \ - /* Perform triangle-box overlap test */ \ - if(PlanesTriOverlap(clip_mask)) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -PlanesCollider::PlanesCollider() : - mPlanes (null), - mNbPlanes (0) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -PlanesCollider::~PlanesCollider() -{ - DELETEARRAY(mPlanes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Validates current settings. You should call this method after all the settings and callbacks have been defined. - * \return null if everything is ok, else a string describing the problem - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const char* PlanesCollider::ValidateSettings() -{ - if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; - - return VolumeCollider::ValidateSettings(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a planes cache - * \param planes [in] list of planes in world space - * \param nb_planes [in] number of planes - * \param model [in] Opcode model to collide with - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool PlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const Model& model, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, planes, nb_planes, worldm)) return true; - - udword PlaneMask = (1<mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - else _Collide(Tree->GetNodes(), PlaneMask); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - compute planes in model space - * - check temporal coherence - * - * \param cache [in/out] a planes cache - * \param planes [in] list of planes - * \param nb_planes [in] number of planes - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL PlanesCollider::InitQuery(PlanesCache& cache, const Plane* planes, udword nb_planes, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute planes in model space - if(nb_planes>mNbPlanes) - { - DELETEARRAY(mPlanes); - mPlanes = new Plane[nb_planes]; - } - mNbPlanes = nb_planes; - - if(worldm) - { - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - -// for(udword i=0;iHasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the planes (and set contact status if needed) - udword clip_mask = (1< check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the planes (and set contact status if needed) - udword clip_mask = (1< we'll have to perform a normal query - } - else mTouchedPrimitives->Reset(); - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - return FALSE; -} - -#define TEST_CLIP_MASK \ - /* If the box is completely included, so are its children. We don't need to do extra tests, we */ \ - /* can immediately output a list of visible children. Those ones won't need to be clipped. */ \ - if(!OutClipMask) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBCollisionNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _Collide(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBQuantizedNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _Collide(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBNoLeafNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg(), OutClipMask); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node, udword clip_mask) -{ - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_Collide(const AABBQuantizedNoLeafNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg(), OutClipMask); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node, udword clip_mask) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. - udword OutClipMask; - if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; - - TEST_CLIP_MASK - - // Else the box straddles one or several planes, so we need to recurse down the tree. - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); -} - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridPlanesCollider::HybridPlanesCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridPlanesCollider::~HybridPlanesCollider() -{ -} - -bool HybridPlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const HybridModel& model, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, planes, nb_planes, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - udword clip_mask = (1<mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - udword clip_mask = (1<Distance(*mVP.Vertex[0]); - float d1 = p->Distance(*mVP.Vertex[1]); - float d2 = p->Distance(*mVP.Vertex[2]); - if(d0>0.0f && d1>0.0f && d2>0.0f) return FALSE; -// if(!(IR(d0)&SIGN_BITMASK) && !(IR(d1)&SIGN_BITMASK) && !(IR(d2)&SIGN_BITMASK)) return FALSE; - } - Mask+=Mask; - p++; - } -/* - for(udword i=0;i<6;i++) - { - float d0 = p[i].Distance(mLeafVerts[0]); - float d1 = p[i].Distance(mLeafVerts[1]); - float d2 = p[i].Distance(mLeafVerts[2]); - if(d0>0.0f && d1>0.0f && d2>0.0f) return false; - } -*/ - return TRUE; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_RayAABBOverlap.h b/libraries/ode-0.9/OPCODE/OPC_RayAABBOverlap.h deleted file mode 100644 index a8162bf033..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_RayAABBOverlap.h +++ /dev/null @@ -1,63 +0,0 @@ -// Opcode 1.1: ray-AABB overlap tests based on Woo's code -// Opcode 1.2: ray-AABB overlap tests based on the separating axis theorem -// -// The point of intersection is not computed anymore. The distance to impact is not needed anymore -// since we now have two different queries for segments or rays. - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a segment-AABB overlap test using the separating axis theorem. Segment is cached within the class. - * \param center [in] AABB center - * \param extents [in] AABB extents - * \return true on overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::SegmentAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbRayBVTests++; - - float Dx = mData2.x - center.x; if(fabsf(Dx) > extents.x + mFDir.x) return FALSE; - float Dy = mData2.y - center.y; if(fabsf(Dy) > extents.y + mFDir.y) return FALSE; - float Dz = mData2.z - center.z; if(fabsf(Dz) > extents.z + mFDir.z) return FALSE; - - float f; - f = mData.y * Dz - mData.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; - f = mData.z * Dx - mData.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; - f = mData.x * Dy - mData.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; - - return TRUE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a ray-AABB overlap test using the separating axis theorem. Ray is cached within the class. - * \param center [in] AABB center - * \param extents [in] AABB extents - * \return true on overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::RayAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbRayBVTests++; - -// float Dx = mOrigin.x - center.x; if(fabsf(Dx) > extents.x && Dx*mDir.x>=0.0f) return FALSE; -// float Dy = mOrigin.y - center.y; if(fabsf(Dy) > extents.y && Dy*mDir.y>=0.0f) return FALSE; -// float Dz = mOrigin.z - center.z; if(fabsf(Dz) > extents.z && Dz*mDir.z>=0.0f) return FALSE; - - float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && Dx*mDir.x>=0.0f) return FALSE; - float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && Dy*mDir.y>=0.0f) return FALSE; - float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && Dz*mDir.z>=0.0f) return FALSE; - -// float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && ((SIR(Dx)-1)^SIR(mDir.x))>=0.0f) return FALSE; -// float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && ((SIR(Dy)-1)^SIR(mDir.y))>=0.0f) return FALSE; -// float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && ((SIR(Dz)-1)^SIR(mDir.z))>=0.0f) return FALSE; - - float f; - f = mDir.y * Dz - mDir.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; - f = mDir.z * Dx - mDir.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; - f = mDir.x * Dy - mDir.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; - - return TRUE; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_RayCollider.cpp b/libraries/ode-0.9/OPCODE/OPC_RayCollider.cpp deleted file mode 100644 index 5828ce4336..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_RayCollider.cpp +++ /dev/null @@ -1,762 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a ray collider. - * \file OPC_RayCollider.cpp - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a ray-vs-tree collider. - * This class performs a stabbing query on an AABB tree, i.e. does a ray-mesh collision. - * - * HIGHER DISTANCE BOUND: - * - * If P0 and P1 are two 3D points, let's define: - * - d = distance between P0 and P1 - * - Origin = P0 - * - Direction = (P1 - P0) / d = normalized direction vector - * - A parameter t such as a point P on the line (P0,P1) is P = Origin + t * Direction - * - t = 0 --> P = P0 - * - t = d --> P = P1 - * - * Then we can define a general "ray" as: - * - * struct Ray - * { - * Point Origin; - * Point Direction; - * }; - * - * But it actually maps three different things: - * - a segment, when 0 <= t <= d - * - a half-line, when 0 <= t < +infinity, or -infinity < t <= d - * - a line, when -infinity < t < +infinity - * - * In Opcode, we support segment queries, which yield half-line queries by setting d = +infinity. - * We don't support line-queries. If you need them, shift the origin along the ray by an appropriate margin. - * - * In short, the lower bound is always 0, and you can setup the higher bound "d" with RayCollider::SetMaxDist(). - * - * Query |segment |half-line |line - * --------|-------------------|---------------|---------------- - * Usages |-shadow feelers |-raytracing |- - * |-sweep tests |-in/out tests | - * - * FIRST CONTACT: - * - * - You can setup "first contact" mode or "all contacts" mode with RayCollider::SetFirstContact(). - * - In "first contact" mode we return as soon as the ray hits one face. If can be useful e.g. for shadow feelers, where - * you want to know whether the path to the light is free or not (a boolean answer is enough). - * - In "all contacts" mode we return all faces hit by the ray. - * - * TEMPORAL COHERENCE: - * - * - You can enable or disable temporal coherence with RayCollider::SetTemporalCoherence(). - * - It currently only works in "first contact" mode. - * - If temporal coherence is enabled, the previously hit triangle is cached during the first query. Then, next queries - * start by colliding the ray against the cached triangle. If they still collide, we return immediately. - * - * CLOSEST HIT: - * - * - You can enable or disable "closest hit" with RayCollider::SetClosestHit(). - * - It currently only works in "all contacts" mode. - * - If closest hit is enabled, faces are sorted by distance on-the-fly and the closest one only is reported. - * - * BACKFACE CULLING: - * - * - You can enable or disable backface culling with RayCollider::SetCulling(). - * - If culling is enabled, ray will not hit back faces (only front faces). - * - * - * - * \class RayCollider - * \author Pierre Terdiman - * \version 1.3 - * \date June, 2, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * This class describes a face hit by a ray or segment. - * This is a particular class dedicated to stabbing queries. - * - * \class CollisionFace - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * This class is a dedicated collection of CollisionFace. - * - * \class CollisionFaces - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_RayAABBOverlap.h" -#include "OPC_RayTriOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - mNbIntersections++; \ - /* Set contact status */ \ - mFlags |= flag; \ - /* In any case the contact has been found and recorded in mStabbedFace */ \ - mStabbedFace.mFaceID = prim_index; - -#ifdef OPC_RAYHIT_CALLBACK - - #define HANDLE_CONTACT(prim_index, flag) \ - SET_CONTACT(prim_index, flag) \ - \ - if(mHitCallback) (mHitCallback)(mStabbedFace, mUserData); - - #define UPDATE_CACHE \ - if(cache && GetContactStatus()) \ - { \ - *cache = mStabbedFace.mFaceID; \ - } -#else - - #define HANDLE_CONTACT(prim_index, flag) \ - SET_CONTACT(prim_index, flag) \ - \ - /* Now we can also record it in mStabbedFaces if available */ \ - if(mStabbedFaces) \ - { \ - /* If we want all faces or if that's the first one we hit */ \ - if(!mClosestHit || !mStabbedFaces->GetNbFaces()) \ - { \ - mStabbedFaces->AddFace(mStabbedFace); \ - } \ - else \ - { \ - /* We only keep closest hit */ \ - CollisionFace* Current = const_cast(mStabbedFaces->GetFaces()); \ - if(Current && mStabbedFace.mDistancemDistance) \ - { \ - *Current = mStabbedFace; \ - } \ - } \ - } - - #define UPDATE_CACHE \ - if(cache && GetContactStatus() && mStabbedFaces) \ - { \ - const CollisionFace* Current = mStabbedFaces->GetFaces(); \ - if(Current) *cache = Current->mFaceID; \ - else *cache = INVALID_ID; \ - } -#endif - -#define SEGMENT_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - \ - /* Perform ray-tri overlap test and return */ \ - if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - /* Intersection point is valid if dist < segment's length */ \ - /* We know dist>0 so we can use integers */ \ - if(IR(mStabbedFace.mDistance)GetTriangle(VP, prim_index); \ - \ - /* Perform ray-tri overlap test and return */ \ - if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - HANDLE_CONTACT(prim_index, flag) \ - } - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RayCollider::RayCollider() : - mNbRayBVTests (0), - mNbRayPrimTests (0), - mNbIntersections (0), - mCulling (true), -#ifdef OPC_RAYHIT_CALLBACK - mHitCallback (null), - mUserData (0), -#else - mClosestHit (false), - mStabbedFaces (null), -#endif - mMaxDist (MAX_FLOAT) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -RayCollider::~RayCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Validates current settings. You should call this method after all the settings and callbacks have been defined. - * \return null if everything is ok, else a string describing the problem - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const char* RayCollider::ValidateSettings() -{ - if(mMaxDist<0.0f) return "Higher distance bound must be positive!"; - if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; -#ifndef OPC_RAYHIT_CALLBACK - if(mClosestHit && FirstContactEnabled()) return "Closest hit doesn't work with ""First contact"" mode!"; - if(TemporalCoherenceEnabled() && mClosestHit) return "Temporal coherence can't guarantee to report closest hit!"; -#endif - if(SkipPrimitiveTests()) return "SkipPrimitiveTests not possible for RayCollider ! (not implemented)"; - return null; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic stabbing query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - in the user-provided destination array - * - * \param world_ray [in] stabbing ray in world space - * \param model [in] Opcode model to collide with - * \param world [in] model's world matrix, or null - * \param cache [in] a possibly cached face index, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool RayCollider::Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world, udword* cache) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(world_ray, world, cache)) return true; - - if(!model.HasLeafNodes()) - { - if(model.IsQuantized()) - { - const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); - else _RayStab(Tree->GetNodes()); - } - } - - // Update cache if needed - UPDATE_CACHE - return true; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a stabbing query : - * - reset stats & contact status - * - compute ray in local space - * - check temporal coherence - * - * \param world_ray [in] stabbing ray in world space - * \param world [in] object's world matrix, or null - * \param face_id [in] index of previously stabbed triangle - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL RayCollider::InitQuery(const Ray& world_ray, const Matrix4x4* world, udword* face_id) -{ - // Reset stats & contact status - Collider::InitQuery(); - mNbRayBVTests = 0; - mNbRayPrimTests = 0; - mNbIntersections = 0; -#ifndef OPC_RAYHIT_CALLBACK - if(mStabbedFaces) mStabbedFaces->Reset(); -#endif - - // Compute ray in local space - // The (Origin/Dir) form is needed for the ray-triangle test anyway (even for segment tests) - if(world) - { - Matrix3x3 InvWorld = *world; - mDir = InvWorld * world_ray.mDir; - - Matrix4x4 World; - InvertPRMatrix(World, *world); - mOrigin = world_ray.mOrig * World; - } - else - { - mDir = world_ray.mDir; - mOrigin = world_ray.mOrig; - } - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - if(!SkipPrimitiveTests()) - { - // Perform overlap test between the unique triangle and the ray (and set contact status if needed) - SEGMENT_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // Check temporal coherence : - - // Test previously colliding primitives first - if(TemporalCoherenceEnabled() && FirstContactEnabled() && face_id && *face_id!=INVALID_ID) - { -#ifdef OLD_CODE -#ifndef OPC_RAYHIT_CALLBACK - if(!mClosestHit) -#endif - { - // Request vertices from the app - VertexPointers VP; - mIMesh->GetTriangle(VP, *face_id); - // Perform ray-cached tri overlap test - if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) - { - // Intersection point is valid if: - // - distance is positive (else it can just be a face behind the orig point) - // - distance is smaller than a given max distance (useful for shadow feelers) -// if(mStabbedFace.mDistance>0.0f && mStabbedFace.mDistanceAddFace(mStabbedFace); -#endif - return TRUE; - } - } - } -#else - // New code - // We handle both Segment/ray queries with the same segment code, and a possible infinite limit - SEGMENT_PRIM(*face_id, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; -#endif - } - - // Precompute data (moved after temporal coherence since only needed for ray-AABB) - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) - { - // For Segment-AABB overlap - mData = 0.5f * mDir * mMaxDist; - mData2 = mOrigin + mData; - - // Precompute mFDir; - mFDir.x = fabsf(mData.x); - mFDir.y = fabsf(mData.y); - mFDir.z = fabsf(mData.z); - } - else - { - // For Ray-AABB overlap -// udword x = SIR(mDir.x)-1; -// udword y = SIR(mDir.y)-1; -// udword z = SIR(mDir.z)-1; -// mData.x = FR(x); -// mData.y = FR(y); -// mData.z = FR(z); - - // Precompute mFDir; - mFDir.x = fabsf(mDir.x); - mFDir.y = fabsf(mDir.y); - mFDir.z = fabsf(mDir.z); - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Stabbing query for vanilla AABB trees. - * \param world_ray [in] stabbing ray in world space - * \param tree [in] AABB tree - * \param box_indices [out] indices of stabbed boxes - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool RayCollider::Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices) -{ - // ### bad design here - - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - // Basically this is only called to initialize precomputed data - if(InitQuery(world_ray)) return true; - - // Perform stabbing query - if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(tree, box_indices); - else _RayStab(tree, box_indices); - - return true; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBCollisionNode* node) -{ - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->IsLeaf()) - { - SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - _SegmentStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - _SegmentStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBNoLeafNode* node) -{ - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->HasPosLeaf()) - { - SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Segment-AABB overlap test - if(!SegmentAABBOverlap(Center, Extents)) return; - - if(node->HasPosLeaf()) - { - SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _SegmentStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for vanilla AABB trees. - * \param node [in] current collision node - * \param box_indices [out] indices of stabbed boxes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_SegmentStab(const AABBTreeNode* node, Container& box_indices) -{ - // Test the box against the segment - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!SegmentAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _SegmentStab(node->GetPos(), box_indices); - _SegmentStab(node->GetNeg(), box_indices); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBCollisionNode* node) -{ - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->IsLeaf()) - { - RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _RayStab(node->GetPos()); - - if(ContactFound()) return; - - _RayStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _RayStab(node->GetPos()); - - if(ContactFound()) return; - - _RayStab(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBNoLeafNode* node) -{ - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - if(node->HasPosLeaf()) - { - RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Ray-AABB overlap test - if(!RayAABBOverlap(Center, Extents)) return; - - if(node->HasPosLeaf()) - { - RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) - { - RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) - } - else _RayStab(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive stabbing query for vanilla AABB trees. - * \param node [in] current collision node - * \param box_indices [out] indices of stabbed boxes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void RayCollider::_RayStab(const AABBTreeNode* node, Container& box_indices) -{ - // Test the box against the ray - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!RayAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf()) - { - mFlags |= OPC_CONTACT; - box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _RayStab(node->GetPos(), box_indices); - _RayStab(node->GetNeg(), box_indices); - } -} diff --git a/libraries/ode-0.9/OPCODE/OPC_RayCollider.h b/libraries/ode-0.9/OPCODE/OPC_RayCollider.h deleted file mode 100644 index 3fd8381a67..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_RayCollider.h +++ /dev/null @@ -1,225 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a ray collider. - * \file OPC_RayCollider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_RAYCOLLIDER_H__ -#define __OPC_RAYCOLLIDER_H__ - - class OPCODE_API CollisionFace - { - public: - //! Constructor - inline_ CollisionFace() {} - //! Destructor - inline_ ~CollisionFace() {} - - udword mFaceID; //!< Index of touched face - float mDistance; //!< Distance from collider to hitpoint - float mU, mV; //!< Impact barycentric coordinates - }; - - class OPCODE_API CollisionFaces : public Container - { - public: - //! Constructor - CollisionFaces() {} - //! Destructor - ~CollisionFaces() {} - - inline_ udword GetNbFaces() const { return GetNbEntries()>>2; } - inline_ const CollisionFace* GetFaces() const { return (const CollisionFace*)GetEntries(); } - - inline_ void Reset() { Container::Reset(); } - - inline_ void AddFace(const CollisionFace& face) { Add(face.mFaceID).Add(face.mDistance).Add(face.mU).Add(face.mV); } - }; - -#ifdef OPC_RAYHIT_CALLBACK - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called by OPCODE to record a hit. - * \param hit [in] current hit - * \param user_data [in] user-defined data from SetCallback() - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef void (*HitCallback) (const CollisionFace& hit, void* user_data); -#endif - - class OPCODE_API RayCollider : public Collider - { - public: - // Constructor / Destructor - RayCollider(); - virtual ~RayCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic stabbing query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - in the user-provided destination array - * - * \param world_ray [in] stabbing ray in world space - * \param model [in] Opcode model to collide with - * \param world [in] model's world matrix, or null - * \param cache [in] a possibly cached face index, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world=null, udword* cache=null); - // - bool Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices); - // Settings - -#ifndef OPC_RAYHIT_CALLBACK - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: enable or disable "closest hit" mode. - * \param flag [in] true to report closest hit only - * \see SetCulling(bool flag) - * \see SetMaxDist(float max_dist) - * \see SetDestination(StabbedFaces* sf) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetClosestHit(bool flag) { mClosestHit = flag; } -#endif - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: enable or disable backface culling. - * \param flag [in] true to enable backface culling - * \see SetClosestHit(bool flag) - * \see SetMaxDist(float max_dist) - * \see SetDestination(StabbedFaces* sf) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetCulling(bool flag) { mCulling = flag; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: sets the higher distance bound. - * \param max_dist [in] higher distance bound. Default = maximal value, for ray queries (else segment) - * \see SetClosestHit(bool flag) - * \see SetCulling(bool flag) - * \see SetDestination(StabbedFaces* sf) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetMaxDist(float max_dist=MAX_FLOAT) { mMaxDist = max_dist; } - -#ifdef OPC_RAYHIT_CALLBACK - inline_ void SetHitCallback(HitCallback cb) { mHitCallback = cb; } - inline_ void SetUserData(void* user_data) { mUserData = user_data; } -#else - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: sets the destination array for stabbed faces. - * \param cf [in] destination array, filled during queries - * \see SetClosestHit(bool flag) - * \see SetCulling(bool flag) - * \see SetMaxDist(float max_dist) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetDestination(CollisionFaces* cf) { mStabbedFaces = cf; } -#endif - // Stats - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Ray-BV overlap tests after a collision query. - * \see GetNbRayPrimTests() - * \see GetNbIntersections() - * \return the number of Ray-BV tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbRayBVTests() const { return mNbRayBVTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Ray-Triangle overlap tests after a collision query. - * \see GetNbRayBVTests() - * \see GetNbIntersections() - * \return the number of Ray-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbRayPrimTests() const { return mNbRayPrimTests; } - - // In-out test - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of intersection found after a collision query. Can be used for in/out tests. - * \see GetNbRayBVTests() - * \see GetNbRayPrimTests() - * \return the number of valid intersections during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbIntersections() const { return mNbIntersections; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Ray in local space - Point mOrigin; //!< Ray origin - Point mDir; //!< Ray direction (normalized) - Point mFDir; //!< fabsf(mDir) - Point mData, mData2; - // Stabbed faces - CollisionFace mStabbedFace; //!< Current stabbed face -#ifdef OPC_RAYHIT_CALLBACK - HitCallback mHitCallback; //!< Callback used to record a hit - void* mUserData; //!< User-defined data -#else - CollisionFaces* mStabbedFaces; //!< List of stabbed faces -#endif - // Stats - udword mNbRayBVTests; //!< Number of Ray-BV tests - udword mNbRayPrimTests; //!< Number of Ray-Primitive tests - // In-out test - udword mNbIntersections; //!< Number of valid intersections - // Dequantization coeffs - Point mCenterCoeff; - Point mExtentsCoeff; - // Settings - float mMaxDist; //!< Valid segment on the ray -#ifndef OPC_RAYHIT_CALLBACK - bool mClosestHit; //!< Report closest hit only -#endif - bool mCulling; //!< Stab culled faces or not - // Internal methods - void _SegmentStab(const AABBCollisionNode* node); - void _SegmentStab(const AABBNoLeafNode* node); - void _SegmentStab(const AABBQuantizedNode* node); - void _SegmentStab(const AABBQuantizedNoLeafNode* node); - void _SegmentStab(const AABBTreeNode* node, Container& box_indices); - void _RayStab(const AABBCollisionNode* node); - void _RayStab(const AABBNoLeafNode* node); - void _RayStab(const AABBQuantizedNode* node); - void _RayStab(const AABBQuantizedNoLeafNode* node); - void _RayStab(const AABBTreeNode* node, Container& box_indices); - // Overlap tests - inline_ BOOL RayAABBOverlap(const Point& center, const Point& extents); - inline_ BOOL SegmentAABBOverlap(const Point& center, const Point& extents); - inline_ BOOL RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); - // Init methods - BOOL InitQuery(const Ray& world_ray, const Matrix4x4* world=null, udword* face_id=null); - }; - -#endif // __OPC_RAYCOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_RayTriOverlap.h b/libraries/ode-0.9/OPCODE/OPC_RayTriOverlap.h deleted file mode 100644 index 7fe37c9856..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_RayTriOverlap.h +++ /dev/null @@ -1,89 +0,0 @@ -#define LOCAL_EPSILON 0.000001f - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes a ray-triangle intersection test. - * Original code from Tomas Mller's "Fast Minimum Storage Ray-Triangle Intersection". - * It's been optimized a bit with integer code, and modified to return a non-intersection if distance from - * ray origin to triangle is negative. - * - * \param vert0 [in] triangle vertex - * \param vert1 [in] triangle vertex - * \param vert2 [in] triangle vertex - * \return true on overlap. mStabbedFace is filled with relevant info. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL RayCollider::RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) -{ - // Stats - mNbRayPrimTests++; - - // Find vectors for two edges sharing vert0 - Point edge1 = vert1 - vert0; - Point edge2 = vert2 - vert0; - - // Begin calculating determinant - also used to calculate U parameter - Point pvec = mDir^edge2; - - // If determinant is near zero, ray lies in plane of triangle - float det = edge1|pvec; - - if(mCulling) - { - if(det 0. So we can use integer cmp. - - // Calculate distance from vert0 to ray origin - Point tvec = mOrigin - vert0; - - // Calculate U parameter and test bounds - mStabbedFace.mU = tvec|pvec; -// if(IR(u)&0x80000000 || u>det) return FALSE; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IR(det)) return FALSE; - - // Prepare to test V parameter - Point qvec = tvec^edge1; - - // Calculate V parameter and test bounds - mStabbedFace.mV = mDir|qvec; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>det) return FALSE; - - // Calculate t, scale parameters, ray intersects triangle - mStabbedFace.mDistance = edge2|qvec; - // Det > 0 so we can early exit here - // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) - if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; - // Else go on - float OneOverDet = 1.0f / det; - mStabbedFace.mDistance *= OneOverDet; - mStabbedFace.mU *= OneOverDet; - mStabbedFace.mV *= OneOverDet; - } - else - { - // the non-culling branch - if(det>-LOCAL_EPSILON && det1.0f) return FALSE; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IEEE_1_0) return FALSE; - - // prepare to test V parameter - Point qvec = tvec^edge1; - - // Calculate V parameter and test bounds - mStabbedFace.mV = (mDir|qvec) * OneOverDet; - if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>1.0f) return FALSE; - - // Calculate t, ray intersects triangle - mStabbedFace.mDistance = (edge2|qvec) * OneOverDet; - // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) - if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; - } - return TRUE; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_Settings.h b/libraries/ode-0.9/OPCODE/OPC_Settings.h deleted file mode 100644 index 1841a2bcf5..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_Settings.h +++ /dev/null @@ -1,49 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains compilation flags. - * \file OPC_Settings.h - * \author Pierre Terdiman - * \date May, 12, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_SETTINGS_H__ -#define __OPC_SETTINGS_H__ - - //! Use CPU comparisons (comment that line to use standard FPU compares) - #define OPC_CPU_COMPARE - - //! Use FCOMI / FCMOV on Pentium-Pro based processors (comment that line to use plain C++) - #define OPC_USE_FCOMI - - //! Use epsilon value in tri-tri overlap test - #define OPC_TRITRI_EPSILON_TEST - - //! Use tree-coherence or not [not implemented yet] -// #define OPC_USE_TREE_COHERENCE - - //! Use callbacks or direct pointers. Using callbacks might be a bit slower (but probably not much) -// #define OPC_USE_CALLBACKS - - //! Support triangle and vertex strides or not. Using strides might be a bit slower (but probably not much) - #define OPC_USE_STRIDE - - //! Discard negative pointer in vanilla trees - #define OPC_NO_NEG_VANILLA_TREE - - //! Use a callback in the ray collider - //#define OPC_RAYHIT_CALLBACK - - // NB: no compilation flag to enable/disable stats since they're actually needed in the box/box overlap test - -#endif //__OPC_SETTINGS_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_SphereAABBOverlap.h b/libraries/ode-0.9/OPCODE/OPC_SphereAABBOverlap.h deleted file mode 100644 index 2278bc01f9..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_SphereAABBOverlap.h +++ /dev/null @@ -1,128 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Sphere-AABB overlap test, based on Jim Arvo's code. - * \param center [in] box center - * \param extents [in] box extents - * \return TRUE on overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL SphereCollider::SphereAABBOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbVolumeBVTests++; - - float d = 0.0f; - - //find the square of the distance - //from the sphere to the box -#ifdef OLDIES - for(udword i=0;i<3;i++) - { - float tmp = mCenter[i] - center[i]; - float s = tmp + extents[i]; - - if(s<0.0f) d += s*s; - else - { - s = tmp - extents[i]; - if(s>0.0f) d += s*s; - } - } -#endif - -//#ifdef NEW_TEST - -// float tmp = mCenter.x - center.x; -// float s = tmp + extents.x; - - float tmp,s; - - tmp = mCenter.x - center.x; - s = tmp + extents.x; - - if(s<0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - else - { - s = tmp - extents.x; - if(s>0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - } - - tmp = mCenter.y - center.y; - s = tmp + extents.y; - - if(s<0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - else - { - s = tmp - extents.y; - if(s>0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - } - - tmp = mCenter.z - center.z; - s = tmp + extents.z; - - if(s<0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - else - { - s = tmp - extents.z; - if(s>0.0f) - { - d += s*s; - if(d>mRadius2) return FALSE; - } - } -//#endif - -#ifdef OLDIES -// Point Min = center - extents; -// Point Max = center + extents; - - float d = 0.0f; - - //find the square of the distance - //from the sphere to the box - for(udword i=0;i<3;i++) - { -float Min = center[i] - extents[i]; - -// if(mCenter[i]Max[i]) - if(mCenter[i]>Max) - { - float s = mCenter[i] - Max; - d += s*s; - } - } - } -#endif - return d <= mRadius2; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_SphereCollider.cpp b/libraries/ode-0.9/OPCODE/OPC_SphereCollider.cpp deleted file mode 100644 index 65350b714f..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_SphereCollider.cpp +++ /dev/null @@ -1,739 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a sphere collider. - * \file OPC_SphereCollider.cpp - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains a sphere-vs-tree collider. - * This class performs a collision test between a sphere and an AABB tree. You can use this to do a standard player vs world collision, - * in a Nettle/Telemachos way. It doesn't suffer from all reported bugs in those two classic codes - the "new" one by Paul Nettle is a - * debuggued version I think. Collision response can be driven by reported collision data - it works extremely well for me. In sake of - * efficiency, all meshes (that is, all AABB trees) should of course also be kept in an extra hierarchical structure (octree, whatever). - * - * \class SphereCollider - * \author Pierre Terdiman - * \version 1.3 - * \date June, 2, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -#include "OPC_SphereAABBOverlap.h" -#include "OPC_SphereTriOverlap.h" - -#define SET_CONTACT(prim_index, flag) \ - /* Set contact status */ \ - mFlags |= flag; \ - mTouchedPrimitives->Add(udword(prim_index)); - -//! Sphere-triangle overlap test -#define SPHERE_PRIM(prim_index, flag) \ - /* Request vertices from the app */ \ - VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ - \ - /* Perform sphere-tri overlap test */ \ - if(SphereTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ - { \ - SET_CONTACT(prim_index, flag) \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SphereCollider::SphereCollider() -{ - mCenter.Zero(); - mRadius2 = 0.0f; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SphereCollider::~SphereCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a sphere cache - * \param sphere [in] collision sphere in local space - * \param model [in] Opcode model to collide with - * \param worlds [in] sphere's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds, const Matrix4x4* worldm) -{ - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, sphere, worlds, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); - else _Collide(Tree->GetNodes()); - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - check temporal coherence - * - * \param cache [in/out] a sphere cache - * \param sphere [in] sphere in local space - * \param worlds [in] sphere's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return TRUE if we can return immediately - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BOOL SphereCollider::InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds, const Matrix4x4* worldm) -{ - // 1) Call the base method - VolumeCollider::InitQuery(); - - // 2) Compute sphere in model space: - // - Precompute R^2 - mRadius2 = sphere.mRadius * sphere.mRadius; - // - Compute center position - mCenter = sphere.mCenter; - // -> to world space - if(worlds) mCenter *= *worlds; - // -> to model space - if(worldm) - { - // Invert model matrix - Matrix4x4 InvWorldM; - InvertPRMatrix(InvWorldM, *worldm); - - mCenter *= InvWorldM; - } - - // 3) Setup destination pointer - mTouchedPrimitives = &cache.TouchedPrimitives; - - // 4) Special case: 1-triangle meshes [Opcode 1.3] - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - if(!SkipPrimitiveTests()) - { - // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. - mTouchedPrimitives->Reset(); - - // Perform overlap test between the unique triangle and the sphere (and set contact status if needed) - SPHERE_PRIM(udword(0), OPC_CONTACT) - - // Return immediately regardless of status - return TRUE; - } - } - - // 5) Check temporal coherence : - if(TemporalCoherenceEnabled()) - { - // Here we use temporal coherence - // => check results from previous frame before performing the collision query - if(FirstContactEnabled()) - { - // We're only interested in the first contact found => test the unique previously touched face - if(mTouchedPrimitives->GetNbEntries()) - { - // Get index of previously touched face = the first entry in the array - udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); - - // Then reset the array: - // - if the overlap test below is successful, the index we'll get added back anyway - // - if it isn't, then the array should be reset anyway for the normal query - mTouchedPrimitives->Reset(); - - // Perform overlap test between the cached triangle and the sphere (and set contact status if needed) - SPHERE_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) - - // Return immediately if possible - if(GetContactStatus()) return TRUE; - } - // else no face has been touched during previous query - // => we'll have to perform a normal query - } - else - { - // We're interested in all contacts =>test the new real sphere N(ew) against the previous fat sphere P(revious): - float r = sqrtf(cache.FatRadius2) - sphere.mRadius; - if(IsCacheValid(cache) && cache.Center.SquareDistance(mCenter) < r*r) - { - // - if N is included in P, return previous list - // => we simply leave the list (mTouchedFaces) unchanged - - // Set contact status if needed - if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; - - // In any case we don't need to do a query - return TRUE; - } - else - { - // - else do the query using a fat N - - // Reset cache since we'll about to perform a real query - mTouchedPrimitives->Reset(); - - // Make a fat sphere so that coherence will work for subsequent frames - mRadius2 *= cache.FatCoeff; -// mRadius2 = (sphere.mRadius * cache.FatCoeff)*(sphere.mRadius * cache.FatCoeff); - - // Update cache with query data (signature for cached faces) - cache.Center = mCenter; - cache.FatRadius2 = mRadius2; - } - } - } - else - { - // Here we don't use temporal coherence => do a normal query - mTouchedPrimitives->Reset(); - } - - return FALSE; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for vanilla AABB trees. - * \param cache [in/out] a sphere cache - * \param sphere [in] collision sphere in world space - * \param tree [in] AABB tree - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree) -{ - // This is typically called for a scene tree, full of -AABBs-, not full of triangles. - // So we don't really have "primitives" to deal with. Hence it doesn't work with - // "FirstContact" + "TemporalCoherence". - ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); - - // Checkings - if(!tree) return false; - - // Init collision query - if(InitQuery(cache, sphere)) return true; - - // Perform collision query - _Collide(tree); - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Checks the sphere completely contains the box. In which case we can end the query sooner. - * \param bc [in] box center - * \param be [in] box extents - * \return true if the sphere contains the whole box - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL SphereCollider::SphereContainsBox(const Point& bc, const Point& be) -{ - // I assume if all 8 box vertices are inside the sphere, so does the whole box. - // Sounds ok but maybe there's a better way? - Point p; - p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z+be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z-be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; - - return TRUE; -} - -#define TEST_BOX_IN_SPHERE(center, extents) \ - if(SphereContainsBox(center, extents)) \ - { \ - /* Set contact status */ \ - mFlags |= OPC_CONTACT; \ - _Dump(node); \ - return; \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBCollisionNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->IsLeaf()) - { - SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _Collide(node->GetPos()); - - if(ContactFound()) return; - - _Collide(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->IsLeaf()) - { - SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) - } - else - { - _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - _CollideNoPrimitiveTest(node->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBNoLeafNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) -{ - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; - - TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } - else _Collide(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } - else _Collide(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) -{ - // Dequantize box - const QuantizedAABB& Box = node->mAABB; - const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); - const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); - - // Perform Sphere-AABB overlap test - if(!SphereAABBOverlap(Center, Extents)) return; - - TEST_BOX_IN_SPHERE(Center, Extents) - - if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetPos()); - - if(ContactFound()) return; - - if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } - else _CollideNoPrimitiveTest(node->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for vanilla AABB trees. - * \param node [in] current collision node - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SphereCollider::_Collide(const AABBTreeNode* node) -{ - // Perform Sphere-AABB overlap test - Point Center, Extents; - node->GetAABB()->GetCenter(Center); - node->GetAABB()->GetExtents(Extents); - if(!SphereAABBOverlap(Center, Extents)) return; - - if(node->IsLeaf() || SphereContainsBox(Center, Extents)) - { - mFlags |= OPC_CONTACT; - mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); - } - else - { - _Collide(node->GetPos()); - _Collide(node->GetNeg()); - } -} - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridSphereCollider::HybridSphereCollider() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -HybridSphereCollider::~HybridSphereCollider() -{ -} - -bool HybridSphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds, const Matrix4x4* worldm) -{ - // We don't want primitive tests here! - mFlags |= OPC_NO_PRIMITIVE_TESTS; - - // Checkings - if(!Setup(&model)) return false; - - // Init collision query - if(InitQuery(cache, sphere, worlds, worldm)) return true; - - // Special case for 1-leaf trees - if(mCurrentModel && mCurrentModel->HasSingleNode()) - { - // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles - udword Nb = mIMesh->GetNbTriangles(); - - // Loop through all triangles - for(udword i=0;imCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - else - { - if(model.IsQuantized()) - { - const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); - - // Setup dequantization coeffs - mCenterCoeff = Tree->mCenterCoeff; - mExtentsCoeff = Tree->mExtentsCoeff; - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - else - { - const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); - - // Perform collision query - we don't want primitive tests here! - _CollideNoPrimitiveTest(Tree->GetNodes()); - } - } - - // We only have a list of boxes so far - if(GetContactStatus()) - { - // Reset contact status, since it currently only reflects collisions with leaf boxes - Collider::InitQuery(); - - // Change dest container so that we can use built-in overlap tests and get collided primitives - cache.TouchedPrimitives.Reset(); - mTouchedPrimitives = &cache.TouchedPrimitives; - - // Read touched leaf boxes - udword Nb = mTouchedBoxes.GetNbEntries(); - const udword* Touched = mTouchedBoxes.GetEntries(); - - const LeafTriangles* LT = model.GetLeafTriangles(); - const udword* Indices = model.GetIndices(); - - // Loop through touched leaves - while(Nb--) - { - const LeafTriangles& CurrentLeaf = LT[*Touched++]; - - // Each leaf box has a set of triangles - udword NbTris = CurrentLeaf.GetNbTriangles(); - if(Indices) - { - const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = *T++; - SPHERE_PRIM(TriangleIndex, OPC_CONTACT) - } - } - else - { - udword BaseIndex = CurrentLeaf.GetTriangleIndex(); - - // Loop through triangles and test each of them - while(NbTris--) - { - udword TriangleIndex = BaseIndex++; - SPHERE_PRIM(TriangleIndex, OPC_CONTACT) - } - } - } - } - - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_SphereCollider.h b/libraries/ode-0.9/OPCODE/OPC_SphereCollider.h deleted file mode 100644 index ac6495ef9f..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_SphereCollider.h +++ /dev/null @@ -1,96 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a sphere collider. - * \file OPC_SphereCollider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_SPHERECOLLIDER_H__ -#define __OPC_SPHERECOLLIDER_H__ - - struct OPCODE_API SphereCache : VolumeCache - { - SphereCache() : Center(0.0f,0.0f,0.0f), FatRadius2(0.0f), FatCoeff(1.1f) {} - ~SphereCache() {} - - // Cached faces signature - Point Center; //!< Sphere used when performing the query resulting in cached faces - float FatRadius2; //!< Sphere used when performing the query resulting in cached faces - // User settings - float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere - }; - - class OPCODE_API SphereCollider : public VolumeCollider - { - public: - // Constructor / Destructor - SphereCollider(); - virtual ~SphereCollider(); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results: - * - with GetContactStatus() - * - with GetNbTouchedPrimitives() - * - with GetTouchedPrimitives() - * - * \param cache [in/out] a sphere cache - * \param sphere [in] collision sphere in local space - * \param model [in] Opcode model to collide with - * \param worlds [in] sphere's world matrix, or null - * \param worldm [in] model's world matrix, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); - - // - bool Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree); - protected: - // Sphere in model space - Point mCenter; //!< Sphere center - float mRadius2; //!< Sphere radius squared - // Internal methods - void _Collide(const AABBCollisionNode* node); - void _Collide(const AABBNoLeafNode* node); - void _Collide(const AABBQuantizedNode* node); - void _Collide(const AABBQuantizedNoLeafNode* node); - void _Collide(const AABBTreeNode* node); - void _CollideNoPrimitiveTest(const AABBCollisionNode* node); - void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); - void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); - // Overlap tests - inline_ BOOL SphereContainsBox(const Point& bc, const Point& be); - inline_ BOOL SphereAABBOverlap(const Point& center, const Point& extents); - BOOL SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); - // Init methods - BOOL InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); - }; - - class OPCODE_API HybridSphereCollider : public SphereCollider - { - public: - // Constructor / Destructor - HybridSphereCollider(); - virtual ~HybridSphereCollider(); - - bool Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); - protected: - Container mTouchedBoxes; - }; - -#endif // __OPC_SPHERECOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_SphereTriOverlap.h b/libraries/ode-0.9/OPCODE/OPC_SphereTriOverlap.h deleted file mode 100644 index 77e59f371d..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_SphereTriOverlap.h +++ /dev/null @@ -1,187 +0,0 @@ - -// This is collision detection. If you do another distance test for collision *response*, -// if might be useful to simply *skip* the test below completely, and report a collision. -// - if sphere-triangle overlap, result is ok -// - if they don't, we'll discard them during collision response with a similar test anyway -// Overall this approach should run faster. - -// Original code by David Eberly in Magic. -BOOL SphereCollider::SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) -{ - // Stats - mNbVolumePrimTests++; - - // Early exit if one of the vertices is inside the sphere - Point kDiff = vert2 - mCenter; - float fC = kDiff.SquareMagnitude(); - if(fC <= mRadius2) return TRUE; - - kDiff = vert1 - mCenter; - fC = kDiff.SquareMagnitude(); - if(fC <= mRadius2) return TRUE; - - kDiff = vert0 - mCenter; - fC = kDiff.SquareMagnitude(); - if(fC <= mRadius2) return TRUE; - - // Else do the full distance test - Point TriEdge0 = vert1 - vert0; - Point TriEdge1 = vert2 - vert0; - -//Point kDiff = vert0 - mCenter; - float fA00 = TriEdge0.SquareMagnitude(); - float fA01 = TriEdge0 | TriEdge1; - float fA11 = TriEdge1.SquareMagnitude(); - float fB0 = kDiff | TriEdge0; - float fB1 = kDiff | TriEdge1; -//float fC = kDiff.SquareMagnitude(); - float fDet = fabsf(fA00*fA11 - fA01*fA01); - float u = fA01*fB1-fA11*fB0; - float v = fA01*fB0-fA00*fB1; - float SqrDist; - - if(u + v <= fDet) - { - if(u < 0.0f) - { - if(v < 0.0f) // region 4 - { - if(fB0 < 0.0f) - { -// v = 0.0f; - if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } - else { u = -fB0/fA00; SqrDist = fB0*u+fC; } - } - else - { -// u = 0.0f; - if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } - else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } - else { v = -fB1/fA11; SqrDist = fB1*v+fC; } - } - } - else // region 3 - { -// u = 0.0f; - if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } - else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } - else { v = -fB1/fA11; SqrDist = fB1*v+fC; } - } - } - else if(v < 0.0f) // region 5 - { -// v = 0.0f; - if(fB0>=0.0f) { /*u = 0.0f;*/ SqrDist = fC; } - else if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } - else { u = -fB0/fA00; SqrDist = fB0*u+fC; } - } - else // region 0 - { - // minimum at interior point - if(fDet==0.0f) - { -// u = 0.0f; -// v = 0.0f; - SqrDist = MAX_FLOAT; - } - else - { - float fInvDet = 1.0f/fDet; - u *= fInvDet; - v *= fInvDet; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - } - else - { - float fTmp0, fTmp1, fNumer, fDenom; - - if(u < 0.0f) // region 2 - { - fTmp0 = fA01 + fB0; - fTmp1 = fA11 + fB1; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { -// u = 1.0f; -// v = 0.0f; - SqrDist = fA00+2.0f*fB0+fC; - } - else - { - u = fNumer/fDenom; - v = 1.0f - u; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - else - { -// u = 0.0f; - if(fTmp1 <= 0.0f) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } - else if(fB1 >= 0.0f) { /*v = 0.0f;*/ SqrDist = fC; } - else { v = -fB1/fA11; SqrDist = fB1*v+fC; } - } - } - else if(v < 0.0f) // region 6 - { - fTmp0 = fA01 + fB1; - fTmp1 = fA00 + fB0; - if(fTmp1 > fTmp0) - { - fNumer = fTmp1 - fTmp0; - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { -// v = 1.0f; -// u = 0.0f; - SqrDist = fA11+2.0f*fB1+fC; - } - else - { - v = fNumer/fDenom; - u = 1.0f - v; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - else - { -// v = 0.0f; - if(fTmp1 <= 0.0f) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } - else if(fB0 >= 0.0f) { /*u = 0.0f;*/ SqrDist = fC; } - else { u = -fB0/fA00; SqrDist = fB0*u+fC; } - } - } - else // region 1 - { - fNumer = fA11 + fB1 - fA01 - fB0; - if(fNumer <= 0.0f) - { -// u = 0.0f; -// v = 1.0f; - SqrDist = fA11+2.0f*fB1+fC; - } - else - { - fDenom = fA00-2.0f*fA01+fA11; - if(fNumer >= fDenom) - { -// u = 1.0f; -// v = 0.0f; - SqrDist = fA00+2.0f*fB0+fC; - } - else - { - u = fNumer/fDenom; - v = 1.0f - u; - SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; - } - } - } - } - - return fabsf(SqrDist) < mRadius2; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_SweepAndPrune.cpp b/libraries/ode-0.9/OPCODE/OPC_SweepAndPrune.cpp deleted file mode 100644 index 7f1a8f317a..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_SweepAndPrune.cpp +++ /dev/null @@ -1,664 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) - * \file OPC_SweepAndPrune.cpp - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -inline_ void Sort(udword& id0, udword& id1) -{ - if(id0>id1) Swap(id0, id1); -} - - class Opcode::SAP_Element - { - public: - inline_ SAP_Element() {} - inline_ SAP_Element(udword id, SAP_Element* next) : mID(id), mNext(next) {} - inline_ ~SAP_Element() {} - - udword mID; - SAP_Element* mNext; - }; - - class Opcode::SAP_Box - { - public: - SAP_EndPoint* Min[3]; - SAP_EndPoint* Max[3]; - }; - - class Opcode::SAP_EndPoint - { - public: - float Value; // Min or Max value - SAP_EndPoint* Previous; // Previous EndPoint whose Value is smaller than ours (or null) - SAP_EndPoint* Next; // Next EndPoint whose Value is greater than ours (or null) - udword Data; // Parent box ID *2 | MinMax flag - - inline_ void SetData(udword box_id, BOOL is_max) { Data = (box_id<<1)|is_max; } - inline_ BOOL IsMax() const { return Data & 1; } - inline_ udword GetBoxID() const { return Data>>1; } - - inline_ void InsertAfter(SAP_EndPoint* element) - { - if(this!=element && this!=element->Next) - { - // Remove - if(Previous) Previous->Next = Next; - if(Next) Next->Previous = Previous; - - // Insert - Next = element->Next; - if(Next) Next->Previous = this; - - element->Next = this; - Previous = element; - } - } - - inline_ void InsertBefore(SAP_EndPoint* element) - { - if(this!=element && this!=element->Previous) - { - // Remove - if(Previous) Previous->Next = Next; - if(Next) Next->Previous = Previous; - - // Insert - Previous = element->Previous; - element->Previous = this; - - Next = element; - if(Previous) Previous->Next = this; - } - } - }; - - - - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SAP_PairData::SAP_PairData() : - mNbElements (0), - mNbUsedElements (0), - mElementPool (null), - mFirstFree (null), - mNbObjects (0), - mArray (null) -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SAP_PairData::~SAP_PairData() -{ - Release(); -} - -void SAP_PairData::Release() -{ - mNbElements = 0; - mNbUsedElements = 0; - mNbObjects = 0; - DELETEARRAY(mElementPool); - DELETEARRAY(mArray); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes. - * \param nb_objects [in] - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool SAP_PairData::Init(udword nb_objects) -{ - // Make sure everything has been released - Release(); - if(!nb_objects) return false; - - mArray = new SAP_Element*[nb_objects]; - CHECKALLOC(mArray); - ZeroMemory(mArray, nb_objects*sizeof(SAP_Element*)); - mNbObjects = nb_objects; - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Remaps a pointer when pool gets resized. - * \param element [in/out] remapped element - * \param delta [in] offset in bytes - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void Remap(SAP_Element*& element, size_t delta) -{ - if(element) element = (SAP_Element*)(size_t(element) + delta); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Gets a free element in the pool. - * \param id [in] element id - * \param next [in] next element - * \param remap [out] possible remapping offset - * \return the new element - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SAP_Element* SAP_PairData::GetFreeElem(udword id, SAP_Element* next, udword* remap) -{ - if(remap) *remap = 0; - - SAP_Element* FreeElem; - if(mFirstFree) - { - // Recycle - FreeElem = mFirstFree; - mFirstFree = mFirstFree->mNext; // First free = next free (or null) - } - else - { - if(mNbUsedElements==mNbElements) - { - // Resize - mNbElements = mNbElements ? (mNbElements<<1) : 2; - - SAP_Element* NewElems = new SAP_Element[mNbElements]; - - if(mNbUsedElements) CopyMemory(NewElems, mElementPool, mNbUsedElements*sizeof(SAP_Element)); - - // Remap everything - { - size_t Delta = size_t(NewElems) - size_t(mElementPool); - - for(udword i=0;imID = id; - FreeElem->mNext = next; - - return FreeElem; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Frees an element of the pool. - * \param elem [in] element to free/recycle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void SAP_PairData::FreeElem(SAP_Element* elem) -{ - elem->mNext = mFirstFree; // Next free - mFirstFree = elem; -} - -// Add a pair to the set. -void SAP_PairData::AddPair(udword id1, udword id2) -{ - // Order the ids - Sort(id1, id2); - - ASSERT(id1=mNbObjects) return; - - // Select the right list from "mArray". - SAP_Element* Current = mArray[id1]; - - if(!Current) - { - // Empty slot => create new element - mArray[id1] = GetFreeElem(id2, null); - } - else if(Current->mID>id2) - { - // The list is not empty but all elements are greater than id2 => insert id2 in the front. - mArray[id1] = GetFreeElem(id2, mArray[id1]); - } - else - { - // Else find the correct location in the sorted list (ascending order) and insert id2 there. - while(Current->mNext) - { - if(Current->mNext->mID > id2) break; - - Current = Current->mNext; - } - - if(Current->mID==id2) return; // The pair already exists - -// Current->mNext = GetFreeElem(id2, Current->mNext); - udword Delta; - SAP_Element* E = GetFreeElem(id2, Current->mNext, &Delta); - if(Delta) Remap(Current, Delta); - Current->mNext = E; - } -} - -// Delete a pair from the set. -void SAP_PairData::RemovePair(udword id1, udword id2) -{ - // Order the ids. - Sort(id1, id2); - - // Exit if the pair doesn't exist in the set - if(id1>=mNbObjects) return; - - // Otherwise, select the correct list. - SAP_Element* Current = mArray[id1]; - - // If this list is empty, the pair doesn't exist. - if(!Current) return; - - // Otherwise, if id2 is the first element, delete it. - if(Current->mID==id2) - { - mArray[id1] = Current->mNext; - FreeElem(Current); - } - else - { - // If id2 is not the first element, start traversing the sorted list. - while(Current->mNext) - { - // If we have moved too far away without hitting id2, then the pair doesn't exist - if(Current->mNext->mID > id2) return; - - // Otherwise, delete id2. - if(Current->mNext->mID == id2) - { - SAP_Element* Temp = Current->mNext; - Current->mNext = Temp->mNext; - FreeElem(Temp); - return; - } - Current = Current->mNext; - } - } -} - -void SAP_PairData::DumpPairs(Pairs& pairs) const -{ - // ### Ugly and slow - for(udword i=0;imIDmID); - Current = Current->mNext; - } - } -} - -void SAP_PairData::DumpPairs(PairCallback callback, void* user_data) const -{ - if(!callback) return; - - // ### Ugly and slow - for(udword i=0;imIDmID, user_data)) return; - Current = Current->mNext; - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Constructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SweepAndPrune::SweepAndPrune() -{ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Destructor. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SweepAndPrune::~SweepAndPrune() -{ -} - -void SweepAndPrune::GetPairs(Pairs& pairs) const -{ - mPairs.DumpPairs(pairs); -} - -void SweepAndPrune::GetPairs(PairCallback callback, void* user_data) const -{ - mPairs.DumpPairs(callback, user_data); -} - -bool SweepAndPrune::Init(udword nb_objects, const AABB** boxes) -{ - // 1) Create sorted lists - mNbObjects = nb_objects; - - mBoxes = new SAP_Box[nb_objects]; -// for(udword i=0;iGetMin(Axis); - Data[i*2+1] = boxes[i]->GetMax(Axis); - } - RadixSort RS; - const udword* Sorted = RS.Sort(Data, nb_objects*2).GetRanks(); - - SAP_EndPoint* PreviousEndPoint = null; - - for(udword i=0;i>1; - - ASSERT(BoxIndexValue = SortedCoord; -// CurrentEndPoint->IsMax = SortedIndex&1; // ### could be implicit ? -// CurrentEndPoint->ID = BoxIndex; // ### could be implicit ? - CurrentEndPoint->SetData(BoxIndex, SortedIndex&1); // ### could be implicit ? - CurrentEndPoint->Previous = PreviousEndPoint; - CurrentEndPoint->Next = null; - if(PreviousEndPoint) PreviousEndPoint->Next = CurrentEndPoint; - - if(CurrentEndPoint->IsMax()) mBoxes[BoxIndex].Max[Axis] = CurrentEndPoint; - else mBoxes[BoxIndex].Min[Axis] = CurrentEndPoint; - - PreviousEndPoint = CurrentEndPoint; - } - } - - DELETEARRAY(Data); - - CheckListsIntegrity(); - - // 2) Quickly find starting pairs - - mPairs.Init(nb_objects); - - { - Pairs P; - CompleteBoxPruning(nb_objects, boxes, P, Axes(AXES_XZY)); - for(udword i=0;iid0; - udword id1 = PP->id1; - - if(id0!=id1 && boxes[id0]->Intersect(*boxes[id1])) - { - mPairs.AddPair(id0, id1); - } - else ASSERT(0); - } - } - - return true; -} - -bool SweepAndPrune::CheckListsIntegrity() -{ - for(udword Axis=0;Axis<3;Axis++) - { - // Find list head - SAP_EndPoint* Current = mList[Axis]; - while(Current->Previous) Current = Current->Previous; - - udword Nb = 0; - - SAP_EndPoint* Previous = null; - while(Current) - { - Nb++; - - if(Previous) - { - ASSERT(Previous->Value <= Current->Value); - if(Previous->Value > Current->Value) return false; - } - - ASSERT(Current->Previous==Previous); - if(Current->Previous!=Previous) return false; - - Previous = Current; - Current = Current->Next; - } - - ASSERT(Nb==mNbObjects*2); - } - return true; -} - -inline_ BOOL Intersect(const AABB& a, const SAP_Box& b) -{ - if(b.Max[0]->Value < a.GetMin(0) || a.GetMax(0) < b.Min[0]->Value - || b.Max[1]->Value < a.GetMin(1) || a.GetMax(1) < b.Min[1]->Value - || b.Max[2]->Value < a.GetMin(2) || a.GetMax(2) < b.Min[2]->Value) return FALSE; - - return TRUE; -} - - - -bool SweepAndPrune::UpdateObject(udword i, const AABB& box) -{ - for(udword Axis=0;Axis<3;Axis++) - { -// udword Base = (udword)&mList[Axis][0]; - - // Update min - { - SAP_EndPoint* const CurrentMin = mBoxes[i].Min[Axis]; - ASSERT(!CurrentMin->IsMax()); - - const float Limit = box.GetMin(Axis); - if(Limit == CurrentMin->Value) - { - } - else if(Limit < CurrentMin->Value) - { - CurrentMin->Value = Limit; - - // Min is moving left: - SAP_EndPoint* NewPos = CurrentMin; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Previous) && tmp->Value > Limit) - { - NewPos = tmp; - - if(NewPos->IsMax()) - { - // Our min passed a max => start overlap - //udword SortedIndex = (udword(CurrentMin) - Base)/sizeof(NS_EndPoint); - const udword id0 = CurrentMin->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); - } - } - - CurrentMin->InsertBefore(NewPos); - } - else// if(Limit > CurrentMin->Value) - { - CurrentMin->Value = Limit; - - // Min is moving right: - SAP_EndPoint* NewPos = CurrentMin; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Next) && tmp->Value < Limit) - { - NewPos = tmp; - - if(NewPos->IsMax()) - { - // Our min passed a max => stop overlap - const udword id0 = CurrentMin->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1) mPairs.RemovePair(id0, id1); - } - } - - CurrentMin->InsertAfter(NewPos); - } - } - - // Update max - { - SAP_EndPoint* const CurrentMax = mBoxes[i].Max[Axis]; - ASSERT(CurrentMax->IsMax()); - - const float Limit = box.GetMax(Axis); - if(Limit == CurrentMax->Value) - { - } - else if(Limit > CurrentMax->Value) - { - CurrentMax->Value = Limit; - - // Max is moving right: - SAP_EndPoint* NewPos = CurrentMax; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Next) && tmp->Value < Limit) - { - NewPos = tmp; - - if(!NewPos->IsMax()) - { - // Our max passed a min => start overlap - const udword id0 = CurrentMax->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); - } - } - - CurrentMax->InsertAfter(NewPos); - } - else// if(Limit < CurrentMax->Value) - { - CurrentMax->Value = Limit; - - // Max is moving left: - SAP_EndPoint* NewPos = CurrentMax; - ASSERT(NewPos); - - SAP_EndPoint* tmp; - while((tmp = NewPos->Previous) && tmp->Value > Limit) - { - NewPos = tmp; - - if(!NewPos->IsMax()) - { - // Our max passed a min => stop overlap - const udword id0 = CurrentMax->GetBoxID(); - const udword id1 = NewPos->GetBoxID(); - - if(id0!=id1) mPairs.RemovePair(id0, id1); - } - } - - CurrentMax->InsertBefore(NewPos); - } - } - } - - return true; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_SweepAndPrune.h b/libraries/ode-0.9/OPCODE/OPC_SweepAndPrune.h deleted file mode 100644 index 2cbbb7e6ca..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_SweepAndPrune.h +++ /dev/null @@ -1,86 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) - * \file OPC_SweepAndPrune.h - * \author Pierre Terdiman - * \date January, 29, 2000 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_SWEEPANDPRUNE_H__ -#define __OPC_SWEEPANDPRUNE_H__ - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * User-callback, called by OPCODE for each colliding pairs. - * \param id0 [in] id of colliding object - * \param id1 [in] id of colliding object - * \param user_data [in] user-defined data - * \return TRUE to continue enumeration - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef BOOL (*PairCallback) (udword id0, udword id1, void* user_data); - - class SAP_Element; - class SAP_EndPoint; - class SAP_Box; - - class OPCODE_API SAP_PairData - { - public: - SAP_PairData(); - ~SAP_PairData(); - - bool Init(udword nb_objects); - - void AddPair(udword id1, udword id2); - void RemovePair(udword id1, udword id2); - - void DumpPairs(Pairs& pairs) const; - void DumpPairs(PairCallback callback, void* user_data) const; - private: - udword mNbElements; //!< Total number of elements in the pool - udword mNbUsedElements; //!< Number of used elements - SAP_Element* mElementPool; //!< Array of mNbElements elements - SAP_Element* mFirstFree; //!< First free element in the pool - - udword mNbObjects; //!< Max number of objects we can handle - SAP_Element** mArray; //!< Pointers to pool - // Internal methods - SAP_Element* GetFreeElem(udword id, SAP_Element* next, udword* remap=null); - inline_ void FreeElem(SAP_Element* elem); - void Release(); - }; - - class OPCODE_API SweepAndPrune - { - public: - SweepAndPrune(); - ~SweepAndPrune(); - - bool Init(udword nb_objects, const AABB** boxes); - bool UpdateObject(udword i, const AABB& box); - - void GetPairs(Pairs& pairs) const; - void GetPairs(PairCallback callback, void* user_data) const; - private: - SAP_PairData mPairs; - - udword mNbObjects; - SAP_Box* mBoxes; - SAP_EndPoint* mList[3]; - // Internal methods - bool CheckListsIntegrity(); - }; - -#endif //__OPC_SWEEPANDPRUNE_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp b/libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp deleted file mode 100644 index d2359a0ef2..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_TreeBuilders.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for tree builders. - * \file OPC_TreeBuilders.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A builder for AABB-trees of vertices. - * - * \class AABBTreeOfVerticesBuilder - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A builder for AABB-trees of AABBs. - * - * \class AABBTreeOfAABBsBuilder - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * A builder for AABB-trees of triangles. - * - * \class AABBTreeOfTrianglesBuilder - * \author Pierre Terdiman - * \version 1.3 - * \date March, 20, 2001 -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -using namespace Opcode; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the AABB of a set of primitives. - * \param primitives [in] list of indices of primitives - * \param nb_prims [in] number of indices - * \param global_box [out] global AABB enclosing the set of input primitives - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeOfAABBsBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const -{ - // Checkings - if(!primitives || !nb_prims) return false; - - // Initialize global box - global_box = mAABBArray[primitives[0]]; - - // Loop through boxes - for(udword i=1;iGetTriangle(VP, *primitives++); - // Update global box - Min.Min(*VP.Vertex[0]).Min(*VP.Vertex[1]).Min(*VP.Vertex[2]); - Max.Max(*VP.Vertex[0]).Max(*VP.Vertex[1]).Max(*VP.Vertex[2]); - } - global_box.SetMinMax(Min, Max); - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the splitting value along a given axis for a given primitive. - * \param index [in] index of the primitive to split - * \param axis [in] axis index (0,1,2) - * \return splitting value - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float AABBTreeOfTrianglesBuilder::GetSplittingValue(udword index, udword axis) const -{ -/* // Compute center of triangle - Point Center; - mTriList[index].Center(mVerts, Center); - // Return value - return Center[axis];*/ - - // Compute correct component from center of triangle -// return (mVerts[mTriList[index].mVRef[0]][axis] -// +mVerts[mTriList[index].mVRef[1]][axis] -// +mVerts[mTriList[index].mVRef[2]][axis])*INV3; - - VertexPointers VP; - mIMesh->GetTriangle(VP, index); - - // Compute correct component from center of triangle - return ((*VP.Vertex[0])[axis] - +(*VP.Vertex[1])[axis] - +(*VP.Vertex[2])[axis])*INV3; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the splitting value along a given axis for a given node. - * \param primitives [in] list of indices of primitives - * \param nb_prims [in] number of indices - * \param global_box [in] global AABB enclosing the set of input primitives - * \param axis [in] axis index (0,1,2) - * \return splitting value - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -float AABBTreeOfTrianglesBuilder::GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const -{ - if(mSettings.mRules&SPLIT_GEOM_CENTER) - { - // Loop through triangles - float SplitValue = 0.0f; - VertexPointers VP; - for(udword i=0;iGetTriangle(VP, primitives[i]); - // Update split value - SplitValue += (*VP.Vertex[0])[axis]; - SplitValue += (*VP.Vertex[1])[axis]; - SplitValue += (*VP.Vertex[2])[axis]; - } - return SplitValue / float(nb_prims*3); - } - else return AABBTreeBuilder::GetSplittingValue(primitives, nb_prims, global_box, axis); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Computes the AABB of a set of primitives. - * \param primitives [in] list of indices of primitives - * \param nb_prims [in] number of indices - * \param global_box [out] global AABB enclosing the set of input primitives - * \return true if success - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeOfVerticesBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const -{ - // Checkings - if(!primitives || !nb_prims) return false; - - // Initialize global box - global_box.SetEmpty(); - - // Loop through vertices - for(udword i=0;iHasLeafNodes()!=cache.Model1->HasLeafNodes()) return false; - if(cache.Model0->IsQuantized()!=cache.Model1->IsQuantized()) return false; - - /* - - Rules: - - perform hull test - - when hulls collide, disable hull test - - if meshes overlap, reset countdown - - if countdown reaches 0, enable hull test - - */ - -#ifdef __MESHMERIZER_H__ - // Handle hulls - if(cache.HullTest) - { - if(cache.Model0->GetHull() && cache.Model1->GetHull()) - { - struct Local - { - static Point* SVCallback(const Point& sv, udword& previndex, udword user_data) - { - CollisionHull* Hull = (CollisionHull*)user_data; - previndex = Hull->ComputeSupportingVertex(sv, previndex); - return (Point*)&Hull->GetVerts()[previndex]; - } - }; - - bool Collide; - - if(0) - { - static GJKEngine GJK; - static bool GJKInitDone=false; - if(!GJKInitDone) - { - GJK.Enable(GJK_BACKUP_PROCEDURE); - GJK.Enable(GJK_DEGENERATE); - GJK.Enable(GJK_HILLCLIMBING); - GJKInitDone = true; - } - GJK.SetCallbackObj0(Local::SVCallback); - GJK.SetCallbackObj1(Local::SVCallback); - GJK.SetUserData0(udword(cache.Model0->GetHull())); - GJK.SetUserData1(udword(cache.Model1->GetHull())); - Collide = GJK.Collide(*world0, *world1, &cache.SepVector); - } - else - { - static SVEngine SVE; - SVE.SetCallbackObj0(Local::SVCallback); - SVE.SetCallbackObj1(Local::SVCallback); - SVE.SetUserData0(udword(cache.Model0->GetHull())); - SVE.SetUserData1(udword(cache.Model1->GetHull())); - Collide = SVE.Collide(*world0, *world1, &cache.SepVector); - } - - if(!Collide) - { - // Reset stats & contact status - mFlags &= ~OPC_CONTACT; - mNbBVBVTests = 0; - mNbPrimPrimTests = 0; - mNbBVPrimTests = 0; - mPairs.Reset(); - return true; - } - } - } - - // Here, hulls collide - cache.HullTest = false; -#endif // __MESHMERIZER_H__ - - // Checkings - if(!Setup(cache.Model0->GetMeshInterface(), cache.Model1->GetMeshInterface())) return false; - - // Simple double-dispatch - bool Status; - if(!cache.Model0->HasLeafNodes()) - { - if(cache.Model0->IsQuantized()) - { - const AABBQuantizedNoLeafTree* T0 = (const AABBQuantizedNoLeafTree*)cache.Model0->GetTree(); - const AABBQuantizedNoLeafTree* T1 = (const AABBQuantizedNoLeafTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - else - { - const AABBNoLeafTree* T0 = (const AABBNoLeafTree*)cache.Model0->GetTree(); - const AABBNoLeafTree* T1 = (const AABBNoLeafTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - } - else - { - if(cache.Model0->IsQuantized()) - { - const AABBQuantizedTree* T0 = (const AABBQuantizedTree*)cache.Model0->GetTree(); - const AABBQuantizedTree* T1 = (const AABBQuantizedTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - else - { - const AABBCollisionTree* T0 = (const AABBCollisionTree*)cache.Model0->GetTree(); - const AABBCollisionTree* T1 = (const AABBCollisionTree*)cache.Model1->GetTree(); - Status = Collide(T0, T1, world0, world1, &cache); - } - } - -#ifdef __MESHMERIZER_H__ - if(Status) - { - // Reset counter as long as overlap occurs - if(GetContactStatus()) cache.ResetCountDown(); - - // Enable hull test again when counter reaches zero - cache.CountDown--; - if(!cache.CountDown) - { - cache.ResetCountDown(); - cache.HullTest = true; - } - } -#endif - return Status; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Initializes a collision query : - * - reset stats & contact status - * - setup matrices - * - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::InitQuery(const Matrix4x4* world0, const Matrix4x4* world1) -{ - // Reset stats & contact status - Collider::InitQuery(); - mNbBVBVTests = 0; - mNbPrimPrimTests = 0; - mNbBVPrimTests = 0; - mPairs.Reset(); - - // Setup matrices - Matrix4x4 InvWorld0, InvWorld1; - if(world0) InvertPRMatrix(InvWorld0, *world0); - else InvWorld0.Identity(); - - if(world1) InvertPRMatrix(InvWorld1, *world1); - else InvWorld1.Identity(); - - Matrix4x4 World0to1 = world0 ? (*world0 * InvWorld1) : InvWorld1; - Matrix4x4 World1to0 = world1 ? (*world1 * InvWorld0) : InvWorld0; - - mR0to1 = World0to1; World0to1.GetTrans(mT0to1); - mR1to0 = World1to0; World1to0.GetTrans(mT1to0); - - // Precompute absolute 1-to-0 rotation matrix - for(udword i=0;i<3;i++) - { - for(udword j=0;j<3;j++) - { - // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) - mAR.m[i][j] = 1e-6f + fabsf(mR1to0.m[i][j]); - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Takes advantage of temporal coherence. - * \param cache [in] cache for a pair of previously colliding primitives - * \return true if we can return immediately - * \warning only works for "First Contact" mode - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::CheckTemporalCoherence(Pair* cache) -{ - // Checkings - if(!cache) return false; - - // Test previously colliding primitives first - if(TemporalCoherenceEnabled() && FirstContactEnabled()) - { - PrimTest(cache->id0, cache->id1); - if(GetContactStatus()) return true; - } - return false; -} - -#define UPDATE_CACHE \ - if(cache && GetContactStatus()) \ - { \ - cache->id0 = mPairs.GetEntry(0); \ - cache->id1 = mPairs.GetEntry(1); \ - } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for normal AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Perform collision query - _Collide(tree0->GetNodes(), tree1->GetNodes()); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for no-leaf AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Perform collision query - _Collide(tree0->GetNodes(), tree1->GetNodes()); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for quantized AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Setup dequantization coeffs - mCenterCoeff0 = tree0->mCenterCoeff; - mExtentsCoeff0 = tree0->mExtentsCoeff; - mCenterCoeff1 = tree1->mCenterCoeff; - mExtentsCoeff1 = tree1->mExtentsCoeff; - - // Dequantize box A - const AABBQuantizedNode* N0 = tree0->GetNodes(); - const Point a(float(N0->mAABB.mExtents[0]) * mExtentsCoeff0.x, float(N0->mAABB.mExtents[1]) * mExtentsCoeff0.y, float(N0->mAABB.mExtents[2]) * mExtentsCoeff0.z); - const Point Pa(float(N0->mAABB.mCenter[0]) * mCenterCoeff0.x, float(N0->mAABB.mCenter[1]) * mCenterCoeff0.y, float(N0->mAABB.mCenter[2]) * mCenterCoeff0.z); - // Dequantize box B - const AABBQuantizedNode* N1 = tree1->GetNodes(); - const Point b(float(N1->mAABB.mExtents[0]) * mExtentsCoeff1.x, float(N1->mAABB.mExtents[1]) * mExtentsCoeff1.y, float(N1->mAABB.mExtents[2]) * mExtentsCoeff1.z); - const Point Pb(float(N1->mAABB.mCenter[0]) * mCenterCoeff1.x, float(N1->mAABB.mCenter[1]) * mCenterCoeff1.y, float(N1->mAABB.mCenter[2]) * mCenterCoeff1.z); - - // Perform collision query - _Collide(N0, N1, a, Pa, b, Pb); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Collision query for quantized no-leaf AABB trees. - * \param tree0 [in] AABB tree from first object - * \param tree1 [in] AABB tree from second object - * \param world0 [in] world matrix for first object - * \param world1 [in] world matrix for second object - * \param cache [in/out] cache for a pair of previously colliding primitives - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool AABBTreeCollider::Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) -{ - // Init collision query - InitQuery(world0, world1); - - // Check previous state - if(CheckTemporalCoherence(cache)) return true; - - // Setup dequantization coeffs - mCenterCoeff0 = tree0->mCenterCoeff; - mExtentsCoeff0 = tree0->mExtentsCoeff; - mCenterCoeff1 = tree1->mCenterCoeff; - mExtentsCoeff1 = tree1->mExtentsCoeff; - - // Perform collision query - _Collide(tree0->GetNodes(), tree1->GetNodes()); - - UPDATE_CACHE - - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Standard trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// The normal AABB tree can use 2 different descent rules (with different performances) -//#define ORIGINAL_CODE //!< UNC-like descent rules -#define ALTERNATIVE_CODE //!< Alternative descent rules - -#ifdef ORIGINAL_CODE -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param b0 [in] collision node from first tree - * \param b1 [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) return; - - if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } - - if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) - { - _Collide(b0->GetNeg(), b1); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1); - } - else - { - _Collide(b0, b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0, b1->GetPos()); - } -} -#endif - -#ifdef ALTERNATIVE_CODE -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for normal AABB trees. - * \param b0 [in] collision node from first tree - * \param b1 [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) - { - return; - } - - if(b0->IsLeaf()) - { - if(b1->IsLeaf()) - { - PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); - } - else - { - _Collide(b0, b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0, b1->GetPos()); - } - } - else if(b1->IsLeaf()) - { - _Collide(b0->GetNeg(), b1); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1); - } - else - { - _Collide(b0->GetNeg(), b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0->GetNeg(), b1->GetPos()); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1->GetNeg()); - if(ContactFound()) return; - _Collide(b0->GetPos(), b1->GetPos()); - } -} -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// No-leaf trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Leaf-leaf test for two primitive indices. - * \param id0 [in] index from first leaf-triangle - * \param id1 [in] index from second leaf-triangle - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::PrimTest(udword id0, udword id1) -{ - // Request vertices from the app - VertexPointers VP0; - VertexPointers VP1; - mIMesh0->GetTriangle(VP0, id0); - mIMesh1->GetTriangle(VP1, id1); - - // Transform from space 1 to space 0 - Point u0,u1,u2; - TransformPoint(u0, *VP1.Vertex[0], mR1to0, mT1to0); - TransformPoint(u1, *VP1.Vertex[1], mR1to0, mT1to0); - TransformPoint(u2, *VP1.Vertex[2], mR1to0, mT1to0); - - // Perform triangle-triangle overlap test - if(TriTriOverlap(*VP0.Vertex[0], *VP0.Vertex[1], *VP0.Vertex[2], u0, u1, u2)) - { - // Keep track of colliding pairs - mPairs.Add(id0).Add(id1); - // Set contact status - mFlags |= OPC_CONTACT; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Leaf-leaf test for a previously fetched triangle from tree A (in B's space) and a new leaf from B. - * \param id1 [in] leaf-triangle index from tree B - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void AABBTreeCollider::PrimTestTriIndex(udword id1) -{ - // Request vertices from the app - VertexPointers VP; - mIMesh1->GetTriangle(VP, id1); - - // Perform triangle-triangle overlap test - if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) - { - // Keep track of colliding pairs - mPairs.Add(mLeafIndex).Add(id1); - // Set contact status - mFlags |= OPC_CONTACT; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Leaf-leaf test for a previously fetched triangle from tree B (in A's space) and a new leaf from A. - * \param id0 [in] leaf-triangle index from tree A - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ void AABBTreeCollider::PrimTestIndexTri(udword id0) -{ - // Request vertices from the app - VertexPointers VP; - mIMesh0->GetTriangle(VP, id0); - - // Perform triangle-triangle overlap test - if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) - { - // Keep track of colliding pairs - mPairs.Add(id0).Add(mLeafIndex); - // Set contact status - mFlags |= OPC_CONTACT; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from A and a branch from B. - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideTriBox(const AABBNoLeafNode* b) -{ - // Perform triangle-box overlap test - if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; - - // Keep same triangle, deal with first child - if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - // Keep same triangle, deal with second child - if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from B and a branch from A. - * \param b [in] collision node from first tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideBoxTri(const AABBNoLeafNode* b) -{ - // Perform triangle-box overlap test - if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; - - // Keep same triangle, deal with first child - if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); - else _CollideBoxTri(b->GetPos()); - - if(ContactFound()) return; - - // Keep same triangle, deal with second child - if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); - else _CollideBoxTri(b->GetNeg()); -} - -//! Request triangle vertices from the app and transform them -#define FETCH_LEAF(prim_index, imesh, rot, trans) \ - mLeafIndex = prim_index; \ - /* Request vertices from the app */ \ - VertexPointers VP; imesh->GetTriangle(VP, prim_index); \ - /* Transform them in a common space */ \ - TransformPoint(mLeafVerts[0], *VP.Vertex[0], rot, trans); \ - TransformPoint(mLeafVerts[1], *VP.Vertex[1], rot, trans); \ - TransformPoint(mLeafVerts[2], *VP.Vertex[2], rot, trans); - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for no-leaf AABB trees. - * \param a [in] collision node from first tree - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(a->mAABB.mExtents, a->mAABB.mCenter, b->mAABB.mExtents, b->mAABB.mCenter)) return; - - // Catch leaf status - BOOL BHasPosLeaf = b->HasPosLeaf(); - BOOL BHasNegLeaf = b->HasNegLeaf(); - - if(a->HasPosLeaf()) - { - FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetNeg()); - } - - if(ContactFound()) return; - - if(a->HasNegLeaf()) - { - FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetNeg()); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Quantized trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized AABB trees. - * \param b0 [in] collision node from first tree - * \param b1 [in] collision node from second tree - * \param a [in] extent from box A - * \param Pa [in] center from box A - * \param b [in] extent from box B - * \param Pb [in] center from box B - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb) -{ - // Perform BV-BV overlap test - if(!BoxBoxOverlap(a, Pa, b, Pb)) return; - - if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } - - if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) - { - // Dequantize box - const QuantizedAABB* Box = &b0->GetNeg()->mAABB; - const Point negPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); - const Point nega(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); - _Collide(b0->GetNeg(), b1, nega, negPa, b, Pb); - - if(ContactFound()) return; - - // Dequantize box - Box = &b0->GetPos()->mAABB; - const Point posPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); - const Point posa(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); - _Collide(b0->GetPos(), b1, posa, posPa, b, Pb); - } - else - { - // Dequantize box - const QuantizedAABB* Box = &b1->GetNeg()->mAABB; - const Point negPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); - const Point negb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); - _Collide(b0, b1->GetNeg(), a, Pa, negb, negPb); - - if(ContactFound()) return; - - // Dequantize box - Box = &b1->GetPos()->mAABB; - const Point posPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); - const Point posb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); - _Collide(b0, b1->GetPos(), a, Pa, posb, posPb); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Quantized no-leaf trees -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from A and a quantized branch from B. - * \param leaf [in] leaf triangle from first tree - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideTriBox(const AABBQuantizedNoLeafNode* b) -{ - // Dequantize box - const QuantizedAABB* bb = &b->mAABB; - const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); - const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); - - // Perform triangle-box overlap test - if(!TriBoxOverlap(Pb, eb)) return; - - if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision of a leaf node from B and a quantized branch from A. - * \param b [in] collision node from first tree - * \param leaf [in] leaf triangle from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_CollideBoxTri(const AABBQuantizedNoLeafNode* b) -{ - // Dequantize box - const QuantizedAABB* bb = &b->mAABB; - const Point Pa(float(bb->mCenter[0]) * mCenterCoeff0.x, float(bb->mCenter[1]) * mCenterCoeff0.y, float(bb->mCenter[2]) * mCenterCoeff0.z); - const Point ea(float(bb->mExtents[0]) * mExtentsCoeff0.x, float(bb->mExtents[1]) * mExtentsCoeff0.y, float(bb->mExtents[2]) * mExtentsCoeff0.z); - - // Perform triangle-box overlap test - if(!TriBoxOverlap(Pa, ea)) return; - - if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); - else _CollideBoxTri(b->GetPos()); - - if(ContactFound()) return; - - if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); - else _CollideBoxTri(b->GetNeg()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Recursive collision query for quantized no-leaf AABB trees. - * \param a [in] collision node from first tree - * \param b [in] collision node from second tree - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void AABBTreeCollider::_Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b) -{ - // Dequantize box A - const QuantizedAABB* ab = &a->mAABB; - const Point Pa(float(ab->mCenter[0]) * mCenterCoeff0.x, float(ab->mCenter[1]) * mCenterCoeff0.y, float(ab->mCenter[2]) * mCenterCoeff0.z); - const Point ea(float(ab->mExtents[0]) * mExtentsCoeff0.x, float(ab->mExtents[1]) * mExtentsCoeff0.y, float(ab->mExtents[2]) * mExtentsCoeff0.z); - // Dequantize box B - const QuantizedAABB* bb = &b->mAABB; - const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); - const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); - - // Perform BV-BV overlap test - if(!BoxBoxOverlap(ea, Pa, eb, Pb)) return; - - // Catch leaf status - BOOL BHasPosLeaf = b->HasPosLeaf(); - BOOL BHasNegLeaf = b->HasNegLeaf(); - - if(a->HasPosLeaf()) - { - FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetPos()); - } - else _Collide(a->GetPos(), b->GetNeg()); - } - - if(ContactFound()) return; - - if(a->HasNegLeaf()) - { - FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) - - if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); - else _CollideTriBox(b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); - else _CollideTriBox(b->GetNeg()); - } - else - { - if(BHasPosLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetPos()); - - if(ContactFound()) return; - - if(BHasNegLeaf) - { - // ### That leaf has possibly already been fetched - FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) - - _CollideBoxTri(a->GetNeg()); - } - else _Collide(a->GetNeg(), b->GetNeg()); - } -} diff --git a/libraries/ode-0.9/OPCODE/OPC_TreeCollider.h b/libraries/ode-0.9/OPCODE/OPC_TreeCollider.h deleted file mode 100644 index 1e943a4bf4..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_TreeCollider.h +++ /dev/null @@ -1,246 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains code for a tree collider. - * \file OPC_TreeCollider.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_TREECOLLIDER_H__ -#define __OPC_TREECOLLIDER_H__ - - //! This structure holds cached information used by the algorithm. - //! Two model pointers and two colliding primitives are cached. Model pointers are assigned - //! to their respective meshes, and the pair of colliding primitives is used for temporal - //! coherence. That is, in case temporal coherence is enabled, those two primitives are - //! tested for overlap before everything else. If they still collide, we're done before - //! even entering the recursive collision code. - struct OPCODE_API BVTCache : Pair - { - //! Constructor - inline_ BVTCache() - { - ResetCache(); - ResetCountDown(); - } - - void ResetCache() - { - Model0 = null; - Model1 = null; - id0 = 0; - id1 = 1; -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - HullTest = true; - SepVector.pid = 0; - SepVector.qid = 0; - SepVector.SV = Point(1.0f, 0.0f, 0.0f); -#endif // __MESHMERIZER_H__ - } - -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - inline_ void ResetCountDown() - { - CountDown = 50; - } -#else - void ResetCountDown(){}; -#endif // __MESHMERIZER_H__ - - const Model* Model0; //!< Model for first object - const Model* Model1; //!< Model for second object - -#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! - SVCache SepVector; - udword CountDown; - bool HullTest; -#endif // __MESHMERIZER_H__ - }; - - class OPCODE_API AABBTreeCollider : public Collider - { - public: - // Constructor / Destructor - AABBTreeCollider(); - virtual ~AABBTreeCollider(); - // Generic collision query - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Generic collision query for generic OPCODE models. After the call, access the results with: - * - GetContactStatus() - * - GetNbPairs() - * - GetPairs() - * - * \param cache [in] collision cache for model pointers and a colliding pair of primitives - * \param world0 [in] world matrix for first object, or null - * \param world1 [in] world matrix for second object, or null - * \return true if success - * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool Collide(BVTCache& cache, const Matrix4x4* world0=null, const Matrix4x4* world1=null); - - // Collision queries - bool Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - bool Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - bool Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - bool Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: selects between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) - * \param flag [in] true for full tests, false for coarse tests - * \see SetFullPrimBoxTest(bool flag) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Settings: selects between full triangle-box tests or "SAT-lite" tests (where Class III axes are discarded) - * \param flag [in] true for full tests, false for coarse tests - * \see SetFullBoxBoxTest(bool flag) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ void SetFullPrimBoxTest(bool flag) { mFullPrimBoxTest = flag; } - - // Stats - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of BV-BV overlap tests after a collision query. - * \see GetNbPrimPrimTests() - * \see GetNbBVPrimTests() - * \return the number of BV-BV tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbBVBVTests() const { return mNbBVBVTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Triangle-Triangle overlap tests after a collision query. - * \see GetNbBVBVTests() - * \see GetNbBVPrimTests() - * \return the number of Triangle-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbPrimPrimTests() const { return mNbPrimPrimTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of BV-Triangle overlap tests after a collision query. - * \see GetNbBVBVTests() - * \see GetNbPrimPrimTests() - * \return the number of BV-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbBVPrimTests() const { return mNbBVPrimTests; } - - // Data access - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of contacts after a collision query. - * \see GetContactStatus() - * \see GetPairs() - * \return the number of contacts / colliding pairs. - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbPairs() const { return mPairs.GetNbEntries()>>1; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the pairs of colliding triangles after a collision query. - * \see GetContactStatus() - * \see GetNbPairs() - * \return the list of colliding pairs (triangle indices) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const Pair* GetPairs() const { return (const Pair*)mPairs.GetEntries(); } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Colliding pairs - Container mPairs; //!< Pairs of colliding primitives - // User mesh interfaces - const MeshInterface* mIMesh0; //!< User-defined mesh interface for object0 - const MeshInterface* mIMesh1; //!< User-defined mesh interface for object1 - // Stats - udword mNbBVBVTests; //!< Number of BV-BV tests - udword mNbPrimPrimTests; //!< Number of Primitive-Primitive tests - udword mNbBVPrimTests; //!< Number of BV-Primitive tests - // Precomputed data - Matrix3x3 mAR; //!< Absolute rotation matrix - Matrix3x3 mR0to1; //!< Rotation from object0 to object1 - Matrix3x3 mR1to0; //!< Rotation from object1 to object0 - Point mT0to1; //!< Translation from object0 to object1 - Point mT1to0; //!< Translation from object1 to object0 - // Dequantization coeffs - Point mCenterCoeff0; - Point mExtentsCoeff0; - Point mCenterCoeff1; - Point mExtentsCoeff1; - // Leaf description - Point mLeafVerts[3]; //!< Triangle vertices - udword mLeafIndex; //!< Triangle index - // Settings - bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) - bool mFullPrimBoxTest; //!< Perform full Primitive-BV tests (true) or SAT-lite tests (false) - // Internal methods - - // Standard AABB trees - void _Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1); - // Quantized AABB trees - void _Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb); - // No-leaf AABB trees - void _CollideTriBox(const AABBNoLeafNode* b); - void _CollideBoxTri(const AABBNoLeafNode* b); - void _Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b); - // Quantized no-leaf AABB trees - void _CollideTriBox(const AABBQuantizedNoLeafNode* b); - void _CollideBoxTri(const AABBQuantizedNoLeafNode* b); - void _Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b); - // Overlap tests - void PrimTest(udword id0, udword id1); - inline_ void PrimTestTriIndex(udword id1); - inline_ void PrimTestIndexTri(udword id0); - - inline_ BOOL BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb); - inline_ BOOL TriBoxOverlap(const Point& center, const Point& extents); - inline_ BOOL TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2); - // Init methods - void InitQuery(const Matrix4x4* world0=null, const Matrix4x4* world1=null); - bool CheckTemporalCoherence(Pair* cache); - - inline_ BOOL Setup(const MeshInterface* mi0, const MeshInterface* mi1) - { - mIMesh0 = mi0; - mIMesh1 = mi1; - - if(!mIMesh0 || !mIMesh1) return FALSE; - - return TRUE; - } - }; - -#endif // __OPC_TREECOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/OPC_TriBoxOverlap.h b/libraries/ode-0.9/OPCODE/OPC_TriBoxOverlap.h deleted file mode 100644 index b3a9bdee7c..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_TriBoxOverlap.h +++ /dev/null @@ -1,339 +0,0 @@ - -//! This macro quickly finds the min & max values among 3 variables -#define FINDMINMAX(x0, x1, x2, min, max) \ - min = max = x0; \ - if(x1max) max=x1; \ - if(x2max) max=x2; - -//! TO BE DOCUMENTED -inline_ BOOL planeBoxOverlap(const Point& normal, const float d, const Point& maxbox) -{ - Point vmin, vmax; - for(udword q=0;q<=2;q++) - { - if(normal[q]>0.0f) { vmin[q]=-maxbox[q]; vmax[q]=maxbox[q]; } - else { vmin[q]=maxbox[q]; vmax[q]=-maxbox[q]; } - } - if((normal|vmin)+d>0.0f) return FALSE; - if((normal|vmax)+d>=0.0f) return TRUE; - - return FALSE; -} - -//! TO BE DOCUMENTED -#define AXISTEST_X01(a, b, fa, fb) \ - min = a*v0.y - b*v0.z; \ - max = a*v2.y - b*v2.z; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.y + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_X2(a, b, fa, fb) \ - min = a*v0.y - b*v0.z; \ - max = a*v1.y - b*v1.z; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.y + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Y02(a, b, fa, fb) \ - min = b*v0.z - a*v0.x; \ - max = b*v2.z - a*v2.x; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Y1(a, b, fa, fb) \ - min = b*v0.z - a*v0.x; \ - max = b*v1.z - a*v1.x; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.z; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Z12(a, b, fa, fb) \ - min = a*v1.x - b*v1.y; \ - max = a*v2.x - b*v2.y; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.y; \ - if(min>rad || max<-rad) return FALSE; - -//! TO BE DOCUMENTED -#define AXISTEST_Z0(a, b, fa, fb) \ - min = a*v0.x - b*v0.y; \ - max = a*v1.x - b*v1.y; \ - if(min>max) {const float tmp=max; max=min; min=tmp; } \ - rad = fa * extents.x + fb * extents.y; \ - if(min>rad || max<-rad) return FALSE; - -// compute triangle edges -// - edges lazy evaluated to take advantage of early exits -// - fabs precomputed (half less work, possible since extents are always >0) -// - customized macros to take advantage of the null component -// - axis vector discarded, possibly saves useless movs -#define IMPLEMENT_CLASS3_TESTS \ - float rad; \ - float min, max; \ - \ - const float fey0 = fabsf(e0.y); \ - const float fez0 = fabsf(e0.z); \ - AXISTEST_X01(e0.z, e0.y, fez0, fey0); \ - const float fex0 = fabsf(e0.x); \ - AXISTEST_Y02(e0.z, e0.x, fez0, fex0); \ - AXISTEST_Z12(e0.y, e0.x, fey0, fex0); \ - \ - const float fey1 = fabsf(e1.y); \ - const float fez1 = fabsf(e1.z); \ - AXISTEST_X01(e1.z, e1.y, fez1, fey1); \ - const float fex1 = fabsf(e1.x); \ - AXISTEST_Y02(e1.z, e1.x, fez1, fex1); \ - AXISTEST_Z0(e1.y, e1.x, fey1, fex1); \ - \ - const Point e2 = mLeafVerts[0] - mLeafVerts[2]; \ - const float fey2 = fabsf(e2.y); \ - const float fez2 = fabsf(e2.z); \ - AXISTEST_X2(e2.z, e2.y, fez2, fey2); \ - const float fex2 = fabsf(e2.x); \ - AXISTEST_Y1(e2.z, e2.x, fez2, fex2); \ - AXISTEST_Z12(e2.y, e2.x, fey2, fex2); - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Triangle-Box overlap test using the separating axis theorem. - * This is the code from Tomas Mller, a bit optimized: - * - with some more lazy evaluation (faster path on PC) - * - with a tiny bit of assembly - * - with "SAT-lite" applied if needed - * - and perhaps with some more minor modifs... - * - * \param center [in] box center - * \param extents [in] box extents - * \return true if triangle & box overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBTreeCollider::TriBoxOverlap(const Point& center, const Point& extents) -{ - // Stats - mNbBVPrimTests++; - - // use separating axis theorem to test overlap between triangle and box - // need to test for overlap in these directions: - // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle - // we do not even need to test these) - // 2) normal of the triangle - // 3) crossproduct(edge from tri, {x,y,z}-directin) - // this gives 3x3=9 more tests - - // move everything so that the boxcenter is in (0,0,0) - Point v0, v1, v2; - v0.x = mLeafVerts[0].x - center.x; - v1.x = mLeafVerts[1].x - center.x; - v2.x = mLeafVerts[2].x - center.x; - - // First, test overlap in the {x,y,z}-directions -#ifdef OPC_USE_FCOMI - // find min, max of the triangle in x-direction, and test for overlap in X - if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; - if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; - - // same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; - if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; - - // same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; - if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; -#else - float min,max; - // Find min, max of the triangle in x-direction, and test for overlap in X - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if(min>extents.x || max<-extents.x) return FALSE; - - // Same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if(min>extents.y || max<-extents.y) return FALSE; - - // Same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if(min>extents.z || max<-extents.z) return FALSE; -#endif - // 2) Test if the box intersects the plane of the triangle - // compute plane equation of triangle: normal*x+d=0 - // ### could be precomputed since we use the same leaf triangle several times - const Point e0 = v1 - v0; - const Point e1 = v2 - v1; - const Point normal = e0 ^ e1; - const float d = -normal|v0; - if(!planeBoxOverlap(normal, d, extents)) return FALSE; - - // 3) "Class III" tests - if(mFullPrimBoxTest) - { - IMPLEMENT_CLASS3_TESTS - } - return TRUE; -} - -//! A dedicated version where the box is constant -inline_ BOOL OBBCollider::TriBoxOverlap() -{ - // Stats - mNbVolumePrimTests++; - - // Hook - const Point& extents = mBoxExtents; - const Point& v0 = mLeafVerts[0]; - const Point& v1 = mLeafVerts[1]; - const Point& v2 = mLeafVerts[2]; - - // use separating axis theorem to test overlap between triangle and box - // need to test for overlap in these directions: - // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle - // we do not even need to test these) - // 2) normal of the triangle - // 3) crossproduct(edge from tri, {x,y,z}-directin) - // this gives 3x3=9 more tests - - // Box center is already in (0,0,0) - - // First, test overlap in the {x,y,z}-directions -#ifdef OPC_USE_FCOMI - // find min, max of the triangle in x-direction, and test for overlap in X - if(FCMin3(v0.x, v1.x, v2.x)>mBoxExtents.x) return FALSE; - if(FCMax3(v0.x, v1.x, v2.x)<-mBoxExtents.x) return FALSE; - - if(FCMin3(v0.y, v1.y, v2.y)>mBoxExtents.y) return FALSE; - if(FCMax3(v0.y, v1.y, v2.y)<-mBoxExtents.y) return FALSE; - - if(FCMin3(v0.z, v1.z, v2.z)>mBoxExtents.z) return FALSE; - if(FCMax3(v0.z, v1.z, v2.z)<-mBoxExtents.z) return FALSE; -#else - float min,max; - // Find min, max of the triangle in x-direction, and test for overlap in X - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if(min>mBoxExtents.x || max<-mBoxExtents.x) return FALSE; - - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if(min>mBoxExtents.y || max<-mBoxExtents.y) return FALSE; - - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if(min>mBoxExtents.z || max<-mBoxExtents.z) return FALSE; -#endif - // 2) Test if the box intersects the plane of the triangle - // compute plane equation of triangle: normal*x+d=0 - // ### could be precomputed since we use the same leaf triangle several times - const Point e0 = v1 - v0; - const Point e1 = v2 - v1; - const Point normal = e0 ^ e1; - const float d = -normal|v0; - if(!planeBoxOverlap(normal, d, mBoxExtents)) return FALSE; - - // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) - { - IMPLEMENT_CLASS3_TESTS - } - return TRUE; -} - -//! ...and another one, jeez -inline_ BOOL AABBCollider::TriBoxOverlap() -{ - // Stats - mNbVolumePrimTests++; - - // Hook - const Point& center = mBox.mCenter; - const Point& extents = mBox.mExtents; - - // use separating axis theorem to test overlap between triangle and box - // need to test for overlap in these directions: - // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle - // we do not even need to test these) - // 2) normal of the triangle - // 3) crossproduct(edge from tri, {x,y,z}-directin) - // this gives 3x3=9 more tests - - // move everything so that the boxcenter is in (0,0,0) - Point v0, v1, v2; - v0.x = mLeafVerts[0].x - center.x; - v1.x = mLeafVerts[1].x - center.x; - v2.x = mLeafVerts[2].x - center.x; - - // First, test overlap in the {x,y,z}-directions -#ifdef OPC_USE_FCOMI - // find min, max of the triangle in x-direction, and test for overlap in X - if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; - if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; - - // same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; - if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; - - // same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; - if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; -#else - float min,max; - // Find min, max of the triangle in x-direction, and test for overlap in X - FINDMINMAX(v0.x, v1.x, v2.x, min, max); - if(min>extents.x || max<-extents.x) return FALSE; - - // Same for Y - v0.y = mLeafVerts[0].y - center.y; - v1.y = mLeafVerts[1].y - center.y; - v2.y = mLeafVerts[2].y - center.y; - - FINDMINMAX(v0.y, v1.y, v2.y, min, max); - if(min>extents.y || max<-extents.y) return FALSE; - - // Same for Z - v0.z = mLeafVerts[0].z - center.z; - v1.z = mLeafVerts[1].z - center.z; - v2.z = mLeafVerts[2].z - center.z; - - FINDMINMAX(v0.z, v1.z, v2.z, min, max); - if(min>extents.z || max<-extents.z) return FALSE; -#endif - // 2) Test if the box intersects the plane of the triangle - // compute plane equation of triangle: normal*x+d=0 - // ### could be precomputed since we use the same leaf triangle several times - const Point e0 = v1 - v0; - const Point e1 = v2 - v1; - const Point normal = e0 ^ e1; - const float d = -normal|v0; - if(!planeBoxOverlap(normal, d, extents)) return FALSE; - - // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) - { - IMPLEMENT_CLASS3_TESTS - } - return TRUE; -} diff --git a/libraries/ode-0.9/OPCODE/OPC_TriTriOverlap.h b/libraries/ode-0.9/OPCODE/OPC_TriTriOverlap.h deleted file mode 100644 index 1e71c6a5c1..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_TriTriOverlap.h +++ /dev/null @@ -1,279 +0,0 @@ - -//! if OPC_TRITRI_EPSILON_TEST is true then we do a check (if |dv|b) \ - { \ - const float c=a; \ - a=b; \ - b=c; \ - } - -//! Edge to edge test based on Franlin Antonio's gem: "Faster Line Segment Intersection", in Graphics Gems III, pp. 199-202 -#define EDGE_EDGE_TEST(V0, U0, U1) \ - Bx = U0[i0] - U1[i0]; \ - By = U0[i1] - U1[i1]; \ - Cx = V0[i0] - U0[i0]; \ - Cy = V0[i1] - U0[i1]; \ - f = Ay*Bx - Ax*By; \ - d = By*Cx - Bx*Cy; \ - if((f>0.0f && d>=0.0f && d<=f) || (f<0.0f && d<=0.0f && d>=f)) \ - { \ - const float e=Ax*Cy - Ay*Cx; \ - if(f>0.0f) \ - { \ - if(e>=0.0f && e<=f) return TRUE; \ - } \ - else \ - { \ - if(e<=0.0f && e>=f) return TRUE; \ - } \ - } - -//! TO BE DOCUMENTED -#define EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2) \ -{ \ - float Bx,By,Cx,Cy,d,f; \ - const float Ax = V1[i0] - V0[i0]; \ - const float Ay = V1[i1] - V0[i1]; \ - /* test edge U0,U1 against V0,V1 */ \ - EDGE_EDGE_TEST(V0, U0, U1); \ - /* test edge U1,U2 against V0,V1 */ \ - EDGE_EDGE_TEST(V0, U1, U2); \ - /* test edge U2,U1 against V0,V1 */ \ - EDGE_EDGE_TEST(V0, U2, U0); \ -} - -//! TO BE DOCUMENTED -#define POINT_IN_TRI(V0, U0, U1, U2) \ -{ \ - /* is T1 completly inside T2? */ \ - /* check if V0 is inside tri(U0,U1,U2) */ \ - float a = U1[i1] - U0[i1]; \ - float b = -(U1[i0] - U0[i0]); \ - float c = -a*U0[i0] - b*U0[i1]; \ - float d0 = a*V0[i0] + b*V0[i1] + c; \ - \ - a = U2[i1] - U1[i1]; \ - b = -(U2[i0] - U1[i0]); \ - c = -a*U1[i0] - b*U1[i1]; \ - const float d1 = a*V0[i0] + b*V0[i1] + c; \ - \ - a = U0[i1] - U2[i1]; \ - b = -(U0[i0] - U2[i0]); \ - c = -a*U2[i0] - b*U2[i1]; \ - const float d2 = a*V0[i0] + b*V0[i1] + c; \ - if(d0*d1>0.0f) \ - { \ - if(d0*d2>0.0f) return TRUE; \ - } \ -} - -//! TO BE DOCUMENTED -BOOL CoplanarTriTri(const Point& n, const Point& v0, const Point& v1, const Point& v2, const Point& u0, const Point& u1, const Point& u2) -{ - float A[3]; - short i0,i1; - /* first project onto an axis-aligned plane, that maximizes the area */ - /* of the triangles, compute indices: i0,i1. */ - A[0] = fabsf(n[0]); - A[1] = fabsf(n[1]); - A[2] = fabsf(n[2]); - if(A[0]>A[1]) - { - if(A[0]>A[2]) - { - i0=1; /* A[0] is greatest */ - i1=2; - } - else - { - i0=0; /* A[2] is greatest */ - i1=1; - } - } - else /* A[0]<=A[1] */ - { - if(A[2]>A[1]) - { - i0=0; /* A[2] is greatest */ - i1=1; - } - else - { - i0=0; /* A[1] is greatest */ - i1=2; - } - } - - /* test all edges of triangle 1 against the edges of triangle 2 */ - EDGE_AGAINST_TRI_EDGES(v0, v1, u0, u1, u2); - EDGE_AGAINST_TRI_EDGES(v1, v2, u0, u1, u2); - EDGE_AGAINST_TRI_EDGES(v2, v0, u0, u1, u2); - - /* finally, test if tri1 is totally contained in tri2 or vice versa */ - POINT_IN_TRI(v0, u0, u1, u2); - POINT_IN_TRI(u0, v0, v1, v2); - - return FALSE; -} - -//! TO BE DOCUMENTED -#define NEWCOMPUTE_INTERVALS(VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, A, B, C, X0, X1) \ -{ \ - if(D0D1>0.0f) \ - { \ - /* here we know that D0D2<=0.0 */ \ - /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ - A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ - } \ - else if(D0D2>0.0f) \ - { \ - /* here we know that d0d1<=0.0 */ \ - A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ - } \ - else if(D1*D2>0.0f || D0!=0.0f) \ - { \ - /* here we know that d0d1<=0.0 or that D0!=0.0 */ \ - A=VV0; B=(VV1 - VV0)*D0; C=(VV2 - VV0)*D0; X0=D0 - D1; X1=D0 - D2; \ - } \ - else if(D1!=0.0f) \ - { \ - A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ - } \ - else if(D2!=0.0f) \ - { \ - A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ - } \ - else \ - { \ - /* triangles are coplanar */ \ - return CoplanarTriTri(N1, V0, V1, V2, U0, U1, U2); \ - } \ -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Triangle/triangle intersection test routine, - * by Tomas Moller, 1997. - * See article "A Fast Triangle-Triangle Intersection Test", - * Journal of Graphics Tools, 2(2), 1997 - * - * Updated June 1999: removed the divisions -- a little faster now! - * Updated October 1999: added {} to CROSS and SUB macros - * - * int NoDivTriTriIsect(float V0[3],float V1[3],float V2[3], - * float U0[3],float U1[3],float U2[3]) - * - * \param V0 [in] triangle 0, vertex 0 - * \param V1 [in] triangle 0, vertex 1 - * \param V2 [in] triangle 0, vertex 2 - * \param U0 [in] triangle 1, vertex 0 - * \param U1 [in] triangle 1, vertex 1 - * \param U2 [in] triangle 1, vertex 2 - * \return true if triangles overlap - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -inline_ BOOL AABBTreeCollider::TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2) -{ - // Stats - mNbPrimPrimTests++; - - // Compute plane equation of triangle(V0,V1,V2) - Point E1 = V1 - V0; - Point E2 = V2 - V0; - const Point N1 = E1 ^ E2; - const float d1 =-N1 | V0; - // Plane equation 1: N1.X+d1=0 - - // Put U0,U1,U2 into plane equation 1 to compute signed distances to the plane - float du0 = (N1|U0) + d1; - float du1 = (N1|U1) + d1; - float du2 = (N1|U2) + d1; - - // Coplanarity robustness check -#ifdef OPC_TRITRI_EPSILON_TEST - if(fabsf(du0)0.0f && du0du2>0.0f) // same sign on all of them + not equal 0 ? - return FALSE; // no intersection occurs - - // Compute plane of triangle (U0,U1,U2) - E1 = U1 - U0; - E2 = U2 - U0; - const Point N2 = E1 ^ E2; - const float d2=-N2 | U0; - // plane equation 2: N2.X+d2=0 - - // put V0,V1,V2 into plane equation 2 - float dv0 = (N2|V0) + d2; - float dv1 = (N2|V1) + d2; - float dv2 = (N2|V2) + d2; - -#ifdef OPC_TRITRI_EPSILON_TEST - if(fabsf(dv0)0.0f && dv0dv2>0.0f) // same sign on all of them + not equal 0 ? - return FALSE; // no intersection occurs - - // Compute direction of intersection line - const Point D = N1^N2; - - // Compute and index to the largest component of D - float max=fabsf(D[0]); - short index=0; - float bb=fabsf(D[1]); - float cc=fabsf(D[2]); - if(bb>max) max=bb,index=1; - if(cc>max) max=cc,index=2; - - // This is the simplified projection onto L - const float vp0 = V0[index]; - const float vp1 = V1[index]; - const float vp2 = V2[index]; - - const float up0 = U0[index]; - const float up1 = U1[index]; - const float up2 = U2[index]; - - // Compute interval for triangle 1 - float a,b,c,x0,x1; - NEWCOMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,a,b,c,x0,x1); - - // Compute interval for triangle 2 - float d,e,f,y0,y1; - NEWCOMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,d,e,f,y0,y1); - - const float xx=x0*x1; - const float yy=y0*y1; - const float xxyy=xx*yy; - - float isect1[2], isect2[2]; - - float tmp=a*xxyy; - isect1[0]=tmp+b*x1*yy; - isect1[1]=tmp+c*x0*yy; - - tmp=d*xxyy; - isect2[0]=tmp+e*xx*y1; - isect2[1]=tmp+f*xx*y0; - - SORT(isect1[0],isect1[1]); - SORT(isect2[0],isect2[1]); - - if(isect1[1]HasPosLeaf()) mTouchedPrimitives->Add(udword(node->GetPosPrimitive())); \ - else _Dump(node->GetPos()); \ - \ - if(ContactFound()) return; \ - \ - if(node->HasNegLeaf()) mTouchedPrimitives->Add(udword(node->GetNegPrimitive())); \ - else _Dump(node->GetNeg()); \ -} - -#define IMPLEMENT_LEAFDUMP(type) \ -void VolumeCollider::_Dump(const type* node) \ -{ \ - if(node->IsLeaf()) \ - { \ - mTouchedPrimitives->Add(udword(node->GetPrimitive())); \ - } \ - else \ - { \ - _Dump(node->GetPos()); \ - \ - if(ContactFound()) return; \ - \ - _Dump(node->GetNeg()); \ - } \ -} - -IMPLEMENT_NOLEAFDUMP(AABBNoLeafNode) -IMPLEMENT_NOLEAFDUMP(AABBQuantizedNoLeafNode) - -IMPLEMENT_LEAFDUMP(AABBCollisionNode) -IMPLEMENT_LEAFDUMP(AABBQuantizedNode) diff --git a/libraries/ode-0.9/OPCODE/OPC_VolumeCollider.h b/libraries/ode-0.9/OPCODE/OPC_VolumeCollider.h deleted file mode 100644 index c0b812e7da..0000000000 --- a/libraries/ode-0.9/OPCODE/OPC_VolumeCollider.h +++ /dev/null @@ -1,138 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Contains base volume collider class. - * \file OPC_VolumeCollider.h - * \author Pierre Terdiman - * \date June, 2, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPC_VOLUMECOLLIDER_H__ -#define __OPC_VOLUMECOLLIDER_H__ - - struct OPCODE_API VolumeCache - { - VolumeCache() : Model(null) {} - ~VolumeCache() {} - - Container TouchedPrimitives; //!< Indices of touched primitives - const BaseModel* Model; //!< Owner - }; - - class OPCODE_API VolumeCollider : public Collider - { - public: - // Constructor / Destructor - VolumeCollider(); - virtual ~VolumeCollider() = 0; - - // Collision report - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the number of touched primitives after a collision query. - * \see GetContactStatus() - * \see GetTouchedPrimitives() - * \return the number of touched primitives - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetNbEntries() : 0; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Gets the list of touched primitives after a collision query. - * \see GetContactStatus() - * \see GetNbTouchedPrimitives() - * \return the list of touched primitives (primitive indices) - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ const udword* GetTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetEntries() : null; } - - // Stats - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Volume-BV overlap tests after a collision query. - * \see GetNbVolumePrimTests() - * \return the number of Volume-BV tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbVolumeBVTests() const { return mNbVolumeBVTests; } - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Stats: gets the number of Volume-Triangle overlap tests after a collision query. - * \see GetNbVolumeBVTests() - * \return the number of Volume-Triangle tests performed during last query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - inline_ udword GetNbVolumePrimTests() const { return mNbVolumePrimTests; } - - // Settings - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. - * \return null if everything is ok, else a string describing the problem - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) const char* ValidateSettings(); - - protected: - // Touched primitives - Container* mTouchedPrimitives; //!< List of touched primitives - - // Dequantization coeffs - Point mCenterCoeff; - Point mExtentsCoeff; - // Stats - udword mNbVolumeBVTests; //!< Number of Volume-BV tests - udword mNbVolumePrimTests; //!< Number of Volume-Primitive tests - // Internal methods - void _Dump(const AABBCollisionNode* node); - void _Dump(const AABBNoLeafNode* node); - void _Dump(const AABBQuantizedNode* node); - void _Dump(const AABBQuantizedNoLeafNode* node); - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /** - * Initializes a query - */ - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - override(Collider) inline_ void InitQuery() - { - // Reset stats & contact status - mNbVolumeBVTests = 0; - mNbVolumePrimTests = 0; - Collider::InitQuery(); - } - - inline_ BOOL IsCacheValid(VolumeCache& cache) - { - // We're going to do a volume-vs-model query. - if(cache.Model!=mCurrentModel) - { - // Cached list was for another model so we can't keep it - // Keep track of new owner and reset cache - cache.Model = mCurrentModel; - return FALSE; - } - else - { - // Same models, no problem - return TRUE; - } - } - }; - -#endif // __OPC_VOLUMECOLLIDER_H__ diff --git a/libraries/ode-0.9/OPCODE/Opcode.cpp b/libraries/ode-0.9/OPCODE/Opcode.cpp deleted file mode 100644 index c9fa104e0f..0000000000 --- a/libraries/ode-0.9/OPCODE/Opcode.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main file for Opcode.dll. - * \file Opcode.cpp - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* - Finding a good name is difficult! - Here's the draft for this lib.... Spooky, uh? - - VOID? Very Optimized Interference Detection - ZOID? Zappy's Optimized Interference Detection - CID? Custom/Clever Interference Detection - AID / ACID! Accurate Interference Detection - QUID? Quick Interference Detection - RIDE? Realtime Interference DEtection - WIDE? Wicked Interference DEtection (....) - GUID! - KID ! k-dop interference detection :) - OPCODE! OPtimized COllision DEtection -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Precompiled Header -#include "Stdafx.h" - -bool Opcode::InitOpcode() -{ - Log("// Initializing OPCODE\n\n"); -// LogAPIInfo(); - return true; -} - -void ReleasePruningSorters(); -bool Opcode::CloseOpcode() -{ - Log("// Closing OPCODE\n\n"); - - ReleasePruningSorters(); - - return true; -} - -#ifdef ICE_MAIN - -void ModuleAttach(HINSTANCE hinstance) -{ -} - -void ModuleDetach() -{ -} - -#endif diff --git a/libraries/ode-0.9/OPCODE/Opcode.dsp b/libraries/ode-0.9/OPCODE/Opcode.dsp deleted file mode 100644 index 560cf56c8e..0000000000 --- a/libraries/ode-0.9/OPCODE/Opcode.dsp +++ /dev/null @@ -1,470 +0,0 @@ -# Microsoft Developer Studio Project File - Name="OPCODE" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=OPCODE - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "Opcode.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "Opcode.mak" CFG="OPCODE - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "OPCODE - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "OPCODE - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName ""$/TR4/ODE/VC6", WNKAAAAA" -# PROP Scc_LocalPath "..\vc6" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "OPCODE - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /G6 /Zp4 /MD /O2 /Ob0 /I ".\\" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "ICE_NO_DLL" /FD /c -# SUBTRACT CPP /Fr /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\lib\OPCODE.lib" - -!ELSEIF "$(CFG)" == "OPCODE - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /G6 /Zp4 /MDd /Gm /ZI /Od /I ".\\" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "ICE_NO_DLL" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\lib\OPCODE_D.lib" - -!ENDIF - -# Begin Target - -# Name "OPCODE - Win32 Release" -# Name "OPCODE - Win32 Debug" -# Begin Source File - -SOURCE=.\Ice\IceAABB.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceAABB.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceAxes.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceBoundingSphere.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceContainer.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceContainer.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceFPU.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceHPoint.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceHPoint.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceIndexedTriangle.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceIndexedTriangle.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceLSS.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix3x3.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix3x3.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix4x4.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMatrix4x4.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceMemoryMacros.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceOBB.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceOBB.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePairs.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePlane.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePlane.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePoint.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePoint.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IcePreprocessor.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRandom.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRandom.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRay.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRay.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRevisitedRadix.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceRevisitedRadix.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceSegment.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceSegment.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTriangle.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTriangle.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTrilist.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceTypes.h -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceUtils.cpp -# End Source File -# Begin Source File - -SOURCE=.\Ice\IceUtils.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_AABBCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_AABBCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_AABBTree.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_AABBTree.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_BaseModel.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_BaseModel.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_BoxBoxOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_BoxPruning.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_BoxPruning.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Collider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Collider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Common.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Common.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_HybridModel.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_HybridModel.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_IceHook.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_LSSTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_MeshInterface.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_MeshInterface.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Model.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Model.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_OBBCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_OBBCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_OptimizedTree.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_OptimizedTree.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Picking.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_Picking.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_PlanesTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_RayTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_Settings.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereAABBOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SphereTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_SweepAndPrune.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_SweepAndPrune.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeBuilders.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeBuilders.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_TreeCollider.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TriBoxOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_TriTriOverlap.h -# End Source File -# Begin Source File - -SOURCE=.\OPC_VolumeCollider.cpp -# End Source File -# Begin Source File - -SOURCE=.\OPC_VolumeCollider.h -# End Source File -# Begin Source File - -SOURCE=.\Opcode.cpp -# End Source File -# Begin Source File - -SOURCE=.\Opcode.h -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.cpp -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Target -# End Project diff --git a/libraries/ode-0.9/OPCODE/Opcode.dsw b/libraries/ode-0.9/OPCODE/Opcode.dsw deleted file mode 100644 index 27f5c28d4e..0000000000 --- a/libraries/ode-0.9/OPCODE/Opcode.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "OPCODE"=.\Opcode.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/libraries/ode-0.9/OPCODE/Opcode.h b/libraries/ode-0.9/OPCODE/Opcode.h deleted file mode 100644 index 2a7a6c5a3e..0000000000 --- a/libraries/ode-0.9/OPCODE/Opcode.h +++ /dev/null @@ -1,113 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** - * Main file for Opcode.dll. - * \file Opcode.h - * \author Pierre Terdiman - * \date March, 20, 2001 - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Include Guard -#ifndef __OPCODE_H__ -#define __OPCODE_H__ - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Things to help us compile on non-windows platforms - -#if defined(__APPLE__) || defined(__MACOSX__) -#if __APPLE_CC__ < 1495 -#define sqrtf sqrt -#define sinf sin -#define cosf cos -#define acosf acos -#define asinf asin -#endif -#endif - -#ifndef _MSC_VER -#ifndef __int64 -#define __int64 long long int -#endif -#ifndef __stdcall /* this is defined in MinGW and CygWin, so avoid the warning */ -#define __stdcall /* */ -#endif -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Compilation messages -#ifdef _MSC_VER - #if defined(OPCODE_EXPORTS) - // #pragma message("Compiling OPCODE") - #elif !defined(OPCODE_EXPORTS) - // #pragma message("Using OPCODE") - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Automatic linking - #ifndef BAN_OPCODE_AUTOLINK - #ifdef _DEBUG - //#pragma comment(lib, "Opcode_D.lib") - #else - //#pragma comment(lib, "Opcode.lib") - #endif - #endif - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Preprocessor -#ifndef ICE_NO_DLL - #ifdef OPCODE_EXPORTS - #define OPCODE_API// __declspec(dllexport) - #else - #define OPCODE_API// __declspec(dllimport) - #endif -#else - #define OPCODE_API -#endif - - #include "OPC_IceHook.h" - - namespace Opcode - { - // Bulk-of-the-work - #include "OPC_Settings.h" - #include "OPC_Common.h" - #include "OPC_MeshInterface.h" - // Builders - #include "OPC_TreeBuilders.h" - // Trees - #include "OPC_AABBTree.h" - #include "OPC_OptimizedTree.h" - // Models - #include "OPC_BaseModel.h" - #include "OPC_Model.h" - #include "OPC_HybridModel.h" - // Colliders - #include "OPC_Collider.h" - #include "OPC_VolumeCollider.h" - #include "OPC_TreeCollider.h" - #include "OPC_RayCollider.h" - #include "OPC_SphereCollider.h" - #include "OPC_OBBCollider.h" - #include "OPC_AABBCollider.h" - #include "OPC_LSSCollider.h" - #include "OPC_PlanesCollider.h" - // Usages - #include "OPC_Picking.h" - // Sweep-and-prune - #include "OPC_BoxPruning.h" - #include "OPC_SweepAndPrune.h" - - FUNCTION OPCODE_API bool InitOpcode(); - FUNCTION OPCODE_API bool CloseOpcode(); - } - -#endif // __OPCODE_H__ diff --git a/libraries/ode-0.9/OPCODE/README-ODE.txt b/libraries/ode-0.9/OPCODE/README-ODE.txt deleted file mode 100644 index c5d5800952..0000000000 --- a/libraries/ode-0.9/OPCODE/README-ODE.txt +++ /dev/null @@ -1,13 +0,0 @@ - -This is a copy of the OPCODE collision detection library by Pierre Terdiman. -See http://www.codercorner.com/Opcode.htm for more information, and read -the ReadMe.txt in this directory. - -If you want to use the TriList (triangle mesh) geometry class in ODE, the -OPCODE library must be compiled. If you are using the autotools support to -compile ODE, you just have to specify --with-trimesh=opcode when calling ./configure. - -This code was originally written for and compiled on windows, but it has been -ported so that it should compile under unix/gcc too. Your mileage may vary. - -Russ Smith, April 12 2005. diff --git a/libraries/ode-0.9/OPCODE/ReadMe.txt b/libraries/ode-0.9/OPCODE/ReadMe.txt deleted file mode 100644 index 8a39eff436..0000000000 --- a/libraries/ode-0.9/OPCODE/ReadMe.txt +++ /dev/null @@ -1,171 +0,0 @@ - - OPCODE distribution 1.3 (june 2003) - ----------------------- - - New in Opcode 1.3: - - fixed the divide by 0 bug that was happening when all centers where located on a coordinate axis (thanks to Jorrit T) - - linearized "complete" vanilla AABB trees - - ANSI-compliant "for" loops (for the ones porting it to Linux...) - - callbacks & pointers moved to mesh interface - - support for triangle & vertex strides - - optimized the sphere-triangle overlap code a bit - - dynamic trees (refit) - - more builders - - ValidateSubdivision in builders - - LSS collider - - primitive-bv tests can now be skipped in most volume queries - - temporal coherence now also works for airborne objects - - temporal coherence completed for boxes / all contacts, LSS, etc - - ray-collider now uses a callback - - some common "usages" have been introduced (only picking for now) - - SPLIT_COMPLETE removed (now implicitely using mLimit = 1) - - hybrid collision models - - sweep-and-prune code added, moved from my old Z-Collide lib - - it now works with meshes made of only 1 triangle (except in mesh-mesh case!) - - Disclaimer: - - - I forced myself to actually *do* the release today no matter what. Else it would never have been done. That's - why the code may not be very polished. I also removed a *lot* of things (more usages, distance queries, etc...) - that weren't ready for prime-time (or that were linked to too many of my supporting libs) - - - Some comments may also be obsolete here and there. The old User Manual for Opcode 1.2 may not fit version 1.3 - either, since there's a new "mesh interface" to support strides, etc. - - - Everything in the "Ice" directory has been hacked out of my engine and edited until everything compiled. Don't - expect anything out there to be cute or something. In particular, some CPP files are not even included when not - needed, so you can expect some linker errors if you try messing around with them... - - Otherwise, it should be just like previous version, only better. In particular, hybrid models can be very - memory-friendly (sometimes using like 10 times less ram than the best trees from version 1.2). The possible - speed hit is often invisible (if it even exists), especially using temporal coherence in "all contacts" mode. - (Admittedly, this depends on your particular usage pattern / what you do on collided triangles). - - The sweep-and-prune code is similar to the "vanilla" version found in V-Collide (but that one's better IMHO...) - The simple "radix" version is often just as good, see for yourself. - - OPCODE distribution 1.2 (august 2002) - ----------------------- - - New in Opcode 1.2: - - new VolumeCollider base class - - simplified callback setup - - you can now use callbacks or pointers (setup at compile time) - - destination array not needed anymore in the RayCollider (faster in-out tests) - - renamed classes: AABBRayCollider => RayCollider, AABBSphereCollider => SphereCollider - - the sphere query now only returns a list of faces (extra info discarded). On the other hand it's a lot faster. - - OBB, AABB and planes queries. Original OBB and AABB queries contributed by Erwin de Vries. - - cosmetic changes in OPC_BoxBoxOverlap.h contributed by Gottfried Chen - - some inlining problems fixed - - faster ray-mesh tests using the separating axis theorem - - new split value in AABB tree construction (contributed by Igor Kravtchenko). Provides faster queries most of the time. - - improved temporal coherence for sphere & AABB queries (works in "All contacts" mode) - - Notes: - - - Everything in the "Ice code" directory (in VC++) is basically copy-pasted from my engine, with a lot - of code removed until there was no link error anymore. Don't expect those files to be cute or anything, - they've never been meant to be released and they're often updated/modified/messy. - - Some experimental features have been removed as well. Else I would never have released the 1.2... - - Not as polished/optimal as I would like it to be, but that's life. I promised myself to release it - before october 2002 (one YEAR later ?!).... That's the only reason why it's there. - - Some people reported ColDet was faster. Uh, come on. They were using Opcode in - "All contacts" mode whereas ColDet was doing "first contact"... - - OPCODE distribution 1.1 (october 2001) - ----------------------- - - New in Opcode 1.1: - - stabbing queries - - sphere queries - - abtract base class for colliders - - settings validation methods - - compilation flags now grouped in OPC_Settings.h - - smaller files, new VC++ virtual dirs (cleaner) - - Notes: - - - "override(baseclass)" is a personal cosmetic thing. It's the same as "virtual", but provides more info. - - I code in 1600*1200, so some lines may look a bit long.. - - This version is not as polished as the previous one due to lack of time. The stabbing & sphere queries - can still be optimized: for example by trying other atomic overlap tests. I'm using my first ray-AABB - code, but the newer one seems better. Tim Schrder's one is good as well. See: www.codercorner.com/RayAABB.cpp - - The trees can easily be compressed even more, I save this for later (lack of time, lack of time!) - - I removed various tests before releasing this one: - - a separation line, a.k.a. "front" in QuickCD, because gains were unclear - - distance queries in a PQP style, because it was way too slow - - support for deformable models, too slow as well - - You can easily use Opcode to do your player-vs-world collision detection, in a Nettle/Telemachos way. - If someone out there wants to donate some art / level for the cause, I'd be glad to release a demo. (current - demo uses copyrighted art I'm not allowed to spread) - - Sorry for the lack of real docs and/or solid examples. I just don't have enough time. - - OPCODE distribution 1.0 (march 2001) - ----------------------- - - - First release - - =============================================================================== - - WHAT ? - - OPCODE means OPtimized COllision DEtection. - So this is a collision detection package similar to RAPID. Here's a - quick list of features: - - - C++ interface, developed for Windows systems using VC++ 6.0 - - Works on arbitrary meshes (convex or non-convex), even polygon soups - - Current implementation uses AABB-trees - - Introduces Primitive-BV overlap tests during recursive collision queries (whereas - standard libraries only rely on Primitive-Primitive and BV-BV tests) - - Introduces no-leaf trees, i.e. collision trees whose leaf nodes have been removed - - Supports collision queries on quantized trees (decompressed on-the-fly) - - Supports "first contact" or "all contacts" modes ( la RAPID) - - Uses temporal coherence for "first contact" mode (~10 to 20 times faster, useful - in rigid body simulation during bisection) - - Memory footprint is 7.2 times smaller than RAPID's one, which is ideal for console - games with limited ram (actually, if you use the unmodified RAPID code using double - precision, it's more like 13 times smaller...) - - And yet it often runs faster than RAPID (according to RDTSC, sometimes more than 5 - times faster when objects are deeply overlapping) - - Performance is usually close to RAPID's one in close-proximity situations - - Stabbing, planes & volume queries (sphere, AABB, OBB, LSS) - - Sweep-and-prune - - Now works with deformable meshes - - Hybrid trees - - - What it can be used for: - - standard mesh-mesh collision detection (similar to RAPID, SOLID, QuickCD, PQP, ColDet...) - - N-body collisions (similar to V-Collide) - - camera-vs-world collisions (similar to Telemachos/Paul Nettle/Stan Melax articles) - - shadow feelers to speed up lightmap computations - - in-out tests to speed up voxelization processes - - picking - - rigid body simulation - - view frustum culling - - etc - - WHY ? - - - Because RAPID uses too many bytes. - - Because the idea was nice... - - WHEN ? - - It's been coded in march 2001 following a thread on the GD-Algorithms list. - - GDAlgorithms-list mailing list - GDAlgorithms-list@lists.sourceforge.net - http://lists.sourceforge.net/lists/listinfo/gdalgorithms-list - - WHO ? - - Pierre Terdiman - June, 1, 2003 - - p.terdiman@wanadoo.fr - p.terdiman@codercorner.com - - http://www.codercorner.com - http://www.codercorner.com/Opcode.htm diff --git a/libraries/ode-0.9/OPCODE/StdAfx.cpp b/libraries/ode-0.9/OPCODE/StdAfx.cpp deleted file mode 100644 index 9c381f6cec..0000000000 --- a/libraries/ode-0.9/OPCODE/StdAfx.cpp +++ /dev/null @@ -1,10 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -//#define ICE_MAIN -#include "Stdafx.h" diff --git a/libraries/ode-0.9/OPCODE/Stdafx.h b/libraries/ode-0.9/OPCODE/Stdafx.h deleted file mode 100644 index 0223a6ca0e..0000000000 --- a/libraries/ode-0.9/OPCODE/Stdafx.h +++ /dev/null @@ -1,24 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* - * OPCODE - Optimized Collision Detection - * Copyright (C) 2001 Pierre Terdiman - * Homepage: http://www.codercorner.com/Opcode.htm - */ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) -#define AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -// Insert your headers here -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include "Opcode.h" - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) diff --git a/libraries/ode-0.9/OPCODE/TemporalCoherence.txt b/libraries/ode-0.9/OPCODE/TemporalCoherence.txt deleted file mode 100644 index fb8593188d..0000000000 --- a/libraries/ode-0.9/OPCODE/TemporalCoherence.txt +++ /dev/null @@ -1,32 +0,0 @@ - -> Hi John, -> -> I know I'll forget to tell you this if I don't write it right now.... -> -> >(2) How is the receiving geometry for the shadow decided? -> -> I wrote about an LSS-test but actually performing a new VFC test (from the -> light's view) is the same. In both cases, here's a trick to take advantage -> of temporal coherence : test the world against a slightly larger than -> necessary LSS or frustum. Keep the list of touched surfaces. Then next -> frame, if the new volume is still contained within the previous one used -for -> the query, you can reuse the same list immediately. Actually it's a bit -> similar to what you did in your sphere-tree, I think. Anyway, now the -O(log -> N) VFC is O(1) for some frames. It's not worth it for the "real" VFC, but -> when you have N virtual frustum to test to drop N shadows, that's another -> story. -> -> Two downsides: -> - You need more ram to keep track of one list of meshes / shadow, but -> usually it's not a lot. -> - By using a larger volume for the query you possibly touch more -> faces/surfaces, which will be rendered in the shadow pass. Usually it's -not -> a problem either since rendering is simply faster than geometric queries -> those days. But of course, "your mileage may vary". -> -> Happy new year ! -> -> Pierre diff --git a/libraries/ode-0.9/README.txt b/libraries/ode-0.9/README.txt deleted file mode 100644 index c9275f9f40..0000000000 --- a/libraries/ode-0.9/README.txt +++ /dev/null @@ -1,41 +0,0 @@ -The Open Dynamics Engine (ODE), Copyright (C) 2001-2007 Russell L. Smith. -------------------------------------------------------------------------- - -ODE is a free, industrial quality library for simulating articulated -rigid body dynamics - for example ground vehicles, legged creatures, -and moving objects in VR environments. It is fast, flexible, robust -and platform independent, with advanced joints, contact with friction, -and built-in collision detection. - -This library is free software; you can redistribute it and/or -modify it under the terms of EITHER: - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file LICENSE.TXT. - (2) The BSD-style license that is included with this library in - the file LICENSE-BSD.TXT. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files -LICENSE.TXT and LICENSE-BSD.TXT for more details. - - * Installation instructions are in the INSTALL file - - * The ODE web pages are at http://ode.org/ - - * An online manual is at http://opende.sf.net/wiki/index.php/Manual - - * API documentation is in the file ode/docs/index.html, or you - can view it on the web at http://opende.sf.net/docs/index.html - -All contributions are copyright by their owners, but the owners -automatically transfer unrestricted rights in those changes to the ODE -project, which is released under the dual licenses as indicated. The -owners can also use the contributions in other projects under other -licenses if they want (including sell them), but they can't prevent -anyone from releasing the contributions under the dual ODE licenses as -part of an ODE release. - diff --git a/libraries/ode-0.9/aclocal.m4 b/libraries/ode-0.9/aclocal.m4 deleted file mode 100644 index b8cf9cd5a5..0000000000 --- a/libraries/ode-0.9/aclocal.m4 +++ /dev/null @@ -1,874 +0,0 @@ -# generated automatically by aclocal 1.10 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_if(m4_PACKAGE_VERSION, [2.61],, -[m4_fatal([this file was generated for autoconf 2.61. -You have another version of autoconf. If you want to use that, -you should regenerate the build system entirely.], [63])]) - -# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.10' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.10], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.10])dnl -_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 9 - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -#serial 3 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 12 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.60])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $1 | $1:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 5 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - diff --git a/libraries/ode-0.9/autogen.sh b/libraries/ode-0.9/autogen.sh deleted file mode 100755 index 68a9759a5c..0000000000 --- a/libraries/ode-0.9/autogen.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh - -# The version nr detection is not working. -# It fails if there is a '-' char in the version nr e.g. -# We should not use it until fixed. - Bram - -## The reason this uses sed instead of "grep --only-matches" -## is because MinGW's grep is an old version and does not contain that flag. -#automake_version=`automake --version | grep --regexp='[+0-9].[+0-9].[+0-9]' | sed -n 's/[* ()A-Za-z]//g;p'` -#automake_mayor=${automake_version%.*.*} -#automake_minor=${automake_version%.*} -#automake_minor=${automake_minor##*.} -#automake_revision=${automake_version##*.} -#echo "AutoMake Version: $automake_mayor.$automake_minor.$automake_revision" -# -#if [ $automake_mayor -eq 1 ]; then -# if [ $automake_minor -lt 8 ]; then -# echo "Automake must be 1.8.2 or higher, please upgrade" -# exit -# else -# if [ $automake_minor -eq 8 ] && [ $automake_revision -lt 2 ]; then -# echo "Automake must be 1.8.2 or higher, please upgrade" -# exit -# fi -# fi -#fi - -echo "Please make sure that you use automake 1.8.2 or later" -echo "Warnings about underquoted definitions are harmless" - -echo "Running aclocal" -aclocal -I . || exit 1 -echo "Running autoheader" -autoheader || exit 1 -echo "Running automake" -automake --foreign --include-deps --add-missing --copy || exit 1 -echo "Running autoconf" -autoconf || exit 1 - -#./configure $* - -echo "Now you are ready to run ./configure" diff --git a/libraries/ode-0.9/build/README.txt b/libraries/ode-0.9/build/README.txt deleted file mode 100644 index 853cc0da51..0000000000 --- a/libraries/ode-0.9/build/README.txt +++ /dev/null @@ -1,44 +0,0 @@ -Premake-based Windows Build System -Contributed by Jason Perkins (jason379@users.sourceforge.net) -------------------------------------------------------------------- - - SVN USERS: Before using these project files you must copy - config-default.h to ode/include/ode/config.h (or run Premake to - generate a new set of project files, see below). - - -ABOUT THESE FILES - - These project files are automatically generated using a tool called - Premake, available from http://premake.sourceforge.net/. The scripts - used to build them have the ".lua" file extension. To regenerate the - stock project files for inclusion in a new release, type: - - premake --makeall - - -CREATING CUSTOM PROJECT FILES - - To create a set of custom project files, first type `premake --help` - to see the options that you have available. Then generate the new - project files using the form: - - premake [options] --target [toolset] - - For instance: - - premake --no-trimesh --target vs2005 - - To build the test applications and Drawstuff library, use the form: - - premake --with-tests --target [toolset] - - If you ever decide that you want to remove your custom project, you - can just type: - - premake --with-tests --clean - - Feel free to direct any questions or comments to myself or the ODE - mailing list. - - diff --git a/libraries/ode-0.9/build/config-default.h b/libraries/ode-0.9/build/config-default.h deleted file mode 100644 index 7d64006b2c..0000000000 --- a/libraries/ode-0.9/build/config-default.h +++ /dev/null @@ -1,176 +0,0 @@ -/* This file was autogenerated by Premake */ -#ifndef _ODE_CONFIG_H_ -#define _ODE_CONFIG_H_ - - -/****************************************************************** - * CONFIGURATON SETTINGS - you can change these, and then rebuild - * ODE to modify the behavior of the library. - * - * dSINGLE/dDOUBLE - force ODE to use single-precision (float) - * or double-precision (double) for numbers. - * Only one should be defined. - * - * dTRIMESH_ENABLED - enable/disable trimesh support - * dTRIMESH_OPCODE - use the OPCODE trimesh engine - * dTRIMESH_GIMPACT - use the GIMPACT trimesh engine - * Only one trimesh engine should be enabled. - * - * dUSE_MALLOC_FOR_ALLOCA (experimental)- - * Use malloc() instead of alloca(). Slower, - * but allows for larger systems and more - * graceful out-of-memory handling. - * - * dTRIMESH_OPCODE_USE_NEW_TRIMESH_TRIMESH_COLLIDER (experimental)- - * Use an alternative trimesh-trimesh collider - * which should yield better results. - * - ******************************************************************/ - -#define dSINGLE -/* #define dDOUBLE */ - -#define dTRIMESH_ENABLED 1 -#define dTRIMESH_OPCODE 1 - -#define dTRIMESH_OPCODE_USE_NEW_TRIMESH_TRIMESH_COLLIDER 0 - -/* #define dUSE_MALLOC_FOR_ALLOCA */ - - -/****************************************************************** - * SYSTEM SETTINGS - you shouldn't need to change these. If you - * run into an issue with these settings, please report it to - * the ODE bug tracker at: - * http://sf.net/tracker/?group_id=24884&atid=382799 - ******************************************************************/ - -/* Try to identify the platform */ -#if defined(_XENON) - #define ODE_PLATFORM_XBOX360 -#elif defined(SN_TARGET_PSP_HW) - #define ODE_PLATFORM_PSP -#elif defined(SN_TARGET_PS3) - #define ODE_PLATFORM_PS3 -#elif defined(_MSC_VER) || defined(__CYGWIN32__) || defined(__MINGW32__) - #define ODE_PLATFORM_WINDOWS -#elif defined(__linux__) - #define ODE_PLATFORM_LINUX -#elif defined(__APPLE__) && defined(__MACH__) - #define ODE_PLATFORM_OSX -#else - #error "Need some help identifying the platform!" -#endif - -/* Additional platform defines used in the code */ -#if defined(ODE_PLATFORM_WINDOWS) && !defined(WIN32) - #define WIN32 -#endif - -#if defined(__CYGWIN32__) || defined(__MINGW32__) - #define CYGWIN -#endif - -#if defined(ODE_PLATFORM_OSX) - #define macintosh -#endif - - -/* Define a DLL export symbol for those platforms that need it */ -#if defined(ODE_PLATFORM_WINDOWS) - #if defined(ODE_DLL) - #define ODE_API __declspec(dllexport) - #elif !defined(ODE_LIB) - #define ODE_DLL_API __declspec(dllimport) - #endif -#endif - -#if !defined(ODE_API) - #define ODE_API -#endif - - -/* Pull in the standard headers */ -#include -#include -#include -#include -#include -#include - -#if !defined(ODE_PLATFORM_PS3) - #include -#endif - -#if !defined(ODE_PLATFORM_WINDOWS) - #include -#endif - - -/* Visual C does not define these functions */ -#if defined(_MSC_VER) - #define copysignf _copysign - #define copysign _copysign -#endif - - -/* Define a value for infinity */ -#if defined(HUGE_VALF) - #define ODE_INFINITY4 HUGE_VALF - #define ODE_INFINITY8 HUGE_VAL -#elif defined(FLT_MAX) - #define ODE_INFINITY4 FLT_MAX - #define ODE_INFINITY8 DBL_MAX -#else - static union { unsigned char __c[4]; float __f; } __ode_huge_valf = {{0,0,0x80,0x7f}}; - static union { unsigned char __c[8]; double __d; } __ode_huge_val = {{0,0,0,0,0,0,0xf0,0x7f}}; - #define ODE_INFINITY4 (__ode_huge_valf.__f) - #define ODE_INFINITY8 (__ode_huge_val.__d) -#endif - -#ifdef dSINGLE - #define dInfinity ODE_INFINITY4 - #define dEpsilon FLT_EPSILON -#else - #define dInfinity ODE_INFINITY8 - #define dEpsilon DBL_EPSILON -#endif - - -/* Well-defined common data types...need to define for 64 bit systems */ -#if defined(_M_IA64) || defined(__ia64__) || defined(_M_AMD64) || defined(__x86_64__) - #define X86_64_SYSTEM 1 - typedef int int32; - typedef unsigned int uint32; - typedef short int16; - typedef unsigned short uint16; - typedef char int8; - typedef unsigned char uint8; -#else - typedef int int32; - typedef unsigned int uint32; - typedef short int16; - typedef unsigned short uint16; - typedef char int8; - typedef unsigned char uint8; -#endif - -/* An integer type that can be safely cast to a pointer. This definition - * should be safe even on 64-bit systems */ -typedef size_t intP; - - -/* The efficient alignment. most platforms align data structures to some - * number of bytes, but this is not always the most efficient alignment. - * for example, many x86 compilers align to 4 bytes, but on a pentium it is - * important to align doubles to 8 byte boundaries (for speed), and the 4 - * floats in a SIMD register to 16 byte boundaries. many other platforms have - * similar behavior. setting a larger alignment can waste a (very) small - * amount of memory. NOTE: this number must be a power of two. */ -#define EFFICIENT_ALIGNMENT 16 - - -/* Define this if your system supports anonymous memory maps (linux does) */ -#define MMAP_ANONYMOUS - -#endif diff --git a/libraries/ode-0.9/build/demos.lua b/libraries/ode-0.9/build/demos.lua deleted file mode 100644 index 4752ba64c9..0000000000 --- a/libraries/ode-0.9/build/demos.lua +++ /dev/null @@ -1,88 +0,0 @@ --- Here are the lists of demos to build. Add/remove new --- demos here and everything else should just work - - local demos = - { - "boxstack", - "buggy", - "chain1", - "chain2", - "collision", - "crash", - "feedback", - "friction", - "heightfield", - "hinge", - "I", - "jointsPR", - "joints", - "motor", - "ode", - "plane2d", - "slider", - "space", - "space_stress", - "step" - } - - if (not options["no-trimesh"]) then - table.insert(demos, "basket") - if (not options["no-cylinder"]) then - table.insert(demos, "cyl") - end - table.insert(demos, "moving_trimesh") - table.insert(demos, "trimesh") - end - - if (not options["no-cylinder"]) then - table.insert(demos, "cylvssphere") - end - - --- Separate distribution files into toolset subdirectories - - if (options["usetargetpath"]) then - packagepath = options["target"] - else - packagepath = "custom" - end - - --- Factory function for demo packages - - function makedemo(index, name) - package = newpackage() - package.name = "demo_" .. name - package.kind = "exe" - package.language = "c++" - package.path = packagepath - package.objdir = "obj/"..name - - package.includepaths = { "../../include" } - package.defines = { "_CRT_SECURE_NO_DEPRECATE" } - - if (options.target == "vs6" or options.target == "vs2002" or options.target == "vs2003") then - package.config.DebugLib.buildflags = { "static-runtime" } - package.config.ReleaseLib.buildflags = { "static-runtime" } - end - - package.links = { "ode", "drawstuff" } - if (windows) then - table.insert(package.links, { "user32", "winmm", "gdi32", "opengl32", "glu32" }) - else - table.insert(package.links, { "GL", "GLU" }) - end - - if (name == "chain1") then - package.files = { "../../ode/demo/demo_" .. name .. ".c" } - else - package.files = { "../../ode/demo/demo_" .. name .. ".cpp" } - end - - if (windows) then - table.insert(package.defines, "WIN32") - table.insert(package.files, "../../drawstuff/src/resources.rc") - end - end - - table.foreach(demos, makedemo) diff --git a/libraries/ode-0.9/build/drawstuff.lua b/libraries/ode-0.9/build/drawstuff.lua deleted file mode 100644 index c36b35006e..0000000000 --- a/libraries/ode-0.9/build/drawstuff.lua +++ /dev/null @@ -1,112 +0,0 @@ -package.name = "drawstuff" -package.language = "c++" -package.objdir = "obj/drawstuff" - - --- Separate distribution files into toolset subdirectories - - if (options["usetargetpath"]) then - package.path = options["target"] - else - package.path = "custom" - end - - --- Package Build Settings - - local dll_defines = - { - "DS_DLL", - "USRDLL" - } - - local lib_defines = - { - "DS_LIB" - } - - if (options["enable-shared-only"]) then - package.kind = "dll" - table.insert(package.defines, dll_defines) - elseif (options["enable-static-only"]) then - package.kind = "lib" - table.insert(package.defines, lib_defines) - else - package.config["DebugDLL"].kind = "dll" - package.config["DebugLib"].kind = "lib" - package.config["ReleaseDLL"].kind = "dll" - package.config["ReleaseLib"].kind = "lib" - - table.insert(package.config["DebugDLL"].defines, dll_defines) - table.insert(package.config["ReleaseDLL"].defines, dll_defines) - table.insert(package.config["DebugLib"].defines, lib_defines) - table.insert(package.config["ReleaseLib"].defines, lib_defines) - end - - package.includepaths = - { - "../../include" - } - - -- disable VS2005 CRT security warnings - if (options["target"] == "vs2005") then - table.insert(package.defines, "_CRT_SECURE_NO_DEPRECATE") - end - - --- Build Flags - - package.config["DebugLib"].buildflags = { } - package.config["DebugDLL"].buildflags = { } - - package.config["ReleaseDLL"].buildflags = { "optimize-speed", "no-symbols", "no-frame-pointer" } - package.config["ReleaseLib"].buildflags = { "optimize-speed", "no-symbols", "no-frame-pointer" } - - if (options.target == "vs6" or options.target == "vs2002" or options.target == "vs2003") then - table.insert(package.config.DebugLib.buildflags, "static-runtime") - table.insert(package.config.ReleaseLib.buildflags, "static-runtime") - end - - --- Libraries - - local windows_libs = - { - "user32", - "opengl32", - "glu32", - "winmm", - "gdi32" - } - - local x11_libs = - { - "X11", - "GL", - "GLU" - } - - if (windows) then - table.insert(package.links, windows_libs) - else - table.insert(package.links, x11_libs) - end - - --- Files - - package.files = - { - matchfiles("../../include/drawstuff/*.h"), - "../../drawstuff/src/internal.h", - "../../drawstuff/src/drawstuff.cpp" - } - - if (windows) then - table.insert(package.defines, "WIN32") - table.insert(package.files, "../../drawstuff/src/resource.h") - table.insert(package.files, "../../drawstuff/src/resources.rc") - table.insert(package.files, "../../drawstuff/src/windows.cpp") - else - table.insert(package.files, "../../drawstuff/src/x11.cpp") - end diff --git a/libraries/ode-0.9/build/gnu/Makefile b/libraries/ode-0.9/build/gnu/Makefile deleted file mode 100644 index e392a26c4e..0000000000 --- a/libraries/ode-0.9/build/gnu/Makefile +++ /dev/null @@ -1,155 +0,0 @@ -# Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` -# Options: -# CONFIG=[DebugDLL|ReleaseDLL|DebugLib|ReleaseLib] - -ifndef CONFIG - CONFIG=DebugDLL -endif - -export CONFIG - -.PHONY: all clean ode drawstuff demo_boxstack demo_buggy demo_chain1 demo_chain2 demo_collision demo_crash demo_feedback demo_friction demo_heightfield demo_hinge demo_I demo_joints demo_motor demo_ode demo_plane2d demo_slider demo_space demo_space_stress demo_step demo_basket demo_cyl demo_moving_trimesh demo_trimesh demo_cylvssphere tests - -all: ode drawstuff demo_boxstack demo_buggy demo_chain1 demo_chain2 demo_collision demo_crash demo_feedback demo_friction demo_heightfield demo_hinge demo_I demo_joints demo_motor demo_ode demo_plane2d demo_slider demo_space demo_space_stress demo_step demo_basket demo_cyl demo_moving_trimesh demo_trimesh demo_cylvssphere tests - -Makefile: ../premake.lua ../ode.lua ../drawstuff.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../demos.lua ../tests.lua - @echo ==== Regenerating Makefiles ==== - @premake --file $^ --usetargetpath --with-demos --with-tests --clean --target gnu - -ode: - @echo ==== Building ode ==== - @$(MAKE) --no-print-directory -C . -f ode.make - -drawstuff: - @echo ==== Building drawstuff ==== - @$(MAKE) --no-print-directory -C . -f drawstuff.make - -demo_boxstack: ode drawstuff - @echo ==== Building demo_boxstack ==== - @$(MAKE) --no-print-directory -C . -f demo_boxstack.make - -demo_buggy: ode drawstuff - @echo ==== Building demo_buggy ==== - @$(MAKE) --no-print-directory -C . -f demo_buggy.make - -demo_chain1: ode drawstuff - @echo ==== Building demo_chain1 ==== - @$(MAKE) --no-print-directory -C . -f demo_chain1.make - -demo_chain2: ode drawstuff - @echo ==== Building demo_chain2 ==== - @$(MAKE) --no-print-directory -C . -f demo_chain2.make - -demo_collision: ode drawstuff - @echo ==== Building demo_collision ==== - @$(MAKE) --no-print-directory -C . -f demo_collision.make - -demo_crash: ode drawstuff - @echo ==== Building demo_crash ==== - @$(MAKE) --no-print-directory -C . -f demo_crash.make - -demo_feedback: ode drawstuff - @echo ==== Building demo_feedback ==== - @$(MAKE) --no-print-directory -C . -f demo_feedback.make - -demo_friction: ode drawstuff - @echo ==== Building demo_friction ==== - @$(MAKE) --no-print-directory -C . -f demo_friction.make - -demo_heightfield: ode drawstuff - @echo ==== Building demo_heightfield ==== - @$(MAKE) --no-print-directory -C . -f demo_heightfield.make - -demo_hinge: ode drawstuff - @echo ==== Building demo_hinge ==== - @$(MAKE) --no-print-directory -C . -f demo_hinge.make - -demo_I: ode drawstuff - @echo ==== Building demo_I ==== - @$(MAKE) --no-print-directory -C . -f demo_I.make - -demo_joints: ode drawstuff - @echo ==== Building demo_joints ==== - @$(MAKE) --no-print-directory -C . -f demo_joints.make - -demo_motor: ode drawstuff - @echo ==== Building demo_motor ==== - @$(MAKE) --no-print-directory -C . -f demo_motor.make - -demo_ode: ode drawstuff - @echo ==== Building demo_ode ==== - @$(MAKE) --no-print-directory -C . -f demo_ode.make - -demo_plane2d: ode drawstuff - @echo ==== Building demo_plane2d ==== - @$(MAKE) --no-print-directory -C . -f demo_plane2d.make - -demo_slider: ode drawstuff - @echo ==== Building demo_slider ==== - @$(MAKE) --no-print-directory -C . -f demo_slider.make - -demo_space: ode drawstuff - @echo ==== Building demo_space ==== - @$(MAKE) --no-print-directory -C . -f demo_space.make - -demo_space_stress: ode drawstuff - @echo ==== Building demo_space_stress ==== - @$(MAKE) --no-print-directory -C . -f demo_space_stress.make - -demo_step: ode drawstuff - @echo ==== Building demo_step ==== - @$(MAKE) --no-print-directory -C . -f demo_step.make - -demo_basket: ode drawstuff - @echo ==== Building demo_basket ==== - @$(MAKE) --no-print-directory -C . -f demo_basket.make - -demo_cyl: ode drawstuff - @echo ==== Building demo_cyl ==== - @$(MAKE) --no-print-directory -C . -f demo_cyl.make - -demo_moving_trimesh: ode drawstuff - @echo ==== Building demo_moving_trimesh ==== - @$(MAKE) --no-print-directory -C . -f demo_moving_trimesh.make - -demo_trimesh: ode drawstuff - @echo ==== Building demo_trimesh ==== - @$(MAKE) --no-print-directory -C . -f demo_trimesh.make - -demo_cylvssphere: ode drawstuff - @echo ==== Building demo_cylvssphere ==== - @$(MAKE) --no-print-directory -C . -f demo_cylvssphere.make - -tests: ode - @echo ==== Building tests ==== - @$(MAKE) --no-print-directory -C . -f tests.make - -clean: - @$(MAKE) --no-print-directory -C . -f ode.make clean - @$(MAKE) --no-print-directory -C . -f drawstuff.make clean - @$(MAKE) --no-print-directory -C . -f demo_boxstack.make clean - @$(MAKE) --no-print-directory -C . -f demo_buggy.make clean - @$(MAKE) --no-print-directory -C . -f demo_chain1.make clean - @$(MAKE) --no-print-directory -C . -f demo_chain2.make clean - @$(MAKE) --no-print-directory -C . -f demo_collision.make clean - @$(MAKE) --no-print-directory -C . -f demo_crash.make clean - @$(MAKE) --no-print-directory -C . -f demo_feedback.make clean - @$(MAKE) --no-print-directory -C . -f demo_friction.make clean - @$(MAKE) --no-print-directory -C . -f demo_heightfield.make clean - @$(MAKE) --no-print-directory -C . -f demo_hinge.make clean - @$(MAKE) --no-print-directory -C . -f demo_I.make clean - @$(MAKE) --no-print-directory -C . -f demo_joints.make clean - @$(MAKE) --no-print-directory -C . -f demo_motor.make clean - @$(MAKE) --no-print-directory -C . -f demo_ode.make clean - @$(MAKE) --no-print-directory -C . -f demo_plane2d.make clean - @$(MAKE) --no-print-directory -C . -f demo_slider.make clean - @$(MAKE) --no-print-directory -C . -f demo_space.make clean - @$(MAKE) --no-print-directory -C . -f demo_space_stress.make clean - @$(MAKE) --no-print-directory -C . -f demo_step.make clean - @$(MAKE) --no-print-directory -C . -f demo_basket.make clean - @$(MAKE) --no-print-directory -C . -f demo_cyl.make clean - @$(MAKE) --no-print-directory -C . -f demo_moving_trimesh.make clean - @$(MAKE) --no-print-directory -C . -f demo_trimesh.make clean - @$(MAKE) --no-print-directory -C . -f demo_cylvssphere.make clean - @$(MAKE) --no-print-directory -C . -f tests.make clean diff --git a/libraries/ode-0.9/build/gnu/demo_I.make b/libraries/ode-0.9/build/gnu/demo_I.make deleted file mode 100644 index 4e661c20be..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_I.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/I/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_I.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/I/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_I.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/I/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_I.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/I/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_I.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_I.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_I - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_I -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_I.o: ../../ode/demo/demo_I.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_basket.make b/libraries/ode-0.9/build/gnu/demo_basket.make deleted file mode 100644 index ba7605ae65..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_basket.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/basket/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_basket.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/basket/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_basket.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/basket/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_basket.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/basket/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_basket.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_basket.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_basket - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_basket -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_basket.o: ../../ode/demo/demo_basket.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_boxstack.make b/libraries/ode-0.9/build/gnu/demo_boxstack.make deleted file mode 100644 index 9e3f3d7610..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_boxstack.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Static Library Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/boxstack/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_boxstack.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/boxstack/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_boxstack.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/boxstack/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_boxstack.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/boxstack/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_boxstack.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_boxstack.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_boxstack - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_boxstack -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_boxstack.o: ../../ode/demo/demo_boxstack.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_buggy.make b/libraries/ode-0.9/build/gnu/demo_buggy.make deleted file mode 100644 index 1fe86eee5b..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_buggy.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/buggy/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_buggy.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/buggy/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_buggy.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/buggy/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_buggy.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/buggy/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_buggy.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_buggy.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_buggy - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_buggy -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_buggy.o: ../../ode/demo/demo_buggy.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_chain1.make b/libraries/ode-0.9/build/gnu/demo_chain1.make deleted file mode 100644 index 5aeaa9b748..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_chain1.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/chain1/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain1.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/chain1/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain1.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/chain1/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain1.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/chain1/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain1.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_chain1.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_chain1 - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_chain1 -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_chain1.o: ../../ode/demo/demo_chain1.c - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CC) $(CFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_chain2.make b/libraries/ode-0.9/build/gnu/demo_chain2.make deleted file mode 100644 index c5ebf07392..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_chain2.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/chain2/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain2.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/chain2/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain2.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/chain2/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain2.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/chain2/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_chain2.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_chain2.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_chain2 - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_chain2 -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_chain2.o: ../../ode/demo/demo_chain2.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_collision.make b/libraries/ode-0.9/build/gnu/demo_collision.make deleted file mode 100644 index 1ce042abdb..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_collision.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/collision/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_collision.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/collision/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_collision.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/collision/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_collision.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/collision/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_collision.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_collision.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_collision - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_collision -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_collision.o: ../../ode/demo/demo_collision.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_crash.make b/libraries/ode-0.9/build/gnu/demo_crash.make deleted file mode 100644 index 8e22ec5b58..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_crash.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/crash/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_crash.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/crash/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_crash.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/crash/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_crash.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/crash/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_crash.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_crash.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_crash - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_crash -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_crash.o: ../../ode/demo/demo_crash.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_cyl.make b/libraries/ode-0.9/build/gnu/demo_cyl.make deleted file mode 100644 index 9258ae8adc..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_cyl.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/cyl/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cyl.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/cyl/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cyl.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/cyl/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cyl.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/cyl/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cyl.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_cyl.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_cyl - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_cyl -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_cyl.o: ../../ode/demo/demo_cyl.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_cylvssphere.make b/libraries/ode-0.9/build/gnu/demo_cylvssphere.make deleted file mode 100644 index a153c24588..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_cylvssphere.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/cylvssphere/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cylvssphere.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/cylvssphere/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cylvssphere.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/cylvssphere/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cylvssphere.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/cylvssphere/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_cylvssphere.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_cylvssphere.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_cylvssphere - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_cylvssphere -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_cylvssphere.o: ../../ode/demo/demo_cylvssphere.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_feedback.make b/libraries/ode-0.9/build/gnu/demo_feedback.make deleted file mode 100644 index e3e53ab8cb..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_feedback.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/feedback/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_feedback.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/feedback/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_feedback.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/feedback/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_feedback.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/feedback/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_feedback.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_feedback.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_feedback - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_feedback -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_feedback.o: ../../ode/demo/demo_feedback.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_friction.make b/libraries/ode-0.9/build/gnu/demo_friction.make deleted file mode 100644 index 2d589198f1..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_friction.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/friction/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_friction.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/friction/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_friction.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/friction/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_friction.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/friction/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_friction.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_friction.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_friction - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_friction -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_friction.o: ../../ode/demo/demo_friction.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_heightfield.make b/libraries/ode-0.9/build/gnu/demo_heightfield.make deleted file mode 100644 index f60cb0c909..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_heightfield.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/heightfield/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_heightfield.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/heightfield/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_heightfield.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/heightfield/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_heightfield.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/heightfield/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_heightfield.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_heightfield.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_heightfield - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_heightfield -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_heightfield.o: ../../ode/demo/demo_heightfield.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_hinge.make b/libraries/ode-0.9/build/gnu/demo_hinge.make deleted file mode 100644 index 17e17b2924..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_hinge.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/hinge/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_hinge.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/hinge/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_hinge.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/hinge/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_hinge.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/hinge/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_hinge.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_hinge.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_hinge - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_hinge -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_hinge.o: ../../ode/demo/demo_hinge.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_joints.make b/libraries/ode-0.9/build/gnu/demo_joints.make deleted file mode 100644 index d1581abbda..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_joints.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/joints/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_joints.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/joints/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_joints.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/joints/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_joints.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/joints/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_joints.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_joints.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_joints - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_joints -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_joints.o: ../../ode/demo/demo_joints.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_motor.make b/libraries/ode-0.9/build/gnu/demo_motor.make deleted file mode 100644 index b49b00d31f..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_motor.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/motor/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_motor.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/motor/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_motor.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/motor/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_motor.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/motor/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_motor.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_motor.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_motor - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_motor -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_motor.o: ../../ode/demo/demo_motor.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_moving_trimesh.make b/libraries/ode-0.9/build/gnu/demo_moving_trimesh.make deleted file mode 100644 index 381c7bfd79..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_moving_trimesh.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/moving_trimesh/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_moving_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/moving_trimesh/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_moving_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/moving_trimesh/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_moving_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/moving_trimesh/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_moving_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_moving_trimesh.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_moving_trimesh - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_moving_trimesh -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_moving_trimesh.o: ../../ode/demo/demo_moving_trimesh.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_ode.make b/libraries/ode-0.9/build/gnu/demo_ode.make deleted file mode 100644 index 3c5b3a5475..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_ode.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/ode/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_ode.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/ode/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_ode.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/ode/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_ode.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/ode/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_ode.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_ode.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_ode - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_ode -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_ode.o: ../../ode/demo/demo_ode.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_plane2d.make b/libraries/ode-0.9/build/gnu/demo_plane2d.make deleted file mode 100644 index aa07b22e27..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_plane2d.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/plane2d/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_plane2d.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/plane2d/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_plane2d.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/plane2d/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_plane2d.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/plane2d/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_plane2d.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_plane2d.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_plane2d - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_plane2d -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_plane2d.o: ../../ode/demo/demo_plane2d.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_slider.make b/libraries/ode-0.9/build/gnu/demo_slider.make deleted file mode 100644 index ed3dc42d09..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_slider.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/slider/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_slider.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/slider/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_slider.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/slider/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_slider.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/slider/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_slider.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_slider.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_slider - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_slider -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_slider.o: ../../ode/demo/demo_slider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_space.make b/libraries/ode-0.9/build/gnu/demo_space.make deleted file mode 100644 index 352b3acf3e..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_space.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/space/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/space/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/space/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/space/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_space.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_space - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_space -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_space.o: ../../ode/demo/demo_space.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_space_stress.make b/libraries/ode-0.9/build/gnu/demo_space_stress.make deleted file mode 100644 index e55f9b88c6..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_space_stress.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/space_stress/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space_stress.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/space_stress/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space_stress.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/space_stress/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space_stress.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/space_stress/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_space_stress.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_space_stress.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_space_stress - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_space_stress -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_space_stress.o: ../../ode/demo/demo_space_stress.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_step.make b/libraries/ode-0.9/build/gnu/demo_step.make deleted file mode 100644 index 9d33c53356..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_step.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/step/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_step.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/step/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_step.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/step/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_step.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/step/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_step.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_step.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_step - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_step -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_step.o: ../../ode/demo/demo_step.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/demo_trimesh.make b/libraries/ode-0.9/build/gnu/demo_trimesh.make deleted file mode 100644 index 15973d3ccd..0000000000 --- a/libraries/ode-0.9/build/gnu/demo_trimesh.make +++ /dev/null @@ -1,124 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/trimesh/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugDLL/ode.dll ../../lib/DebugDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/trimesh/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseDLL/ode.dll ../../lib/ReleaseDLL/drawstuff.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/trimesh/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/DebugLib/libode.a ../../lib/DebugLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/trimesh/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a -luser32 -lwinmm -lgdi32 -lopengl32 -lglu32 - LDDEPS := ../../lib/ReleaseLib/libode.a ../../lib/ReleaseLib/libdrawstuff.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "WIN32" -I "../../include" - TARGET := demo_trimesh.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/demo_trimesh.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking demo_trimesh - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning demo_trimesh -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/demo_trimesh.o: ../../ode/demo/demo_trimesh.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/drawstuff.make b/libraries/ode-0.9/build/gnu/drawstuff.make deleted file mode 100644 index 5d55c538f5..0000000000 --- a/libraries/ode-0.9/build/gnu/drawstuff.make +++ /dev/null @@ -1,130 +0,0 @@ -# C++ Static Library Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/drawstuff/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "WIN32" -D "DS_DLL" -D "USRDLL" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -shared -luser32 -lopengl32 -lglu32 -lwinmm -lgdi32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "DS_DLL" -D "USRDLL" -I "../../include" - TARGET := drawstuff.dll - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/drawstuff/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "WIN32" -D "DS_DLL" -D "USRDLL" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -fomit-frame-pointer - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -shared -s -luser32 -lopengl32 -lglu32 -lwinmm -lgdi32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "DS_DLL" -D "USRDLL" -I "../../include" - TARGET := drawstuff.dll - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/drawstuff/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "WIN32" -D "DS_LIB" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -luser32 -lopengl32 -lglu32 -lwinmm -lgdi32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "DS_LIB" -I "../../include" - TARGET := libdrawstuff.a - BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/drawstuff/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "WIN32" -D "DS_LIB" -I "../../include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -fomit-frame-pointer - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -s -luser32 -lopengl32 -lglu32 -lwinmm -lgdi32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "DS_LIB" -I "../../include" - TARGET := libdrawstuff.a - BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/drawstuff.o \ - $(OBJDIR)/windows.o \ - -RESOURCES := \ - $(OBJDIR)/resources.res \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking drawstuff - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning drawstuff -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/drawstuff.o: ../../drawstuff/src/drawstuff.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/windows.o: ../../drawstuff/src/windows.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/resources.res: ../../drawstuff/src/resources.rc - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @windres $< -O coff -o $@ $(RESFLAGS) - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/ode.make b/libraries/ode-0.9/build/gnu/ode.make deleted file mode 100644 index 413a5aa9cb..0000000000 --- a/libraries/ode-0.9/build/gnu/ode.make +++ /dev/null @@ -1,706 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/ode/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "WIN32" -D "ODE_DLL" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -shared -luser32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "ODE_DLL" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - TARGET := ode.dll - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/ode/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "WIN32" -D "ODE_DLL" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -fomit-frame-pointer - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -shared -s -luser32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "ODE_DLL" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - TARGET := ode.dll - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/ode/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "WIN32" -D "ODE_LIB" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -luser32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "ODE_LIB" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - TARGET := libode.a - BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/ode/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "WIN32" -D "ODE_LIB" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -fomit-frame-pointer - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -s -luser32 - LDDEPS := - RESFLAGS := -D "WIN32" -D "ODE_LIB" -I "../../include" -I "../../OPCODE" -I "../../GIMPACT/include" - TARGET := libode.a - BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/fastdot.o \ - $(OBJDIR)/fastldlt.o \ - $(OBJDIR)/fastlsolve.o \ - $(OBJDIR)/fastltsolve.o \ - $(OBJDIR)/array.o \ - $(OBJDIR)/box.o \ - $(OBJDIR)/capsule.o \ - $(OBJDIR)/collision_cylinder_box.o \ - $(OBJDIR)/collision_cylinder_plane.o \ - $(OBJDIR)/collision_cylinder_sphere.o \ - $(OBJDIR)/collision_cylinder_trimesh.o \ - $(OBJDIR)/collision_kernel.o \ - $(OBJDIR)/collision_quadtreespace.o \ - $(OBJDIR)/collision_space.o \ - $(OBJDIR)/collision_transform.o \ - $(OBJDIR)/collision_trimesh_box.o \ - $(OBJDIR)/collision_trimesh_ccylinder.o \ - $(OBJDIR)/collision_trimesh_distance.o \ - $(OBJDIR)/collision_trimesh_gimpact.o \ - $(OBJDIR)/collision_trimesh_opcode.o \ - $(OBJDIR)/collision_trimesh_plane.o \ - $(OBJDIR)/collision_trimesh_ray.o \ - $(OBJDIR)/collision_trimesh_sphere.o \ - $(OBJDIR)/collision_trimesh_trimesh.o \ - $(OBJDIR)/collision_trimesh_trimesh_new.o \ - $(OBJDIR)/collision_util.o \ - $(OBJDIR)/convex.o \ - $(OBJDIR)/cylinder.o \ - $(OBJDIR)/error.o \ - $(OBJDIR)/export-dif.o \ - $(OBJDIR)/heightfield.o \ - $(OBJDIR)/joint.o \ - $(OBJDIR)/lcp.o \ - $(OBJDIR)/mass.o \ - $(OBJDIR)/mat.o \ - $(OBJDIR)/matrix.o \ - $(OBJDIR)/memory.o \ - $(OBJDIR)/misc.o \ - $(OBJDIR)/obstack.o \ - $(OBJDIR)/ode.o \ - $(OBJDIR)/odemath.o \ - $(OBJDIR)/plane.o \ - $(OBJDIR)/quickstep.o \ - $(OBJDIR)/ray.o \ - $(OBJDIR)/rotation.o \ - $(OBJDIR)/sphere.o \ - $(OBJDIR)/step.o \ - $(OBJDIR)/stepfast.o \ - $(OBJDIR)/testing.o \ - $(OBJDIR)/timer.o \ - $(OBJDIR)/util.o \ - $(OBJDIR)/gimpact.o \ - $(OBJDIR)/gim_boxpruning.o \ - $(OBJDIR)/gim_contact.o \ - $(OBJDIR)/gim_math.o \ - $(OBJDIR)/gim_memory.o \ - $(OBJDIR)/gim_trimesh.o \ - $(OBJDIR)/gim_trimesh_capsule_collision.o \ - $(OBJDIR)/gim_trimesh_ray_collision.o \ - $(OBJDIR)/gim_trimesh_sphere_collision.o \ - $(OBJDIR)/gim_trimesh_trimesh_collision.o \ - $(OBJDIR)/gim_tri_tri_overlap.o \ - $(OBJDIR)/Opcode.o \ - $(OBJDIR)/OPC_AABBCollider.o \ - $(OBJDIR)/OPC_AABBTree.o \ - $(OBJDIR)/OPC_BaseModel.o \ - $(OBJDIR)/OPC_BoxPruning.o \ - $(OBJDIR)/OPC_Collider.o \ - $(OBJDIR)/OPC_Common.o \ - $(OBJDIR)/OPC_HybridModel.o \ - $(OBJDIR)/OPC_LSSCollider.o \ - $(OBJDIR)/OPC_MeshInterface.o \ - $(OBJDIR)/OPC_Model.o \ - $(OBJDIR)/OPC_OBBCollider.o \ - $(OBJDIR)/OPC_OptimizedTree.o \ - $(OBJDIR)/OPC_Picking.o \ - $(OBJDIR)/OPC_PlanesCollider.o \ - $(OBJDIR)/OPC_RayCollider.o \ - $(OBJDIR)/OPC_SphereCollider.o \ - $(OBJDIR)/OPC_SweepAndPrune.o \ - $(OBJDIR)/OPC_TreeBuilders.o \ - $(OBJDIR)/OPC_TreeCollider.o \ - $(OBJDIR)/OPC_VolumeCollider.o \ - $(OBJDIR)/StdAfx.o \ - $(OBJDIR)/IceAABB.o \ - $(OBJDIR)/IceContainer.o \ - $(OBJDIR)/IceHPoint.o \ - $(OBJDIR)/IceIndexedTriangle.o \ - $(OBJDIR)/IceMatrix3x3.o \ - $(OBJDIR)/IceMatrix4x4.o \ - $(OBJDIR)/IceOBB.o \ - $(OBJDIR)/IcePlane.o \ - $(OBJDIR)/IcePoint.o \ - $(OBJDIR)/IceRandom.o \ - $(OBJDIR)/IceRay.o \ - $(OBJDIR)/IceRevisitedRadix.o \ - $(OBJDIR)/IceSegment.o \ - $(OBJDIR)/IceTriangle.o \ - $(OBJDIR)/IceUtils.o \ - -RESOURCES := \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking ode - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning ode -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/fastdot.o: ../../ode/src/fastdot.c - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CC) $(CFLAGS) -o $@ -c $< - -$(OBJDIR)/fastldlt.o: ../../ode/src/fastldlt.c - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CC) $(CFLAGS) -o $@ -c $< - -$(OBJDIR)/fastlsolve.o: ../../ode/src/fastlsolve.c - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CC) $(CFLAGS) -o $@ -c $< - -$(OBJDIR)/fastltsolve.o: ../../ode/src/fastltsolve.c - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CC) $(CFLAGS) -o $@ -c $< - -$(OBJDIR)/array.o: ../../ode/src/array.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/box.o: ../../ode/src/box.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/capsule.o: ../../ode/src/capsule.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_cylinder_box.o: ../../ode/src/collision_cylinder_box.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_cylinder_plane.o: ../../ode/src/collision_cylinder_plane.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_cylinder_sphere.o: ../../ode/src/collision_cylinder_sphere.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_cylinder_trimesh.o: ../../ode/src/collision_cylinder_trimesh.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_kernel.o: ../../ode/src/collision_kernel.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_quadtreespace.o: ../../ode/src/collision_quadtreespace.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_space.o: ../../ode/src/collision_space.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_transform.o: ../../ode/src/collision_transform.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_box.o: ../../ode/src/collision_trimesh_box.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_ccylinder.o: ../../ode/src/collision_trimesh_ccylinder.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_distance.o: ../../ode/src/collision_trimesh_distance.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_gimpact.o: ../../ode/src/collision_trimesh_gimpact.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_opcode.o: ../../ode/src/collision_trimesh_opcode.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_plane.o: ../../ode/src/collision_trimesh_plane.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_ray.o: ../../ode/src/collision_trimesh_ray.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_sphere.o: ../../ode/src/collision_trimesh_sphere.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_trimesh.o: ../../ode/src/collision_trimesh_trimesh.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_trimesh_trimesh_new.o: ../../ode/src/collision_trimesh_trimesh_new.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/collision_util.o: ../../ode/src/collision_util.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/convex.o: ../../ode/src/convex.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/cylinder.o: ../../ode/src/cylinder.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/error.o: ../../ode/src/error.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/export-dif.o: ../../ode/src/export-dif.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/heightfield.o: ../../ode/src/heightfield.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/joint.o: ../../ode/src/joint.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/lcp.o: ../../ode/src/lcp.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/mass.o: ../../ode/src/mass.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/mat.o: ../../ode/src/mat.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/matrix.o: ../../ode/src/matrix.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/memory.o: ../../ode/src/memory.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/misc.o: ../../ode/src/misc.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/obstack.o: ../../ode/src/obstack.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/ode.o: ../../ode/src/ode.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/odemath.o: ../../ode/src/odemath.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/plane.o: ../../ode/src/plane.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/quickstep.o: ../../ode/src/quickstep.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/ray.o: ../../ode/src/ray.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/rotation.o: ../../ode/src/rotation.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/sphere.o: ../../ode/src/sphere.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/step.o: ../../ode/src/step.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/stepfast.o: ../../ode/src/stepfast.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/testing.o: ../../ode/src/testing.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/timer.o: ../../ode/src/timer.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/util.o: ../../ode/src/util.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gimpact.o: ../../GIMPACT/src/gimpact.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_boxpruning.o: ../../GIMPACT/src/gim_boxpruning.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_contact.o: ../../GIMPACT/src/gim_contact.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_math.o: ../../GIMPACT/src/gim_math.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_memory.o: ../../GIMPACT/src/gim_memory.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_trimesh.o: ../../GIMPACT/src/gim_trimesh.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_trimesh_capsule_collision.o: ../../GIMPACT/src/gim_trimesh_capsule_collision.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_trimesh_ray_collision.o: ../../GIMPACT/src/gim_trimesh_ray_collision.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_trimesh_sphere_collision.o: ../../GIMPACT/src/gim_trimesh_sphere_collision.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_trimesh_trimesh_collision.o: ../../GIMPACT/src/gim_trimesh_trimesh_collision.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/gim_tri_tri_overlap.o: ../../GIMPACT/src/gim_tri_tri_overlap.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/Opcode.o: ../../OPCODE/Opcode.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_AABBCollider.o: ../../OPCODE/OPC_AABBCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_AABBTree.o: ../../OPCODE/OPC_AABBTree.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_BaseModel.o: ../../OPCODE/OPC_BaseModel.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_BoxPruning.o: ../../OPCODE/OPC_BoxPruning.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_Collider.o: ../../OPCODE/OPC_Collider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_Common.o: ../../OPCODE/OPC_Common.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_HybridModel.o: ../../OPCODE/OPC_HybridModel.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_LSSCollider.o: ../../OPCODE/OPC_LSSCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_MeshInterface.o: ../../OPCODE/OPC_MeshInterface.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_Model.o: ../../OPCODE/OPC_Model.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_OBBCollider.o: ../../OPCODE/OPC_OBBCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_OptimizedTree.o: ../../OPCODE/OPC_OptimizedTree.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_Picking.o: ../../OPCODE/OPC_Picking.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_PlanesCollider.o: ../../OPCODE/OPC_PlanesCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_RayCollider.o: ../../OPCODE/OPC_RayCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_SphereCollider.o: ../../OPCODE/OPC_SphereCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_SweepAndPrune.o: ../../OPCODE/OPC_SweepAndPrune.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_TreeBuilders.o: ../../OPCODE/OPC_TreeBuilders.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_TreeCollider.o: ../../OPCODE/OPC_TreeCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/OPC_VolumeCollider.o: ../../OPCODE/OPC_VolumeCollider.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/StdAfx.o: ../../OPCODE/StdAfx.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceAABB.o: ../../OPCODE/Ice/IceAABB.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceContainer.o: ../../OPCODE/Ice/IceContainer.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceHPoint.o: ../../OPCODE/Ice/IceHPoint.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceIndexedTriangle.o: ../../OPCODE/Ice/IceIndexedTriangle.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceMatrix3x3.o: ../../OPCODE/Ice/IceMatrix3x3.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceMatrix4x4.o: ../../OPCODE/Ice/IceMatrix4x4.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceOBB.o: ../../OPCODE/Ice/IceOBB.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IcePlane.o: ../../OPCODE/Ice/IcePlane.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IcePoint.o: ../../OPCODE/Ice/IcePoint.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceRandom.o: ../../OPCODE/Ice/IceRandom.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceRay.o: ../../OPCODE/Ice/IceRay.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceRevisitedRadix.o: ../../OPCODE/Ice/IceRevisitedRadix.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceSegment.o: ../../OPCODE/Ice/IceSegment.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceTriangle.o: ../../OPCODE/Ice/IceTriangle.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/IceUtils.o: ../../OPCODE/Ice/IceUtils.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/gnu/tests.make b/libraries/ode-0.9/build/gnu/tests.make deleted file mode 100644 index 869e809012..0000000000 --- a/libraries/ode-0.9/build/gnu/tests.make +++ /dev/null @@ -1,166 +0,0 @@ -# C++ Console Executable Makefile autogenerated by premake -# Don't edit this file! Instead edit `premake.lua` then rerun `make` - -ifndef CONFIG - CONFIG=DebugDLL -endif - -ifeq ($(CONFIG),DebugDLL) - BINDIR := ../../lib/DebugDLL - LIBDIR := ../../lib/DebugDLL - OBJDIR := obj/tests/DebugDLL - OUTDIR := ../../lib/DebugDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugDLL/ode.dll - LDDEPS := ../../lib/DebugDLL/ode.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - TARGET := tests.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseDLL) - BINDIR := ../../lib/ReleaseDLL - LIBDIR := ../../lib/ReleaseDLL - OBJDIR := obj/tests/ReleaseDLL - OUTDIR := ../../lib/ReleaseDLL - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseDLL/ode.dll - LDDEPS := ../../lib/ReleaseDLL/ode.dll - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - TARGET := tests.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),DebugLib) - BINDIR := ../../lib/DebugLib - LIBDIR := ../../lib/DebugLib - OBJDIR := obj/tests/DebugLib - OUTDIR := ../../lib/DebugLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/DebugLib/libode.a - LDDEPS := ../../lib/DebugLib/libode.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - TARGET := tests.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -ifeq ($(CONFIG),ReleaseLib) - BINDIR := ../../lib/ReleaseLib - LIBDIR := ../../lib/ReleaseLib - OBJDIR := obj/tests/ReleaseLib - OUTDIR := ../../lib/ReleaseLib - CPPFLAGS := -MMD -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g - CXXFLAGS := $(CFLAGS) - LDFLAGS += -L$(BINDIR) -L$(LIBDIR) ../../lib/ReleaseLib/libode.a - LDDEPS := ../../lib/ReleaseLib/libode.a - RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -I "../../include" -I "../../tests/CppTestHarness" - TARGET := tests.exe - BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) -endif - -OBJECTS := \ - $(OBJDIR)/main.o \ - $(OBJDIR)/box_sphere.o \ - $(OBJDIR)/HTMLTestReporter.o \ - $(OBJDIR)/PrintfTestReporter.o \ - $(OBJDIR)/Test.o \ - $(OBJDIR)/TestLauncher.o \ - $(OBJDIR)/TestReporter.o \ - $(OBJDIR)/TestResults.o \ - $(OBJDIR)/TestRunner.o \ - -RESOURCES := \ - -MKDIR_TYPE := msdos -CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) -ifeq (,$(CMD)) - MKDIR_TYPE := posix -endif -ifeq (/bin/sh.exe,$(SHELL)) - MKDIR_TYPE := posix -endif -ifeq ($(MKDIR_TYPE),posix) - CMD_MKBINDIR := mkdir -p $(BINDIR) - CMD_MKLIBDIR := mkdir -p $(LIBDIR) - CMD_MKOUTDIR := mkdir -p $(OUTDIR) - CMD_MKOBJDIR := mkdir -p $(OBJDIR) -else - CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) - CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) - CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) - CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) -endif - -.PHONY: clean - -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) - @echo Linking tests - -@$(CMD_MKBINDIR) - -@$(CMD_MKLIBDIR) - -@$(CMD_MKOUTDIR) - @$(BLDCMD) - -clean: - @echo Cleaning tests -ifeq ($(MKDIR_TYPE),posix) - -@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) -else - -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) - -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) - -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) -endif - -$(OBJDIR)/main.o: ../../tests/main.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/box_sphere.o: ../../tests/colliders/box_sphere.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/HTMLTestReporter.o: ../../tests/CppTestHarness/HTMLTestReporter.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/PrintfTestReporter.o: ../../tests/CppTestHarness/PrintfTestReporter.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/Test.o: ../../tests/CppTestHarness/Test.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/TestLauncher.o: ../../tests/CppTestHarness/TestLauncher.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/TestReporter.o: ../../tests/CppTestHarness/TestReporter.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/TestResults.o: ../../tests/CppTestHarness/TestResults.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - -$(OBJDIR)/TestRunner.o: ../../tests/CppTestHarness/TestRunner.cpp - -@$(CMD_MKOBJDIR) - @echo $(notdir $<) - @$(CXX) $(CXXFLAGS) -o $@ -c $< - --include $(OBJECTS:%.o=%.d) - diff --git a/libraries/ode-0.9/build/ode.lua b/libraries/ode-0.9/build/ode.lua deleted file mode 100644 index 568cd260f1..0000000000 --- a/libraries/ode-0.9/build/ode.lua +++ /dev/null @@ -1,166 +0,0 @@ -package.name = "ode" -package.language = "c++" -package.objdir = "obj/ode" - - --- Separate distribution files into toolset subdirectories - - if (options["usetargetpath"]) then - package.path = options["target"] - else - package.path = "custom" - end - - --- Write a custom to include/ode, based on the specified flags - - io.input("config-default.h") - local text = io.read("*a") - - if (options["with-doubles"]) then - text = string.gsub(text, "#define dSINGLE", "/* #define dSINGLE */") - text = string.gsub(text, "/%* #define dDOUBLE %*/", "#define dDOUBLE") - end - - if (options["no-trimesh"]) then - - text = string.gsub(text, "#define dTRIMESH_ENABLED 1", "/* #define dTRIMESH_ENABLED 1 */") - text = string.gsub(text, "#define dTRIMESH_OPCODE 1", "/* #define dTRIMESH_OPCODE 1 */") - - elseif (options["with-gimpact"]) then - - text = string.gsub(text, "#define dTRIMESH_OPCODE 1", "#define dTRIMESH_GIMPACT 1") - - end - - if (options["no-alloca"]) then - text = string.gsub(text, "/%* #define dUSE_MALLOC_FOR_ALLOCA %*/", "#define dUSE_MALLOC_FOR_ALLOCA") - end - - io.output("../include/ode/config.h") - io.write(text) - io.close() - - --- Package Build Settings - - if (options["enable-shared-only"]) then - - package.kind = "dll" - table.insert(package.defines, "ODE_DLL") - - elseif (options["enable-static-only"]) then - - package.kind = "lib" - table.insert(package.defines, "ODE_LIB") - - else - - package.config["DebugDLL"].kind = "dll" - package.config["DebugLib"].kind = "lib" - package.config["ReleaseDLL"].kind = "dll" - package.config["ReleaseLib"].kind = "lib" - - table.insert(package.config["DebugDLL"].defines, "ODE_DLL") - table.insert(package.config["ReleaseDLL"].defines, "ODE_DLL") - table.insert(package.config["DebugLib"].defines, "ODE_LIB") - table.insert(package.config["ReleaseLib"].defines, "ODE_LIB") - - end - - package.includepaths = - { - "../../include", - "../../OPCODE", - "../../GIMPACT/include" - } - - if (windows) then - table.insert(package.defines, "WIN32") - end - - -- disable VS2005 CRT security warnings - if (options["target"] == "vs2005") then - table.insert(package.defines, "_CRT_SECURE_NO_DEPRECATE") - end - - --- Build Flags - - package.config["DebugLib"].buildflags = { } - package.config["DebugDLL"].buildflags = { } - - package.config["ReleaseDLL"].buildflags = { "optimize-speed", "no-symbols", "no-frame-pointer" } - package.config["ReleaseLib"].buildflags = { "optimize-speed", "no-symbols", "no-frame-pointer" } - - if (options.target == "vs6" or options.target == "vs2002" or options.target == "vs2003") then - table.insert(package.config.DebugLib.buildflags, "static-runtime") - table.insert(package.config.ReleaseLib.buildflags, "static-runtime") - end - - --- Libraries - - if (windows) then - table.insert(package.links, "user32") - end - - --- Files - - core_files = - { - matchfiles("../../include/ode/*.h"), - matchfiles ("../../ode/src/*.h", "../../ode/src/*.c", "../../ode/src/*.cpp") - } - - excluded_files = - { - "../../ode/src/collision_std.cpp", - "../../ode/src/scrapbook.cpp", - "../../ode/src/stack.cpp" - } - - trimesh_files = - { - "../../ode/src/collision_trimesh_internal.h", - "../../ode/src/collision_trimesh_opcode.cpp", - "../../ode/src/collision_trimesh_gimpact.cpp", - "../../ode/src/collision_trimesh_box.cpp", - "../../ode/src/collision_trimesh_ccylinder.cpp", - "../../ode/src/collision_cylinder_trimesh.cpp", - "../../ode/src/collision_trimesh_distance.cpp", - "../../ode/src/collision_trimesh_ray.cpp", - "../../ode/src/collision_trimesh_sphere.cpp", - "../../ode/src/collision_trimesh_trimesh.cpp", - "../../ode/src/collision_trimesh_plane.cpp" - } - - opcode_files = - { - matchrecursive("../../OPCODE/*.h", "../../OPCODE/*.cpp") - } - - gimpact_files = - { - matchrecursive("../../GIMPACT/*.h", "../../GIMPACT/*.cpp") - } - - dif_files = - { - "../../ode/src/export-dif.cpp" - } - - package.files = { core_files } - package.excludes = { excluded_files } - - if (options["no-dif"]) then - table.insert(package.excludes, dif_files) - end - - if (options["no-trimesh"]) then - table.insert(package.excludes, trimesh_files) - else - table.insert(package.files, gimpact_files) - table.insert(package.files, opcode_files) - end diff --git a/libraries/ode-0.9/build/premake.lua b/libraries/ode-0.9/build/premake.lua deleted file mode 100644 index 350365acca..0000000000 --- a/libraries/ode-0.9/build/premake.lua +++ /dev/null @@ -1,98 +0,0 @@ -project.name = "ode" - - if (options["target"] == "vs6") then - error("Visual Studio 6 is no longer supported; please upgrade to Visual Studio 2005 C++ Express.") - end - - --- Define the build configurations. You can also use the flags --- `--enable-shared-only` and `--enable-static-only` if you want to --- call these packages from within your own Premake-enabled project. - - if (not options["enable-shared-only"] and not options["enable-static-only"]) then - project.configs = { "DebugDLL", "ReleaseDLL", "DebugLib", "ReleaseLib" } - end - - --- Project options - - addoption("with-doubles", "Use double instead of float as base numeric type") - addoption("with-demos", "Builds the demo applications and DrawStuff library") - addoption("with-tests", "Builds the unit test application") - addoption("with-gimpact", "Use GIMPACT for trimesh collisions (experimental)") - addoption("no-dif", "Exclude DIF (Dynamics Interchange Format) exports") - addoption("no-trimesh", "Exclude trimesh collision geometry") - addoption("no-alloca", "Use heap memory instead of the stack (experimental)") - - --- If the `--usetargetpath` flag is specified, each set of generated files --- be placed in a directory named for the target toolset. This flag is --- used by the `--makeall` command (see below). - - if (options["usetargetpath"]) then - project.path = options["target"] - end - - --- Set the output directories - - if (options["enable-shared-only"] or options["enable-static-only"]) then - project.config["Debug"].bindir = "../lib/debug" - project.config["Debug"].libdir = "../lib/debug" - project.config["Release"].bindir = "../lib/release" - project.config["Release"].bindir = "../lib/release" - else - project.config["DebugDLL"].bindir = "../lib/DebugDLL" - project.config["DebugDLL"].libdir = "../lib/DebugDLL" - project.config["ReleaseDLL"].bindir = "../lib/ReleaseDLL" - project.config["ReleaseDLL"].libdir = "../lib/ReleaseDLL" - project.config["DebugLib"].bindir = "../lib/DebugLib" - project.config["DebugLib"].libdir = "../lib/DebugLib" - project.config["ReleaseLib"].bindir = "../lib/ReleaseLib" - project.config["ReleaseLib"].libdir = "../lib/ReleaseLib" - end - - --- Build packages - - dopackage("ode.lua") - - if (options["with-demos"]) then - dopackage("drawstuff.lua") - dopackage("demos.lua") - end - - if (options["with-tests"]) then - dopackage("tests.lua") - end - - --- Remove all intermediate files - - function doclean(cmd, arg) - docommand(cmd, arg) - if (options["target"] == "") then - os.remove("../include/ode/config.h") - end - os.rmdir("custom") - os.rmdir("../lib/debug") - os.rmdir("../lib/release") - os.rmdir("../lib/DebugDLL") - os.rmdir("../lib/DebugLib") - os.rmdir("../lib/ReleaseDLL") - os.rmdir("../lib/ReleaseLib") - os.rmdir("gnu/obj") - os.rmdir("vs2002/obj") - os.rmdir("vs2003/obj") - os.rmdir("vs2005/obj") - end - - --- Generate all toolsets in one go - - function domakeall(cmd, arg) - os.execute("premake --usetargetpath --with-demos --with-tests --clean --target vs2002") - os.execute("premake --usetargetpath --with-demos --with-tests --clean --target vs2003") - os.execute("premake --usetargetpath --with-demos --with-tests --clean --target vs2005") - os.execute("premake --usetargetpath --with-demos --with-tests --clean --target gnu") - end diff --git a/libraries/ode-0.9/build/tests.lua b/libraries/ode-0.9/build/tests.lua deleted file mode 100644 index 25da24e704..0000000000 --- a/libraries/ode-0.9/build/tests.lua +++ /dev/null @@ -1,26 +0,0 @@ - package.name = "tests" - package.kind = "exe" - package.language = "c++" - package.path = packagepath - package.objdir = "obj/tests" - - package.includepaths = - { - "../../include", - "../../tests/CppTestHarness" - } - - package.defines = - { - "_CRT_SECURE_NO_DEPRECATE" - } - - package.links = - { - "ode" - } - - package.files = - { - matchrecursive("../../tests/*.h", "../../tests/*.cpp") - } diff --git a/libraries/ode-0.9/build/vs2002/demo_I.vcproj b/libraries/ode-0.9/build/vs2002/demo_I.vcproj deleted file mode 100644 index 83eec4b06f..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_I.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_basket.vcproj b/libraries/ode-0.9/build/vs2002/demo_basket.vcproj deleted file mode 100644 index 5ed08efc4a..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_basket.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_boxstack.vcproj b/libraries/ode-0.9/build/vs2002/demo_boxstack.vcproj deleted file mode 100644 index ccc1e1260f..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_boxstack.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_buggy.vcproj b/libraries/ode-0.9/build/vs2002/demo_buggy.vcproj deleted file mode 100644 index b5f413e509..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_buggy.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_chain1.vcproj b/libraries/ode-0.9/build/vs2002/demo_chain1.vcproj deleted file mode 100644 index d7894f6f72..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_chain1.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_chain2.vcproj b/libraries/ode-0.9/build/vs2002/demo_chain2.vcproj deleted file mode 100644 index d4b82bb2e4..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_chain2.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_collision.vcproj b/libraries/ode-0.9/build/vs2002/demo_collision.vcproj deleted file mode 100644 index 321c47923b..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_collision.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_crash.vcproj b/libraries/ode-0.9/build/vs2002/demo_crash.vcproj deleted file mode 100644 index 4d38fa8716..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_crash.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_cyl.vcproj b/libraries/ode-0.9/build/vs2002/demo_cyl.vcproj deleted file mode 100644 index e9f854b266..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_cyl.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_cylvssphere.vcproj b/libraries/ode-0.9/build/vs2002/demo_cylvssphere.vcproj deleted file mode 100644 index 411d008aea..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_cylvssphere.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_feedback.vcproj b/libraries/ode-0.9/build/vs2002/demo_feedback.vcproj deleted file mode 100644 index 0d2d3c3c59..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_feedback.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_friction.vcproj b/libraries/ode-0.9/build/vs2002/demo_friction.vcproj deleted file mode 100644 index 20adbb313a..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_friction.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_heightfield.vcproj b/libraries/ode-0.9/build/vs2002/demo_heightfield.vcproj deleted file mode 100644 index fd6cafdb3c..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_heightfield.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_hinge.vcproj b/libraries/ode-0.9/build/vs2002/demo_hinge.vcproj deleted file mode 100644 index fb46da4649..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_hinge.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_joints.vcproj b/libraries/ode-0.9/build/vs2002/demo_joints.vcproj deleted file mode 100644 index d8491a48d7..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_joints.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_motor.vcproj b/libraries/ode-0.9/build/vs2002/demo_motor.vcproj deleted file mode 100644 index 5f797fdc35..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_motor.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_moving_trimesh.vcproj b/libraries/ode-0.9/build/vs2002/demo_moving_trimesh.vcproj deleted file mode 100644 index 829b78c64a..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_moving_trimesh.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_ode.vcproj b/libraries/ode-0.9/build/vs2002/demo_ode.vcproj deleted file mode 100644 index 6285736d45..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_ode.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_plane2d.vcproj b/libraries/ode-0.9/build/vs2002/demo_plane2d.vcproj deleted file mode 100644 index e0d7c840a7..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_plane2d.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_slider.vcproj b/libraries/ode-0.9/build/vs2002/demo_slider.vcproj deleted file mode 100644 index c3132f9c4e..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_slider.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_space.vcproj b/libraries/ode-0.9/build/vs2002/demo_space.vcproj deleted file mode 100644 index 546c0450aa..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_space.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_space_stress.vcproj b/libraries/ode-0.9/build/vs2002/demo_space_stress.vcproj deleted file mode 100644 index ff27b34554..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_space_stress.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_step.vcproj b/libraries/ode-0.9/build/vs2002/demo_step.vcproj deleted file mode 100644 index a5d29e82b2..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_step.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/demo_trimesh.vcproj b/libraries/ode-0.9/build/vs2002/demo_trimesh.vcproj deleted file mode 100644 index 19fb4fd42a..0000000000 --- a/libraries/ode-0.9/build/vs2002/demo_trimesh.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/drawstuff.vcproj b/libraries/ode-0.9/build/vs2002/drawstuff.vcproj deleted file mode 100644 index d6aac06d7b..0000000000 --- a/libraries/ode-0.9/build/vs2002/drawstuff.vcproj +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/ode.sln b/libraries/ode-0.9/build/vs2002/ode.sln deleted file mode 100644 index 70dcd5063f..0000000000 --- a/libraries/ode-0.9/build/vs2002/ode.sln +++ /dev/null @@ -1,336 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 7.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ode", "./ode.vcproj", "{7530658D-B5A8-6046-ACD2-C155B5A252A8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "drawstuff", "./drawstuff.vcproj", "{4E655490-1B05-844D-871C-BA0F04084AF7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_boxstack", "./demo_boxstack.vcproj", "{B9222926-060B-3248-830A-7C83791F4C61}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_buggy", "./demo_buggy.vcproj", "{8C0F98C4-A95C-6B42-A522-8BC78284EB24}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_chain1", "./demo_chain1.vcproj", "{AD6DDB03-D653-0A48-929F-EB8523978EF2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_chain2", "./demo_chain2.vcproj", "{341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_collision", "./demo_collision.vcproj", "{31540B38-E155-6443-B2CD-BA527144D859}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_crash", "./demo_crash.vcproj", "{7021A282-47AE-294A-9482-DB85E9820FBA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_feedback", "./demo_feedback.vcproj", "{9749BFD4-C4AE-164E-80B4-909F77D77869}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_friction", "./demo_friction.vcproj", "{1C345B16-ACE5-6549-8E84-C91B8392FD0C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_heightfield", "./demo_heightfield.vcproj", "{B8CB1716-5EFF-F442-B261-4056E3F8B8D1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_hinge", "./demo_hinge.vcproj", "{FB9A21A7-A63E-D744-A1D0-F393E7730DC2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_I", "./demo_I.vcproj", "{A382F22A-4053-3445-9E14-02B3447E5F1E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_joints", "./demo_joints.vcproj", "{9C43F96A-1793-5743-A767-2519C9FA48F8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_motor", "./demo_motor.vcproj", "{C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_ode", "./demo_ode.vcproj", "{439C6FAA-CF31-3E42-AD89-CCC07CBE3727}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_plane2d", "./demo_plane2d.vcproj", "{17389BAF-67B5-0747-9126-D01B69F4A0C5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_slider", "./demo_slider.vcproj", "{B0D00D10-D115-5849-976C-2A03A5E0B7D5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_space", "./demo_space.vcproj", "{15F48142-ACD9-0347-B18C-3C26152AEADE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_space_stress", "./demo_space_stress.vcproj", "{86143476-EE08-104B-9C2B-FADE62C8DC23}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_step", "./demo_step.vcproj", "{B818CB9B-879B-2B44-82E2-2F96FA8D61E8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_basket", "./demo_basket.vcproj", "{4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_cyl", "./demo_cyl.vcproj", "{35B7AA42-1B0A-D644-9728-2D9E83806F40}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_moving_trimesh", "./demo_moving_trimesh.vcproj", "{F98194BC-7D59-0742-A5A1-7CA698E65FE2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_trimesh", "./demo_trimesh.vcproj", "{EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_cylvssphere", "./demo_cylvssphere.vcproj", "{81101776-8512-C64E-875D-4FE66D465AB1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "./tests.vcproj", "{E10C083A-2A98-6D4F-A1D3-EF613C0C7141}" -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = DebugDLL - ConfigName.1 = ReleaseDLL - ConfigName.2 = DebugLib - ConfigName.3 = ReleaseLib - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - {B9222926-060B-3248-830A-7C83791F4C61}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {B9222926-060B-3248-830A-7C83791F4C61}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {31540B38-E155-6443-B2CD-BA527144D859}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {31540B38-E155-6443-B2CD-BA527144D859}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {7021A282-47AE-294A-9482-DB85E9820FBA}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {7021A282-47AE-294A-9482-DB85E9820FBA}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {9749BFD4-C4AE-164E-80B4-909F77D77869}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {9749BFD4-C4AE-164E-80B4-909F77D77869}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {A382F22A-4053-3445-9E14-02B3447E5F1E}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {A382F22A-4053-3445-9E14-02B3447E5F1E}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {9C43F96A-1793-5743-A767-2519C9FA48F8}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {9C43F96A-1793-5743-A767-2519C9FA48F8}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {15F48142-ACD9-0347-B18C-3C26152AEADE}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {15F48142-ACD9-0347-B18C-3C26152AEADE}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {86143476-EE08-104B-9C2B-FADE62C8DC23}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {86143476-EE08-104B-9C2B-FADE62C8DC23}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {81101776-8512-C64E-875D-4FE66D465AB1}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - {81101776-8512-C64E-875D-4FE66D465AB1}.1 = {4E655490-1B05-844D-871C-BA0F04084AF7} - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.0 = {7530658D-B5A8-6046-ACD2-C155B5A252A8} - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.DebugDLL.Build.0 = DebugDLL|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.DebugLib.ActiveCfg = DebugLib|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.DebugLib.Build.0 = DebugLib|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {7530658D-B5A8-6046-ACD2-C155B5A252A8}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.DebugDLL.Build.0 = DebugDLL|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.DebugLib.ActiveCfg = DebugLib|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.DebugLib.Build.0 = DebugLib|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {4E655490-1B05-844D-871C-BA0F04084AF7}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.DebugDLL.Build.0 = DebugDLL|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.DebugLib.ActiveCfg = DebugLib|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.DebugLib.Build.0 = DebugLib|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {B9222926-060B-3248-830A-7C83791F4C61}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.DebugDLL.Build.0 = DebugDLL|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.DebugLib.ActiveCfg = DebugLib|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.DebugLib.Build.0 = DebugLib|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {8C0F98C4-A95C-6B42-A522-8BC78284EB24}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.DebugDLL.Build.0 = DebugDLL|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.DebugLib.ActiveCfg = DebugLib|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.DebugLib.Build.0 = DebugLib|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {AD6DDB03-D653-0A48-929F-EB8523978EF2}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.DebugDLL.Build.0 = DebugDLL|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.DebugLib.ActiveCfg = DebugLib|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.DebugLib.Build.0 = DebugLib|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {341B4B78-CA98-5244-8CB0-5F4BCA52B8AB}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.DebugDLL.Build.0 = DebugDLL|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.DebugLib.ActiveCfg = DebugLib|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.DebugLib.Build.0 = DebugLib|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {31540B38-E155-6443-B2CD-BA527144D859}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.DebugDLL.Build.0 = DebugDLL|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.DebugLib.ActiveCfg = DebugLib|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.DebugLib.Build.0 = DebugLib|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {7021A282-47AE-294A-9482-DB85E9820FBA}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.DebugDLL.Build.0 = DebugDLL|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.DebugLib.ActiveCfg = DebugLib|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.DebugLib.Build.0 = DebugLib|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {9749BFD4-C4AE-164E-80B4-909F77D77869}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.DebugDLL.Build.0 = DebugDLL|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.DebugLib.ActiveCfg = DebugLib|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.DebugLib.Build.0 = DebugLib|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {1C345B16-ACE5-6549-8E84-C91B8392FD0C}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.DebugDLL.Build.0 = DebugDLL|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.DebugLib.ActiveCfg = DebugLib|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.DebugLib.Build.0 = DebugLib|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {B8CB1716-5EFF-F442-B261-4056E3F8B8D1}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.DebugDLL.Build.0 = DebugDLL|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.DebugLib.ActiveCfg = DebugLib|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.DebugLib.Build.0 = DebugLib|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {FB9A21A7-A63E-D744-A1D0-F393E7730DC2}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.DebugDLL.Build.0 = DebugDLL|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.DebugLib.ActiveCfg = DebugLib|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.DebugLib.Build.0 = DebugLib|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {A382F22A-4053-3445-9E14-02B3447E5F1E}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.DebugDLL.Build.0 = DebugDLL|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.DebugLib.ActiveCfg = DebugLib|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.DebugLib.Build.0 = DebugLib|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {9C43F96A-1793-5743-A767-2519C9FA48F8}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.DebugDLL.Build.0 = DebugDLL|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.DebugLib.ActiveCfg = DebugLib|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.DebugLib.Build.0 = DebugLib|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {C0CBBFAD-5F99-9B43-969E-13B3B46EBED5}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.DebugDLL.Build.0 = DebugDLL|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.DebugLib.ActiveCfg = DebugLib|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.DebugLib.Build.0 = DebugLib|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {439C6FAA-CF31-3E42-AD89-CCC07CBE3727}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.DebugDLL.Build.0 = DebugDLL|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.DebugLib.ActiveCfg = DebugLib|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.DebugLib.Build.0 = DebugLib|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {17389BAF-67B5-0747-9126-D01B69F4A0C5}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.DebugDLL.Build.0 = DebugDLL|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.DebugLib.ActiveCfg = DebugLib|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.DebugLib.Build.0 = DebugLib|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {B0D00D10-D115-5849-976C-2A03A5E0B7D5}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.DebugDLL.Build.0 = DebugDLL|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.DebugLib.ActiveCfg = DebugLib|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.DebugLib.Build.0 = DebugLib|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {15F48142-ACD9-0347-B18C-3C26152AEADE}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.DebugDLL.Build.0 = DebugDLL|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.DebugLib.ActiveCfg = DebugLib|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.DebugLib.Build.0 = DebugLib|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {86143476-EE08-104B-9C2B-FADE62C8DC23}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.DebugDLL.Build.0 = DebugDLL|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.DebugLib.ActiveCfg = DebugLib|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.DebugLib.Build.0 = DebugLib|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {B818CB9B-879B-2B44-82E2-2F96FA8D61E8}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.DebugDLL.Build.0 = DebugDLL|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.DebugLib.ActiveCfg = DebugLib|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.DebugLib.Build.0 = DebugLib|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {4D85F0AA-E59F-3B43-918F-B5033A5E3BD4}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.DebugDLL.Build.0 = DebugDLL|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.DebugLib.ActiveCfg = DebugLib|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.DebugLib.Build.0 = DebugLib|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {35B7AA42-1B0A-D644-9728-2D9E83806F40}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.DebugDLL.Build.0 = DebugDLL|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.DebugLib.ActiveCfg = DebugLib|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.DebugLib.Build.0 = DebugLib|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {F98194BC-7D59-0742-A5A1-7CA698E65FE2}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.DebugDLL.Build.0 = DebugDLL|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.DebugLib.ActiveCfg = DebugLib|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.DebugLib.Build.0 = DebugLib|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {EE803EF6-9285-BA47-AD4A-C5AE76BF7FDC}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.DebugDLL.Build.0 = DebugDLL|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.DebugLib.ActiveCfg = DebugLib|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.DebugLib.Build.0 = DebugLib|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {81101776-8512-C64E-875D-4FE66D465AB1}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.DebugDLL.Build.0 = DebugDLL|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.DebugLib.ActiveCfg = DebugLib|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.DebugLib.Build.0 = DebugLib|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {E10C083A-2A98-6D4F-A1D3-EF613C0C7141}.ReleaseLib.Build.0 = ReleaseLib|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/libraries/ode-0.9/build/vs2002/ode.vcproj b/libraries/ode-0.9/build/vs2002/ode.vcproj deleted file mode 100644 index ddaf370299..0000000000 --- a/libraries/ode-0.9/build/vs2002/ode.vcproj +++ /dev/null @@ -1,864 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2002/tests.vcproj b/libraries/ode-0.9/build/vs2002/tests.vcproj deleted file mode 100644 index 26bcef99ab..0000000000 --- a/libraries/ode-0.9/build/vs2002/tests.vcproj +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_I.vcproj b/libraries/ode-0.9/build/vs2003/demo_I.vcproj deleted file mode 100644 index 60b8c1c11a..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_I.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_basket.vcproj b/libraries/ode-0.9/build/vs2003/demo_basket.vcproj deleted file mode 100644 index c8c552d336..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_basket.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_boxstack.vcproj b/libraries/ode-0.9/build/vs2003/demo_boxstack.vcproj deleted file mode 100644 index 22c49205c1..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_boxstack.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_buggy.vcproj b/libraries/ode-0.9/build/vs2003/demo_buggy.vcproj deleted file mode 100644 index dc4c38edf3..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_buggy.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_chain1.vcproj b/libraries/ode-0.9/build/vs2003/demo_chain1.vcproj deleted file mode 100644 index cd20c46aa3..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_chain1.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_chain2.vcproj b/libraries/ode-0.9/build/vs2003/demo_chain2.vcproj deleted file mode 100644 index d677b26417..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_chain2.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_collision.vcproj b/libraries/ode-0.9/build/vs2003/demo_collision.vcproj deleted file mode 100644 index bf0f338924..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_collision.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_crash.vcproj b/libraries/ode-0.9/build/vs2003/demo_crash.vcproj deleted file mode 100644 index 3a5dad0b5c..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_crash.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_cyl.vcproj b/libraries/ode-0.9/build/vs2003/demo_cyl.vcproj deleted file mode 100644 index 5584ae5674..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_cyl.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_cylvssphere.vcproj b/libraries/ode-0.9/build/vs2003/demo_cylvssphere.vcproj deleted file mode 100644 index 4c2870f92b..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_cylvssphere.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_feedback.vcproj b/libraries/ode-0.9/build/vs2003/demo_feedback.vcproj deleted file mode 100644 index 361e72aac8..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_feedback.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_friction.vcproj b/libraries/ode-0.9/build/vs2003/demo_friction.vcproj deleted file mode 100644 index a8a90c01c7..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_friction.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_heightfield.vcproj b/libraries/ode-0.9/build/vs2003/demo_heightfield.vcproj deleted file mode 100644 index 1287bc61b8..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_heightfield.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_hinge.vcproj b/libraries/ode-0.9/build/vs2003/demo_hinge.vcproj deleted file mode 100644 index a7061b74a8..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_hinge.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_joints.vcproj b/libraries/ode-0.9/build/vs2003/demo_joints.vcproj deleted file mode 100644 index b80d31c6c6..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_joints.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_motor.vcproj b/libraries/ode-0.9/build/vs2003/demo_motor.vcproj deleted file mode 100644 index 8fd9f90593..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_motor.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_moving_trimesh.vcproj b/libraries/ode-0.9/build/vs2003/demo_moving_trimesh.vcproj deleted file mode 100644 index 65079c023d..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_moving_trimesh.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_ode.vcproj b/libraries/ode-0.9/build/vs2003/demo_ode.vcproj deleted file mode 100644 index be0ce9955c..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_ode.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_plane2d.vcproj b/libraries/ode-0.9/build/vs2003/demo_plane2d.vcproj deleted file mode 100644 index 874f182e19..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_plane2d.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_slider.vcproj b/libraries/ode-0.9/build/vs2003/demo_slider.vcproj deleted file mode 100644 index a9c6bc1364..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_slider.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_space.vcproj b/libraries/ode-0.9/build/vs2003/demo_space.vcproj deleted file mode 100644 index 4243a9006c..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_space.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_space_stress.vcproj b/libraries/ode-0.9/build/vs2003/demo_space_stress.vcproj deleted file mode 100644 index 988583ea99..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_space_stress.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_step.vcproj b/libraries/ode-0.9/build/vs2003/demo_step.vcproj deleted file mode 100644 index 353e12fb19..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_step.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/demo_trimesh.vcproj b/libraries/ode-0.9/build/vs2003/demo_trimesh.vcproj deleted file mode 100644 index b95ae50f27..0000000000 --- a/libraries/ode-0.9/build/vs2003/demo_trimesh.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/drawstuff.vcproj b/libraries/ode-0.9/build/vs2003/drawstuff.vcproj deleted file mode 100644 index 39f0d56eed..0000000000 --- a/libraries/ode-0.9/build/vs2003/drawstuff.vcproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/ode.sln b/libraries/ode-0.9/build/vs2003/ode.sln deleted file mode 100644 index e00732bba3..0000000000 --- a/libraries/ode-0.9/build/vs2003/ode.sln +++ /dev/null @@ -1,388 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ode", "./ode.vcproj", "{5F0953F1-B966-BA4E-A31A-C002A407FD47}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "drawstuff", "./drawstuff.vcproj", "{029C9CCD-2B3E-BE45-8520-A231CD8C67EC}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_boxstack", "./demo_boxstack.vcproj", "{F25F1B18-2103-B147-A5F0-984D0D1EBBDA}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_buggy", "./demo_buggy.vcproj", "{79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_chain1", "./demo_chain1.vcproj", "{DC6294E4-6A55-1D41-9846-53EC913D0DC3}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_chain2", "./demo_chain2.vcproj", "{D01EDE86-5B74-A24B-B084-FC79608D376D}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_collision", "./demo_collision.vcproj", "{238F8FBA-C48F-694E-9D78-6D99DA572645}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_crash", "./demo_crash.vcproj", "{4D828A55-6AAD-B948-8817-38EB3E85F504}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_feedback", "./demo_feedback.vcproj", "{2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_friction", "./demo_friction.vcproj", "{ECE402AB-3062-6745-AC2A-85BB65CA000F}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_heightfield", "./demo_heightfield.vcproj", "{D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_hinge", "./demo_hinge.vcproj", "{1F4FB263-EF66-F247-807C-30DA768C7072}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_I", "./demo_I.vcproj", "{F387003D-4CE3-7548-A471-3C2D188AB7D3}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_joints", "./demo_joints.vcproj", "{B05FDE9B-2066-9A49-A286-52FA07638F67}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_motor", "./demo_motor.vcproj", "{94367E2E-BAD6-C04F-9929-77D2FFFD945B}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_ode", "./demo_ode.vcproj", "{26876866-6691-1C48-BB6A-2CF14E2E2B16}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_plane2d", "./demo_plane2d.vcproj", "{4C672D5A-F87B-C645-8CA2-A9F4BF94525A}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_slider", "./demo_slider.vcproj", "{5621B59B-14FB-5741-8F14-90A0865161F8}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_space", "./demo_space.vcproj", "{8C77C726-B2ED-3745-9433-FF91E9D2556F}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_space_stress", "./demo_space_stress.vcproj", "{CE00A8A1-848B-9448-9A86-03F518195687}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_step", "./demo_step.vcproj", "{441E2B42-D9D5-FD48-872E-1F547FEFEC1D}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_basket", "./demo_basket.vcproj", "{658A5390-4A5E-5A48-9A10-B04A53848994}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_cyl", "./demo_cyl.vcproj", "{3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_moving_trimesh", "./demo_moving_trimesh.vcproj", "{94C25B7D-977F-E744-A255-2554C19771A8}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_trimesh", "./demo_trimesh.vcproj", "{01532891-8699-8846-9409-0DADE3A53422}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_cylvssphere", "./demo_cylvssphere.vcproj", "{9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} = {029C9CCD-2B3E-BE45-8520-A231CD8C67EC} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "./tests.vcproj", "{65028345-CDF4-B74C-B94F-8F4A0493D8C4}" - ProjectSection(ProjectDependencies) = postProject - {5F0953F1-B966-BA4E-A31A-C002A407FD47} = {5F0953F1-B966-BA4E-A31A-C002A407FD47} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - DebugDLL = DebugDLL - ReleaseDLL = ReleaseDLL - DebugLib = DebugLib - ReleaseLib = ReleaseLib - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.DebugDLL.Build.0 = DebugDLL|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.DebugLib.ActiveCfg = DebugLib|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.DebugLib.Build.0 = DebugLib|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {5F0953F1-B966-BA4E-A31A-C002A407FD47}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.DebugDLL.Build.0 = DebugDLL|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.DebugLib.ActiveCfg = DebugLib|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.DebugLib.Build.0 = DebugLib|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {029C9CCD-2B3E-BE45-8520-A231CD8C67EC}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.DebugDLL.Build.0 = DebugDLL|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.DebugLib.ActiveCfg = DebugLib|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.DebugLib.Build.0 = DebugLib|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {F25F1B18-2103-B147-A5F0-984D0D1EBBDA}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.DebugDLL.Build.0 = DebugDLL|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.DebugLib.ActiveCfg = DebugLib|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.DebugLib.Build.0 = DebugLib|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {79FFAF28-2FD1-6744-909F-7F7E68DDEB6D}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.DebugDLL.Build.0 = DebugDLL|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.DebugLib.ActiveCfg = DebugLib|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.DebugLib.Build.0 = DebugLib|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {DC6294E4-6A55-1D41-9846-53EC913D0DC3}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.DebugDLL.Build.0 = DebugDLL|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.DebugLib.ActiveCfg = DebugLib|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.DebugLib.Build.0 = DebugLib|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {D01EDE86-5B74-A24B-B084-FC79608D376D}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.DebugDLL.Build.0 = DebugDLL|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.DebugLib.ActiveCfg = DebugLib|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.DebugLib.Build.0 = DebugLib|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {238F8FBA-C48F-694E-9D78-6D99DA572645}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.DebugDLL.Build.0 = DebugDLL|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.DebugLib.ActiveCfg = DebugLib|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.DebugLib.Build.0 = DebugLib|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {4D828A55-6AAD-B948-8817-38EB3E85F504}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.DebugDLL.Build.0 = DebugDLL|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.DebugLib.ActiveCfg = DebugLib|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.DebugLib.Build.0 = DebugLib|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {2CFE9EEA-E735-BD49-96FF-34C2C3893AC7}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.DebugDLL.Build.0 = DebugDLL|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.DebugLib.ActiveCfg = DebugLib|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.DebugLib.Build.0 = DebugLib|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {ECE402AB-3062-6745-AC2A-85BB65CA000F}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.DebugDLL.Build.0 = DebugDLL|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.DebugLib.ActiveCfg = DebugLib|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.DebugLib.Build.0 = DebugLib|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {D746A3DA-E7D4-6A4A-B078-D5E5A79CFB5F}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.DebugDLL.Build.0 = DebugDLL|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.DebugLib.ActiveCfg = DebugLib|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.DebugLib.Build.0 = DebugLib|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {1F4FB263-EF66-F247-807C-30DA768C7072}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.DebugDLL.Build.0 = DebugDLL|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.DebugLib.ActiveCfg = DebugLib|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.DebugLib.Build.0 = DebugLib|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {F387003D-4CE3-7548-A471-3C2D188AB7D3}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.DebugDLL.Build.0 = DebugDLL|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.DebugLib.ActiveCfg = DebugLib|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.DebugLib.Build.0 = DebugLib|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {B05FDE9B-2066-9A49-A286-52FA07638F67}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.DebugDLL.Build.0 = DebugDLL|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.DebugLib.ActiveCfg = DebugLib|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.DebugLib.Build.0 = DebugLib|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {94367E2E-BAD6-C04F-9929-77D2FFFD945B}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.DebugDLL.Build.0 = DebugDLL|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.DebugLib.ActiveCfg = DebugLib|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.DebugLib.Build.0 = DebugLib|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {26876866-6691-1C48-BB6A-2CF14E2E2B16}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.DebugDLL.Build.0 = DebugDLL|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.DebugLib.ActiveCfg = DebugLib|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.DebugLib.Build.0 = DebugLib|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {4C672D5A-F87B-C645-8CA2-A9F4BF94525A}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.DebugDLL.Build.0 = DebugDLL|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.DebugLib.ActiveCfg = DebugLib|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.DebugLib.Build.0 = DebugLib|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {5621B59B-14FB-5741-8F14-90A0865161F8}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.DebugDLL.Build.0 = DebugDLL|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.DebugLib.ActiveCfg = DebugLib|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.DebugLib.Build.0 = DebugLib|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {8C77C726-B2ED-3745-9433-FF91E9D2556F}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.DebugDLL.Build.0 = DebugDLL|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.DebugLib.ActiveCfg = DebugLib|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.DebugLib.Build.0 = DebugLib|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {CE00A8A1-848B-9448-9A86-03F518195687}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.DebugDLL.Build.0 = DebugDLL|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.DebugLib.ActiveCfg = DebugLib|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.DebugLib.Build.0 = DebugLib|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {441E2B42-D9D5-FD48-872E-1F547FEFEC1D}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.DebugDLL.Build.0 = DebugDLL|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.DebugLib.ActiveCfg = DebugLib|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.DebugLib.Build.0 = DebugLib|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {658A5390-4A5E-5A48-9A10-B04A53848994}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.DebugDLL.Build.0 = DebugDLL|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.DebugLib.ActiveCfg = DebugLib|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.DebugLib.Build.0 = DebugLib|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {3E62DE94-D6E5-0F42-A99B-CAA0139E7C82}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.DebugDLL.Build.0 = DebugDLL|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.DebugLib.ActiveCfg = DebugLib|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.DebugLib.Build.0 = DebugLib|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {94C25B7D-977F-E744-A255-2554C19771A8}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.DebugDLL.Build.0 = DebugDLL|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.DebugLib.ActiveCfg = DebugLib|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.DebugLib.Build.0 = DebugLib|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {01532891-8699-8846-9409-0DADE3A53422}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.DebugDLL.Build.0 = DebugDLL|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.DebugLib.ActiveCfg = DebugLib|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.DebugLib.Build.0 = DebugLib|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {9419B36B-EB65-8F4C-9E29-9DE728FEF4BA}.ReleaseLib.Build.0 = ReleaseLib|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.DebugDLL.ActiveCfg = DebugDLL|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.DebugDLL.Build.0 = DebugDLL|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.ReleaseDLL.ActiveCfg = ReleaseDLL|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.ReleaseDLL.Build.0 = ReleaseDLL|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.DebugLib.ActiveCfg = DebugLib|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.DebugLib.Build.0 = DebugLib|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.ReleaseLib.ActiveCfg = ReleaseLib|Win32 - {65028345-CDF4-B74C-B94F-8F4A0493D8C4}.ReleaseLib.Build.0 = ReleaseLib|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/libraries/ode-0.9/build/vs2003/ode.vcproj b/libraries/ode-0.9/build/vs2003/ode.vcproj deleted file mode 100644 index 80bed8ec7d..0000000000 --- a/libraries/ode-0.9/build/vs2003/ode.vcproj +++ /dev/null @@ -1,890 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2003/tests.vcproj b/libraries/ode-0.9/build/vs2003/tests.vcproj deleted file mode 100644 index 1010093fc7..0000000000 --- a/libraries/ode-0.9/build/vs2003/tests.vcproj +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_I.vcproj b/libraries/ode-0.9/build/vs2005/demo_I.vcproj deleted file mode 100644 index 106aeded05..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_I.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_basket.vcproj b/libraries/ode-0.9/build/vs2005/demo_basket.vcproj deleted file mode 100644 index d19403dd76..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_basket.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_boxstack.vcproj b/libraries/ode-0.9/build/vs2005/demo_boxstack.vcproj deleted file mode 100644 index ff91d078c0..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_boxstack.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_buggy.vcproj b/libraries/ode-0.9/build/vs2005/demo_buggy.vcproj deleted file mode 100644 index 88d5e44d34..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_buggy.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_chain1.vcproj b/libraries/ode-0.9/build/vs2005/demo_chain1.vcproj deleted file mode 100644 index daa8ac8123..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_chain1.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_chain2.vcproj b/libraries/ode-0.9/build/vs2005/demo_chain2.vcproj deleted file mode 100644 index 5549d98813..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_chain2.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_collision.vcproj b/libraries/ode-0.9/build/vs2005/demo_collision.vcproj deleted file mode 100644 index d20edf8d6b..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_collision.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_crash.vcproj b/libraries/ode-0.9/build/vs2005/demo_crash.vcproj deleted file mode 100644 index d8725875c2..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_crash.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_cyl.vcproj b/libraries/ode-0.9/build/vs2005/demo_cyl.vcproj deleted file mode 100644 index e6fac4f65e..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_cyl.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_cylvssphere.vcproj b/libraries/ode-0.9/build/vs2005/demo_cylvssphere.vcproj deleted file mode 100644 index 686c830f60..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_cylvssphere.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_feedback.vcproj b/libraries/ode-0.9/build/vs2005/demo_feedback.vcproj deleted file mode 100644 index fb949f26f7..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_feedback.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_friction.vcproj b/libraries/ode-0.9/build/vs2005/demo_friction.vcproj deleted file mode 100644 index 29983a5300..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_friction.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_heightfield.vcproj b/libraries/ode-0.9/build/vs2005/demo_heightfield.vcproj deleted file mode 100644 index 463ebd0145..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_heightfield.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_hinge.vcproj b/libraries/ode-0.9/build/vs2005/demo_hinge.vcproj deleted file mode 100644 index c1ed4e9445..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_hinge.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_joints.vcproj b/libraries/ode-0.9/build/vs2005/demo_joints.vcproj deleted file mode 100644 index 6fa43d04a1..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_joints.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_motor.vcproj b/libraries/ode-0.9/build/vs2005/demo_motor.vcproj deleted file mode 100644 index 751c057690..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_motor.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_moving_trimesh.vcproj b/libraries/ode-0.9/build/vs2005/demo_moving_trimesh.vcproj deleted file mode 100644 index da66c0f91d..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_moving_trimesh.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_ode.vcproj b/libraries/ode-0.9/build/vs2005/demo_ode.vcproj deleted file mode 100644 index e9afccd936..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_ode.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_plane2d.vcproj b/libraries/ode-0.9/build/vs2005/demo_plane2d.vcproj deleted file mode 100644 index 226f51e022..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_plane2d.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_slider.vcproj b/libraries/ode-0.9/build/vs2005/demo_slider.vcproj deleted file mode 100644 index 16a8dd8ea5..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_slider.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_space.vcproj b/libraries/ode-0.9/build/vs2005/demo_space.vcproj deleted file mode 100644 index e65fd64f03..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_space.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_space_stress.vcproj b/libraries/ode-0.9/build/vs2005/demo_space_stress.vcproj deleted file mode 100644 index 43dd6c1aff..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_space_stress.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_step.vcproj b/libraries/ode-0.9/build/vs2005/demo_step.vcproj deleted file mode 100644 index 37a4cac39e..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_step.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/demo_trimesh.vcproj b/libraries/ode-0.9/build/vs2005/demo_trimesh.vcproj deleted file mode 100644 index 09a1ed8cb3..0000000000 --- a/libraries/ode-0.9/build/vs2005/demo_trimesh.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/drawstuff.vcproj b/libraries/ode-0.9/build/vs2005/drawstuff.vcproj deleted file mode 100644 index ecbdbed0d0..0000000000 --- a/libraries/ode-0.9/build/vs2005/drawstuff.vcproj +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/ode.sln b/libraries/ode-0.9/build/vs2005/ode.sln deleted file mode 100644 index a7a623f75d..0000000000 --- a/libraries/ode-0.9/build/vs2005/ode.sln +++ /dev/null @@ -1,388 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ode", "./ode.vcproj", "{2A8430BA-889E-EE4A-B1E3-A3231F6816EE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "drawstuff", "./drawstuff.vcproj", "{B855BC68-59AE-BD44-82BB-88183332A6D9}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_boxstack", "./demo_boxstack.vcproj", "{A71669E5-246A-794A-B2C2-646946E9EE64}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_buggy", "./demo_buggy.vcproj", "{081B462D-C222-144C-AF0C-384C47BE98D2}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_chain1", "./demo_chain1.vcproj", "{D329C439-EF31-4641-9B34-4DE23174C997}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_chain2", "./demo_chain2.vcproj", "{B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_collision", "./demo_collision.vcproj", "{9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_crash", "./demo_crash.vcproj", "{1478BD02-E2D4-1046-AD1C-63E59DD228BC}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_feedback", "./demo_feedback.vcproj", "{B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_friction", "./demo_friction.vcproj", "{BAD97423-A545-814E-8CCC-32603D25E6D4}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_heightfield", "./demo_heightfield.vcproj", "{5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_hinge", "./demo_hinge.vcproj", "{DFD3F85E-944E-7740-A29F-715891AF8262}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_I", "./demo_I.vcproj", "{D03ABAA3-4C58-674E-B545-4AE8E993A57A}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_joints", "./demo_joints.vcproj", "{0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_motor", "./demo_motor.vcproj", "{D63DCF21-8421-044C-910F-9758DFF417D0}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_ode", "./demo_ode.vcproj", "{B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_plane2d", "./demo_plane2d.vcproj", "{BCF62E98-514B-254D-95C5-CEBF06A37108}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_slider", "./demo_slider.vcproj", "{B8043AEB-91BD-4D49-B580-D480DC1B979F}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_space", "./demo_space.vcproj", "{6DCB0D01-0638-0244-BEB9-A313999D14E9}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_space_stress", "./demo_space_stress.vcproj", "{29A4883C-6553-4D48-8FFC-10382F07DA72}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_step", "./demo_step.vcproj", "{D1B53AFE-F148-194C-B3A1-8386C9B25359}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_basket", "./demo_basket.vcproj", "{FE66E49C-CF34-5F4B-B43C-9A0C89185222}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_cyl", "./demo_cyl.vcproj", "{EA15C089-307B-8B4A-A598-0E06C82ADB1E}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_moving_trimesh", "./demo_moving_trimesh.vcproj", "{BE3117C9-B067-0A4B-920D-7F3C00374BA0}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_trimesh", "./demo_trimesh.vcproj", "{13D33F5C-1C2C-D740-A28A-BCFD15616E75}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo_cylvssphere", "./demo_cylvssphere.vcproj", "{FA871426-5142-F646-B3D2-3AF70E784D68}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - {B855BC68-59AE-BD44-82BB-88183332A6D9} = {B855BC68-59AE-BD44-82BB-88183332A6D9} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "./tests.vcproj", "{EA829A28-B1B2-1345-98B9-897763B937AF}" - ProjectSection(ProjectDependencies) = postProject - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} = {2A8430BA-889E-EE4A-B1E3-A3231F6816EE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - DebugDLL|Win32 = DebugDLL|Win32 - ReleaseDLL|Win32 = ReleaseDLL|Win32 - DebugLib|Win32 = DebugLib|Win32 - ReleaseLib|Win32 = ReleaseLib|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {2A8430BA-889E-EE4A-B1E3-A3231F6816EE}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {B855BC68-59AE-BD44-82BB-88183332A6D9}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {A71669E5-246A-794A-B2C2-646946E9EE64}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {081B462D-C222-144C-AF0C-384C47BE98D2}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {D329C439-EF31-4641-9B34-4DE23174C997}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {B27B11A1-72EB-8149-ABF2-63A9D7E05CA2}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {9C1C9F02-11C4-514C-AF5C-1CB45A31E1A9}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {1478BD02-E2D4-1046-AD1C-63E59DD228BC}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {B8BC0F67-D7F2-7F4E-8314-5EAAECCD671C}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {BAD97423-A545-814E-8CCC-32603D25E6D4}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {5DDFAAD0-23AC-9A42-AA5E-31B8E8E68CA0}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {DFD3F85E-944E-7740-A29F-715891AF8262}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {D03ABAA3-4C58-674E-B545-4AE8E993A57A}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {0F6BA7D9-8481-D34C-9CA7-C69AC15DCE4C}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {D63DCF21-8421-044C-910F-9758DFF417D0}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {B8D35A81-5E45-744C-BABD-BFCAA4CBF36E}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {BCF62E98-514B-254D-95C5-CEBF06A37108}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {B8043AEB-91BD-4D49-B580-D480DC1B979F}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {6DCB0D01-0638-0244-BEB9-A313999D14E9}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {29A4883C-6553-4D48-8FFC-10382F07DA72}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {D1B53AFE-F148-194C-B3A1-8386C9B25359}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {FE66E49C-CF34-5F4B-B43C-9A0C89185222}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {EA15C089-307B-8B4A-A598-0E06C82ADB1E}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {BE3117C9-B067-0A4B-920D-7F3C00374BA0}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {13D33F5C-1C2C-D740-A28A-BCFD15616E75}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {FA871426-5142-F646-B3D2-3AF70E784D68}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.DebugLib|Win32.ActiveCfg = DebugLib|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.DebugLib|Win32.Build.0 = DebugLib|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.ReleaseLib|Win32.ActiveCfg = ReleaseLib|Win32 - {EA829A28-B1B2-1345-98B9-897763B937AF}.ReleaseLib|Win32.Build.0 = ReleaseLib|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/libraries/ode-0.9/build/vs2005/ode.vcproj b/libraries/ode-0.9/build/vs2005/ode.vcproj deleted file mode 100644 index 254ea21114..0000000000 --- a/libraries/ode-0.9/build/vs2005/ode.vcproj +++ /dev/null @@ -1,1197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/build/vs2005/tests.vcproj b/libraries/ode-0.9/build/vs2005/tests.vcproj deleted file mode 100644 index e772e8c902..0000000000 --- a/libraries/ode-0.9/build/vs2005/tests.vcproj +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/config.guess b/libraries/ode-0.9/config.guess deleted file mode 100755 index 396482d6cb..0000000000 --- a/libraries/ode-0.9/config.guess +++ /dev/null @@ -1,1500 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. - -timestamp='2006-07-02' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - x86:Interix*:[3456]*) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T:Interix*:[3456]*) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/libraries/ode-0.9/config.sub b/libraries/ode-0.9/config.sub deleted file mode 100755 index fab0aa3556..0000000000 --- a/libraries/ode-0.9/config.sub +++ /dev/null @@ -1,1616 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. - -timestamp='2006-09-20' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64vr | mips64vrel \ - | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | score \ - | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ - | ymp-* \ - | z8k-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16c) - basic_machine=cr16c-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/libraries/ode-0.9/configure b/libraries/ode-0.9/configure deleted file mode 100755 index 3785f0fefe..0000000000 --- a/libraries/ode-0.9/configure +++ /dev/null @@ -1,14308 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for ODE 0.9.0. -# -# Report bugs to . -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -as_nl=' -' -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell autoconf@gnu.org about your system, - echo including any error possibly output before this - echo message -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Identity of this package. -PACKAGE_NAME='ODE' -PACKAGE_TARNAME='ode' -PACKAGE_VERSION='0.9.0' -PACKAGE_STRING='ODE 0.9.0' -PACKAGE_BUGREPORT='ode@ode.org' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='SHELL -PATH_SEPARATOR -PACKAGE_NAME -PACKAGE_TARNAME -PACKAGE_VERSION -PACKAGE_STRING -PACKAGE_BUGREPORT -exec_prefix -prefix -program_transform_name -bindir -sbindir -libexecdir -datarootdir -datadir -sysconfdir -sharedstatedir -localstatedir -includedir -oldincludedir -docdir -infodir -htmldir -dvidir -pdfdir -psdir -libdir -localedir -mandir -DEFS -ECHO_C -ECHO_N -ECHO_T -LIBS -build_alias -host_alias -target_alias -build -build_cpu -build_vendor -build_os -host -host_cpu -host_vendor -host_os -target -target_cpu -target_vendor -target_os -INSTALL_PROGRAM -INSTALL_SCRIPT -INSTALL_DATA -am__isrc -CYGPATH_W -PACKAGE -VERSION -ACLOCAL -AUTOCONF -AUTOMAKE -AUTOHEADER -MAKEINFO -install_sh -STRIP -INSTALL_STRIP_PROGRAM -mkdir_p -AWK -SET_MAKE -am__leading_dot -AMTAR -am__tar -am__untar -CC -CFLAGS -LDFLAGS -CPPFLAGS -ac_ct_CC -EXEEXT -OBJEXT -DEPDIR -am__include -am__quote -AMDEP_TRUE -AMDEP_FALSE -AMDEPBACKSLASH -CCDEPMODE -am__fastdepCC_TRUE -am__fastdepCC_FALSE -CPP -GREP -EGREP -XMKMF -X_CFLAGS -X_PRE_LIBS -X_LIBS -X_EXTRA_LIBS -ODE_CURRENT -ODE_REVISION -ODE_AGE -ODE_RELEASE -ODE_SONAME -CXX -CXXFLAGS -ac_ct_CXX -CXXDEPMODE -am__fastdepCXX_TRUE -am__fastdepCXX_FALSE -WINDRES -ac_ct_WINDRES -RANLIB -USE_SONAME_TRUE -USE_SONAME_FALSE -ENABLE_DEMOS_TRUE -ENABLE_DEMOS_FALSE -ARCHFLAGS -OPCODE_TRUE -OPCODE_FALSE -GIMPACT_TRUE -GIMPACT_FALSE -TRIMESH_TRUE -TRIMESH_FALSE -X86_64_SYSTEM_TRUE -X86_64_SYSTEM_FALSE -WIN32_TRUE -WIN32_FALSE -X11_TRUE -X11_FALSE -OSX_TRUE -OSX_FALSE -DRAWSTUFF -so_ext -SHARED_LDFLAGS -GL_LIBS -TOPDIR -ALLOCA -LIBOBJS -LTLIBOBJS' -ac_subst_files='' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -XMKMF -CXX -CXXFLAGS -CCC' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` - eval enable_$ac_feature=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` - eval enable_$ac_feature=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/[-.]/_/g'` - eval with_$ac_package=\$ac_optarg ;; - - -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/[-.]/_/g'` - eval with_$ac_package=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -# Be sure to have absolute directory names. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { echo "$as_me: error: Working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$0" || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures ODE 0.9.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/ode] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -X features: - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] - --target=TARGET configure for building compilers for TARGET [HOST] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of ODE 0.9.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-soname Configure ODE shared library to set the soname field - on ELF files - --enable-demos build tests - --disable-gyroscopic Configure ODE to work without gyroscopic term (may - improve stability) - --enable-double-precision - Configure ODE to work with double precision, if not - specified, single precision is used - --enable-release build a release library with -fomit-frame-pointer - and -ffast-math - --enable-debug Add debug symbols to the library with -g - --enable-gprof enable profiling with gprof - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-x use the X Window System - --with-arch=arch build for $arch, where arch is any of the -march - flags passed to gcc, without the -march, for example - --with-arch=pentium3 - --with-trimesh=opcode|gimpact|none - use the specified system for trimesh support. - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - XMKMF Path to xmkmf, Makefile generator for X Window System - CXX C++ compiler command - CXXFLAGS C++ compiler flags - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -ODE configure 0.9.0 -generated by GNU Autoconf 2.61 - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by ODE $as_me 0.9.0, which was -generated by GNU Autoconf 2.61. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args '$ac_arg'" - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -n "$CONFIG_SITE"; then - set x "$CONFIG_SITE" -elif test "x$prefix" != xNONE; then - set x "$prefix/share/config.site" "$prefix/etc/config.site" -else - set x "$ac_default_prefix/share/config.site" \ - "$ac_default_prefix/etc/config.site" -fi -shift -for ac_site_file -do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - - - - - - - - - - - - - - - - - - - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -ODE_CURRENT=0 -ODE_REVISION=9 -ODE_AGE=0 -ODE_RELEASE=$ODE_CURRENT.$ODE_REVISION.$ODE_AGE -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } - -{ echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6; } -if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -echo "$as_me: error: invalid value of canonical build" >&2;} - { (exit 1); exit 1; }; };; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6; } -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -{ echo "$as_me:$LINENO: checking target system type" >&5 -echo $ECHO_N "checking target system type... $ECHO_C" >&6; } -if test "${ac_cv_target+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5 -echo "${ECHO_T}$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 -echo "$as_me: error: invalid value of canonical target" >&2;} - { (exit 1); exit 1; }; };; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -am__api_version='1.10' - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done -IFS=$as_save_IFS - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } -fi -{ echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. -# By default was `s,x,x', remove it if useless. -cat <<\_ACEOF >conftest.sed -s/[\\$]/&&/g;s/;s,x,x,$// -_ACEOF -program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm -f conftest.sed - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 -echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } -if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done -done -IFS=$as_save_IFS - -fi - - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version - MKDIR_P="$ac_install_sh -d" - fi -fi -{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5 -echo "${ECHO_T}$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } -set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - SET_MAKE= -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE=ODE - VERSION=$ODE_RELEASE - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - - - -ac_config_headers="$ac_config_headers include/ode/config.h" - -CFLAGS= -CXXFLAGS= -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi - - -{ echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - -# Provide some information about the compiler. -echo "$as_me:$LINENO: checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -# -# List of possible output files, starting from the most likely. -# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) -# only as a last resort. b.out is created by i960 compilers. -ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' -# -# The IRIX 6 linker writes into existing files which may not be -# executable, retaining their permissions. Remove them first so a -# subsequent execution test works. -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { (ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi - -{ echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6; } -if test -z "$ac_file"; then - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -{ echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - -rm -f a.out a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6; } - -{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest$ac_cv_exeext -{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } -GCC=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c89=$ac_arg -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6; } ;; - xno) - { echo "$as_me:$LINENO: result: unsupported" >&5 -echo "${ECHO_T}unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; -esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CC" am_compiler_list= - -{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } -if test "${ac_cv_path_GREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Extract the first word of "grep ggrep" to use in msg output -if test -z "$GREP"; then -set dummy grep ggrep; ac_prog_name=$2 -if test "${ac_cv_path_GREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_path_GREP_found=false -# Loop through the user's path and test for each of PROGNAME-LIST -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue - # Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - - $ac_path_GREP_found && break 3 - done -done - -done -IFS=$as_save_IFS - - -fi - -GREP="$ac_cv_path_GREP" -if test -z "$GREP"; then - { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } -fi - -else - ac_cv_path_GREP=$GREP -fi - - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -echo "${ECHO_T}$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - # Extract the first word of "egrep" to use in msg output -if test -z "$EGREP"; then -set dummy egrep; ac_prog_name=$2 -if test "${ac_cv_path_EGREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_path_EGREP_found=false -# Loop through the user's path and test for each of PROGNAME-LIST -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue - # Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - - $ac_path_EGREP_found && break 3 - done -done - -done -IFS=$as_save_IFS - - -fi - -EGREP="$ac_cv_path_EGREP" -if test -z "$EGREP"; then - { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } -fi - -else - ac_cv_path_EGREP=$EGREP -fi - - - fi -fi -{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -{ echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 -echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; } -if test "${ac_cv_c_bigendian+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # See if sys/param.h defines the BYTE_ORDER macro. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include - -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN \ - && BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN) - bogus endian macros -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - # It does; now see whether it defined to BIG_ENDIAN or not. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include - -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_c_bigendian=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_c_bigendian=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # It does not; compile a test program. -if test "$cross_compiling" = yes; then - # try to guess the endianness by grepping values into an object file - ac_cv_c_bigendian=unknown - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } -short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } -int -main () -{ - _ascii (); _ebcdic (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then - ac_cv_c_bigendian=yes -fi -if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi -fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_bigendian=no -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 -echo "${ECHO_T}$ac_cv_c_bigendian" >&6; } -case $ac_cv_c_bigendian in - yes) - -cat >>confdefs.h <<\_ACEOF -#define WORDS_BIGENDIAN 1 -_ACEOF - ;; - no) - ;; - *) - { { echo "$as_me:$LINENO: error: unknown endianness -presetting ac_cv_c_bigendian=no (or yes) will help" >&5 -echo "$as_me: error: unknown endianness -presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} - { (exit 1); exit 1; }; } ;; -esac - -{ echo "$as_me:$LINENO: checking for X" >&5 -echo $ECHO_N "checking for X... $ECHO_C" >&6; } - - -# Check whether --with-x was given. -if test "${with_x+set}" = set; then - withval=$with_x; -fi - -# $have_x is `yes', `no', `disabled', or empty when we do not yet know. -if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled -else - case $x_includes,$x_libraries in #( - *\'*) { { echo "$as_me:$LINENO: error: Cannot use X directory names containing '" >&5 -echo "$as_me: error: Cannot use X directory names containing '" >&2;} - { (exit 1); exit 1; }; };; #( - *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # One or both of the vars are not set, and there is no cached value. -ac_x_includes=no ac_x_libraries=no -rm -f -r conftest.dir -if mkdir conftest.dir; then - cd conftest.dir - cat >Imakefile <<'_ACEOF' -incroot: - @echo incroot='${INCROOT}' -usrlibdir: - @echo usrlibdir='${USRLIBDIR}' -libdir: - @echo libdir='${LIBDIR}' -_ACEOF - if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. - for ac_var in incroot usrlibdir libdir; do - eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" - done - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl; do - if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && - test -f "$ac_im_libdir/libX11.$ac_extension"; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. They are - # bogus both because they are the default anyway, and because - # using them would break gcc on systems where it needs fixed includes. - case $ac_im_incroot in - /usr/include) ac_x_includes= ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; - esac - case $ac_im_usrlibdir in - /usr/lib | /lib) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; - esac - fi - cd .. - rm -f -r conftest.dir -fi - -# Standard set of common directories for X headers. -# Check X11 before X11Rn because it is often a symlink to the current release. -ac_x_header_dirs=' -/usr/X11/include -/usr/X11R6/include -/usr/X11R5/include -/usr/X11R4/include - -/usr/include/X11 -/usr/include/X11R6 -/usr/include/X11R5 -/usr/include/X11R4 - -/usr/local/X11/include -/usr/local/X11R6/include -/usr/local/X11R5/include -/usr/local/X11R4/include - -/usr/local/include/X11 -/usr/local/include/X11R6 -/usr/local/include/X11R5 -/usr/local/include/X11R4 - -/usr/X386/include -/usr/x386/include -/usr/XFree86/include/X11 - -/usr/include -/usr/local/include -/usr/unsupported/include -/usr/athena/include -/usr/local/x11r5/include -/usr/lpp/Xamples/include - -/usr/openwin/include -/usr/openwin/share/include' - -if test "$ac_x_includes" = no; then - # Guess where to find include files, by looking for Xlib.h. - # First, try using that file with no special directory specified. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # We can compile using X headers with no special include directory. -ac_x_includes= -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - for ac_dir in $ac_x_header_dirs; do - if test -r "$ac_dir/X11/Xlib.h"; then - ac_x_includes=$ac_dir - break - fi -done -fi - -rm -f conftest.err conftest.$ac_ext -fi # $ac_x_includes = no - -if test "$ac_x_libraries" = no; then - # Check for the libraries. - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS=$LIBS - LIBS="-lX11 $LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -XrmInitialize () - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - LIBS=$ac_save_LIBS -# We can link X programs with no special library path. -ac_x_libraries= -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - LIBS=$ac_save_LIBS -for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` -do - # Don't even attempt the hair of trying to link an X program! - for ac_extension in a so sl; do - if test -r "$ac_dir/libX11.$ac_extension"; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi # $ac_x_libraries = no - -case $ac_x_includes,$ac_x_libraries in #( - no,* | *,no | *\'*) - # Didn't find X, or a directory has "'" in its name. - ac_cv_have_x="have_x=no";; #( - *) - # Record where we found X for the cache. - ac_cv_have_x="have_x=yes\ - ac_x_includes='$ac_x_includes'\ - ac_x_libraries='$ac_x_libraries'" -esac -fi -;; #( - *) have_x=yes;; - esac - eval "$ac_cv_have_x" -fi # $with_x != no - -if test "$have_x" != yes; then - { echo "$as_me:$LINENO: result: $have_x" >&5 -echo "${ECHO_T}$have_x" >&6; } - no_x=yes -else - # If each of the values was on the command line, it overrides each guess. - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - # Update the cache value to reflect the command line values. - ac_cv_have_x="have_x=yes\ - ac_x_includes='$x_includes'\ - ac_x_libraries='$x_libraries'" - { echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 -echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6; } -fi - -if test "$no_x" = yes; then - # Not all programs may use this symbol, but it does not hurt to define it. - -cat >>confdefs.h <<\_ACEOF -#define X_DISPLAY_MISSING 1 -_ACEOF - - X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= -else - if test -n "$x_includes"; then - X_CFLAGS="$X_CFLAGS -I$x_includes" - fi - - # It would also be nice to do this for all -L options, not just this one. - if test -n "$x_libraries"; then - X_LIBS="$X_LIBS -L$x_libraries" - # For Solaris; some versions of Sun CC require a space after -R and - # others require no space. Words are not sufficient . . . . - { echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 -echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6; } - ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" - ac_xsave_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - X_LIBS="$X_LIBS -R$x_libraries" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - LIBS="$ac_xsave_LIBS -R $x_libraries" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - X_LIBS="$X_LIBS -R $x_libraries" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: neither works" >&5 -echo "${ECHO_T}neither works" >&6; } -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - ac_c_werror_flag=$ac_xsave_c_werror_flag - LIBS=$ac_xsave_LIBS - fi - - # Check for system-dependent libraries X programs must link with. - # Do this before checking for the system-independent R6 libraries - # (-lICE), since we may need -lsocket or whatever for X linking. - - if test "$ISC" = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" - else - # Martyn Johnson says this is needed for Ultrix, if the X - # libraries were built with DECnet support. And Karl Berry says - # the Alpha needs dnet_stub (dnet does not exist). - ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char XOpenDisplay (); -int -main () -{ -return XOpenDisplay (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 -echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6; } -if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldnet $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dnet_ntoa (); -int -main () -{ -return dnet_ntoa (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_dnet_dnet_ntoa=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dnet_dnet_ntoa=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 -echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6; } -if test $ac_cv_lib_dnet_dnet_ntoa = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" -fi - - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - { echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 -echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6; } -if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldnet_stub $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dnet_ntoa (); -int -main () -{ -return dnet_ntoa (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_dnet_stub_dnet_ntoa=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dnet_stub_dnet_ntoa=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 -echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } -if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" -fi - - fi -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$ac_xsave_LIBS" - - # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, - # to get the SysV transport functions. - # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) - # needs -lnsl. - # The nsl library prevents programs from opening the X display - # on Irix 5.2, according to T.E. Dickey. - # The functions gethostbyname, getservbyname, and inet_addr are - # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. - { echo "$as_me:$LINENO: checking for gethostbyname" >&5 -echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6; } -if test "${ac_cv_func_gethostbyname+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define gethostbyname to an innocuous variant, in case declares gethostbyname. - For example, HP-UX 11i declares gettimeofday. */ -#define gethostbyname innocuous_gethostbyname - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char gethostbyname (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef gethostbyname - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gethostbyname (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_gethostbyname || defined __stub___gethostbyname -choke me -#endif - -int -main () -{ -return gethostbyname (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_gethostbyname=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_gethostbyname=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 -echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6; } - - if test $ac_cv_func_gethostbyname = no; then - { echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 -echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6; } -if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gethostbyname (); -int -main () -{ -return gethostbyname (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_nsl_gethostbyname=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_nsl_gethostbyname=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 -echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6; } -if test $ac_cv_lib_nsl_gethostbyname = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" -fi - - if test $ac_cv_lib_nsl_gethostbyname = no; then - { echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 -echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6; } -if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lbsd $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gethostbyname (); -int -main () -{ -return gethostbyname (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_bsd_gethostbyname=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_bsd_gethostbyname=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 -echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6; } -if test $ac_cv_lib_bsd_gethostbyname = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" -fi - - fi - fi - - # lieder@skyler.mavd.honeywell.com says without -lsocket, - # socket/setsockopt and other routines are undefined under SCO ODT - # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary - # on later versions), says Simon Leinen: it contains gethostby* - # variants that don't use the name server (or something). -lsocket - # must be given before -lnsl if both are needed. We assume that - # if connect needs -lnsl, so does gethostbyname. - { echo "$as_me:$LINENO: checking for connect" >&5 -echo $ECHO_N "checking for connect... $ECHO_C" >&6; } -if test "${ac_cv_func_connect+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define connect to an innocuous variant, in case declares connect. - For example, HP-UX 11i declares gettimeofday. */ -#define connect innocuous_connect - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char connect (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef connect - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char connect (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_connect || defined __stub___connect -choke me -#endif - -int -main () -{ -return connect (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_connect=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_connect=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 -echo "${ECHO_T}$ac_cv_func_connect" >&6; } - - if test $ac_cv_func_connect = no; then - { echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 -echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6; } -if test "${ac_cv_lib_socket_connect+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsocket $X_EXTRA_LIBS $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char connect (); -int -main () -{ -return connect (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_socket_connect=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_socket_connect=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 -echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6; } -if test $ac_cv_lib_socket_connect = yes; then - X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" -fi - - fi - - # Guillermo Gomez says -lposix is necessary on A/UX. - { echo "$as_me:$LINENO: checking for remove" >&5 -echo $ECHO_N "checking for remove... $ECHO_C" >&6; } -if test "${ac_cv_func_remove+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define remove to an innocuous variant, in case declares remove. - For example, HP-UX 11i declares gettimeofday. */ -#define remove innocuous_remove - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char remove (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef remove - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char remove (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_remove || defined __stub___remove -choke me -#endif - -int -main () -{ -return remove (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_remove=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_remove=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 -echo "${ECHO_T}$ac_cv_func_remove" >&6; } - - if test $ac_cv_func_remove = no; then - { echo "$as_me:$LINENO: checking for remove in -lposix" >&5 -echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6; } -if test "${ac_cv_lib_posix_remove+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lposix $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char remove (); -int -main () -{ -return remove (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_posix_remove=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_posix_remove=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 -echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6; } -if test $ac_cv_lib_posix_remove = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" -fi - - fi - - # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - { echo "$as_me:$LINENO: checking for shmat" >&5 -echo $ECHO_N "checking for shmat... $ECHO_C" >&6; } -if test "${ac_cv_func_shmat+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shmat to an innocuous variant, in case declares shmat. - For example, HP-UX 11i declares gettimeofday. */ -#define shmat innocuous_shmat - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shmat (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shmat - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shmat (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shmat || defined __stub___shmat -choke me -#endif - -int -main () -{ -return shmat (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_shmat=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_shmat=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 -echo "${ECHO_T}$ac_cv_func_shmat" >&6; } - - if test $ac_cv_func_shmat = no; then - { echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 -echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6; } -if test "${ac_cv_lib_ipc_shmat+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lipc $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shmat (); -int -main () -{ -return shmat (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_ipc_shmat=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_ipc_shmat=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 -echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6; } -if test $ac_cv_lib_ipc_shmat = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" -fi - - fi - fi - - # Check for libraries that X11R6 Xt/Xaw programs need. - ac_save_LDFLAGS=$LDFLAGS - test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" - # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to - # check for ICE first), but we must link in the order -lSM -lICE or - # we get undefined symbols. So assume we have SM if we have ICE. - # These have to be linked with before -lX11, unlike the other - # libraries we check for below, so use a different variable. - # John Interrante, Karl Berry - { echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 -echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6; } -if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lICE $X_EXTRA_LIBS $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char IceConnectionNumber (); -int -main () -{ -return IceConnectionNumber (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_ICE_IceConnectionNumber=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_ICE_IceConnectionNumber=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 -echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6; } -if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then - X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" -fi - - LDFLAGS=$ac_save_LDFLAGS - -fi - - -ODE_SONAME=libode.so.$ODE_CURRENT - - - - - - - -{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } -set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - SET_MAKE= -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -echo "$as_me:$LINENO: checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CXX" am_compiler_list= - -{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done -IFS=$as_save_IFS - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -if test -n "$ac_tool_prefix"; then - for ac_prog in windres - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_WINDRES+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$WINDRES"; then - ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_WINDRES="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -WINDRES=$ac_cv_prog_WINDRES -if test -n "$WINDRES"; then - { echo "$as_me:$LINENO: result: $WINDRES" >&5 -echo "${ECHO_T}$WINDRES" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$WINDRES" && break - done -fi -if test -z "$WINDRES"; then - ac_ct_WINDRES=$WINDRES - for ac_prog in windres -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_WINDRES+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_WINDRES"; then - ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_WINDRES="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES -if test -n "$ac_ct_WINDRES"; then - { echo "$as_me:$LINENO: result: $ac_ct_WINDRES" >&5 -echo "${ECHO_T}$ac_ct_WINDRES" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_WINDRES" && break -done - - if test "x$ac_ct_WINDRES" = x; then - WINDRES="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - WINDRES=$ac_ct_WINDRES - fi -fi - -{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } -if test "${ac_cv_c_const+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_c_const=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_c_const=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -echo "${ECHO_T}$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -cat >>confdefs.h <<\_ACEOF -#define const -_ACEOF - -fi - -{ echo "$as_me:$LINENO: checking for inline" >&5 -echo $ECHO_N "checking for inline... $ECHO_C" >&6; } -if test "${ac_cv_c_inline+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_c_inline=$ac_kw -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 -echo "${ECHO_T}$ac_cv_c_inline" >&6; } - - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -{ echo "$as_me:$LINENO: checking for working volatile" >&5 -echo $ECHO_N "checking for working volatile... $ECHO_C" >&6; } -if test "${ac_cv_c_volatile+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - -volatile int x; -int * volatile y = (int *) 0; -return !x && !y; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_c_volatile=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_c_volatile=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 -echo "${ECHO_T}$ac_cv_c_volatile" >&6; } -if test $ac_cv_c_volatile = no; then - -cat >>confdefs.h <<\_ACEOF -#define volatile -_ACEOF - -fi - -{ echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 -echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6; } -if test "${ac_cv_header_stdbool_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#ifndef bool - "error: bool is not defined" -#endif -#ifndef false - "error: false is not defined" -#endif -#if false - "error: false is not 0" -#endif -#ifndef true - "error: true is not defined" -#endif -#if true != 1 - "error: true is not 1" -#endif -#ifndef __bool_true_false_are_defined - "error: __bool_true_false_are_defined is not defined" -#endif - - struct s { _Bool s: 1; _Bool t; } s; - - char a[true == 1 ? 1 : -1]; - char b[false == 0 ? 1 : -1]; - char c[__bool_true_false_are_defined == 1 ? 1 : -1]; - char d[(bool) 0.5 == true ? 1 : -1]; - bool e = &s; - char f[(_Bool) 0.0 == false ? 1 : -1]; - char g[true]; - char h[sizeof (_Bool)]; - char i[sizeof s.t]; - enum { j = false, k = true, l = false * true, m = true * 256 }; - _Bool n[m]; - char o[sizeof n == m * sizeof n[0] ? 1 : -1]; - char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; -# if defined __xlc__ || defined __GNUC__ - /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 - reported by James Lemley on 2005-10-05; see - http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html - This test is not quite right, since xlc is allowed to - reject this program, as the initializer for xlcbug is - not one of the forms that C requires support for. - However, doing the test right would require a runtime - test, and that would make cross-compilation harder. - Let us hope that IBM fixes the xlc bug, and also adds - support for this kind of constant expression. In the - meantime, this test will reject xlc, which is OK, since - our stdbool.h substitute should suffice. We also test - this with GCC, where it should work, to detect more - quickly whether someone messes up the test in the - future. */ - char digs[] = "0123456789"; - int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); -# endif - /* Catch a bug in an HP-UX C compiler. See - http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html - http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html - */ - _Bool q = true; - _Bool *pq = &q; - -int -main () -{ - - *pq |= q; - *pq |= ! q; - /* Refer to every declared value, to avoid compiler optimizations. */ - return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l - + !m + !n + !o + !p + !q + !pq); - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdbool_h=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdbool_h=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 -echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6; } -{ echo "$as_me:$LINENO: checking for _Bool" >&5 -echo $ECHO_N "checking for _Bool... $ECHO_C" >&6; } -if test "${ac_cv_type__Bool+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef _Bool ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type__Bool=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type__Bool=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 -echo "${ECHO_T}$ac_cv_type__Bool" >&6; } -if test $ac_cv_type__Bool = yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE__BOOL 1 -_ACEOF - - -fi - -if test $ac_cv_header_stdbool_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_STDBOOL_H 1 -_ACEOF - -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -{ echo "$as_me:$LINENO: checking for size_t" >&5 -echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } -if test "${ac_cv_type_size_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef size_t ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_size_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_size_t=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -echo "${ECHO_T}$ac_cv_type_size_t" >&6; } -if test $ac_cv_type_size_t = yes; then - : -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - - -{ echo "$as_me:$LINENO: checking if a soname should be set" >&5 -echo $ECHO_N "checking if a soname should be set... $ECHO_C" >&6; } -# Check whether --enable-soname was given. -if test "${enable_soname+set}" = set; then - enableval=$enable_soname; use_soname=$enableval -else - use_soname=no -fi - -{ echo "$as_me:$LINENO: result: $use_soname" >&5 -echo "${ECHO_T}$use_soname" >&6; } - if test x$use_soname = xyes; then - USE_SONAME_TRUE= - USE_SONAME_FALSE='#' -else - USE_SONAME_TRUE='#' - USE_SONAME_FALSE= -fi - - - -{ echo "$as_me:$LINENO: checking if tests should be built" >&5 -echo $ECHO_N "checking if tests should be built... $ECHO_C" >&6; } -# Check whether --enable-demos was given. -if test "${enable_demos+set}" = set; then - enableval=$enable_demos; enable_demos=$enableval -else - enable_demos=yes -fi - -{ echo "$as_me:$LINENO: result: $enable_demos" >&5 -echo "${ECHO_T}$enable_demos" >&6; } - if test x$enable_demos = xyes; then - ENABLE_DEMOS_TRUE= - ENABLE_DEMOS_FALSE='#' -else - ENABLE_DEMOS_TRUE='#' - ENABLE_DEMOS_FALSE= -fi - - - - -# Check whether --with-arch was given. -if test "${with_arch+set}" = set; then - withval=$with_arch; arch=$withval -else - arch=no -fi - -ARCHFLAGS="" -if test "x$arch" != xno -then - ARCHFLAGS="-march=$arch" -fi - - -case "$arch" in - pentium3 | pentium4 | athlon* ) - -cat >>confdefs.h <<\_ACEOF -#define HAVE_SSE -_ACEOF - - ;; -esac - - - - - - - - - - - - - -for ac_header in alloca.h ieeefp.h stdio.h stdlib.h math.h string.h stdarg.h malloc.h values.h float.h time.h sys/time.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## -------------------------- ## -## Report this to ode@ode.org ## -## -------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - -opcode=no -gimpact=no - -# Check whether --with-trimesh was given. -if test "${with_trimesh+set}" = set; then - withval=$with_trimesh; trimesh=$withval -else - trimesh=opcode - -fi - -if test "$trimesh" = opcode -then - opcode=yes -fi -if test "$trimesh" = gimpact -then - gimpact=yes -fi - - if test $opcode = yes; then - OPCODE_TRUE= - OPCODE_FALSE='#' -else - OPCODE_TRUE='#' - OPCODE_FALSE= -fi - - if test $gimpact = yes; then - GIMPACT_TRUE= - GIMPACT_FALSE='#' -else - GIMPACT_TRUE='#' - GIMPACT_FALSE= -fi - - if test $opcode = yes -o $gimpact = yes; then - TRIMESH_TRUE= - TRIMESH_FALSE='#' -else - TRIMESH_TRUE='#' - TRIMESH_FALSE= -fi - - - -{ echo "$as_me:$LINENO: checking if gyroscopic term should be used" >&5 -echo $ECHO_N "checking if gyroscopic term should be used... $ECHO_C" >&6; } -# Check whether --enable-gyroscopic was given. -if test "${enable_gyroscopic+set}" = set; then - enableval=$enable_gyroscopic; gyroscopic=$enableval -else - gyroscopic=yes -fi - -{ echo "$as_me:$LINENO: result: $gyroscopic" >&5 -echo "${ECHO_T}$gyroscopic" >&6; } -if test x"$gyroscopic" = xyes -then - -cat >>confdefs.h <<\_ACEOF -#define dGYROSCOPIC -_ACEOF - -fi - -{ echo "$as_me:$LINENO: checking if double precision is requested" >&5 -echo $ECHO_N "checking if double precision is requested... $ECHO_C" >&6; } -# Check whether --enable-double-precision was given. -if test "${enable_double_precision+set}" = set; then - enableval=$enable_double_precision; precision=$enableval -else - precision=no -fi - -if test "$precision" != no -then - -cat >>confdefs.h <<\_ACEOF -#define dDOUBLE -_ACEOF - -if test "$build_os" == "$target_os" -then -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#define dInfinity 1e20 -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=1e20 -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#define dInfinity 1.7976931348623157e+308 -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=1.7976931348623157e+308 -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#define dInfinity HUGE_VAL -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=HUGE_VAL -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#define dInfinity DBL_MAX -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=DBL_MAX -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -else -#cross-compiling, use a reasonable value. We should add an option for setting this. -dinfinity=DBL_MAX -fi -else - -cat >>confdefs.h <<\_ACEOF -#define dSINGLE -_ACEOF - -if test "$build_os" == "$target_os" -then -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#define dInfinity 1e20f -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=1e20f -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#define dInfinity 3.402823466e+38F -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=3.402823466e+38F -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#define dInfinity HUGE_VALF -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=HUGE_VALF -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#define dInfinity FLT_MAX -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - dinfinity=FLT_MAX -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -#cross-compiling, use a reasonable value. We should add an option for setting this. -dinfinity=FLT_MAX -fi -fi -{ echo "$as_me:$LINENO: result: $precision" >&5 -echo "${ECHO_T}$precision" >&6; } - -cat >>confdefs.h <<_ACEOF -#define dInfinity ${dinfinity} -_ACEOF - -{ echo "$as_me:$LINENO: checking for appropriate dInfinity constant" >&5 -echo $ECHO_N "checking for appropriate dInfinity constant... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $dinfinity" >&5 -echo "${ECHO_T}$dinfinity" >&6; } - -if test "${ac_cv_header_float_h+set}" = set; then - { echo "$as_me:$LINENO: checking for float.h" >&5 -echo $ECHO_N "checking for float.h... $ECHO_C" >&6; } -if test "${ac_cv_header_float_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_float_h" >&5 -echo "${ECHO_T}$ac_cv_header_float_h" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking float.h usability" >&5 -echo $ECHO_N "checking float.h usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking float.h presence" >&5 -echo $ECHO_N "checking float.h presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: float.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: float.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: float.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: float.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: float.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: float.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: float.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: float.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: float.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: float.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: float.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: float.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: float.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: float.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: float.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: float.h: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## -------------------------- ## -## Report this to ode@ode.org ## -## -------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ echo "$as_me:$LINENO: checking for float.h" >&5 -echo $ECHO_N "checking for float.h... $ECHO_C" >&6; } -if test "${ac_cv_header_float_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_float_h=$ac_header_preproc -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_float_h" >&5 -echo "${ECHO_T}$ac_cv_header_float_h" >&6; } - -fi -if test $ac_cv_header_float_h = yes; then - have_float_h=yes -else - have_float_h=no -fi - - -{ echo "$as_me:$LINENO: checking for appropriate dEpsilon constant" >&5 -echo $ECHO_N "checking for appropriate dEpsilon constant... $ECHO_C" >&6; } -if test "x$have_float_h" == xyes -then -if test $precision == yes -then -dEpsilon=DBL_EPSILON -else -dEpsilon=FLT_EPSILON -fi -else -if test $precision == yes -then -dEpsilon=2.2204460492503131e-16 -else -dEpsilon=1.19209290e-07f -fi -fi - -cat >>confdefs.h <<_ACEOF -#define dEpsilon ${dEpsilon} -_ACEOF - -{ echo "$as_me:$LINENO: result: $dEpsilon" >&5 -echo "${ECHO_T}$dEpsilon" >&6; } - - -if test "$build_os" == "$target_os" -then -{ echo "$as_me:$LINENO: checking for a Pentium CPU" >&5 -echo $ECHO_N "checking for a Pentium CPU... $ECHO_C" >&6; } -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int main() -{ -asm ("mov \$0,%%eax;\n" - "cpuid\n" : : : "%eax"); -return 0; -}; - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - pentium=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -pentium=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -else -pentium=no -fi -if test "x$pentium" == xyes -then - -cat >>confdefs.h <<\_ACEOF -#define PENTIUM 1 -_ACEOF - -fi -{ echo "$as_me:$LINENO: result: $pentium" >&5 -echo "${ECHO_T}$pentium" >&6; } - -{ echo "$as_me:$LINENO: checking for a x86-64 CPU" >&5 -echo $ECHO_N "checking for a x86-64 CPU... $ECHO_C" >&6; } -if test "$build_os" == "$target_os" -then -if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int main() -{ -int a = 0; -int * pa = &a; -asm ("mov %0,%%rax\n" - "movl (%%rax),%%eax\n" - : : "r"(pa) : "%rax"); -return 0; -}; - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cpu64=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -cpu64=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -else -cpu64=no -fi -if test "x$cpu64" == xyes -then - -cat >>confdefs.h <<\_ACEOF -#define X86_64_SYSTEM 1 -_ACEOF - -fi -{ echo "$as_me:$LINENO: result: $cpu64" >&5 -echo "${ECHO_T}$cpu64" >&6; } - if test x$cpu64 = xyes; then - X86_64_SYSTEM_TRUE= - X86_64_SYSTEM_FALSE='#' -else - X86_64_SYSTEM_TRUE='#' - X86_64_SYSTEM_FALSE= -fi - - -{ echo "$as_me:$LINENO: checking if building a release library" >&5 -echo $ECHO_N "checking if building a release library... $ECHO_C" >&6; } -# Check whether --enable-release was given. -if test "${enable_release+set}" = set; then - enableval=$enable_release; release=$enableval -else - release=no -fi - -if test "x$release" == xyes -then - CFLAGS="$CFLAGS -fomit-frame-pointer -ffast-math" - CPPFLAGS="$CPPFLAGS -fomit-frame-pointer -ffast-math" - CXXFLAGS="$CXXFLAGS -fomit-frame-pointer -ffast-math" - -cat >>confdefs.h <<\_ACEOF -#define dNODEBUG -_ACEOF - -fi -{ echo "$as_me:$LINENO: result: $release" >&5 -echo "${ECHO_T}$release" >&6; } - -{ echo "$as_me:$LINENO: checking if building a debug library" >&5 -echo $ECHO_N "checking if building a debug library... $ECHO_C" >&6; } -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then - enableval=$enable_debug; debug=$enableval -else - debug=yes -fi - -if test "x$debug" == xyes -then - CFLAGS="$CFLAGS -g" - CPPFLAGS="$CPPFLAGS -g" - CXXFLAGS="$CXXFLAGS -g" -fi -{ echo "$as_me:$LINENO: result: $debug" >&5 -echo "${ECHO_T}$debug" >&6; } - - -{ echo "$as_me:$LINENO: checking for char" >&5 -echo $ECHO_N "checking for char... $ECHO_C" >&6; } -if test "${ac_cv_type_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef char ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_char=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_char=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5 -echo "${ECHO_T}$ac_cv_type_char" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of char" >&5 -echo $ECHO_N "checking size of char... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_char=$ac_lo;; -'') if test "$ac_cv_type_char" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (char) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_char=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef char ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_char=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_char" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (char) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_char=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5 -echo "${ECHO_T}$ac_cv_sizeof_char" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_CHAR $ac_cv_sizeof_char -_ACEOF - - -{ echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6; } -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef int ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_int=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') if test "$ac_cv_type_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_int=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_int=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_INT $ac_cv_sizeof_int -_ACEOF - - -{ echo "$as_me:$LINENO: checking for short" >&5 -echo $ECHO_N "checking for short... $ECHO_C" >&6; } -if test "${ac_cv_type_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef short ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_short=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_short=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -echo "${ECHO_T}$ac_cv_type_short" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of short" >&5 -echo $ECHO_N "checking size of short... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_short=$ac_lo;; -'') if test "$ac_cv_type_short" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (short) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_short=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef short ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_short" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (short) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_short=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -echo "${ECHO_T}$ac_cv_sizeof_short" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SHORT $ac_cv_sizeof_short -_ACEOF - - -{ echo "$as_me:$LINENO: checking for long int" >&5 -echo $ECHO_N "checking for long int... $ECHO_C" >&6; } -if test "${ac_cv_type_long_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef long int ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_long_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_long_int=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_long_int" >&5 -echo "${ECHO_T}$ac_cv_type_long_int" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of long int" >&5 -echo $ECHO_N "checking size of long int... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_long_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long_int=$ac_lo;; -'') if test "$ac_cv_type_long_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (long int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_long_int=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef long int ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_long_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (long int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_long_int=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_INT $ac_cv_sizeof_long_int -_ACEOF - - -{ echo "$as_me:$LINENO: checking for void*" >&5 -echo $ECHO_N "checking for void*... $ECHO_C" >&6; } -if test "${ac_cv_type_voidp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef void* ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_voidp=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_voidp=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_voidp" >&5 -echo "${ECHO_T}$ac_cv_type_voidp" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of void*" >&5 -echo $ECHO_N "checking size of void*... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_voidp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef void* ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef void* ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef void* ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef void* ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef void* ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_voidp=$ac_lo;; -'') if test "$ac_cv_type_voidp" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (void*) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (void*) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_voidp=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef void* ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_voidp=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_voidp" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (void*) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (void*) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_voidp=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_voidp" >&5 -echo "${ECHO_T}$ac_cv_sizeof_voidp" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_VOIDP $ac_cv_sizeof_voidp -_ACEOF - - - -case "$host_os" in - cygwin* | mingw*) - so_ext=".dll" - DLLDEFINE="-DODE_DLL" - SHARED_LDFLAGS="-shared" - drawstuff="Win32" # if in a Windows enviroment - ;; - *apple* | *darwin*) # For Mac OS X - so_ext=".dylib" - DLLDEFINE="" - SHARED_LDFLAGS="-dynamiclib" - drawstuff="OSX" - CC="$CXX" - LINK="$CXXLINK" - ;; - *) - drawstuff="X11" # if anything else default to X11 - if test x$use_soname = xyes; then - so_ext=".so.$ODE_RELEASE" - else - so_ext=".so" - fi - DLLDEFINE="" - SHARED_LDFLAGS="-shared" - ;; -esac - if test x$drawstuff = xWin32; then - WIN32_TRUE= - WIN32_FALSE='#' -else - WIN32_TRUE='#' - WIN32_FALSE= -fi - - if test x$drawstuff = xX11; then - X11_TRUE= - X11_FALSE='#' -else - X11_TRUE='#' - X11_FALSE= -fi - - if test x$drawstuff = xOSX; then - OSX_TRUE= - OSX_FALSE='#' -else - OSX_TRUE='#' - OSX_FALSE= -fi - -{ echo "$as_me:$LINENO: checking which drawstuff lib to build" >&5 -echo $ECHO_N "checking which drawstuff lib to build... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $drawstuff" >&5 -echo "${ECHO_T}$drawstuff" >&6; } - -{ echo "$as_me:$LINENO: checking for the suffix of shared libraries" >&5 -echo $ECHO_N "checking for the suffix of shared libraries... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $so_ext" >&5 -echo "${ECHO_T}$so_ext" >&6; } - -cat >>confdefs.h <<_ACEOF -#define SO_EXT "$so_ext" -_ACEOF - - - - -if test "X$x_includes" != "XNONE"; then - CFLAGS="$CFLAGS -I$x_includes" - CXXFLAGS="$CXXFLAGS -I$x_includes" -fi -if test "X$x_libraries" != "XNONE"; then - CFLAGS="$CFLAGS -L$x_libraries" - CXXFLAGS="$CXXFLAGS -L$x_libraries" -fi - -if test "x$drawstuff" = "xOSX"; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_APPLE_OPENGL_FRAMEWORK 1 -_ACEOF - - GL_LIBS="-framework OpenGL -framework Carbon -framework AGL" -else - - - -for ac_header in GL/gl.h GL/glu.h GL/glext.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_GL_GL_H - #include - #endif - #if HAVE_GL_GLU_H - #include - #endif - - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - { echo "$as_me:$LINENO: checking for main in -lGL" >&5 -echo $ECHO_N "checking for main in -lGL... $ECHO_C" >&6; } -if test "${ac_cv_lib_GL_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lGL $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_GL_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_GL_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_GL_main" >&5 -echo "${ECHO_T}$ac_cv_lib_GL_main" >&6; } -if test $ac_cv_lib_GL_main = yes; then - GL_LIBS="$GL_LIBS -lGL" -fi - - TEMP_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $GL_LIBS" - { echo "$as_me:$LINENO: checking for main in -lGLU" >&5 -echo $ECHO_N "checking for main in -lGLU... $ECHO_C" >&6; } -if test "${ac_cv_lib_GLU_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lGLU $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_GLU_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_GLU_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_GLU_main" >&5 -echo "${ECHO_T}$ac_cv_lib_GLU_main" >&6; } -if test $ac_cv_lib_GLU_main = yes; then - GL_LIBS="$GL_LIBS -lGLU" -fi - - LDFLAGS="$TEMP_LDFLAGS" - { echo "$as_me:$LINENO: checking for main in -lopengl32" >&5 -echo $ECHO_N "checking for main in -lopengl32... $ECHO_C" >&6; } -if test "${ac_cv_lib_opengl32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lopengl32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_opengl32_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_opengl32_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_opengl32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_opengl32_main" >&6; } -if test $ac_cv_lib_opengl32_main = yes; then - GL_LIBS="$GL_LIBS -lopengl32" -fi - - { echo "$as_me:$LINENO: checking for main in -lglu32" >&5 -echo $ECHO_N "checking for main in -lglu32... $ECHO_C" >&6; } -if test "${ac_cv_lib_glu32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lglu32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_glu32_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_glu32_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_glu32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_glu32_main" >&6; } -if test $ac_cv_lib_glu32_main = yes; then - GL_LIBS="$GL_LIBS -lglu32" -fi - - { echo "$as_me:$LINENO: checking for main in -lXmu" >&5 -echo $ECHO_N "checking for main in -lXmu... $ECHO_C" >&6; } -if test "${ac_cv_lib_Xmu_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lXmu $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_Xmu_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_Xmu_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_Xmu_main" >&5 -echo "${ECHO_T}$ac_cv_lib_Xmu_main" >&6; } -if test $ac_cv_lib_Xmu_main = yes; then - GL_LIBS="$GL_LIBS -lXmu" -fi - - { echo "$as_me:$LINENO: checking for main in -lXi" >&5 -echo $ECHO_N "checking for main in -lXi... $ECHO_C" >&6; } -if test "${ac_cv_lib_Xi_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lXi $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_Xi_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_Xi_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_Xi_main" >&5 -echo "${ECHO_T}$ac_cv_lib_Xi_main" >&6; } -if test $ac_cv_lib_Xi_main = yes; then - GL_LIBS="$GL_LIBS -lXi" -fi - - { echo "$as_me:$LINENO: checking for main in -lX" >&5 -echo $ECHO_N "checking for main in -lX... $ECHO_C" >&6; } -if test "${ac_cv_lib_X_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lX $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_X_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_X_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_X_main" >&5 -echo "${ECHO_T}$ac_cv_lib_X_main" >&6; } -if test $ac_cv_lib_X_main = yes; then - GL_LIBS="$GL_LIBS -lX" -fi - - { echo "$as_me:$LINENO: checking for main in -lX11" >&5 -echo $ECHO_N "checking for main in -lX11... $ECHO_C" >&6; } -if test "${ac_cv_lib_X11_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lX11 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_X11_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_X11_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_X11_main" >&5 -echo "${ECHO_T}$ac_cv_lib_X11_main" >&6; } -if test $ac_cv_lib_X11_main = yes; then - GL_LIBS="$GL_LIBS -lX11" -fi - -fi - - -{ echo "$as_me:$LINENO: checking for main in -lcomctl32" >&5 -echo $ECHO_N "checking for main in -lcomctl32... $ECHO_C" >&6; } -if test "${ac_cv_lib_comctl32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lcomctl32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_comctl32_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_comctl32_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_comctl32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_comctl32_main" >&6; } -if test $ac_cv_lib_comctl32_main = yes; then - LIBS="$LIBS -lcomctl32" -fi - -{ echo "$as_me:$LINENO: checking for main in -lkernel32" >&5 -echo $ECHO_N "checking for main in -lkernel32... $ECHO_C" >&6; } -if test "${ac_cv_lib_kernel32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lkernel32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_kernel32_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_kernel32_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_kernel32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_kernel32_main" >&6; } -if test $ac_cv_lib_kernel32_main = yes; then - LIBS="$LIBS -lkernel32" -fi - -{ echo "$as_me:$LINENO: checking for main in -luser32" >&5 -echo $ECHO_N "checking for main in -luser32... $ECHO_C" >&6; } -if test "${ac_cv_lib_user32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-luser32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_user32_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_user32_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_user32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_user32_main" >&6; } -if test $ac_cv_lib_user32_main = yes; then - LIBS="$LIBS -luser32" -fi - -{ echo "$as_me:$LINENO: checking for main in -lgdi32" >&5 -echo $ECHO_N "checking for main in -lgdi32... $ECHO_C" >&6; } -if test "${ac_cv_lib_gdi32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgdi32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_gdi32_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_gdi32_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_gdi32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_gdi32_main" >&6; } -if test $ac_cv_lib_gdi32_main = yes; then - LIBS="$LIBS -lgdi32" -fi - -{ echo "$as_me:$LINENO: checking for main in -lwinmm" >&5 -echo $ECHO_N "checking for main in -lwinmm... $ECHO_C" >&6; } -if test "${ac_cv_lib_winmm_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lwinmm $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_winmm_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_winmm_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_winmm_main" >&5 -echo "${ECHO_T}$ac_cv_lib_winmm_main" >&6; } -if test $ac_cv_lib_winmm_main = yes; then - LIBS="$LIBS -lwinmm" -fi - - -{ echo "$as_me:$LINENO: checking for main in -lstdc++" >&5 -echo $ECHO_N "checking for main in -lstdc++... $ECHO_C" >&6; } -if test "${ac_cv_lib_stdcpp_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lstdc++ $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_stdcpp_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_stdcpp_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_stdcpp_main" >&5 -echo "${ECHO_T}$ac_cv_lib_stdcpp_main" >&6; } -if test $ac_cv_lib_stdcpp_main = yes; then - LIBS="$LIBS -lstdc++" -fi - -{ echo "$as_me:$LINENO: checking for main in -lm" >&5 -echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; } -if test "${ac_cv_lib_m_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lm $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_m_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_m_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5 -echo "${ECHO_T}$ac_cv_lib_m_main" >&6; } -if test $ac_cv_lib_m_main = yes; then - LIBS="$LIBS -lm" -fi - -{ echo "$as_me:$LINENO: checking for main in -lpthread" >&5 -echo $ECHO_N "checking for main in -lpthread... $ECHO_C" >&6; } -if test "${ac_cv_lib_pthread_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_pthread_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_main" >&5 -echo "${ECHO_T}$ac_cv_lib_pthread_main" >&6; } -if test $ac_cv_lib_pthread_main = yes; then - LIBS="$LIBS -lpthread" -fi - - - -TOPDIR=`cd $srcdir;pwd` - - -{ echo "$as_me:$LINENO: checking for gprof" >&5 -echo $ECHO_N "checking for gprof... $ECHO_C" >&6; } -# Check whether --enable-gprof was given. -if test "${enable_gprof+set}" = set; then - enableval=$enable_gprof; gprof=$enableval -else - gprof=no -fi - -if test "$gprof" != no -then - CFLAGS="-pg $CFLAGS" - CPPFLAGS="-pg $CPPFLAGS" - CXXFLAGS="-pg $CXXFLAGS" - { echo "$as_me:$LINENO: checking for main in -lgmon" >&5 -echo $ECHO_N "checking for main in -lgmon... $ECHO_C" >&6; } -if test "${ac_cv_lib_gmon_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgmon $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_gmon_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_gmon_main=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_gmon_main" >&5 -echo "${ECHO_T}$ac_cv_lib_gmon_main" >&6; } -if test $ac_cv_lib_gmon_main = yes; then - LIBS="$LIBS -lgmon" -fi - - { echo "$as_me:$LINENO: result: enabled" >&5 -echo "${ECHO_T}enabled" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - - - - - - - - - - - - - - - - - - - - - -for ac_func in floor memmove memset select sqrt sqrtf sinf cosf fabsf atan2f fmodf copysignf copysign snprintf vsnprintf gettimeofday isnan isnanf _isnan _isnanf __isnan __isnanf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_var'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - -if test "$build_os" == "$target_os" -then -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -{ echo "$as_me:$LINENO: checking for working alloca.h" >&5 -echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; } -if test "${ac_cv_working_alloca_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -char *p = (char *) alloca (2 * sizeof (int)); - if (p) return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_working_alloca_h=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_working_alloca_h=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 -echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; } -if test $ac_cv_working_alloca_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ALLOCA_H 1 -_ACEOF - -fi - -{ echo "$as_me:$LINENO: checking for alloca" >&5 -echo $ECHO_N "checking for alloca... $ECHO_C" >&6; } -if test "${ac_cv_func_alloca_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER -# include -# define alloca _alloca -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int -main () -{ -char *p = (char *) alloca (1); - if (p) return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_alloca_works=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_alloca_works=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 -echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; } - -if test $ac_cv_func_alloca_works = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ALLOCA 1 -_ACEOF - -else - # The SVR3 libPW and SVR4 libucb both contain incompatible functions -# that cause trouble. Some versions do not even contain alloca or -# contain a buggy version. If you still want to use their alloca, -# use ar to extract alloca.o from them instead of compiling alloca.c. - -ALLOCA=\${LIBOBJDIR}alloca.$ac_objext - -cat >>confdefs.h <<\_ACEOF -#define C_ALLOCA 1 -_ACEOF - - -{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 -echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; } -if test "${ac_cv_os_cray+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then - ac_cv_os_cray=yes -else - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 -echo "${ECHO_T}$ac_cv_os_cray" >&6; } -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_var'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_var'}'` = yes; then - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF - - break -fi - - done -fi - -{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 -echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } -if test "${ac_cv_c_stack_direction+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -find_stack_direction () -{ - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; -} - -int -main () -{ - return find_stack_direction () < 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_stack_direction=1 -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_c_stack_direction=-1 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 -echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } - -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF - - -fi - - -for ac_header in stdlib.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## -------------------------- ## -## Report this to ode@ode.org ## -## -------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -{ echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 -echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6; } -if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_malloc_0_nonnull=no -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include -#else -char *malloc (); -#endif - -int -main () -{ -return ! malloc (0); - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_malloc_0_nonnull=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_malloc_0_nonnull=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 -echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6; } -if test $ac_cv_func_malloc_0_nonnull = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_MALLOC 1 -_ACEOF - -else - cat >>confdefs.h <<\_ACEOF -#define HAVE_MALLOC 0 -_ACEOF - - case " $LIBOBJS " in - *" malloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS malloc.$ac_objext" - ;; -esac - - -cat >>confdefs.h <<\_ACEOF -#define malloc rpl_malloc -_ACEOF - -fi - - - -{ echo "$as_me:$LINENO: checking for obstacks" >&5 -echo $ECHO_N "checking for obstacks... $ECHO_C" >&6; } -if test "${ac_cv_func_obstack+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - #include "obstack.h" -int -main () -{ -struct obstack mem; - #define obstack_chunk_alloc malloc - #define obstack_chunk_free free - obstack_init (&mem); - obstack_free (&mem, 0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_obstack=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_obstack=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5 -echo "${ECHO_T}$ac_cv_func_obstack" >&6; } -if test $ac_cv_func_obstack = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_OBSTACK 1 -_ACEOF - -else - case " $LIBOBJS " in - *" obstack.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS obstack.$ac_objext" - ;; -esac - -fi - - -for ac_header in stdlib.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## -------------------------- ## -## Report this to ode@ode.org ## -## -------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -{ echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5 -echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6; } -if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_realloc_0_nonnull=no -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include -#else -char *realloc (); -#endif - -int -main () -{ -return ! realloc (0, 0); - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_realloc_0_nonnull=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_realloc_0_nonnull=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5 -echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6; } -if test $ac_cv_func_realloc_0_nonnull = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_REALLOC 1 -_ACEOF - -else - cat >>confdefs.h <<\_ACEOF -#define HAVE_REALLOC 0 -_ACEOF - - case " $LIBOBJS " in - *" realloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS realloc.$ac_objext" - ;; -esac - - -cat >>confdefs.h <<\_ACEOF -#define realloc rpl_realloc -_ACEOF - -fi - - - - - -for ac_header in sys/select.h sys/socket.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## -------------------------- ## -## Report this to ode@ode.org ## -## -------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -{ echo "$as_me:$LINENO: checking types of arguments for select" >&5 -echo $ECHO_N "checking types of arguments for select... $ECHO_C" >&6; } -if test "${ac_cv_func_select_args+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - for ac_arg234 in 'fd_set *' 'int *' 'void *'; do - for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do - for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#ifdef HAVE_SYS_SELECT_H -# include -#endif -#ifdef HAVE_SYS_SOCKET_H -# include -#endif - -int -main () -{ -extern int select ($ac_arg1, - $ac_arg234, $ac_arg234, $ac_arg234, - $ac_arg5); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - done -done -# Provide a safe default value. -: ${ac_cv_func_select_args='int,int *,struct timeval *'} - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_select_args" >&5 -echo "${ECHO_T}$ac_cv_func_select_args" >&6; } -ac_save_IFS=$IFS; IFS=',' -set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` -IFS=$ac_save_IFS -shift - -cat >>confdefs.h <<_ACEOF -#define SELECT_TYPE_ARG1 $1 -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define SELECT_TYPE_ARG234 ($2) -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define SELECT_TYPE_ARG5 ($3) -_ACEOF - -rm -f conftest* - - -for ac_func in vprintf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_var'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -{ echo "$as_me:$LINENO: checking for _doprnt" >&5 -echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6; } -if test "${ac_cv_func__doprnt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define _doprnt to an innocuous variant, in case declares _doprnt. - For example, HP-UX 11i declares gettimeofday. */ -#define _doprnt innocuous__doprnt - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef _doprnt - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char _doprnt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub__doprnt || defined __stub____doprnt -choke me -#endif - -int -main () -{ -return _doprnt (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func__doprnt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func__doprnt=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 -echo "${ECHO_T}$ac_cv_func__doprnt" >&6; } -if test $ac_cv_func__doprnt = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DOPRNT 1 -_ACEOF - -fi - -fi -done - - -fi - - - - - - - -ac_config_files="$ac_config_files Makefile include/Makefile include/ode/Makefile ode/Makefile ode/src/Makefile drawstuff/Makefile drawstuff/src/Makefile drawstuff/dstest/Makefile ode/demo/Makefile tests/Makefile tests/CppTestHarness/Makefile ode-config" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { echo "$as_me:$LINENO: updating cache $cache_file" >&5 -echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${USE_SONAME_TRUE}" && test -z "${USE_SONAME_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"USE_SONAME\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"USE_SONAME\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${ENABLE_DEMOS_TRUE}" && test -z "${ENABLE_DEMOS_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"ENABLE_DEMOS\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"ENABLE_DEMOS\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${OPCODE_TRUE}" && test -z "${OPCODE_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"OPCODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"OPCODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${GIMPACT_TRUE}" && test -z "${GIMPACT_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"GIMPACT\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"GIMPACT\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${TRIMESH_TRUE}" && test -z "${TRIMESH_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"TRIMESH\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"TRIMESH\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${X86_64_SYSTEM_TRUE}" && test -z "${X86_64_SYSTEM_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"X86_64_SYSTEM\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"X86_64_SYSTEM\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"WIN32\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"WIN32\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${X11_TRUE}" && test -z "${X11_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"X11\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"X11\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${OSX_TRUE}" && test -z "${OSX_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"OSX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"OSX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi - -: ${CONFIG_STATUS=./config.status} -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -as_nl=' -' -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 - -# Save the log message, to keep $[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by ODE $as_me 0.9.0, which was -generated by GNU Autoconf 2.61. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTIONS] [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -ac_cs_version="\\ -ODE config.status 0.9.0 -configured by $0, generated by GNU Autoconf 2.61, - with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - -Copyright (C) 2006 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - echo "$ac_cs_version"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - { echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -if \$ac_cs_recheck; then - echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - CONFIG_SHELL=$SHELL - export CONFIG_SHELL - exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "include/ode/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/ode/config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; - "include/ode/Makefile") CONFIG_FILES="$CONFIG_FILES include/ode/Makefile" ;; - "ode/Makefile") CONFIG_FILES="$CONFIG_FILES ode/Makefile" ;; - "ode/src/Makefile") CONFIG_FILES="$CONFIG_FILES ode/src/Makefile" ;; - "drawstuff/Makefile") CONFIG_FILES="$CONFIG_FILES drawstuff/Makefile" ;; - "drawstuff/src/Makefile") CONFIG_FILES="$CONFIG_FILES drawstuff/src/Makefile" ;; - "drawstuff/dstest/Makefile") CONFIG_FILES="$CONFIG_FILES drawstuff/dstest/Makefile" ;; - "ode/demo/Makefile") CONFIG_FILES="$CONFIG_FILES ode/demo/Makefile" ;; - "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; - "tests/CppTestHarness/Makefile") CONFIG_FILES="$CONFIG_FILES tests/CppTestHarness/Makefile" ;; - "ode-config") CONFIG_FILES="$CONFIG_FILES ode-config" ;; - - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || -{ - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -# -# Set up the sed scripts for CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "$CONFIG_FILES"; then - -_ACEOF - - - -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - cat >conf$$subs.sed <<_ACEOF -SHELL!$SHELL$ac_delim -PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim -PACKAGE_NAME!$PACKAGE_NAME$ac_delim -PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim -PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim -PACKAGE_STRING!$PACKAGE_STRING$ac_delim -PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim -exec_prefix!$exec_prefix$ac_delim -prefix!$prefix$ac_delim -program_transform_name!$program_transform_name$ac_delim -bindir!$bindir$ac_delim -sbindir!$sbindir$ac_delim -libexecdir!$libexecdir$ac_delim -datarootdir!$datarootdir$ac_delim -datadir!$datadir$ac_delim -sysconfdir!$sysconfdir$ac_delim -sharedstatedir!$sharedstatedir$ac_delim -localstatedir!$localstatedir$ac_delim -includedir!$includedir$ac_delim -oldincludedir!$oldincludedir$ac_delim -docdir!$docdir$ac_delim -infodir!$infodir$ac_delim -htmldir!$htmldir$ac_delim -dvidir!$dvidir$ac_delim -pdfdir!$pdfdir$ac_delim -psdir!$psdir$ac_delim -libdir!$libdir$ac_delim -localedir!$localedir$ac_delim -mandir!$mandir$ac_delim -DEFS!$DEFS$ac_delim -ECHO_C!$ECHO_C$ac_delim -ECHO_N!$ECHO_N$ac_delim -ECHO_T!$ECHO_T$ac_delim -LIBS!$LIBS$ac_delim -build_alias!$build_alias$ac_delim -host_alias!$host_alias$ac_delim -target_alias!$target_alias$ac_delim -build!$build$ac_delim -build_cpu!$build_cpu$ac_delim -build_vendor!$build_vendor$ac_delim -build_os!$build_os$ac_delim -host!$host$ac_delim -host_cpu!$host_cpu$ac_delim -host_vendor!$host_vendor$ac_delim -host_os!$host_os$ac_delim -target!$target$ac_delim -target_cpu!$target_cpu$ac_delim -target_vendor!$target_vendor$ac_delim -target_os!$target_os$ac_delim -INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim -INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim -INSTALL_DATA!$INSTALL_DATA$ac_delim -am__isrc!$am__isrc$ac_delim -CYGPATH_W!$CYGPATH_W$ac_delim -PACKAGE!$PACKAGE$ac_delim -VERSION!$VERSION$ac_delim -ACLOCAL!$ACLOCAL$ac_delim -AUTOCONF!$AUTOCONF$ac_delim -AUTOMAKE!$AUTOMAKE$ac_delim -AUTOHEADER!$AUTOHEADER$ac_delim -MAKEINFO!$MAKEINFO$ac_delim -install_sh!$install_sh$ac_delim -STRIP!$STRIP$ac_delim -INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim -mkdir_p!$mkdir_p$ac_delim -AWK!$AWK$ac_delim -SET_MAKE!$SET_MAKE$ac_delim -am__leading_dot!$am__leading_dot$ac_delim -AMTAR!$AMTAR$ac_delim -am__tar!$am__tar$ac_delim -am__untar!$am__untar$ac_delim -CC!$CC$ac_delim -CFLAGS!$CFLAGS$ac_delim -LDFLAGS!$LDFLAGS$ac_delim -CPPFLAGS!$CPPFLAGS$ac_delim -ac_ct_CC!$ac_ct_CC$ac_delim -EXEEXT!$EXEEXT$ac_delim -OBJEXT!$OBJEXT$ac_delim -DEPDIR!$DEPDIR$ac_delim -am__include!$am__include$ac_delim -am__quote!$am__quote$ac_delim -AMDEP_TRUE!$AMDEP_TRUE$ac_delim -AMDEP_FALSE!$AMDEP_FALSE$ac_delim -AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim -CCDEPMODE!$CCDEPMODE$ac_delim -am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim -am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim -CPP!$CPP$ac_delim -GREP!$GREP$ac_delim -EGREP!$EGREP$ac_delim -XMKMF!$XMKMF$ac_delim -X_CFLAGS!$X_CFLAGS$ac_delim -X_PRE_LIBS!$X_PRE_LIBS$ac_delim -X_LIBS!$X_LIBS$ac_delim -X_EXTRA_LIBS!$X_EXTRA_LIBS$ac_delim -ODE_CURRENT!$ODE_CURRENT$ac_delim -ODE_REVISION!$ODE_REVISION$ac_delim -_ACEOF - - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then - break - elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` -fi - -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -_ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF -CEOF$ac_eof -_ACEOF - - -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - cat >conf$$subs.sed <<_ACEOF -ODE_AGE!$ODE_AGE$ac_delim -ODE_RELEASE!$ODE_RELEASE$ac_delim -ODE_SONAME!$ODE_SONAME$ac_delim -CXX!$CXX$ac_delim -CXXFLAGS!$CXXFLAGS$ac_delim -ac_ct_CXX!$ac_ct_CXX$ac_delim -CXXDEPMODE!$CXXDEPMODE$ac_delim -am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim -am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim -WINDRES!$WINDRES$ac_delim -ac_ct_WINDRES!$ac_ct_WINDRES$ac_delim -RANLIB!$RANLIB$ac_delim -USE_SONAME_TRUE!$USE_SONAME_TRUE$ac_delim -USE_SONAME_FALSE!$USE_SONAME_FALSE$ac_delim -ENABLE_DEMOS_TRUE!$ENABLE_DEMOS_TRUE$ac_delim -ENABLE_DEMOS_FALSE!$ENABLE_DEMOS_FALSE$ac_delim -ARCHFLAGS!$ARCHFLAGS$ac_delim -OPCODE_TRUE!$OPCODE_TRUE$ac_delim -OPCODE_FALSE!$OPCODE_FALSE$ac_delim -GIMPACT_TRUE!$GIMPACT_TRUE$ac_delim -GIMPACT_FALSE!$GIMPACT_FALSE$ac_delim -TRIMESH_TRUE!$TRIMESH_TRUE$ac_delim -TRIMESH_FALSE!$TRIMESH_FALSE$ac_delim -X86_64_SYSTEM_TRUE!$X86_64_SYSTEM_TRUE$ac_delim -X86_64_SYSTEM_FALSE!$X86_64_SYSTEM_FALSE$ac_delim -WIN32_TRUE!$WIN32_TRUE$ac_delim -WIN32_FALSE!$WIN32_FALSE$ac_delim -X11_TRUE!$X11_TRUE$ac_delim -X11_FALSE!$X11_FALSE$ac_delim -OSX_TRUE!$OSX_TRUE$ac_delim -OSX_FALSE!$OSX_FALSE$ac_delim -DRAWSTUFF!$DRAWSTUFF$ac_delim -so_ext!$so_ext$ac_delim -SHARED_LDFLAGS!$SHARED_LDFLAGS$ac_delim -GL_LIBS!$GL_LIBS$ac_delim -TOPDIR!$TOPDIR$ac_delim -ALLOCA!$ALLOCA$ac_delim -LIBOBJS!$LIBOBJS$ac_delim -LTLIBOBJS!$LTLIBOBJS$ac_delim -_ACEOF - - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 39; then - break - elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` -fi - -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end -_ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF -:end -s/|#_!!_#|//g -CEOF$ac_eof -_ACEOF - - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF -fi # test -n "$CONFIG_FILES" - - -for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 -echo "$as_me: error: Invalid tag $ac_tag." >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; - esac - ac_file_inputs="$ac_file_inputs $ac_f" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input="Generated from "`IFS=: - echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - fi - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin";; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= - -case `sed -n '/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p -' $ac_file_inputs` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s&@configure_input@&$configure_input&;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out"; rm -f "$tmp/out";; - *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; - esac - ;; - :H) - # - # CONFIG_HEADER - # -_ACEOF - -# Transform confdefs.h into a sed script `conftest.defines', that -# substitutes the proper values into config.h.in to produce config.h. -rm -f conftest.defines conftest.tail -# First, append a space to every undef/define line, to ease matching. -echo 's/$/ /' >conftest.defines -# Then, protect against being on the right side of a sed subst, or in -# an unquoted here document, in config.status. If some macros were -# called several times there might be several #defines for the same -# symbol, which is useless. But do not sort them, since the last -# AC_DEFINE must be honored. -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where -# NAME is the cpp macro being defined, VALUE is the value it is being given. -# PARAMS is the parameter list in the macro definition--in most cases, it's -# just an empty string. -ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' -ac_dB='\\)[ (].*,\\1define\\2' -ac_dC=' ' -ac_dD=' ,' - -uniq confdefs.h | - sed -n ' - t rset - :rset - s/^[ ]*#[ ]*define[ ][ ]*// - t ok - d - :ok - s/[\\&,]/\\&/g - s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p - s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p - ' >>conftest.defines - -# Remove the space that was appended to ease matching. -# Then replace #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -# (The regexp can be short, since the line contains either #define or #undef.) -echo 's/ $// -s,^[ #]*u.*,/* & */,' >>conftest.defines - -# Break up conftest.defines: -ac_max_sed_lines=50 - -# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" -# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" -# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" -# et cetera. -ac_in='$ac_file_inputs' -ac_out='"$tmp/out1"' -ac_nxt='"$tmp/out2"' - -while : -do - # Write a here document: - cat >>$CONFIG_STATUS <<_ACEOF - # First, check the format of the line: - cat >"\$tmp/defines.sed" <<\\CEOF -/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def -/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def -b -:def -_ACEOF - sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS - ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in - sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail - grep . conftest.tail >/dev/null || break - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines conftest.tail - -echo "ac_result=$ac_in" >>$CONFIG_STATUS -cat >>$CONFIG_STATUS <<\_ACEOF - if test x"$ac_file" != x-; then - echo "/* $configure_input */" >"$tmp/config.h" - cat "$ac_result" >>"$tmp/config.h" - if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then - { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f $ac_file - mv "$tmp/config.h" $ac_file - fi - else - echo "/* $configure_input */" - cat "$ac_result" - fi - rm -f "$tmp/out12" -# Compute $ac_file's index in $config_headers. -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $ac_file | $ac_file:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || -$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$ac_file : 'X\(//\)[^/]' \| \ - X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| . 2>/dev/null || -echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 -echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done - ;; - - esac -done # for ac_tag - - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi - - -chmod +x ode-config - -echo "Configuration:" -echo " Target system type: $target" -echo " Build system type: $build" -echo " Host system type: $host" -echo " Use double precision: $precision" -echo " Use OPCODE: $opcode" -echo " Use GIMPACT: $gimpact" -echo " Use gyroscopic term: $gyroscopic" -echo " Is this a Pentium: $pentium" -echo " Is the CPU x86-64: $cpu64" -echo " Is this a release build: $release" -echo " Adding debug symbols: $debug" -echo " Using SONAME: $use_soname" -echo " Headers will be installed in $prefix/include/ode" -echo " Libraries will be installed in $prefix/lib" - -if test $gimpact = yes -a $precision = yes -then - echo "WARNING! Double precision not yet supported for GIMPACT" -fi - diff --git a/libraries/ode-0.9/configure.in b/libraries/ode-0.9/configure.in deleted file mode 100644 index 96eea67787..0000000000 --- a/libraries/ode-0.9/configure.in +++ /dev/null @@ -1,580 +0,0 @@ -dnl Initial configure.in by Rodrigo Hernandez -dnl Modified in 26/10/2005 by Rodrigo Hernandez - -dnl AC_INIT does not take a macro as a version nr: set it separately! - Bram -AC_INIT(ODE,0.9.0,ode@ode.org) - -dnl When upgrading version nr, also change the AC_INIT line! - Bram -ODE_CURRENT=0 -ODE_REVISION=9 -ODE_AGE=0 -ODE_RELEASE=[$ODE_CURRENT].[$ODE_REVISION].[$ODE_AGE] -AC_CANONICAL_HOST -AC_CANONICAL_TARGET - -AM_INIT_AUTOMAKE(ODE,[$ODE_RELEASE]) -AM_CONFIG_HEADER(include/ode/config.h) -dnl Set CFLAGS to zero, so that we avoid getting the gratis -g -O2 -CFLAGS= -CXXFLAGS= -AC_C_BIGENDIAN -AC_PATH_X -AC_PATH_XTRA - -ODE_SONAME=libode.so.[$ODE_CURRENT] - -AC_SUBST(ODE_CURRENT) -AC_SUBST(ODE_REVISION) -AC_SUBST(ODE_AGE) -AC_SUBST(ODE_RELEASE) -AC_SUBST(ODE_SONAME) - -dnl This is needed because we have subdirectories -AC_PROG_MAKE_SET - -AC_PROG_CXX -AC_PROG_INSTALL -AC_CHECK_TOOLS([WINDRES], [windres]) -AC_C_CONST -AC_C_INLINE -AC_C_VOLATILE -AC_HEADER_STDBOOL -AC_PROG_RANLIB -AC_TYPE_SIZE_T - -dnl Check if using sonames is requested -dnl THIS IS TEMPORARY! -AC_MSG_CHECKING(if a soname should be set) -AC_ARG_ENABLE(soname,AC_HELP_STRING([--enable-soname], -[Configure ODE shared library to set the soname field on ELF files]), -use_soname=$enableval,use_soname=no) -AC_MSG_RESULT($use_soname) -AM_CONDITIONAL(USE_SONAME, test x$use_soname = xyes) - - -dnl Check if we want to build demos -AC_MSG_CHECKING(if tests should be built) -AC_ARG_ENABLE(demos,AC_HELP_STRING([--enable-demos], [build tests]), enable_demos=$enableval,enable_demos=yes) -AC_MSG_RESULT($enable_demos) -AM_CONDITIONAL(ENABLE_DEMOS, test x$enable_demos = xyes) - - -AC_ARG_WITH(arch,AC_HELP_STRING([--with-arch=[arch]], -[build for $arch, where arch is any of the -march flags passed to gcc, without the -march, for example --with-arch=pentium3]), -arch=$withval,arch=no) -ARCHFLAGS="" -if test "x$arch" != xno -then - ARCHFLAGS="-march=$arch" -fi -AC_SUBST(ARCHFLAGS) - -dnl Decide whether or not SSE is available -dnl Why dont we compile and run programs like we do to find out if -dnl this is a Pentium machine further down? simple! -dnl this may NOT be the machine on which the code is going to run in, -dnl so allow users to compile programs for their target machine. -case "$arch" in - pentium3 | pentium4 | athlon* ) - AC_DEFINE(HAVE_SSE,,[Use SSE Optimizations]) - ;; -dnl this space available for other architectures specific extensions and/or -dnl other Intel based extensions such as 3DNow, SSE2, MMX, etc. -esac - -dnl check for required headers -AC_CHECK_HEADERS( alloca.h ieeefp.h stdio.h stdlib.h math.h string.h stdarg.h malloc.h values.h float.h time.h sys/time.h ) - - -opcode=no -gimpact=no -AC_ARG_WITH(trimesh,AC_HELP_STRING([--with-trimesh=[opcode|gimpact|none]], -[use the specified system for trimesh support.]), -trimesh=$withval,trimesh=opcode -) -if test "$trimesh" = opcode -then - opcode=yes -fi -if test "$trimesh" = gimpact -then - gimpact=yes -fi - -AM_CONDITIONAL(OPCODE, test $opcode = yes) -AM_CONDITIONAL(GIMPACT, test $gimpact = yes) -AM_CONDITIONAL(TRIMESH, test $opcode = yes -o $gimpact = yes) - - -AC_MSG_CHECKING(if gyroscopic term should be used) -AC_ARG_ENABLE(gyroscopic,AC_HELP_STRING([--disable-gyroscopic], -[Configure ODE to work without gyroscopic term (may improve stability)]), -gyroscopic=$enableval,gyroscopic=yes) -AC_MSG_RESULT($gyroscopic) -if test x"$gyroscopic" = xyes -then -AC_DEFINE(dGYROSCOPIC,,[Use gyroscopic terms]) -fi - -dnl Check Precision, define the dInfinity constant--------------------------/ -AC_MSG_CHECKING(if double precision is requested) -AC_ARG_ENABLE(double-precision,AC_HELP_STRING([--enable-double-precision], -[Configure ODE to work with double precision, if not specified, single precision is used]), -precision=$enableval,precision=no) -if test "$precision" != no -then -dnl DOUBLE was chosen -AC_DEFINE(dDOUBLE,,[Use double precision]) -dnl Check from lest likelly to more likelly. -if test "$build_os" == "$target_os" -then -AC_TRY_RUN([ -#define dInfinity 1e20 -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=1e20,,) -AC_TRY_RUN([ -#define dInfinity 1.7976931348623157e+308 -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=1.7976931348623157e+308,,) -AC_TRY_RUN([ -#include -#define dInfinity HUGE_VAL -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=HUGE_VAL,,) -AC_TRY_RUN([ -#include -#define dInfinity DBL_MAX -int main() -{ -if (dInfinity > 1e10 && -dInfinity < -1e10 && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=DBL_MAX,,) -else -#cross-compiling, use a reasonable value. We should add an option for setting this. -dinfinity=DBL_MAX -fi -else -dnl default to SINGLE. -AC_DEFINE(dSINGLE,,[Use single precision]) -dnl Check from lest likelly to more likelly. -if test "$build_os" == "$target_os" -then -AC_TRY_RUN([ -#define dInfinity 1e20f -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=1e20f,,) -AC_TRY_RUN([ -#define dInfinity 3.402823466e+38F -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=3.402823466e+38F,,) -AC_TRY_RUN([ -#include -#define dInfinity HUGE_VALF -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=HUGE_VALF,,) -AC_TRY_RUN([ -#include -#define dInfinity FLT_MAX -int main() -{ -if (dInfinity > 1e10f && -dInfinity < -1e10f && -dInfinity < dInfinity) -return 0; -else return -1; -} -],dinfinity=FLT_MAX,,) -#cross-compiling, use a reasonable value. We should add an option for setting this. -dinfinity=FLT_MAX -fi -fi -AC_MSG_RESULT($precision) -AC_DEFINE_UNQUOTED(dInfinity,${dinfinity},[dInfinity Constant]) -AC_MSG_CHECKING(for appropriate dInfinity constant) -AC_MSG_RESULT($dinfinity) -dnl --------------------------------------------------------------------------/ - -dnl Define dEpsilon -AC_CHECK_HEADER(float.h,[have_float_h=yes],[have_float_h=no]) -AC_MSG_CHECKING(for appropriate dEpsilon constant) -if test "x$have_float_h" == xyes -then -if test $precision == yes -then -dEpsilon=DBL_EPSILON -else -dEpsilon=FLT_EPSILON -fi -else -if test $precision == yes -then -dEpsilon=2.2204460492503131e-16 -else -dEpsilon=1.19209290e-07f -fi -fi -AC_DEFINE_UNQUOTED(dEpsilon,${dEpsilon},[dEpsilon Constant]) -AC_MSG_RESULT($dEpsilon) - - -dnl Check for PENTIUM -if test "$build_os" == "$target_os" -then -AC_MSG_CHECKING(for a Pentium CPU) -AC_TRY_RUN([ -int main() -{ -asm ("mov \$0,%%eax;\n" - "cpuid\n" : : : "%eax"); -return 0; -}; -],pentium=yes,pentium=no,) -else -pentium=no -fi -if test "x$pentium" == xyes -then -AC_DEFINE(PENTIUM,1,[is this a pentium on a gcc-based platform?]) -fi -AC_MSG_RESULT($pentium) - -dnl Check for 64bit CPU -AC_MSG_CHECKING(for a x86-64 CPU) -if test "$build_os" == "$target_os" -then -AC_TRY_RUN([ -int main() -{ -int a = 0; -int * pa = &a; -asm ("mov %0,%%rax\n" - "movl (%%rax),%%eax\n" - : : "r"(pa) : "%rax"); -return 0; -}; -],cpu64=yes,cpu64=no,) -else -cpu64=no -fi -if test "x$cpu64" == xyes -then -AC_DEFINE(X86_64_SYSTEM,1,[is this a X86_64 system on a gcc-based platform?]) -fi -AC_MSG_RESULT($cpu64) -AM_CONDITIONAL(X86_64_SYSTEM, test x$cpu64 = xyes) - -AC_MSG_CHECKING(if building a release library) -AC_ARG_ENABLE(release,AC_HELP_STRING([--enable-release], -[build a release library with -fomit-frame-pointer and -ffast-math]), -release=$enableval,release=no) -if test "x$release" == xyes -then - CFLAGS="$CFLAGS -fomit-frame-pointer -ffast-math" - CPPFLAGS="$CPPFLAGS -fomit-frame-pointer -ffast-math" - CXXFLAGS="$CXXFLAGS -fomit-frame-pointer -ffast-math" - AC_DEFINE(dNODEBUG,,[Disable debug output]) -fi -AC_MSG_RESULT($release) - -AC_MSG_CHECKING(if building a debug library) -AC_ARG_ENABLE(debug,AC_HELP_STRING([--enable-debug], -[Add debug symbols to the library with -g]), -debug=$enableval,debug=yes) -if test "x$debug" == xyes -then - CFLAGS="$CFLAGS -g" - CPPFLAGS="$CPPFLAGS -g" - CXXFLAGS="$CXXFLAGS -g" -fi -AC_MSG_RESULT($debug) - - -dnl Check variable type sizes -AC_CHECK_SIZEOF(char) -AC_CHECK_SIZEOF(int) -AC_CHECK_SIZEOF(short) -AC_CHECK_SIZEOF(long int) -AC_CHECK_SIZEOF(void*) - -dnl Set some Platform Specific Variables -case "$host_os" in - cygwin* | mingw*) - so_ext=".dll" - DLLDEFINE="-DODE_DLL" - SHARED_LDFLAGS="-shared" - drawstuff="Win32" # if in a Windows enviroment - ;; - *apple* | *darwin*) # For Mac OS X - so_ext=".dylib" - DLLDEFINE="" - SHARED_LDFLAGS="-dynamiclib" - drawstuff="OSX" - dnl We need to use C++ compilation and linking for ode on Mac - dnl Might as well do it for all code. - CC="$CXX" - LINK="$CXXLINK" - ;; - *) - drawstuff="X11" # if anything else default to X11 - if test x$use_soname = xyes; then - so_ext=".so.$ODE_RELEASE" - else - so_ext=".so" - fi - DLLDEFINE="" - SHARED_LDFLAGS="-shared" - ;; -esac -dnl Set Conditionals -AM_CONDITIONAL(WIN32, test x$drawstuff = xWin32) -AM_CONDITIONAL(X11, test x$drawstuff = xX11) -AM_CONDITIONAL(OSX, test x$drawstuff = xOSX) -dnl Set Drawstuff variables -AC_MSG_CHECKING(which drawstuff lib to build) -AC_MSG_RESULT($drawstuff) -AC_SUBST(DRAWSTUFF) -dnl Set shared library variables -AC_MSG_CHECKING(for the suffix of shared libraries) -AC_MSG_RESULT($so_ext) -AC_DEFINE_UNQUOTED(SO_EXT,"$so_ext",[The extension for shared libraries.]) -AC_SUBST(so_ext) -AC_SUBST(SHARED_LDFLAGS) - -dnl Check for AC_PATH_X variables -if test "X$x_includes" != "XNONE"; then - CFLAGS="$CFLAGS -I$x_includes" - CXXFLAGS="$CXXFLAGS -I$x_includes" -fi -if test "X$x_libraries" != "XNONE"; then - CFLAGS="$CFLAGS -L$x_libraries" - CXXFLAGS="$CXXFLAGS -L$x_libraries" -fi - -dnl Check for OpenGL -if test "x$drawstuff" = "xOSX"; then - AC_DEFINE([HAVE_APPLE_OPENGL_FRAMEWORK], [1], - [Use the Apple OpenGL framework.]) - GL_LIBS="-framework OpenGL -framework Carbon -framework AGL" -else - AC_CHECK_HEADERS(GL/gl.h GL/glu.h GL/glext.h,,, - [[#if HAVE_GL_GL_H - #include - #endif - #if HAVE_GL_GLU_H - #include - #endif - ]]) - AC_CHECK_LIB(GL, main,[GL_LIBS="$GL_LIBS -lGL"]) - TEMP_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $GL_LIBS" - AC_CHECK_LIB(GLU, main,[GL_LIBS="$GL_LIBS -lGLU"]) - LDFLAGS="$TEMP_LDFLAGS" - AC_CHECK_LIB(opengl32, main,[GL_LIBS="$GL_LIBS -lopengl32"]) - AC_CHECK_LIB(glu32, main,[GL_LIBS="$GL_LIBS -lglu32"]) - AC_CHECK_LIB(Xmu, main,[GL_LIBS="$GL_LIBS -lXmu"]) - AC_CHECK_LIB(Xi, main,[GL_LIBS="$GL_LIBS -lXi"]) - AC_CHECK_LIB(X, main,[GL_LIBS="$GL_LIBS -lX"]) - AC_CHECK_LIB(X11, main,[GL_LIBS="$GL_LIBS -lX11"]) -fi -AC_SUBST(GL_LIBS) - -dnl Add some Windows libraries if found -AC_CHECK_LIB(comctl32,main,[LIBS="$LIBS -lcomctl32"]) -AC_CHECK_LIB(kernel32,main,[LIBS="$LIBS -lkernel32"]) -AC_CHECK_LIB(user32,main,[LIBS="$LIBS -luser32"]) -AC_CHECK_LIB(gdi32,main,[LIBS="$LIBS -lgdi32"]) -AC_CHECK_LIB(winmm,main,[LIBS="$LIBS -lwinmm"]) - -dnl Add math and standard c++ lib just in case -AC_CHECK_LIB(stdc++,main,[LIBS="$LIBS -lstdc++"]) -AC_CHECK_LIB(m,main,[LIBS="$LIBS -lm"]) -AC_CHECK_LIB(pthread,main,[LIBS="$LIBS -lpthread"]) - - -TOPDIR=`cd $srcdir;pwd` -AC_SUBST(TOPDIR) - -dnl Check if the user wants to profile ODE using gprof -AC_MSG_CHECKING(for gprof) -AC_ARG_ENABLE(gprof, -AC_HELP_STRING([--enable-gprof],[enable profiling with gprof]), -gprof=$enableval,gprof=no) -if test "$gprof" != no -then - CFLAGS="-pg $CFLAGS" - CPPFLAGS="-pg $CPPFLAGS" - CXXFLAGS="-pg $CXXFLAGS" - AC_CHECK_LIB(gmon, main,[LIBS="$LIBS -lgmon"]) - AC_MSG_RESULT(enabled) -else - AC_MSG_RESULT(no) -fi - -dnl Check for autoscan sugested functions -AC_CHECK_FUNCS([floor memmove memset select sqrt sqrtf sinf cosf fabsf atan2f fmodf copysignf copysign snprintf vsnprintf gettimeofday isnan isnanf _isnan _isnanf __isnan __isnanf]) -if test "$build_os" == "$target_os" -then -AC_FUNC_ALLOCA -AC_FUNC_MALLOC -AC_FUNC_OBSTACK -AC_FUNC_REALLOC -AC_FUNC_SELECT_ARGTYPES -AC_FUNC_VPRINTF -fi - -dnl include found system headers into config.h -AH_TOP([ -#ifndef ODE_CONFIG_H -#define ODE_CONFIG_H -]) -AH_BOTTOM([ - -#ifdef HAVE_ALLOCA_H -#include -#endif -#if defined(HAVE_IEEEFP_H) && !defined(__CYGWIN__) -// This header creates conflicts with math.h in Cygwin. -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_MATH_H -#include -#endif -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_STDARG_H -#include -#endif -#ifdef HAVE_MALLOC_H -#include -#endif -#ifdef HAVE_VALUES_H -#include -#endif -#ifdef HAVE_FLOAT_H -#include -#endif -#if SIZEOF_CHAR == 1 -typedef char int8; -typedef unsigned char uint8; -#else -#error "expecting sizeof(char) == 1" -#endif -#if SIZEOF_SHORT == 2 -typedef short int16; -typedef unsigned short uint16; -#else -#error "can not find 2 byte integer type" -#endif -/* integer types (we assume int >= 32 bits) */ -#if SIZEOF_INT == 4 -typedef short int32; -typedef unsigned short uint32; -#else -#error "can not find 4 byte integer type" -#endif -/* an integer type that we can safely cast a pointer to and - * from without loss of bits. - */ -#if SIZEOF_SHORT == SIZEOF_VOIDP -typedef unsigned short intP; -#elif SIZEOF_INT == SIZEOF_VOIDP -typedef unsigned int intP; -#elif SIZEOF_LONG_INT == SIZEOF_VOIDP -typedef unsigned long int intP; -#endif - -/* -Handle Windows DLL odities -Its easier to export all symbols using the -shared flag -for MinGW than differentiating with declspec, -so only do it for MSVC -*/ -#if defined(ODE_DLL) && defined(WIN32) && defined(_MSC_VER) -#define ODE_API __declspec( dllexport ) -#elif !defined(ODE_DLL) && defined(WIN32) && defined(MSC_VER) -#define ODE_API __declspec( dllimport ) -#else -#define ODE_API -#endif - -#endif /* #define ODE_CONFIG_H */ -]) - - -dnl Finally write our Makefiles -AC_OUTPUT([ - Makefile - include/Makefile - include/ode/Makefile - ode/Makefile - ode/src/Makefile - drawstuff/Makefile - drawstuff/src/Makefile - drawstuff/dstest/Makefile - ode/demo/Makefile - tests/Makefile - tests/CppTestHarness/Makefile - ode-config - ]) - -chmod +x ode-config - -dnl Print some useful information -echo "Configuration:" -echo " Target system type: $target" -echo " Build system type: $build" -echo " Host system type: $host" -echo " Use double precision: $precision" -echo " Use OPCODE: $opcode" -echo " Use GIMPACT: $gimpact" -echo " Use gyroscopic term: $gyroscopic" -echo " Is this a Pentium: $pentium" -echo " Is the CPU x86-64: $cpu64" -echo " Is this a release build: $release" -echo " Adding debug symbols: $debug" -echo " Using SONAME: $use_soname" -echo " Headers will be installed in $prefix/include/ode" -echo " Libraries will be installed in $prefix/lib" - -if test $gimpact = yes -a $precision = yes -then - echo "WARNING! Double precision not yet supported for GIMPACT" -fi - diff --git a/libraries/ode-0.9/contrib/BreakableJoints/README.txt b/libraries/ode-0.9/contrib/BreakableJoints/README.txt deleted file mode 100644 index e996816fde..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/README.txt +++ /dev/null @@ -1,110 +0,0 @@ -Breakable Joints - -================================================================================ - -Description: -This is a small addition to ODE that makes joints breakable. Breakable means -that if a force on a joint is to high it wil break. I have included a modified -version of test_buggy.cpp (test_breakable.cpp) so you can see it for your self. -Just drive your buggy into an obstacle and enjoy! - -================================================================================ - -Installation instructions: -- copy joint.h, joint.cpp, ode.cpp and step.cpp to the ode/src/ directory -- copy common.h and object.h to the include/ directory -- copy test_breakable.cpp to the ode/test/ directory -- add test_breakable.cpp to the ODE_TEST_SRC_CPP object in the makefile. -- make ode-lib -- make ode-test -You can also use the diffs. The above files will quickly go out of sync with the -rest of ODE but the diffs wil remain valid longer. - -================================================================================ - -Functions: -dJointSetBreakable (dJointID joint, int b) - If b is 1 the joint is made breakable. If b is 0 the joint is made - unbreakable. - -void dJointSetBreakCallback (dJointID joint, dJointBreakCallback *callbackFunc) - Sets the callback function for this joint. If a funtion is set it will be - called if the joint is broken but before it is actually detached or deleted. - -void dJointSetBreakMode (dJointID joint, int mode) - Use this functions to set some flags. These flags can be ORred ( | ) - together; ie. dJointSetBreakMode (someJoint, -dJOINT_BREAK_AT_B1_FORCE|dJOINT_DELETE_ON_BREAK) - dJOINT_DELETE_ON_BREAK - If the joint breaks it wil be deleted. - dJOINT_BREAK_AT_B1_FORCE - If the force on body 1 is to high the joint will - break - dJOINT_BREAK_AT_B1_TORQUE - If the torque on body 1 is to high the joint will - break - dJOINT_BREAK_AT_B2_FORCE - If the force on body 2 is to high the joint will - break - dJOINT_BREAK_AT_B2_TORQUE - If the torque on body 2 is to high the joint will - break - -void dJointSetBreakForce (dJointID joint, int body, dReal x, dReal y, dReal z) - With this function you can set the maximum force for a body connected to this - joint. A value of 0 for body means body 1, 1 means body 2. The force is - relative to the bodies rotation. - -void dJointSetBreakTorque (dJointID joint, int body, dReal x, dReal y, dReal z) - With this function you can set the maximum torque for a body connected to this - joint. A value of 0 for body means body 1, 1 means body 2. The torque is - relative to the bodies rotation. - -int dJointIsBreakable (dJointID joint) - Returns 1 if this joint is breakable, 0 otherwise. - -int dJointGetBreakMode (dJointID joint) - Returns the breakmode flag. - -void dJointGetBreakForce (dJointID joint, int body, dReal *force) - Returns the force at what this joint will break. A value of 0 for body means - body 1, 1 means body 2. force must have enough space for 3 dReal values. - -void dJointGetBreakTorque (dJointID joint, int body, dReal *torque) - Returns the torque at what this joint will break. A value of 0 for body - means body 1, 1 means body 2. force must have enough space for 3 dReal - values. - -================================================================================ - -The callback function is defined like this (in common.h): -void dJointBreakCallback (dJointID); - -================================================================================ - -Problems, known bugs & other issues: -- If the timestep is very small then joints get a lot weaker. They can even fall - apart! -- I have tested all this with the latest checkout from CVS (at the time of - writing ofcourse). I haven't tested it with earlier versions of ODE. -- I have modified the code that fills the jointfeedback struct. I haven't tested - if it still works. -- I'm not sure if the forces are really relative to the connected bodies. -- There are some memory leaks in the test_breakable.cpp example. - -================================================================================ - -Bugfixes and changes: -09/08/2003 -- I fixed a bug when there where 0 joints in the simulation - -06/12/2003 -- dJointGetBreakMode() added, by vadim_mcagon@hotmail.com - -11/03/2004 -- Updated files to work with latest CVS checkout. -- Added support for dWorldStepFast1() -- Added separate test_breakable.cpp example. -- Updated the code that breaks and destroys a joint. - -================================================================================ - -Send me an e-mail if you have any suggestions, ideas, bugs, bug-fixes, anything! -e-mail: roelvandijk@home.nl - -Roel van Dijk - 11/03/2004 diff --git a/libraries/ode-0.9/contrib/BreakableJoints/common.h b/libraries/ode-0.9/contrib/BreakableJoints/common.h deleted file mode 100644 index bc4272dbb1..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/common.h +++ /dev/null @@ -1,337 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMMON_H_ -#define _ODE_COMMON_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* configuration stuff */ - -/* the efficient alignment. most platforms align data structures to some - * number of bytes, but this is not always the most efficient alignment. - * for example, many x86 compilers align to 4 bytes, but on a pentium it - * is important to align doubles to 8 byte boundaries (for speed), and - * the 4 floats in a SIMD register to 16 byte boundaries. many other - * platforms have similar behavior. setting a larger alignment can waste - * a (very) small amount of memory. NOTE: this number must be a power of - * two. this is set to 16 by default. - */ -#define EFFICIENT_ALIGNMENT 16 - - -/* constants */ - -/* pi and 1/sqrt(2) are defined here if necessary because they don't get - * defined in on some platforms (like MS-Windows) - */ - -#ifndef M_PI -#define M_PI REAL(3.1415926535897932384626433832795029) -#endif -#ifndef M_SQRT1_2 -#define M_SQRT1_2 REAL(0.7071067811865475244008443621048490) -#endif - - -/* debugging: - * IASSERT is an internal assertion, i.e. a consistency check. if it fails - * we want to know where. - * UASSERT is a user assertion, i.e. if it fails a nice error message - * should be printed for the user. - * AASSERT is an arguments assertion, i.e. if it fails "bad argument(s)" - * is printed. - * DEBUGMSG just prints out a message - */ - -#ifndef dNODEBUG -#ifdef __GNUC__ -#define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s() [%s]",__FUNCTION__,__FILE__); -#define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \ - msg " in %s()", __FUNCTION__); -#define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \ - msg " in %s()", __FUNCTION__); -#else -#define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__); -#define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \ - msg " (%s:%d)", __FILE__,__LINE__); -#define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \ - msg " (%s:%d)", __FILE__,__LINE__); -#endif -#else -#define dIASSERT(a) ; -#define dUASSERT(a,msg) ; -#define dDEBUGMSG(msg) ; -#endif -#define dAASSERT(a) dUASSERT(a,"Bad argument(s)") - -/* floating point data type, vector, matrix and quaternion types */ - -#if defined(dSINGLE) -typedef float dReal; -#elif defined(dDOUBLE) -typedef double dReal; -#else -#error You must #define dSINGLE or dDOUBLE -#endif - - -/* round an integer up to a multiple of 4, except that 0 and 1 are unmodified - * (used to compute matrix leading dimensions) - */ -#define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a)) - -/* these types are mainly just used in headers */ -typedef dReal dVector3[4]; -typedef dReal dVector4[4]; -typedef dReal dMatrix3[4*3]; -typedef dReal dMatrix4[4*4]; -typedef dReal dMatrix6[8*6]; -typedef dReal dQuaternion[4]; - - -/* precision dependent scalar math functions */ - -#if defined(dSINGLE) - -#define REAL(x) (x ## f) /* form a constant */ -#define dRecip(x) ((float)(1.0f/(x))) /* reciprocal */ -#define dSqrt(x) ((float)sqrt(x)) /* square root */ -#define dRecipSqrt(x) ((float)(1.0f/sqrt(x))) /* reciprocal square root */ -#define dSin(x) ((float)sin(x)) /* sine */ -#define dCos(x) ((float)cos(x)) /* cosine */ -#define dFabs(x) ((float)fabs(x)) /* absolute value */ -#define dAtan2(y,x) ((float)atan2((y),(x))) /* arc tangent with 2 args */ - -#elif defined(dDOUBLE) - -#define REAL(x) (x) -#define dRecip(x) (1.0/(x)) -#define dSqrt(x) sqrt(x) -#define dRecipSqrt(x) (1.0/sqrt(x)) -#define dSin(x) sin(x) -#define dCos(x) cos(x) -#define dFabs(x) fabs(x) -#define dAtan2(y,x) atan2((y),(x)) - -#else -#error You must #define dSINGLE or dDOUBLE -#endif - - -/* utility */ - - -/* round something up to be a multiple of the EFFICIENT_ALIGNMENT */ - -#define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1) - - -/* alloca aligned to the EFFICIENT_ALIGNMENT. note that this can waste - * up to 15 bytes per allocation, depending on what alloca() returns. - */ - -#define dALLOCA16(n) \ - ((char*)dEFFICIENT_SIZE(((int)(alloca((n)+(EFFICIENT_ALIGNMENT-1)))))) - - -/* internal object types (all prefixed with `dx') */ - -struct dxWorld; /* dynamics world */ -struct dxSpace; /* collision space */ -struct dxBody; /* rigid body (dynamics object) */ -struct dxGeom; /* geometry (collision object) */ -struct dxJoint; -struct dxJointNode; -struct dxJointGroup; - -typedef struct dxWorld *dWorldID; -typedef struct dxSpace *dSpaceID; -typedef struct dxBody *dBodyID; -typedef struct dxGeom *dGeomID; -typedef struct dxJoint *dJointID; -typedef struct dxJointGroup *dJointGroupID; - - -/* error numbers */ - -enum { - d_ERR_UNKNOWN = 0, /* unknown error */ - d_ERR_IASSERT, /* internal assertion failed */ - d_ERR_UASSERT, /* user assertion failed */ - d_ERR_LCP /* user assertion failed */ -}; - - -/* joint type numbers */ - -enum { - dJointTypeNone = 0, /* or "unknown" */ - dJointTypeBall, - dJointTypeHinge, - dJointTypeSlider, - dJointTypeContact, - dJointTypeUniversal, - dJointTypeHinge2, - dJointTypeFixed, - dJointTypeNull, - dJointTypeAMotor -}; - -/******************** breakable joint contribution ***********************/ -/* joint break callback function */ -typedef void dJointBreakCallback (dJointID joint); - -/* joint break modes */ -enum { - // if this flag is set, the joint wil break - dJOINT_BROKEN = 0x0001, - // if this flag is set, the joint wil be deleted when it breaks - dJOINT_DELETE_ON_BREAK = 0x0002, - // if this flag is set, the joint can break at a certain force on body 1 - dJOINT_BREAK_AT_B1_FORCE = 0x0004, - // if this flag is set, the joint can break at a certain torque on body 1 - dJOINT_BREAK_AT_B1_TORQUE = 0x0008, - // if this flag is set, the joint can break at a certain force on body 2 - dJOINT_BREAK_AT_B2_FORCE = 0x0010, - // if this flag is set, the joint can break at a certain torque on body 2 - dJOINT_BREAK_AT_B2_TORQUE = 0x0020 -}; -/*************************************************************************/ - -/* an alternative way of setting joint parameters, using joint parameter - * structures and member constants. we don't actually do this yet. - */ - -/* -typedef struct dLimot { - int mode; - dReal lostop, histop; - dReal vel, fmax; - dReal fudge_factor; - dReal bounce, soft; - dReal suspension_erp, suspension_cfm; -} dLimot; - -enum { - dLimotLoStop = 0x0001, - dLimotHiStop = 0x0002, - dLimotVel = 0x0004, - dLimotFMax = 0x0008, - dLimotFudgeFactor = 0x0010, - dLimotBounce = 0x0020, - dLimotSoft = 0x0040 -}; -*/ - - -/* standard joint parameter names. why are these here? - because we don't want - * to include all the joint function definitions in joint.cpp. hmmmm. - * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument, - * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and - * paste between these two. - */ - -#define D_ALL_PARAM_NAMES(start) \ - /* parameters for limits and motors */ \ - dParamLoStop = start, \ - dParamHiStop, \ - dParamVel, \ - dParamFMax, \ - dParamFudgeFactor, \ - dParamBounce, \ - dParamCFM, \ - dParamStopERP, \ - dParamStopCFM, \ - /* parameters for suspension */ \ - dParamSuspensionERP, \ - dParamSuspensionCFM, - -#define D_ALL_PARAM_NAMES_X(start,x) \ - /* parameters for limits and motors */ \ - dParamLoStop ## x = start, \ - dParamHiStop ## x, \ - dParamVel ## x, \ - dParamFMax ## x, \ - dParamFudgeFactor ## x, \ - dParamBounce ## x, \ - dParamCFM ## x, \ - dParamStopERP ## x, \ - dParamStopCFM ## x, \ - /* parameters for suspension */ \ - dParamSuspensionERP ## x, \ - dParamSuspensionCFM ## x, - -enum { - D_ALL_PARAM_NAMES(0) - D_ALL_PARAM_NAMES_X(0x100,2) - D_ALL_PARAM_NAMES_X(0x200,3) - - /* add a multiple of this constant to the basic parameter numbers to get - * the parameters for the second, third etc axes. - */ - dParamGroup=0x100 -}; - - -/* angular motor mode numbers */ - -enum{ - dAMotorUser = 0, - dAMotorEuler = 1 -}; - - -/* joint force feedback information */ - -typedef struct dJointFeedback { - dVector3 f1; /* force applied to body 1 */ - dVector3 t1; /* torque applied to body 1 */ - dVector3 f2; /* force applied to body 2 */ - dVector3 t2; /* torque applied to body 2 */ -} dJointFeedback; - - -/* private functions that must be implemented by the collision library: - * (1) indicate that a geom has moved, (2) get the next geom in a body list. - * these functions are called whenever the position of geoms connected to a - * body have changed, e.g. with dBodySetPosition(), dBodySetRotation(), or - * when the ODE step function updates the body state. - */ - -void dGeomMoved (dGeomID); -dGeomID dGeomGetBodyNext (dGeomID); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/common.h.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/common.h.diff deleted file mode 100644 index 24415a1468..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/common.h.diff +++ /dev/null @@ -1,21 +0,0 @@ -208,227d207 -< /******************** breakable joint contribution ***********************/ -< /* joint break callback function */ -< typedef void dJointBreakCallback (dJointID joint); -< -< /* joint break modes */ -< enum { -< // if this flag is set, the joint wil break -< dJOINT_BROKEN = 0x0001, -< // if this flag is set, the joint wil be deleted when it breaks -< dJOINT_DELETE_ON_BREAK = 0x0002, -< // if this flag is set, the joint can break at a certain force on body 1 -< dJOINT_BREAK_AT_B1_FORCE = 0x0004, -< // if this flag is set, the joint can break at a certain torque on body 1 -< dJOINT_BREAK_AT_B1_TORQUE = 0x0008, -< // if this flag is set, the joint can break at a certain force on body 2 -< dJOINT_BREAK_AT_B2_FORCE = 0x0010, -< // if this flag is set, the joint can break at a certain torque on body 2 -< dJOINT_BREAK_AT_B2_TORQUE = 0x0020 -< }; -< /*************************************************************************/ diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/joint.cpp.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/joint.cpp.diff deleted file mode 100644 index 80397f0e5d..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/joint.cpp.diff +++ /dev/null @@ -1,148 +0,0 @@ -2659,2804d2658 -< -< /******************** breakable joint contribution ***********************/ -< extern "C" void dJointSetBreakable (dxJoint *joint, int b) { -< dAASSERT(joint); -< if (b) { -< // we want this joint to be breakable but we must first check if it -< // was already breakable -< if (!joint->breakInfo) { -< // allocate a dxJointBreakInfo struct -< joint->breakInfo = new dxJointBreakInfo; -< joint->breakInfo->flags = 0; -< for (int i = 0; i < 3; i++) { -< joint->breakInfo->b1MaxF[0] = 0; -< joint->breakInfo->b1MaxT[0] = 0; -< joint->breakInfo->b2MaxF[0] = 0; -< joint->breakInfo->b2MaxT[0] = 0; -< } -< joint->breakInfo->callback = 0; -< } -< else { -< // the joint was already breakable -< return; -< } -< } -< else { -< // we want this joint to be unbreakable mut we must first check if -< // it is alreay unbreakable -< if (joint->breakInfo) { -< // deallocate the dxJointBreakInfo struct -< delete joint->breakInfo; -< joint->breakInfo = 0; -< } -< else { -< // the joint was already unbreakable -< return; -< } -< } -< } -< -< extern "C" void dJointSetBreakCallback (dxJoint *joint, dJointBreakCallback *callbackFunc) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointSetBreakCallback called on unbreakable joint"); -< } -< # endif -< joint->breakInfo->callback = callbackFunc; -< } -< -< extern "C" void dJointSetBreakMode (dxJoint *joint, int mode) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointSetBreakMode called on unbreakable joint"); -< } -< # endif -< joint->breakInfo->flags = mode; -< } -< -< extern "C" int dJointGetBreakMode (dxJoint *joint) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointGetBreakMode called on unbreakable joint"); -< } -< # endif -< return joint->breakInfo->flags; -< } -< -< extern "C" void dJointSetBreakForce (dxJoint *joint, int body, dReal x, dReal y, dReal z) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointSetBreakForce called on unbreakable joint"); -< } -< # endif -< if (body) { -< joint->breakInfo->b2MaxF[0] = x; -< joint->breakInfo->b2MaxF[1] = y; -< joint->breakInfo->b2MaxF[2] = z; -< } -< else { -< joint->breakInfo->b1MaxF[0] = x; -< joint->breakInfo->b1MaxF[1] = y; -< joint->breakInfo->b1MaxF[2] = z; -< } -< } -< -< extern "C" void dJointSetBreakTorque (dxJoint *joint, int body, dReal x, dReal y, dReal z) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointSetBreakTorque called on unbreakable joint"); -< } -< # endif -< if (body) { -< joint->breakInfo->b2MaxT[0] = x; -< joint->breakInfo->b2MaxT[1] = y; -< joint->breakInfo->b2MaxT[2] = z; -< } -< else { -< joint->breakInfo->b1MaxT[0] = x; -< joint->breakInfo->b1MaxT[1] = y; -< joint->breakInfo->b1MaxT[2] = z; -< } -< } -< -< extern "C" int dJointIsBreakable (dxJoint *joint) { -< dAASSERT(joint); -< return joint->breakInfo != 0; -< } -< -< extern "C" void dJointGetBreakForce (dxJoint *joint, int body, dReal *force) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointGetBreakForce called on unbreakable joint"); -< } -< # endif -< if (body) -< for (int i=0; i<3; i++) force[i]=joint->breakInfo->b2MaxF[i]; -< else -< for (int i=0; i<3; i++) force[i]=joint->breakInfo->b1MaxF[i]; -< } -< -< extern "C" void dJointGetBreakTorque (dxJoint *joint, int body, dReal *torque) { -< dAASSERT(joint); -< # ifndef dNODEBUG -< // only works for a breakable joint -< if (!joint->breakInfo) { -< dDebug (0, "dJointGetBreakTorque called on unbreakable joint"); -< } -< # endif -< if (body) -< for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b2MaxT[i]; -< else -< for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b1MaxT[i]; -< } -< /*************************************************************************/ -< -\ No newline at end of file diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/joint.h.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/joint.h.diff deleted file mode 100644 index eed3c244df..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/joint.h.diff +++ /dev/null @@ -1,18 +0,0 @@ -61,70d60 -< /******************** breakable joint contribution ***********************/ -< struct dxJointBreakInfo : public dBase { -< int flags; -< dReal b1MaxF[3]; // maximum force on body 1 -< dReal b1MaxT[3]; // maximum torque on body 1 -< dReal b2MaxF[3]; // maximum force on body 2 -< dReal b2MaxT[3]; // maximum torque on body 2 -< dJointBreakCallback *callback; // function that is called when this joint breaks -< }; -< /*************************************************************************/ -135,140d124 -< -< /******************** breakable joint contribution ***********************/ -< // optional break info structure. if this is not NULL the the joint is -< // breakable. -< dxJointBreakInfo *breakInfo; -< /*************************************************************************/ diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/objects.h.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/objects.h.diff deleted file mode 100644 index fd2129e7e7..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/objects.h.diff +++ /dev/null @@ -1,13 +0,0 @@ -168,179d167 -< /******************** breakable joint contribution ***********************/ -< void dJointSetBreakable (dJointID, int b); -< void dJointSetBreakCallback (dJointID, dJointBreakCallback *callbackFunc); -< void dJointSetBreakMode (dJointID, int mode); -< int dJointGetBreakMode (dJointID); -< void dJointSetBreakForce (dJointID, int body, dReal x, dReal y, dReal z); -< void dJointSetBreakTorque (dJointID, int body, dReal x, dReal y, dReal z); -< int dJointIsBreakable (dJointID); -< void dJointGetBreakForce (dJointID, int body, dReal *force); -< void dJointGetBreakTorque (dJointID, int body, dReal *torque); -< /*************************************************************************/ -< diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/ode.cpp.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/ode.cpp.diff deleted file mode 100644 index 761b7be2e3..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/ode.cpp.diff +++ /dev/null @@ -1,28 +0,0 @@ -212,230d211 -< /******************** breakable joint contribution ***********************/ -< dxJoint* nextJ; -< if (!world->firstjoint) -< nextJ = 0; -< else -< nextJ = (dxJoint*)world->firstjoint->next; -< for (j=world->firstjoint; j; j=nextJ) { -< nextJ = (dxJoint*)j->next; -< // check if joint is breakable and broken -< if (j->breakInfo && j->breakInfo->flags & dJOINT_BROKEN) { -< // detach (break) the joint -< dJointAttach (j, 0, 0); -< // call the callback function if it is set -< if (j->breakInfo->callback) j->breakInfo->callback (j); -< // finally destroy the joint if the dJOINT_DELETE_ON_BREAK is set -< if (j->breakInfo->flags & dJOINT_DELETE_ON_BREAK) dJointDestroy (j); -< } -< } -< /*************************************************************************/ -931,933d911 -< /******************** breakable joint contribution ***********************/ -< j->breakInfo = 0; -< /*************************************************************************/ -1011,1013d988 -< /******************** breakable joint contribution ***********************/ -< if (j->breakInfo) delete j->breakInfo; -< /*************************************************************************/ diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/step.cpp.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/step.cpp.diff deleted file mode 100644 index dfc8c2f87b..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/step.cpp.diff +++ /dev/null @@ -1,130 +0,0 @@ -966,1066c966,989 -< /******************** breakable joint contribution ***********************/ -< // this saves us a few dereferences -< dxJointBreakInfo *jBI = joint[i]->breakInfo; -< // we need joint feedback if the joint is breakable or if the user -< // requested feedback. -< if (jBI||fb) { -< // we need feedback on the amount of force that this joint is -< // applying to the bodies. we use a slightly slower computation -< // that splits out the force components and puts them in the -< // feedback structure. -< dJointFeedback temp_fb; // temporary storage for joint feedback -< dReal data1[8],data2[8]; -< Multiply1_8q1 (data1, JJ, lambda+ofs[i], info[i].m); -< dReal *cf1 = cforce + 8*b1->tag; -< cf1[0] += (temp_fb.f1[0] = data1[0]); -< cf1[1] += (temp_fb.f1[1] = data1[1]); -< cf1[2] += (temp_fb.f1[2] = data1[2]); -< cf1[4] += (temp_fb.t1[0] = data1[4]); -< cf1[5] += (temp_fb.t1[1] = data1[5]); -< cf1[6] += (temp_fb.t1[2] = data1[6]); -< if (b2) { -< Multiply1_8q1 (data2, JJ + 8*info[i].m, lambda+ofs[i], info[i].m); -< dReal *cf2 = cforce + 8*b2->tag; -< cf2[0] += (temp_fb.f2[0] = data2[0]); -< cf2[1] += (temp_fb.f2[1] = data2[1]); -< cf2[2] += (temp_fb.f2[2] = data2[2]); -< cf2[4] += (temp_fb.t2[0] = data2[4]); -< cf2[5] += (temp_fb.t2[1] = data2[5]); -< cf2[6] += (temp_fb.t2[2] = data2[6]); -< } -< // if the user requested so we must copy the feedback information to -< // the feedback struct that the user suplied. -< if (fb) { -< // copy temp_fb to fb -< fb->f1[0] = temp_fb.f1[0]; -< fb->f1[1] = temp_fb.f1[1]; -< fb->f1[2] = temp_fb.f1[2]; -< fb->t1[0] = temp_fb.t1[0]; -< fb->t1[1] = temp_fb.t1[1]; -< fb->t1[2] = temp_fb.t1[2]; -< if (b2) { -< fb->f2[0] = temp_fb.f2[0]; -< fb->f2[1] = temp_fb.f2[1]; -< fb->f2[2] = temp_fb.f2[2]; -< fb->t2[0] = temp_fb.t2[0]; -< fb->t2[1] = temp_fb.t2[1]; -< fb->t2[2] = temp_fb.t2[2]; -< } -< } -< // if the joint is breakable we need to check the breaking conditions -< if (jBI) { -< dReal relCF1[3]; -< dReal relCT1[3]; -< // multiply the force and torque vectors by the rotation matrix of body 1 -< dMULTIPLY1_331 (&relCF1[0],b1->R,&temp_fb.f1[0]); -< dMULTIPLY1_331 (&relCT1[0],b1->R,&temp_fb.t1[0]); -< if (jBI->flags & dJOINT_BREAK_AT_B1_FORCE) { -< // check if the force is to high -< for (int i = 0; i < 3; i++) { -< if (relCF1[i] > jBI->b1MaxF[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< if (jBI->flags & dJOINT_BREAK_AT_B1_TORQUE) { -< // check if the torque is to high -< for (int i = 0; i < 3; i++) { -< if (relCT1[i] > jBI->b1MaxT[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< if (b2) { -< dReal relCF2[3]; -< dReal relCT2[3]; -< // multiply the force and torque vectors by the rotation matrix of body 2 -< dMULTIPLY1_331 (&relCF2[0],b2->R,&temp_fb.f2[0]); -< dMULTIPLY1_331 (&relCT2[0],b2->R,&temp_fb.t2[0]); -< if (jBI->flags & dJOINT_BREAK_AT_B2_FORCE) { -< // check if the force is to high -< for (int i = 0; i < 3; i++) { -< if (relCF2[i] > jBI->b2MaxF[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< if (jBI->flags & dJOINT_BREAK_AT_B2_TORQUE) { -< // check if the torque is to high -< for (int i = 0; i < 3; i++) { -< if (relCT2[i] > jBI->b2MaxT[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< } -< doneCheckingBreaks: -< ; ---- -> if (fb) { -> // the user has requested feedback on the amount of force that this -> // joint is applying to the bodies. we use a slightly slower -> // computation that splits out the force components and puts them -> // in the feedback structure. -> dReal data1[8],data2[8]; -> Multiply1_8q1 (data1, JJ, lambda+ofs[i], info[i].m); -> dReal *cf1 = cforce + 8*b1->tag; -> cf1[0] += (fb->f1[0] = data1[0]); -> cf1[1] += (fb->f1[1] = data1[1]); -> cf1[2] += (fb->f1[2] = data1[2]); -> cf1[4] += (fb->t1[0] = data1[4]); -> cf1[5] += (fb->t1[1] = data1[5]); -> cf1[6] += (fb->t1[2] = data1[6]); -> if (b2){ -> Multiply1_8q1 (data2, JJ + 8*info[i].m, lambda+ofs[i], info[i].m); -> dReal *cf2 = cforce + 8*b2->tag; -> cf2[0] += (fb->f2[0] = data2[0]); -> cf2[1] += (fb->f2[1] = data2[1]); -> cf2[2] += (fb->f2[2] = data2[2]); -> cf2[4] += (fb->t2[0] = data2[4]); -> cf2[5] += (fb->t2[1] = data2[5]); -> cf2[6] += (fb->t2[2] = data2[6]); -> } -1068,1069d990 -< } -< /*************************************************************************/ diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/stepfast.cpp.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/stepfast.cpp.diff deleted file mode 100644 index ed64cbaec9..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/stepfast.cpp.diff +++ /dev/null @@ -1,143 +0,0 @@ -587,598c587,593 -< /******************** breakable joint contribution ***********************/ -< // this saves us a few dereferences -< dxJointBreakInfo *jBI = joint->breakInfo; -< // we need joint feedback if the joint is breakable or if the user -< // requested feedback. -< if (jBI||fb) { -< // we need feedback on the amount of force that this joint is -< // applying to the bodies. we use a slightly slower computation -< // that splits out the force components and puts them in the -< // feedback structure. -< dJointFeedback temp_fb; // temporary storage for joint feedback -< dReal data1[8],data2[8]; ---- -> if (fb) -> { -> // the user has requested feedback on the amount of force that this -> // joint is applying to the bodies. we use a slightly slower -> // computation that splits out the force components and puts them -> // in the feedback structure. -> dReal data1[8], data2[8]; -603,608c598,603 -< cf1[0] = (temp_fb.f1[0] = data1[0]); -< cf1[1] = (temp_fb.f1[1] = data1[1]); -< cf1[2] = (temp_fb.f1[2] = data1[2]); -< cf1[4] = (temp_fb.t1[0] = data1[4]); -< cf1[5] = (temp_fb.t1[1] = data1[5]); -< cf1[6] = (temp_fb.t1[2] = data1[6]); ---- -> cf1[0] = (fb->f1[0] = data1[0]); -> cf1[1] = (fb->f1[1] = data1[1]); -> cf1[2] = (fb->f1[2] = data1[2]); -> cf1[4] = (fb->t1[0] = data1[4]); -> cf1[5] = (fb->t1[1] = data1[5]); -> cf1[6] = (fb->t1[2] = data1[6]); -614,691c609,614 -< cf2[0] = (temp_fb.f2[0] = data2[0]); -< cf2[1] = (temp_fb.f2[1] = data2[1]); -< cf2[2] = (temp_fb.f2[2] = data2[2]); -< cf2[4] = (temp_fb.t2[0] = data2[4]); -< cf2[5] = (temp_fb.t2[1] = data2[5]); -< cf2[6] = (temp_fb.t2[2] = data2[6]); -< } -< // if the user requested so we must copy the feedback information to -< // the feedback struct that the user suplied. -< if (fb) { -< // copy temp_fb to fb -< fb->f1[0] = temp_fb.f1[0]; -< fb->f1[1] = temp_fb.f1[1]; -< fb->f1[2] = temp_fb.f1[2]; -< fb->t1[0] = temp_fb.t1[0]; -< fb->t1[1] = temp_fb.t1[1]; -< fb->t1[2] = temp_fb.t1[2]; -< if (body[1]) { -< fb->f2[0] = temp_fb.f2[0]; -< fb->f2[1] = temp_fb.f2[1]; -< fb->f2[2] = temp_fb.f2[2]; -< fb->t2[0] = temp_fb.t2[0]; -< fb->t2[1] = temp_fb.t2[1]; -< fb->t2[2] = temp_fb.t2[2]; -< } -< } -< // if the joint is breakable we need to check the breaking conditions -< if (jBI) { -< dReal relCF1[3]; -< dReal relCT1[3]; -< // multiply the force and torque vectors by the rotation matrix of body 1 -< dMULTIPLY1_331 (&relCF1[0],body[0]->R,&temp_fb.f1[0]); -< dMULTIPLY1_331 (&relCT1[0],body[0]->R,&temp_fb.t1[0]); -< if (jBI->flags & dJOINT_BREAK_AT_B1_FORCE) { -< // check if the force is to high -< for (int i = 0; i < 3; i++) { -< if (relCF1[i] > jBI->b1MaxF[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< if (jBI->flags & dJOINT_BREAK_AT_B1_TORQUE) { -< // check if the torque is to high -< for (int i = 0; i < 3; i++) { -< if (relCT1[i] > jBI->b1MaxT[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< if (body[1]) { -< dReal relCF2[3]; -< dReal relCT2[3]; -< // multiply the force and torque vectors by the rotation matrix of body 2 -< dMULTIPLY1_331 (&relCF2[0],body[1]->R,&temp_fb.f2[0]); -< dMULTIPLY1_331 (&relCT2[0],body[1]->R,&temp_fb.t2[0]); -< if (jBI->flags & dJOINT_BREAK_AT_B2_FORCE) { -< // check if the force is to high -< for (int i = 0; i < 3; i++) { -< if (relCF2[i] > jBI->b2MaxF[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< if (jBI->flags & dJOINT_BREAK_AT_B2_TORQUE) { -< // check if the torque is to high -< for (int i = 0; i < 3; i++) { -< if (relCT2[i] > jBI->b2MaxT[i]) { -< jBI->flags |= dJOINT_BROKEN; -< goto doneCheckingBreaks; -< } -< } -< } -< } -< doneCheckingBreaks: -< ; ---- -> cf2[0] = (fb->f2[0] = data2[0]); -> cf2[1] = (fb->f2[1] = data2[1]); -> cf2[2] = (fb->f2[2] = data2[2]); -> cf2[4] = (fb->t2[0] = data2[4]); -> cf2[5] = (fb->t2[1] = data2[5]); -> cf2[6] = (fb->t2[2] = data2[6]); -694d616 -< /*************************************************************************/ -1178,1196d1099 -< /******************** breakable joint contribution ***********************/ -< dxJoint* nextJ; -< if (!world->firstjoint) -< nextJ = 0; -< else -< nextJ = (dxJoint*)world->firstjoint->next; -< for (j=world->firstjoint; j; j=nextJ) { -< nextJ = (dxJoint*)j->next; -< // check if joint is breakable and broken -< if (j->breakInfo && j->breakInfo->flags & dJOINT_BROKEN) { -< // detach (break) the joint -< dJointAttach (j, 0, 0); -< // call the callback function if it is set -< if (j->breakInfo->callback) j->breakInfo->callback (j); -< // finally destroy the joint if the dJOINT_DELETE_ON_BREAK is set -< if (j->breakInfo->flags & dJOINT_DELETE_ON_BREAK) dJointDestroy (j); -< } -< } -< /*************************************************************************/ diff --git a/libraries/ode-0.9/contrib/BreakableJoints/diff/test_buggy.cpp.diff b/libraries/ode-0.9/contrib/BreakableJoints/diff/test_buggy.cpp.diff deleted file mode 100644 index 65770da88c..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/diff/test_buggy.cpp.diff +++ /dev/null @@ -1,16 +0,0 @@ -266,270d265 -< -< // breakable joints contribution -< dJointSetBreakable (joint[i], 1); -< dJointSetBreakMode (joint[i], dJOINT_BREAK_AT_FORCE); -< dJointSetBreakForce (joint[i], 0.5); -298c293 -< ground_box = dCreateBox (space,2,1.5,5); ---- -> ground_box = dCreateBox (space,2,1.5,1); -300,301c295,296 -< dRFromAxisAndAngle (R,0,1,0,-0.85); -< dGeomSetPosition (ground_box,5,0,-1); ---- -> dRFromAxisAndAngle (R,0,1,0,-0.15); -> dGeomSetPosition (ground_box,2,0,-0.34); diff --git a/libraries/ode-0.9/contrib/BreakableJoints/joint.cpp b/libraries/ode-0.9/contrib/BreakableJoints/joint.cpp deleted file mode 100644 index 2c724f84e7..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/joint.cpp +++ /dev/null @@ -1,2803 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -design note: the general principle for giving a joint the option of connecting -to the static environment (i.e. the absolute frame) is to check the second -body (joint->node[1].body), and if it is zero then behave as if its body -transform is the identity. - -*/ - -#include -#include -#include -#include "joint.h" - -//**************************************************************************** -// externs - -extern "C" void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz); -extern "C" void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz); - -//**************************************************************************** -// utility - -// set three "ball-and-socket" rows in the constraint equation, and the -// corresponding right hand side. - -static inline void setBall (dxJoint *joint, dxJoint::Info2 *info, - dVector3 anchor1, dVector3 anchor2) -{ - // anchor points in global coordinates with respect to body PORs. - dVector3 a1,a2; - - int s = info->rowskip; - - // set jacobian - info->J1l[0] = 1; - info->J1l[s+1] = 1; - info->J1l[2*s+2] = 1; - dMULTIPLY0_331 (a1,joint->node[0].body->R,anchor1); - dCROSSMAT (info->J1a,a1,s,-,+); - if (joint->node[1].body) { - info->J2l[0] = -1; - info->J2l[s+1] = -1; - info->J2l[2*s+2] = -1; - dMULTIPLY0_331 (a2,joint->node[1].body->R,anchor2); - dCROSSMAT (info->J2a,a2,s,+,-); - } - - // set right hand side - dReal k = info->fps * info->erp; - if (joint->node[1].body) { - for (int j=0; j<3; j++) { - info->c[j] = k * (a2[j] + joint->node[1].body->pos[j] - - a1[j] - joint->node[0].body->pos[j]); - } - } - else { - for (int j=0; j<3; j++) { - info->c[j] = k * (anchor2[j] - a1[j] - - joint->node[0].body->pos[j]); - } - } -} - - -// this is like setBall(), except that `axis' is a unit length vector -// (in global coordinates) that should be used for the first jacobian -// position row (the other two row vectors will be derived from this). -// `erp1' is the erp value to use along the axis. - -static inline void setBall2 (dxJoint *joint, dxJoint::Info2 *info, - dVector3 anchor1, dVector3 anchor2, - dVector3 axis, dReal erp1) -{ - // anchor points in global coordinates with respect to body PORs. - dVector3 a1,a2; - - int i,s = info->rowskip; - - // get vectors normal to the axis. in setBall() axis,q1,q2 is [1 0 0], - // [0 1 0] and [0 0 1], which makes everything much easier. - dVector3 q1,q2; - dPlaneSpace (axis,q1,q2); - - // set jacobian - for (i=0; i<3; i++) info->J1l[i] = axis[i]; - for (i=0; i<3; i++) info->J1l[s+i] = q1[i]; - for (i=0; i<3; i++) info->J1l[2*s+i] = q2[i]; - dMULTIPLY0_331 (a1,joint->node[0].body->R,anchor1); - dCROSS (info->J1a,=,a1,axis); - dCROSS (info->J1a+s,=,a1,q1); - dCROSS (info->J1a+2*s,=,a1,q2); - if (joint->node[1].body) { - for (i=0; i<3; i++) info->J2l[i] = -axis[i]; - for (i=0; i<3; i++) info->J2l[s+i] = -q1[i]; - for (i=0; i<3; i++) info->J2l[2*s+i] = -q2[i]; - dMULTIPLY0_331 (a2,joint->node[1].body->R,anchor2); - dCROSS (info->J2a,= -,a2,axis); - dCROSS (info->J2a+s,= -,a2,q1); - dCROSS (info->J2a+2*s,= -,a2,q2); - } - - // set right hand side - measure error along (axis,q1,q2) - dReal k1 = info->fps * erp1; - dReal k = info->fps * info->erp; - - for (i=0; i<3; i++) a1[i] += joint->node[0].body->pos[i]; - if (joint->node[1].body) { - for (i=0; i<3; i++) a2[i] += joint->node[1].body->pos[i]; - info->c[0] = k1 * (dDOT(axis,a2) - dDOT(axis,a1)); - info->c[1] = k * (dDOT(q1,a2) - dDOT(q1,a1)); - info->c[2] = k * (dDOT(q2,a2) - dDOT(q2,a1)); - } - else { - info->c[0] = k1 * (dDOT(axis,anchor2) - dDOT(axis,a1)); - info->c[1] = k * (dDOT(q1,anchor2) - dDOT(q1,a1)); - info->c[2] = k * (dDOT(q2,anchor2) - dDOT(q2,a1)); - } -} - - -// set three orientation rows in the constraint equation, and the -// corresponding right hand side. - -static void setFixedOrientation(dxJoint *joint, dxJoint::Info2 *info, dQuaternion qrel, int start_row) -{ - int s = info->rowskip; - int start_index = start_row * s; - - // 3 rows to make body rotations equal - info->J1a[start_index] = 1; - info->J1a[start_index + s + 1] = 1; - info->J1a[start_index + s*2+2] = 1; - if (joint->node[1].body) { - info->J2a[start_index] = -1; - info->J2a[start_index + s+1] = -1; - info->J2a[start_index + s*2+2] = -1; - } - - // compute the right hand side. the first three elements will result in - // relative angular velocity of the two bodies - this is set to bring them - // back into alignment. the correcting angular velocity is - // |angular_velocity| = angle/time = erp*theta / stepsize - // = (erp*fps) * theta - // angular_velocity = |angular_velocity| * u - // = (erp*fps) * theta * u - // where rotation along unit length axis u by theta brings body 2's frame - // to qrel with respect to body 1's frame. using a small angle approximation - // for sin(), this gives - // angular_velocity = (erp*fps) * 2 * v - // where the quaternion of the relative rotation between the two bodies is - // q = [cos(theta/2) sin(theta/2)*u] = [s v] - - // get qerr = relative rotation (rotation error) between two bodies - dQuaternion qerr,e; - if (joint->node[1].body) { - dQuaternion qq; - dQMultiply1 (qq,joint->node[0].body->q,joint->node[1].body->q); - dQMultiply2 (qerr,qq,qrel); - } - else { - dQMultiply3 (qerr,joint->node[0].body->q,qrel); - } - if (qerr[0] < 0) { - qerr[1] = -qerr[1]; // adjust sign of qerr to make theta small - qerr[2] = -qerr[2]; - qerr[3] = -qerr[3]; - } - dMULTIPLY0_331 (e,joint->node[0].body->R,qerr+1); // @@@ bad SIMD padding! - dReal k = info->fps * info->erp; - info->c[start_row] = 2*k * e[0]; - info->c[start_row+1] = 2*k * e[1]; - info->c[start_row+2] = 2*k * e[2]; -} - - -// compute anchor points relative to bodies - -static void setAnchors (dxJoint *j, dReal x, dReal y, dReal z, - dVector3 anchor1, dVector3 anchor2) -{ - if (j->node[0].body) { - dReal q[4]; - q[0] = x - j->node[0].body->pos[0]; - q[1] = y - j->node[0].body->pos[1]; - q[2] = z - j->node[0].body->pos[2]; - q[3] = 0; - dMULTIPLY1_331 (anchor1,j->node[0].body->R,q); - if (j->node[1].body) { - q[0] = x - j->node[1].body->pos[0]; - q[1] = y - j->node[1].body->pos[1]; - q[2] = z - j->node[1].body->pos[2]; - q[3] = 0; - dMULTIPLY1_331 (anchor2,j->node[1].body->R,q); - } - else { - anchor2[0] = x; - anchor2[1] = y; - anchor2[2] = z; - } - } - anchor1[3] = 0; - anchor2[3] = 0; -} - - -// compute axes relative to bodies. either axis1 or axis2 can be 0. - -static void setAxes (dxJoint *j, dReal x, dReal y, dReal z, - dVector3 axis1, dVector3 axis2) -{ - if (j->node[0].body) { - dReal q[4]; - q[0] = x; - q[1] = y; - q[2] = z; - q[3] = 0; - dNormalize3 (q); - if (axis1) { - dMULTIPLY1_331 (axis1,j->node[0].body->R,q); - axis1[3] = 0; - } - if (axis2) { - if (j->node[1].body) { - dMULTIPLY1_331 (axis2,j->node[1].body->R,q); - } - else { - axis2[0] = x; - axis2[1] = y; - axis2[2] = z; - } - axis2[3] = 0; - } - } -} - - -static void getAnchor (dxJoint *j, dVector3 result, dVector3 anchor1) -{ - if (j->node[0].body) { - dMULTIPLY0_331 (result,j->node[0].body->R,anchor1); - result[0] += j->node[0].body->pos[0]; - result[1] += j->node[0].body->pos[1]; - result[2] += j->node[0].body->pos[2]; - } -} - - -static void getAnchor2 (dxJoint *j, dVector3 result, dVector3 anchor2) -{ - if (j->node[1].body) { - dMULTIPLY0_331 (result,j->node[1].body->R,anchor2); - result[0] += j->node[1].body->pos[0]; - result[1] += j->node[1].body->pos[1]; - result[2] += j->node[1].body->pos[2]; - } - else { - result[0] = anchor2[0]; - result[1] = anchor2[1]; - result[2] = anchor2[2]; - } -} - - -static void getAxis (dxJoint *j, dVector3 result, dVector3 axis1) -{ - if (j->node[0].body) { - dMULTIPLY0_331 (result,j->node[0].body->R,axis1); - } -} - - -static void getAxis2 (dxJoint *j, dVector3 result, dVector3 axis2) -{ - if (j->node[1].body) { - dMULTIPLY0_331 (result,j->node[1].body->R,axis2); - } - else { - result[0] = axis2[0]; - result[1] = axis2[1]; - result[2] = axis2[2]; - } -} - - -static dReal getHingeAngleFromRelativeQuat (dQuaternion qrel, dVector3 axis) -{ - // the angle between the two bodies is extracted from the quaternion that - // represents the relative rotation between them. recall that a quaternion - // q is: - // [s,v] = [ cos(theta/2) , sin(theta/2) * u ] - // where s is a scalar and v is a 3-vector. u is a unit length axis and - // theta is a rotation along that axis. we can get theta/2 by: - // theta/2 = atan2 ( sin(theta/2) , cos(theta/2) ) - // but we can't get sin(theta/2) directly, only its absolute value, i.e.: - // |v| = |sin(theta/2)| * |u| - // = |sin(theta/2)| - // using this value will have a strange effect. recall that there are two - // quaternion representations of a given rotation, q and -q. typically as - // a body rotates along the axis it will go through a complete cycle using - // one representation and then the next cycle will use the other - // representation. this corresponds to u pointing in the direction of the - // hinge axis and then in the opposite direction. the result is that theta - // will appear to go "backwards" every other cycle. here is a fix: if u - // points "away" from the direction of the hinge (motor) axis (i.e. more - // than 90 degrees) then use -q instead of q. this represents the same - // rotation, but results in the cos(theta/2) value being sign inverted. - - // extract the angle from the quaternion. cost2 = cos(theta/2), - // sint2 = |sin(theta/2)| - dReal cost2 = qrel[0]; - dReal sint2 = dSqrt (qrel[1]*qrel[1]+qrel[2]*qrel[2]+qrel[3]*qrel[3]); - dReal theta = (dDOT(qrel+1,axis) >= 0) ? // @@@ padding assumptions - (2 * dAtan2(sint2,cost2)) : // if u points in direction of axis - (2 * dAtan2(sint2,-cost2)); // if u points in opposite direction - - // the angle we get will be between 0..2*pi, but we want to return angles - // between -pi..pi - if (theta > M_PI) theta -= 2*M_PI; - - // the angle we've just extracted has the wrong sign - theta = -theta; - - return theta; -} - - -// given two bodies (body1,body2), the hinge axis that they are connected by -// w.r.t. body1 (axis), and the initial relative orientation between them -// (q_initial), return the relative rotation angle. the initial relative -// orientation corresponds to an angle of zero. if body2 is 0 then measure the -// angle between body1 and the static frame. -// -// this will not return the correct angle if the bodies rotate along any axis -// other than the given hinge axis. - -static dReal getHingeAngle (dxBody *body1, dxBody *body2, dVector3 axis, - dQuaternion q_initial) -{ - // get qrel = relative rotation between the two bodies - dQuaternion qrel; - if (body2) { - dQuaternion qq; - dQMultiply1 (qq,body1->q,body2->q); - dQMultiply2 (qrel,qq,q_initial); - } - else { - // pretend body2->q is the identity - dQMultiply3 (qrel,body1->q,q_initial); - } - - return getHingeAngleFromRelativeQuat (qrel,axis); -} - -//**************************************************************************** -// dxJointLimitMotor - -void dxJointLimitMotor::init (dxWorld *world) -{ - vel = 0; - fmax = 0; - lostop = -dInfinity; - histop = dInfinity; - fudge_factor = 1; - normal_cfm = world->global_cfm; - stop_erp = world->global_erp; - stop_cfm = world->global_cfm; - bounce = 0; - limit = 0; - limit_err = 0; -} - - -void dxJointLimitMotor::set (int num, dReal value) -{ - switch (num) { - case dParamLoStop: - if (value <= histop) lostop = value; - break; - case dParamHiStop: - if (value >= lostop) histop = value; - break; - case dParamVel: - vel = value; - break; - case dParamFMax: - if (value >= 0) fmax = value; - break; - case dParamFudgeFactor: - if (value >= 0 && value <= 1) fudge_factor = value; - break; - case dParamBounce: - bounce = value; - break; - case dParamCFM: - normal_cfm = value; - break; - case dParamStopERP: - stop_erp = value; - break; - case dParamStopCFM: - stop_cfm = value; - break; - } -} - - -dReal dxJointLimitMotor::get (int num) -{ - switch (num) { - case dParamLoStop: return lostop; - case dParamHiStop: return histop; - case dParamVel: return vel; - case dParamFMax: return fmax; - case dParamFudgeFactor: return fudge_factor; - case dParamBounce: return bounce; - case dParamCFM: return normal_cfm; - case dParamStopERP: return stop_erp; - case dParamStopCFM: return stop_cfm; - default: return 0; - } -} - - -int dxJointLimitMotor::testRotationalLimit (dReal angle) -{ - if (angle <= lostop) { - limit = 1; - limit_err = angle - lostop; - return 1; - } - else if (angle >= histop) { - limit = 2; - limit_err = angle - histop; - return 1; - } - else { - limit = 0; - return 0; - } -} - - -int dxJointLimitMotor::addLimot (dxJoint *joint, - dxJoint::Info2 *info, int row, - dVector3 ax1, int rotational) -{ - int srow = row * info->rowskip; - - // if the joint is powered, or has joint limits, add in the extra row - int powered = fmax > 0; - if (powered || limit) { - dReal *J1 = rotational ? info->J1a : info->J1l; - dReal *J2 = rotational ? info->J2a : info->J2l; - - J1[srow+0] = ax1[0]; - J1[srow+1] = ax1[1]; - J1[srow+2] = ax1[2]; - if (joint->node[1].body) { - J2[srow+0] = -ax1[0]; - J2[srow+1] = -ax1[1]; - J2[srow+2] = -ax1[2]; - } - - // linear limot torque decoupling step: - // - // if this is a linear limot (e.g. from a slider), we have to be careful - // that the linear constraint forces (+/- ax1) applied to the two bodies - // do not create a torque couple. in other words, the points that the - // constraint force is applied at must lie along the same ax1 axis. - // a torque couple will result in powered or limited slider-jointed free - // bodies from gaining angular momentum. - // the solution used here is to apply the constraint forces at the point - // halfway between the body centers. there is no penalty (other than an - // extra tiny bit of computation) in doing this adjustment. note that we - // only need to do this if the constraint connects two bodies. - - dVector3 ltd; // Linear Torque Decoupling vector (a torque) - if (!rotational && joint->node[1].body) { - dVector3 c; - c[0]=REAL(0.5)*(joint->node[1].body->pos[0]-joint->node[0].body->pos[0]); - c[1]=REAL(0.5)*(joint->node[1].body->pos[1]-joint->node[0].body->pos[1]); - c[2]=REAL(0.5)*(joint->node[1].body->pos[2]-joint->node[0].body->pos[2]); - dCROSS (ltd,=,c,ax1); - info->J1a[srow+0] = ltd[0]; - info->J1a[srow+1] = ltd[1]; - info->J1a[srow+2] = ltd[2]; - info->J2a[srow+0] = ltd[0]; - info->J2a[srow+1] = ltd[1]; - info->J2a[srow+2] = ltd[2]; - } - - // if we're limited low and high simultaneously, the joint motor is - // ineffective - if (limit && (lostop == histop)) powered = 0; - - if (powered) { - info->cfm[row] = normal_cfm; - if (! limit) { - info->c[row] = vel; - info->lo[row] = -fmax; - info->hi[row] = fmax; - } - else { - // the joint is at a limit, AND is being powered. if the joint is - // being powered into the limit then we apply the maximum motor force - // in that direction, because the motor is working against the - // immovable limit. if the joint is being powered away from the limit - // then we have problems because actually we need *two* lcp - // constraints to handle this case. so we fake it and apply some - // fraction of the maximum force. the fraction to use can be set as - // a fudge factor. - - dReal fm = fmax; - if (vel > 0) fm = -fm; - - // if we're powering away from the limit, apply the fudge factor - if ((limit==1 && vel > 0) || (limit==2 && vel < 0)) fm *= fudge_factor; - - if (rotational) { - dBodyAddTorque (joint->node[0].body,-fm*ax1[0],-fm*ax1[1], - -fm*ax1[2]); - if (joint->node[1].body) - dBodyAddTorque (joint->node[1].body,fm*ax1[0],fm*ax1[1],fm*ax1[2]); - } - else { - dBodyAddForce (joint->node[0].body,-fm*ax1[0],-fm*ax1[1],-fm*ax1[2]); - if (joint->node[1].body) { - dBodyAddForce (joint->node[1].body,fm*ax1[0],fm*ax1[1],fm*ax1[2]); - - // linear limot torque decoupling step: refer to above discussion - dBodyAddTorque (joint->node[0].body,-fm*ltd[0],-fm*ltd[1], - -fm*ltd[2]); - dBodyAddTorque (joint->node[1].body,-fm*ltd[0],-fm*ltd[1], - -fm*ltd[2]); - } - } - } - } - - if (limit) { - dReal k = info->fps * stop_erp; - info->c[row] = -k * limit_err; - info->cfm[row] = stop_cfm; - - if (lostop == histop) { - // limited low and high simultaneously - info->lo[row] = -dInfinity; - info->hi[row] = dInfinity; - } - else { - if (limit == 1) { - // low limit - info->lo[row] = 0; - info->hi[row] = dInfinity; - } - else { - // high limit - info->lo[row] = -dInfinity; - info->hi[row] = 0; - } - - // deal with bounce - if (bounce > 0) { - // calculate joint velocity - dReal vel; - if (rotational) { - vel = dDOT(joint->node[0].body->avel,ax1); - if (joint->node[1].body) - vel -= dDOT(joint->node[1].body->avel,ax1); - } - else { - vel = dDOT(joint->node[0].body->lvel,ax1); - if (joint->node[1].body) - vel -= dDOT(joint->node[1].body->lvel,ax1); - } - - // only apply bounce if the velocity is incoming, and if the - // resulting c[] exceeds what we already have. - if (limit == 1) { - // low limit - if (vel < 0) { - dReal newc = -bounce * vel; - if (newc > info->c[row]) info->c[row] = newc; - } - } - else { - // high limit - all those computations are reversed - if (vel > 0) { - dReal newc = -bounce * vel; - if (newc < info->c[row]) info->c[row] = newc; - } - } - } - } - } - return 1; - } - else return 0; -} - -//**************************************************************************** -// ball and socket - -static void ballInit (dxJointBall *j) -{ - dSetZero (j->anchor1,4); - dSetZero (j->anchor2,4); -} - - -static void ballGetInfo1 (dxJointBall *j, dxJoint::Info1 *info) -{ - info->m = 3; - info->nub = 3; -} - - -static void ballGetInfo2 (dxJointBall *joint, dxJoint::Info2 *info) -{ - setBall (joint,info,joint->anchor1,joint->anchor2); -} - - -extern "C" void dJointSetBallAnchor (dxJointBall *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dball_vtable,"joint is not a ball"); - setAnchors (joint,x,y,z,joint->anchor1,joint->anchor2); -} - - -extern "C" void dJointGetBallAnchor (dxJointBall *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dball_vtable,"joint is not a ball"); - if (joint->flags & dJOINT_REVERSE) - getAnchor2 (joint,result,joint->anchor2); - else - getAnchor (joint,result,joint->anchor1); -} - - -extern "C" void dJointGetBallAnchor2 (dxJointBall *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dball_vtable,"joint is not a ball"); - if (joint->flags & dJOINT_REVERSE) - getAnchor (joint,result,joint->anchor1); - else - getAnchor2 (joint,result,joint->anchor2); -} - - -dxJoint::Vtable __dball_vtable = { - sizeof(dxJointBall), - (dxJoint::init_fn*) ballInit, - (dxJoint::getInfo1_fn*) ballGetInfo1, - (dxJoint::getInfo2_fn*) ballGetInfo2, - dJointTypeBall}; - -//**************************************************************************** -// hinge - -static void hingeInit (dxJointHinge *j) -{ - dSetZero (j->anchor1,4); - dSetZero (j->anchor2,4); - dSetZero (j->axis1,4); - j->axis1[0] = 1; - dSetZero (j->axis2,4); - j->axis2[0] = 1; - dSetZero (j->qrel,4); - j->limot.init (j->world); -} - - -static void hingeGetInfo1 (dxJointHinge *j, dxJoint::Info1 *info) -{ - info->nub = 5; - - // see if joint is powered - if (j->limot.fmax > 0) - info->m = 6; // powered hinge needs an extra constraint row - else info->m = 5; - - // see if we're at a joint limit. - if ((j->limot.lostop >= -M_PI || j->limot.histop <= M_PI) && - j->limot.lostop <= j->limot.histop) { - dReal angle = getHingeAngle (j->node[0].body,j->node[1].body,j->axis1, - j->qrel); - if (j->limot.testRotationalLimit (angle)) info->m = 6; - } -} - - -static void hingeGetInfo2 (dxJointHinge *joint, dxJoint::Info2 *info) -{ - // set the three ball-and-socket rows - setBall (joint,info,joint->anchor1,joint->anchor2); - - // set the two hinge rows. the hinge axis should be the only unconstrained - // rotational axis, the angular velocity of the two bodies perpendicular to - // the hinge axis should be equal. thus the constraint equations are - // p*w1 - p*w2 = 0 - // q*w1 - q*w2 = 0 - // where p and q are unit vectors normal to the hinge axis, and w1 and w2 - // are the angular velocity vectors of the two bodies. - - dVector3 ax1; // length 1 joint axis in global coordinates, from 1st body - dVector3 p,q; // plane space vectors for ax1 - dMULTIPLY0_331 (ax1,joint->node[0].body->R,joint->axis1); - dPlaneSpace (ax1,p,q); - - int s3=3*info->rowskip; - int s4=4*info->rowskip; - - info->J1a[s3+0] = p[0]; - info->J1a[s3+1] = p[1]; - info->J1a[s3+2] = p[2]; - info->J1a[s4+0] = q[0]; - info->J1a[s4+1] = q[1]; - info->J1a[s4+2] = q[2]; - - if (joint->node[1].body) { - info->J2a[s3+0] = -p[0]; - info->J2a[s3+1] = -p[1]; - info->J2a[s3+2] = -p[2]; - info->J2a[s4+0] = -q[0]; - info->J2a[s4+1] = -q[1]; - info->J2a[s4+2] = -q[2]; - } - - // compute the right hand side of the constraint equation. set relative - // body velocities along p and q to bring the hinge back into alignment. - // if ax1,ax2 are the unit length hinge axes as computed from body1 and - // body2, we need to rotate both bodies along the axis u = (ax1 x ax2). - // if `theta' is the angle between ax1 and ax2, we need an angular velocity - // along u to cover angle erp*theta in one step : - // |angular_velocity| = angle/time = erp*theta / stepsize - // = (erp*fps) * theta - // angular_velocity = |angular_velocity| * (ax1 x ax2) / |ax1 x ax2| - // = (erp*fps) * theta * (ax1 x ax2) / sin(theta) - // ...as ax1 and ax2 are unit length. if theta is smallish, - // theta ~= sin(theta), so - // angular_velocity = (erp*fps) * (ax1 x ax2) - // ax1 x ax2 is in the plane space of ax1, so we project the angular - // velocity to p and q to find the right hand side. - - dVector3 ax2,b; - if (joint->node[1].body) { - dMULTIPLY0_331 (ax2,joint->node[1].body->R,joint->axis2); - } - else { - ax2[0] = joint->axis2[0]; - ax2[1] = joint->axis2[1]; - ax2[2] = joint->axis2[2]; - } - dCROSS (b,=,ax1,ax2); - dReal k = info->fps * info->erp; - info->c[3] = k * dDOT(b,p); - info->c[4] = k * dDOT(b,q); - - // if the hinge is powered, or has joint limits, add in the stuff - joint->limot.addLimot (joint,info,5,ax1,1); -} - - -// compute initial relative rotation body1 -> body2, or env -> body1 - -static void hingeComputeInitialRelativeRotation (dxJointHinge *joint) -{ - if (joint->node[0].body) { - if (joint->node[1].body) { - dQMultiply1 (joint->qrel,joint->node[0].body->q,joint->node[1].body->q); - } - else { - // set joint->qrel to the transpose of the first body q - joint->qrel[0] = joint->node[0].body->q[0]; - for (int i=1; i<4; i++) joint->qrel[i] = -joint->node[0].body->q[i]; - } - } -} - - -extern "C" void dJointSetHingeAnchor (dxJointHinge *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - setAnchors (joint,x,y,z,joint->anchor1,joint->anchor2); - hingeComputeInitialRelativeRotation (joint); -} - - -extern "C" void dJointSetHingeAxis (dxJointHinge *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - setAxes (joint,x,y,z,joint->axis1,joint->axis2); - hingeComputeInitialRelativeRotation (joint); -} - - -extern "C" void dJointGetHingeAnchor (dxJointHinge *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - if (joint->flags & dJOINT_REVERSE) - getAnchor2 (joint,result,joint->anchor2); - else - getAnchor (joint,result,joint->anchor1); -} - - -extern "C" void dJointGetHingeAnchor2 (dxJointHinge *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - if (joint->flags & dJOINT_REVERSE) - getAnchor (joint,result,joint->anchor1); - else - getAnchor2 (joint,result,joint->anchor2); -} - - -extern "C" void dJointGetHingeAxis (dxJointHinge *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - getAxis (joint,result,joint->axis1); -} - - -extern "C" void dJointSetHingeParam (dxJointHinge *joint, - int parameter, dReal value) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - joint->limot.set (parameter,value); -} - - -extern "C" dReal dJointGetHingeParam (dxJointHinge *joint, int parameter) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - return joint->limot.get (parameter); -} - - -extern "C" dReal dJointGetHingeAngle (dxJointHinge *joint) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a hinge"); - if (joint->node[0].body) { - dReal ang = getHingeAngle (joint->node[0].body,joint->node[1].body,joint->axis1, - joint->qrel); - if (joint->flags & dJOINT_REVERSE) - return -ang; - else - return ang; - } - else return 0; -} - - -extern "C" dReal dJointGetHingeAngleRate (dxJointHinge *joint) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a Hinge"); - if (joint->node[0].body) { - dVector3 axis; - dMULTIPLY0_331 (axis,joint->node[0].body->R,joint->axis1); - dReal rate = dDOT(axis,joint->node[0].body->avel); - if (joint->node[1].body) rate -= dDOT(axis,joint->node[1].body->avel); - if (joint->flags & dJOINT_REVERSE) rate = - rate; - return rate; - } - else return 0; -} - - -extern "C" void dJointAddHingeTorque (dxJointHinge *joint, dReal torque) -{ - dVector3 axis; - dAASSERT(joint); - dUASSERT(joint->vtable == &__dhinge_vtable,"joint is not a Hinge"); - - if (joint->flags & dJOINT_REVERSE) - torque = -torque; - - getAxis (joint,axis,joint->axis1); - axis[0] *= torque; - axis[1] *= torque; - axis[2] *= torque; - - if (joint->node[0].body != 0) - dBodyAddTorque (joint->node[0].body, axis[0], axis[1], axis[2]); - if (joint->node[1].body != 0) - dBodyAddTorque(joint->node[1].body, -axis[0], -axis[1], -axis[2]); -} - - -dxJoint::Vtable __dhinge_vtable = { - sizeof(dxJointHinge), - (dxJoint::init_fn*) hingeInit, - (dxJoint::getInfo1_fn*) hingeGetInfo1, - (dxJoint::getInfo2_fn*) hingeGetInfo2, - dJointTypeHinge}; - -//**************************************************************************** -// slider - -static void sliderInit (dxJointSlider *j) -{ - dSetZero (j->axis1,4); - j->axis1[0] = 1; - dSetZero (j->qrel,4); - dSetZero (j->offset,4); - j->limot.init (j->world); -} - - -extern "C" dReal dJointGetSliderPosition (dxJointSlider *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - - // get axis1 in global coordinates - dVector3 ax1,q; - dMULTIPLY0_331 (ax1,joint->node[0].body->R,joint->axis1); - - if (joint->node[1].body) { - // get body2 + offset point in global coordinates - dMULTIPLY0_331 (q,joint->node[1].body->R,joint->offset); - for (int i=0; i<3; i++) q[i] = joint->node[0].body->pos[i] - q[i] - - joint->node[1].body->pos[i]; - } - else { - for (int i=0; i<3; i++) q[i] = joint->node[0].body->pos[i] - - joint->offset[i]; - - } - return dDOT(ax1,q); -} - - -extern "C" dReal dJointGetSliderPositionRate (dxJointSlider *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - - // get axis1 in global coordinates - dVector3 ax1; - dMULTIPLY0_331 (ax1,joint->node[0].body->R,joint->axis1); - - if (joint->node[1].body) { - return dDOT(ax1,joint->node[0].body->lvel) - - dDOT(ax1,joint->node[1].body->lvel); - } - else { - return dDOT(ax1,joint->node[0].body->lvel); - } -} - - -static void sliderGetInfo1 (dxJointSlider *j, dxJoint::Info1 *info) -{ - info->nub = 5; - - // see if joint is powered - if (j->limot.fmax > 0) - info->m = 6; // powered slider needs an extra constraint row - else info->m = 5; - - // see if we're at a joint limit. - j->limot.limit = 0; - if ((j->limot.lostop > -dInfinity || j->limot.histop < dInfinity) && - j->limot.lostop <= j->limot.histop) { - // measure joint position - dReal pos = dJointGetSliderPosition (j); - if (pos <= j->limot.lostop) { - j->limot.limit = 1; - j->limot.limit_err = pos - j->limot.lostop; - info->m = 6; - } - else if (pos >= j->limot.histop) { - j->limot.limit = 2; - j->limot.limit_err = pos - j->limot.histop; - info->m = 6; - } - } -} - - -static void sliderGetInfo2 (dxJointSlider *joint, dxJoint::Info2 *info) -{ - int i,s = info->rowskip; - int s2=2*s,s3=3*s,s4=4*s; - - // pull out pos and R for both bodies. also get the `connection' - // vector pos2-pos1. - - dReal *pos1,*pos2,*R1,*R2; - dVector3 c; - pos1 = joint->node[0].body->pos; - R1 = joint->node[0].body->R; - if (joint->node[1].body) { - pos2 = joint->node[1].body->pos; - R2 = joint->node[1].body->R; - for (i=0; i<3; i++) c[i] = pos2[i] - pos1[i]; - } - else { - pos2 = 0; - R2 = 0; - } - - // 3 rows to make body rotations equal - setFixedOrientation(joint, info, joint->qrel, 0); - - // remaining two rows. we want: vel2 = vel1 + w1 x c ... but this would - // result in three equations, so we project along the planespace vectors - // so that sliding along the slider axis is disregarded. for symmetry we - // also substitute (w1+w2)/2 for w1, as w1 is supposed to equal w2. - - dVector3 ax1; // joint axis in global coordinates (unit length) - dVector3 p,q; // plane space of ax1 - dMULTIPLY0_331 (ax1,R1,joint->axis1); - dPlaneSpace (ax1,p,q); - if (joint->node[1].body) { - dVector3 tmp; - dCROSS (tmp, = REAL(0.5) * ,c,p); - for (i=0; i<3; i++) info->J2a[s3+i] = tmp[i]; - for (i=0; i<3; i++) info->J2a[s3+i] = tmp[i]; - dCROSS (tmp, = REAL(0.5) * ,c,q); - for (i=0; i<3; i++) info->J2a[s4+i] = tmp[i]; - for (i=0; i<3; i++) info->J2a[s4+i] = tmp[i]; - for (i=0; i<3; i++) info->J2l[s3+i] = -p[i]; - for (i=0; i<3; i++) info->J2l[s4+i] = -q[i]; - } - for (i=0; i<3; i++) info->J1l[s3+i] = p[i]; - for (i=0; i<3; i++) info->J1l[s4+i] = q[i]; - - // compute last two elements of right hand side. we want to align the offset - // point (in body 2's frame) with the center of body 1. - dReal k = info->fps * info->erp; - if (joint->node[1].body) { - dVector3 ofs; // offset point in global coordinates - dMULTIPLY0_331 (ofs,R2,joint->offset); - for (i=0; i<3; i++) c[i] += ofs[i]; - info->c[3] = k * dDOT(p,c); - info->c[4] = k * dDOT(q,c); - } - else { - dVector3 ofs; // offset point in global coordinates - for (i=0; i<3; i++) ofs[i] = joint->offset[i] - pos1[i]; - info->c[3] = k * dDOT(p,ofs); - info->c[4] = k * dDOT(q,ofs); - } - - // if the slider is powered, or has joint limits, add in the extra row - joint->limot.addLimot (joint,info,5,ax1,0); -} - - -extern "C" void dJointSetSliderAxis (dxJointSlider *joint, - dReal x, dReal y, dReal z) -{ - int i; - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - setAxes (joint,x,y,z,joint->axis1,0); - - // compute initial relative rotation body1 -> body2, or env -> body1 - // also compute center of body1 w.r.t body 2 - if (joint->node[1].body) { - dQMultiply1 (joint->qrel,joint->node[0].body->q,joint->node[1].body->q); - dVector3 c; - for (i=0; i<3; i++) - c[i] = joint->node[0].body->pos[i] - joint->node[1].body->pos[i]; - dMULTIPLY1_331 (joint->offset,joint->node[1].body->R,c); - } - else { - // set joint->qrel to the transpose of the first body's q - joint->qrel[0] = joint->node[0].body->q[0]; - for (i=1; i<4; i++) joint->qrel[i] = -joint->node[0].body->q[i]; - for (i=0; i<3; i++) joint->offset[i] = joint->node[0].body->pos[i]; - } -} - - -extern "C" void dJointGetSliderAxis (dxJointSlider *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - getAxis (joint,result,joint->axis1); -} - - -extern "C" void dJointSetSliderParam (dxJointSlider *joint, - int parameter, dReal value) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - joint->limot.set (parameter,value); -} - - -extern "C" dReal dJointGetSliderParam (dxJointSlider *joint, int parameter) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - return joint->limot.get (parameter); -} - - -extern "C" void dJointAddSliderForce (dxJointSlider *joint, dReal force) -{ - dVector3 axis; - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dslider_vtable,"joint is not a slider"); - - if (joint->flags & dJOINT_REVERSE) - force -= force; - - getAxis (joint,axis,joint->axis1); - axis[0] *= force; - axis[1] *= force; - axis[2] *= force; - - if (joint->node[0].body != 0) - dBodyAddForce (joint->node[0].body,axis[0],axis[1],axis[2]); - if (joint->node[1].body != 0) - dBodyAddForce(joint->node[1].body, -axis[0], -axis[1], -axis[2]); -} - - -dxJoint::Vtable __dslider_vtable = { - sizeof(dxJointSlider), - (dxJoint::init_fn*) sliderInit, - (dxJoint::getInfo1_fn*) sliderGetInfo1, - (dxJoint::getInfo2_fn*) sliderGetInfo2, - dJointTypeSlider}; - -//**************************************************************************** -// contact - -static void contactInit (dxJointContact *j) -{ - // default frictionless contact. hmmm, this info gets overwritten straight - // away anyway, so why bother? -#if 0 /* so don't bother ;) */ - j->contact.surface.mode = 0; - j->contact.surface.mu = 0; - dSetZero (j->contact.geom.pos,4); - dSetZero (j->contact.geom.normal,4); - j->contact.geom.depth = 0; -#endif -} - - -static void contactGetInfo1 (dxJointContact *j, dxJoint::Info1 *info) -{ - // make sure mu's >= 0, then calculate number of constraint rows and number - // of unbounded rows. - int m = 1, nub=0; - if (j->contact.surface.mu < 0) j->contact.surface.mu = 0; - if (j->contact.surface.mode & dContactMu2) { - if (j->contact.surface.mu > 0) m++; - if (j->contact.surface.mu2 < 0) j->contact.surface.mu2 = 0; - if (j->contact.surface.mu2 > 0) m++; - if (j->contact.surface.mu == dInfinity) nub ++; - if (j->contact.surface.mu2 == dInfinity) nub ++; - } - else { - if (j->contact.surface.mu > 0) m += 2; - if (j->contact.surface.mu == dInfinity) nub += 2; - } - - j->the_m = m; - info->m = m; - info->nub = nub; -} - - -static void contactGetInfo2 (dxJointContact *j, dxJoint::Info2 *info) -{ - int i,s = info->rowskip; - int s2 = 2*s; - - // get normal, with sign adjusted for body1/body2 polarity - dVector3 normal; - if (j->flags & dJOINT_REVERSE) { - normal[0] = - j->contact.geom.normal[0]; - normal[1] = - j->contact.geom.normal[1]; - normal[2] = - j->contact.geom.normal[2]; - } - else { - normal[0] = j->contact.geom.normal[0]; - normal[1] = j->contact.geom.normal[1]; - normal[2] = j->contact.geom.normal[2]; - } - normal[3] = 0; // @@@ hmmm - - // c1,c2 = contact points with respect to body PORs - dVector3 c1,c2; - for (i=0; i<3; i++) c1[i] = j->contact.geom.pos[i] - j->node[0].body->pos[i]; - - // set jacobian for normal - info->J1l[0] = normal[0]; - info->J1l[1] = normal[1]; - info->J1l[2] = normal[2]; - dCROSS (info->J1a,=,c1,normal); - if (j->node[1].body) { - for (i=0; i<3; i++) c2[i] = j->contact.geom.pos[i] - - j->node[1].body->pos[i]; - info->J2l[0] = -normal[0]; - info->J2l[1] = -normal[1]; - info->J2l[2] = -normal[2]; - dCROSS (info->J2a,= -,c2,normal); - } - - // set right hand side and cfm value for normal - dReal erp = info->erp; - if (j->contact.surface.mode & dContactSoftERP) - erp = j->contact.surface.soft_erp; - dReal k = info->fps * erp; - info->c[0] = k*j->contact.geom.depth; - if (j->contact.surface.mode & dContactSoftCFM) - info->cfm[0] = j->contact.surface.soft_cfm; - - // deal with bounce - if (j->contact.surface.mode & dContactBounce) { - // calculate outgoing velocity (-ve for incoming contact) - dReal outgoing = dDOT(info->J1l,j->node[0].body->lvel) + - dDOT(info->J1a,j->node[0].body->avel); - if (j->node[1].body) { - outgoing += dDOT(info->J2l,j->node[1].body->lvel) + - dDOT(info->J2a,j->node[1].body->avel); - } - // only apply bounce if the outgoing velocity is greater than the - // threshold, and if the resulting c[0] exceeds what we already have. - if (j->contact.surface.bounce_vel >= 0 && - (-outgoing) > j->contact.surface.bounce_vel) { - dReal newc = - j->contact.surface.bounce * outgoing; - if (newc > info->c[0]) info->c[0] = newc; - } - } - - // set LCP limits for normal - info->lo[0] = 0; - info->hi[0] = dInfinity; - - // now do jacobian for tangential forces - dVector3 t1,t2; // two vectors tangential to normal - - // first friction direction - if (j->the_m >= 2) { - if (j->contact.surface.mode & dContactFDir1) { // use fdir1 ? - t1[0] = j->contact.fdir1[0]; - t1[1] = j->contact.fdir1[1]; - t1[2] = j->contact.fdir1[2]; - dCROSS (t2,=,normal,t1); - } - else { - dPlaneSpace (normal,t1,t2); - } - info->J1l[s+0] = t1[0]; - info->J1l[s+1] = t1[1]; - info->J1l[s+2] = t1[2]; - dCROSS (info->J1a+s,=,c1,t1); - if (j->node[1].body) { - info->J2l[s+0] = -t1[0]; - info->J2l[s+1] = -t1[1]; - info->J2l[s+2] = -t1[2]; - dCROSS (info->J2a+s,= -,c2,t1); - } - // set right hand side - if (j->contact.surface.mode & dContactMotion1) { - info->c[1] = j->contact.surface.motion1; - } - // set LCP bounds and friction index. this depends on the approximation - // mode - info->lo[1] = -j->contact.surface.mu; - info->hi[1] = j->contact.surface.mu; - if (j->contact.surface.mode & dContactApprox1_1) info->findex[1] = 0; - - // set slip (constraint force mixing) - if (j->contact.surface.mode & dContactSlip1) - info->cfm[1] = j->contact.surface.slip1; - } - - // second friction direction - if (j->the_m >= 3) { - info->J1l[s2+0] = t2[0]; - info->J1l[s2+1] = t2[1]; - info->J1l[s2+2] = t2[2]; - dCROSS (info->J1a+s2,=,c1,t2); - if (j->node[1].body) { - info->J2l[s2+0] = -t2[0]; - info->J2l[s2+1] = -t2[1]; - info->J2l[s2+2] = -t2[2]; - dCROSS (info->J2a+s2,= -,c2,t2); - } - // set right hand side - if (j->contact.surface.mode & dContactMotion2) { - info->c[2] = j->contact.surface.motion2; - } - // set LCP bounds and friction index. this depends on the approximation - // mode - if (j->contact.surface.mode & dContactMu2) { - info->lo[2] = -j->contact.surface.mu2; - info->hi[2] = j->contact.surface.mu2; - } - else { - info->lo[2] = -j->contact.surface.mu; - info->hi[2] = j->contact.surface.mu; - } - if (j->contact.surface.mode & dContactApprox1_2) info->findex[2] = 0; - - // set slip (constraint force mixing) - if (j->contact.surface.mode & dContactSlip2) - info->cfm[2] = j->contact.surface.slip2; - } -} - - -dxJoint::Vtable __dcontact_vtable = { - sizeof(dxJointContact), - (dxJoint::init_fn*) contactInit, - (dxJoint::getInfo1_fn*) contactGetInfo1, - (dxJoint::getInfo2_fn*) contactGetInfo2, - dJointTypeContact}; - -//**************************************************************************** -// hinge 2. note that this joint must be attached to two bodies for it to work - -static dReal measureHinge2Angle (dxJointHinge2 *joint) -{ - dVector3 a1,a2; - dMULTIPLY0_331 (a1,joint->node[1].body->R,joint->axis2); - dMULTIPLY1_331 (a2,joint->node[0].body->R,a1); - dReal x = dDOT(joint->v1,a2); - dReal y = dDOT(joint->v2,a2); - return -dAtan2 (y,x); -} - - -static void hinge2Init (dxJointHinge2 *j) -{ - dSetZero (j->anchor1,4); - dSetZero (j->anchor2,4); - dSetZero (j->axis1,4); - j->axis1[0] = 1; - dSetZero (j->axis2,4); - j->axis2[1] = 1; - j->c0 = 0; - j->s0 = 0; - - dSetZero (j->v1,4); - j->v1[0] = 1; - dSetZero (j->v2,4); - j->v2[1] = 1; - - j->limot1.init (j->world); - j->limot2.init (j->world); - - j->susp_erp = j->world->global_erp; - j->susp_cfm = j->world->global_cfm; - - j->flags |= dJOINT_TWOBODIES; -} - - -static void hinge2GetInfo1 (dxJointHinge2 *j, dxJoint::Info1 *info) -{ - info->m = 4; - info->nub = 4; - - // see if we're powered or at a joint limit for axis 1 - int atlimit=0; - if ((j->limot1.lostop >= -M_PI || j->limot1.histop <= M_PI) && - j->limot1.lostop <= j->limot1.histop) { - dReal angle = measureHinge2Angle (j); - if (j->limot1.testRotationalLimit (angle)) atlimit = 1; - } - if (atlimit || j->limot1.fmax > 0) info->m++; - - // see if we're powering axis 2 (we currently never limit this axis) - j->limot2.limit = 0; - if (j->limot2.fmax > 0) info->m++; -} - - -// macro that computes ax1,ax2 = axis 1 and 2 in global coordinates (they are -// relative to body 1 and 2 initially) and then computes the constrained -// rotational axis as the cross product of ax1 and ax2. -// the sin and cos of the angle between axis 1 and 2 is computed, this comes -// from dot and cross product rules. - -#define HINGE2_GET_AXIS_INFO(axis,sin_angle,cos_angle) \ - dVector3 ax1,ax2; \ - dMULTIPLY0_331 (ax1,joint->node[0].body->R,joint->axis1); \ - dMULTIPLY0_331 (ax2,joint->node[1].body->R,joint->axis2); \ - dCROSS (axis,=,ax1,ax2); \ - sin_angle = dSqrt (axis[0]*axis[0] + axis[1]*axis[1] + axis[2]*axis[2]); \ - cos_angle = dDOT (ax1,ax2); - - -static void hinge2GetInfo2 (dxJointHinge2 *joint, dxJoint::Info2 *info) -{ - // get information we need to set the hinge row - dReal s,c; - dVector3 q; - HINGE2_GET_AXIS_INFO (q,s,c); - dNormalize3 (q); // @@@ quicker: divide q by s ? - - // set the three ball-and-socket rows (aligned to the suspension axis ax1) - setBall2 (joint,info,joint->anchor1,joint->anchor2,ax1,joint->susp_erp); - - // set the hinge row - int s3=3*info->rowskip; - info->J1a[s3+0] = q[0]; - info->J1a[s3+1] = q[1]; - info->J1a[s3+2] = q[2]; - if (joint->node[1].body) { - info->J2a[s3+0] = -q[0]; - info->J2a[s3+1] = -q[1]; - info->J2a[s3+2] = -q[2]; - } - - // compute the right hand side for the constrained rotational DOF. - // axis 1 and axis 2 are separated by an angle `theta'. the desired - // separation angle is theta0. sin(theta0) and cos(theta0) are recorded - // in the joint structure. the correcting angular velocity is: - // |angular_velocity| = angle/time = erp*(theta0-theta) / stepsize - // = (erp*fps) * (theta0-theta) - // (theta0-theta) can be computed using the following small-angle-difference - // approximation: - // theta0-theta ~= tan(theta0-theta) - // = sin(theta0-theta)/cos(theta0-theta) - // = (c*s0 - s*c0) / (c*c0 + s*s0) - // = c*s0 - s*c0 assuming c*c0 + s*s0 ~= 1 - // where c = cos(theta), s = sin(theta) - // c0 = cos(theta0), s0 = sin(theta0) - - dReal k = info->fps * info->erp; - info->c[3] = k * (joint->c0 * s - joint->s0 * c); - - // if the axis1 hinge is powered, or has joint limits, add in more stuff - int row = 4 + joint->limot1.addLimot (joint,info,4,ax1,1); - - // if the axis2 hinge is powered, add in more stuff - joint->limot2.addLimot (joint,info,row,ax2,1); - - // set parameter for the suspension - info->cfm[0] = joint->susp_cfm; -} - - -// compute vectors v1 and v2 (embedded in body1), used to measure angle -// between body 1 and body 2 - -static void makeHinge2V1andV2 (dxJointHinge2 *joint) -{ - if (joint->node[0].body) { - // get axis 1 and 2 in global coords - dVector3 ax1,ax2,v; - dMULTIPLY0_331 (ax1,joint->node[0].body->R,joint->axis1); - dMULTIPLY0_331 (ax2,joint->node[1].body->R,joint->axis2); - - // don't do anything if the axis1 or axis2 vectors are zero or the same - if ((ax1[0]==0 && ax1[1]==0 && ax1[2]==0) || - (ax2[0]==0 && ax2[1]==0 && ax2[2]==0) || - (ax1[0]==ax2[0] && ax1[1]==ax2[1] && ax1[2]==ax2[2])) return; - - // modify axis 2 so it's perpendicular to axis 1 - dReal k = dDOT(ax1,ax2); - for (int i=0; i<3; i++) ax2[i] -= k*ax1[i]; - dNormalize3 (ax2); - - // make v1 = modified axis2, v2 = axis1 x (modified axis2) - dCROSS (v,=,ax1,ax2); - dMULTIPLY1_331 (joint->v1,joint->node[0].body->R,ax2); - dMULTIPLY1_331 (joint->v2,joint->node[0].body->R,v); - } -} - - -extern "C" void dJointSetHinge2Anchor (dxJointHinge2 *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - setAnchors (joint,x,y,z,joint->anchor1,joint->anchor2); - makeHinge2V1andV2 (joint); -} - - -extern "C" void dJointSetHinge2Axis1 (dxJointHinge2 *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[0].body) { - dReal q[4]; - q[0] = x; - q[1] = y; - q[2] = z; - q[3] = 0; - dNormalize3 (q); - dMULTIPLY1_331 (joint->axis1,joint->node[0].body->R,q); - joint->axis1[3] = 0; - - // compute the sin and cos of the angle between axis 1 and axis 2 - dVector3 ax; - HINGE2_GET_AXIS_INFO(ax,joint->s0,joint->c0); - } - makeHinge2V1andV2 (joint); -} - - -extern "C" void dJointSetHinge2Axis2 (dxJointHinge2 *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[1].body) { - dReal q[4]; - q[0] = x; - q[1] = y; - q[2] = z; - q[3] = 0; - dNormalize3 (q); - dMULTIPLY1_331 (joint->axis2,joint->node[1].body->R,q); - joint->axis1[3] = 0; - - // compute the sin and cos of the angle between axis 1 and axis 2 - dVector3 ax; - HINGE2_GET_AXIS_INFO(ax,joint->s0,joint->c0); - } - makeHinge2V1andV2 (joint); -} - - -extern "C" void dJointSetHinge2Param (dxJointHinge2 *joint, - int parameter, dReal value) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if ((parameter & 0xff00) == 0x100) { - joint->limot2.set (parameter & 0xff,value); - } - else { - if (parameter == dParamSuspensionERP) joint->susp_erp = value; - else if (parameter == dParamSuspensionCFM) joint->susp_cfm = value; - else joint->limot1.set (parameter,value); - } -} - - -extern "C" void dJointGetHinge2Anchor (dxJointHinge2 *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->flags & dJOINT_REVERSE) - getAnchor2 (joint,result,joint->anchor2); - else - getAnchor (joint,result,joint->anchor1); -} - - -extern "C" void dJointGetHinge2Anchor2 (dxJointHinge2 *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->flags & dJOINT_REVERSE) - getAnchor (joint,result,joint->anchor1); - else - getAnchor2 (joint,result,joint->anchor2); -} - - -extern "C" void dJointGetHinge2Axis1 (dxJointHinge2 *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[0].body) { - dMULTIPLY0_331 (result,joint->node[0].body->R,joint->axis1); - } -} - - -extern "C" void dJointGetHinge2Axis2 (dxJointHinge2 *joint, dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[1].body) { - dMULTIPLY0_331 (result,joint->node[1].body->R,joint->axis2); - } -} - - -extern "C" dReal dJointGetHinge2Param (dxJointHinge2 *joint, int parameter) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if ((parameter & 0xff00) == 0x100) { - return joint->limot2.get (parameter & 0xff); - } - else { - if (parameter == dParamSuspensionERP) return joint->susp_erp; - else if (parameter == dParamSuspensionCFM) return joint->susp_cfm; - else return joint->limot1.get (parameter); - } -} - - -extern "C" dReal dJointGetHinge2Angle1 (dxJointHinge2 *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[0].body) return measureHinge2Angle (joint); - else return 0; -} - - -extern "C" dReal dJointGetHinge2Angle1Rate (dxJointHinge2 *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[0].body) { - dVector3 axis; - dMULTIPLY0_331 (axis,joint->node[0].body->R,joint->axis1); - dReal rate = dDOT(axis,joint->node[0].body->avel); - if (joint->node[1].body) rate -= dDOT(axis,joint->node[1].body->avel); - return rate; - } - else return 0; -} - - -extern "C" dReal dJointGetHinge2Angle2Rate (dxJointHinge2 *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - if (joint->node[0].body && joint->node[1].body) { - dVector3 axis; - dMULTIPLY0_331 (axis,joint->node[1].body->R,joint->axis2); - dReal rate = dDOT(axis,joint->node[0].body->avel); - if (joint->node[1].body) rate -= dDOT(axis,joint->node[1].body->avel); - return rate; - } - else return 0; -} - - -extern "C" void dJointAddHinge2Torques (dxJointHinge2 *joint, dReal torque1, dReal torque2) -{ - dVector3 axis1, axis2; - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dhinge2_vtable,"joint is not a hinge2"); - - if (joint->node[0].body && joint->node[1].body) { - dMULTIPLY0_331 (axis1,joint->node[0].body->R,joint->axis1); - dMULTIPLY0_331 (axis2,joint->node[1].body->R,joint->axis2); - axis1[0] = axis1[0] * torque1 + axis2[0] * torque2; - axis1[1] = axis1[1] * torque1 + axis2[1] * torque2; - axis1[2] = axis1[2] * torque1 + axis2[2] * torque2; - dBodyAddTorque (joint->node[0].body,axis1[0],axis1[1],axis1[2]); - dBodyAddTorque(joint->node[1].body, -axis1[0], -axis1[1], -axis1[2]); - } -} - - -dxJoint::Vtable __dhinge2_vtable = { - sizeof(dxJointHinge2), - (dxJoint::init_fn*) hinge2Init, - (dxJoint::getInfo1_fn*) hinge2GetInfo1, - (dxJoint::getInfo2_fn*) hinge2GetInfo2, - dJointTypeHinge2}; - -//**************************************************************************** -// universal - -// I just realized that the universal joint is equivalent to a hinge 2 joint with -// perfectly stiff suspension. By comparing the hinge 2 implementation to -// the universal implementation, you may be able to improve this -// implementation (or, less likely, the hinge2 implementation). - -static void universalInit (dxJointUniversal *j) -{ - dSetZero (j->anchor1,4); - dSetZero (j->anchor2,4); - dSetZero (j->axis1,4); - j->axis1[0] = 1; - dSetZero (j->axis2,4); - j->axis2[1] = 1; - dSetZero(j->qrel1,4); - dSetZero(j->qrel2,4); - j->limot1.init (j->world); - j->limot2.init (j->world); -} - - -static void getUniversalAxes(dxJointUniversal *joint, dVector3 ax1, dVector3 ax2) -{ - // This says "ax1 = joint->node[0].body->R * joint->axis1" - dMULTIPLY0_331 (ax1,joint->node[0].body->R,joint->axis1); - - if (joint->node[1].body) { - dMULTIPLY0_331 (ax2,joint->node[1].body->R,joint->axis2); - } - else { - ax2[0] = joint->axis2[0]; - ax2[1] = joint->axis2[1]; - ax2[2] = joint->axis2[2]; - } -} - - -static dReal getUniversalAngle1(dxJointUniversal *joint) -{ - if (joint->node[0].body) { - // length 1 joint axis in global coordinates, from each body - dVector3 ax1, ax2; - dMatrix3 R; - dQuaternion qcross, qq, qrel; - - getUniversalAxes (joint,ax1,ax2); - - // It should be possible to get both angles without explicitly - // constructing the rotation matrix of the cross. Basically, - // orientation of the cross about axis1 comes from body 2, - // about axis 2 comes from body 1, and the perpendicular - // axis can come from the two bodies somehow. (We don't really - // want to assume it's 90 degrees, because in general the - // constraints won't be perfectly satisfied, or even very well - // satisfied.) - // - // However, we'd need a version of getHingeAngleFromRElativeQuat() - // that CAN handle when its relative quat is rotated along a direction - // other than the given axis. What I have here works, - // although it's probably much slower than need be. - - dRFrom2Axes(R, ax1[0], ax1[1], ax1[2], ax2[0], ax2[1], ax2[2]); - dRtoQ (R,qcross); - - // This code is essential the same as getHingeAngle(), see the comments - // there for details. - - // get qrel = relative rotation between node[0] and the cross - dQMultiply1 (qq,joint->node[0].body->q,qcross); - dQMultiply2 (qrel,qq,joint->qrel1); - - return getHingeAngleFromRelativeQuat(qrel, joint->axis1); - } - return 0; -} - - -static dReal getUniversalAngle2(dxJointUniversal *joint) -{ - if (joint->node[0].body) { - // length 1 joint axis in global coordinates, from each body - dVector3 ax1, ax2; - dMatrix3 R; - dQuaternion qcross, qq, qrel; - - getUniversalAxes (joint,ax1,ax2); - - // It should be possible to get both angles without explicitly - // constructing the rotation matrix of the cross. Basically, - // orientation of the cross about axis1 comes from body 2, - // about axis 2 comes from body 1, and the perpendicular - // axis can come from the two bodies somehow. (We don't really - // want to assume it's 90 degrees, because in general the - // constraints won't be perfectly satisfied, or even very well - // satisfied.) - // - // However, we'd need a version of getHingeAngleFromRElativeQuat() - // that CAN handle when its relative quat is rotated along a direction - // other than the given axis. What I have here works, - // although it's probably much slower than need be. - - dRFrom2Axes(R, ax2[0], ax2[1], ax2[2], ax1[0], ax1[1], ax1[2]); - dRtoQ(R, qcross); - - if (joint->node[1].body) { - dQMultiply1 (qq, joint->node[1].body->q, qcross); - dQMultiply2 (qrel,qq,joint->qrel2); - } - else { - // pretend joint->node[1].body->q is the identity - dQMultiply2 (qrel,qcross, joint->qrel2); - } - - return - getHingeAngleFromRelativeQuat(qrel, joint->axis2); - } - return 0; -} - - -static void universalGetInfo1 (dxJointUniversal *j, dxJoint::Info1 *info) -{ - info->nub = 4; - info->m = 4; - - // see if we're powered or at a joint limit. - bool constraint1 = j->limot1.fmax > 0; - bool constraint2 = j->limot2.fmax > 0; - - bool limiting1 = (j->limot1.lostop >= -M_PI || j->limot1.histop <= M_PI) && - j->limot1.lostop <= j->limot1.histop; - bool limiting2 = (j->limot2.lostop >= -M_PI || j->limot2.histop <= M_PI) && - j->limot2.lostop <= j->limot2.histop; - - // We need to call testRotationLimit() even if we're motored, since it - // records the result. - if (limiting1 || limiting2) { - dReal angle1, angle2; - angle1 = getUniversalAngle1(j); - angle2 = getUniversalAngle2(j); - if (limiting1 && j->limot1.testRotationalLimit (angle1)) constraint1 = true; - if (limiting2 && j->limot2.testRotationalLimit (angle2)) constraint2 = true; - } - if (constraint1) - info->m++; - if (constraint2) - info->m++; -} - - -static void universalGetInfo2 (dxJointUniversal *joint, dxJoint::Info2 *info) -{ - // set the three ball-and-socket rows - setBall (joint,info,joint->anchor1,joint->anchor2); - - // set the universal joint row. the angular velocity about an axis - // perpendicular to both joint axes should be equal. thus the constraint - // equation is - // p*w1 - p*w2 = 0 - // where p is a vector normal to both joint axes, and w1 and w2 - // are the angular velocity vectors of the two bodies. - - // length 1 joint axis in global coordinates, from each body - dVector3 ax1, ax2; - dVector3 ax2_temp; - // length 1 vector perpendicular to ax1 and ax2. Neither body can rotate - // about this. - dVector3 p; - dReal k; - - getUniversalAxes(joint, ax1, ax2); - k = dDOT(ax1, ax2); - ax2_temp[0] = ax2[0] - k*ax1[0]; - ax2_temp[1] = ax2[1] - k*ax1[1]; - ax2_temp[2] = ax2[2] - k*ax1[2]; - dCROSS(p, =, ax1, ax2_temp); - dNormalize3(p); - - int s3=3*info->rowskip; - - info->J1a[s3+0] = p[0]; - info->J1a[s3+1] = p[1]; - info->J1a[s3+2] = p[2]; - - if (joint->node[1].body) { - info->J2a[s3+0] = -p[0]; - info->J2a[s3+1] = -p[1]; - info->J2a[s3+2] = -p[2]; - } - - // compute the right hand side of the constraint equation. set relative - // body velocities along p to bring the axes back to perpendicular. - // If ax1, ax2 are unit length joint axes as computed from body1 and - // body2, we need to rotate both bodies along the axis p. If theta - // is the angle between ax1 and ax2, we need an angular velocity - // along p to cover the angle erp * (theta - Pi/2) in one step: - // - // |angular_velocity| = angle/time = erp*(theta - Pi/2) / stepsize - // = (erp*fps) * (theta - Pi/2) - // - // if theta is close to Pi/2, - // theta - Pi/2 ~= cos(theta), so - // |angular_velocity| ~= (erp*fps) * (ax1 dot ax2) - - info->c[3] = info->fps * info->erp * - dDOT(ax1, ax2); - - // if the first angle is powered, or has joint limits, add in the stuff - int row = 4 + joint->limot1.addLimot (joint,info,4,ax1,1); - - // if the second angle is powered, or has joint limits, add in more stuff - joint->limot2.addLimot (joint,info,row,ax2,1); -} - - -static void universalComputeInitialRelativeRotations (dxJointUniversal *joint) -{ - if (joint->node[0].body) { - dVector3 ax1, ax2; - dMatrix3 R; - dQuaternion qcross; - - getUniversalAxes(joint, ax1, ax2); - - // Axis 1. - dRFrom2Axes(R, ax1[0], ax1[1], ax1[2], ax2[0], ax2[1], ax2[2]); - dRtoQ(R, qcross); - dQMultiply1 (joint->qrel1, joint->node[0].body->q, qcross); - - // Axis 2. - dRFrom2Axes(R, ax2[0], ax2[1], ax2[2], ax1[0], ax1[1], ax1[2]); - dRtoQ(R, qcross); - if (joint->node[1].body) { - dQMultiply1 (joint->qrel2, joint->node[1].body->q, qcross); - } - else { - // set joint->qrel to qcross - for (int i=0; i<4; i++) joint->qrel2[i] = qcross[i]; - } - } -} - - -extern "C" void dJointSetUniversalAnchor (dxJointUniversal *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - setAnchors (joint,x,y,z,joint->anchor1,joint->anchor2); - universalComputeInitialRelativeRotations(joint); -} - - -extern "C" void dJointSetUniversalAxis1 (dxJointUniversal *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - setAxes (joint,x,y,z,NULL,joint->axis2); - else - setAxes (joint,x,y,z,joint->axis1,NULL); - universalComputeInitialRelativeRotations(joint); -} - - -extern "C" void dJointSetUniversalAxis2 (dxJointUniversal *joint, - dReal x, dReal y, dReal z) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - setAxes (joint,x,y,z,joint->axis1,NULL); - else - setAxes (joint,x,y,z,NULL,joint->axis2); - universalComputeInitialRelativeRotations(joint); -} - - -extern "C" void dJointGetUniversalAnchor (dxJointUniversal *joint, - dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - getAnchor2 (joint,result,joint->anchor2); - else - getAnchor (joint,result,joint->anchor1); -} - - -extern "C" void dJointGetUniversalAnchor2 (dxJointUniversal *joint, - dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - getAnchor (joint,result,joint->anchor1); - else - getAnchor2 (joint,result,joint->anchor2); -} - - -extern "C" void dJointGetUniversalAxis1 (dxJointUniversal *joint, - dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - getAxis2 (joint,result,joint->axis2); - else - getAxis (joint,result,joint->axis1); -} - - -extern "C" void dJointGetUniversalAxis2 (dxJointUniversal *joint, - dVector3 result) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(result,"bad result argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - getAxis (joint,result,joint->axis1); - else - getAxis2 (joint,result,joint->axis2); -} - - -extern "C" void dJointSetUniversalParam (dxJointUniversal *joint, - int parameter, dReal value) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if ((parameter & 0xff00) == 0x100) { - joint->limot2.set (parameter & 0xff,value); - } - else { - joint->limot1.set (parameter,value); - } -} - - -extern "C" dReal dJointGetUniversalParam (dxJointUniversal *joint, int parameter) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if ((parameter & 0xff00) == 0x100) { - return joint->limot2.get (parameter & 0xff); - } - else { - return joint->limot1.get (parameter); - } -} - - -extern "C" dReal dJointGetUniversalAngle1 (dxJointUniversal *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - return getUniversalAngle2 (joint); - else - return getUniversalAngle1 (joint); -} - - -extern "C" dReal dJointGetUniversalAngle2 (dxJointUniversal *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - if (joint->flags & dJOINT_REVERSE) - return getUniversalAngle1 (joint); - else - return getUniversalAngle2 (joint); -} - - -extern "C" dReal dJointGetUniversalAngle1Rate (dxJointUniversal *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - - if (joint->node[0].body) { - dVector3 axis; - - if (joint->flags & dJOINT_REVERSE) - getAxis2 (joint,axis,joint->axis2); - else - getAxis (joint,axis,joint->axis1); - - dReal rate = dDOT(axis, joint->node[0].body->avel); - if (joint->node[1].body) rate -= dDOT(axis, joint->node[1].body->avel); - return rate; - } - return 0; -} - - -extern "C" dReal dJointGetUniversalAngle2Rate (dxJointUniversal *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - - if (joint->node[0].body) { - dVector3 axis; - - if (joint->flags & dJOINT_REVERSE) - getAxis (joint,axis,joint->axis1); - else - getAxis2 (joint,axis,joint->axis2); - - dReal rate = dDOT(axis, joint->node[0].body->avel); - if (joint->node[1].body) rate -= dDOT(axis, joint->node[1].body->avel); - return rate; - } - return 0; -} - - -extern "C" void dJointAddUniversalTorques (dxJointUniversal *joint, dReal torque1, dReal torque2) -{ - dVector3 axis1, axis2; - dAASSERT(joint); - dUASSERT(joint->vtable == &__duniversal_vtable,"joint is not a universal"); - - if (joint->flags & dJOINT_REVERSE) { - dReal temp = torque1; - torque1 = - torque2; - torque2 = - temp; - } - - getAxis (joint,axis1,joint->axis1); - getAxis2 (joint,axis2,joint->axis2); - axis1[0] = axis1[0] * torque1 + axis2[0] * torque2; - axis1[1] = axis1[1] * torque1 + axis2[1] * torque2; - axis1[2] = axis1[2] * torque1 + axis2[2] * torque2; - - if (joint->node[0].body != 0) - dBodyAddTorque (joint->node[0].body,axis1[0],axis1[1],axis1[2]); - if (joint->node[1].body != 0) - dBodyAddTorque(joint->node[1].body, -axis1[0], -axis1[1], -axis1[2]); -} - - - - - -dxJoint::Vtable __duniversal_vtable = { - sizeof(dxJointUniversal), - (dxJoint::init_fn*) universalInit, - (dxJoint::getInfo1_fn*) universalGetInfo1, - (dxJoint::getInfo2_fn*) universalGetInfo2, - dJointTypeUniversal}; - -//**************************************************************************** -// angular motor - -static void amotorInit (dxJointAMotor *j) -{ - int i; - j->num = 0; - j->mode = dAMotorUser; - for (i=0; i<3; i++) { - j->rel[i] = 0; - dSetZero (j->axis[i],4); - j->limot[i].init (j->world); - j->angle[i] = 0; - } - dSetZero (j->reference1,4); - dSetZero (j->reference2,4); - - j->flags |= dJOINT_TWOBODIES; -} - - -// compute the 3 axes in global coordinates - -static void amotorComputeGlobalAxes (dxJointAMotor *joint, dVector3 ax[3]) -{ - if (joint->mode == dAMotorEuler) { - // special handling for euler mode - dMULTIPLY0_331 (ax[0],joint->node[0].body->R,joint->axis[0]); - dMULTIPLY0_331 (ax[2],joint->node[1].body->R,joint->axis[2]); - dCROSS (ax[1],=,ax[2],ax[0]); - dNormalize3 (ax[1]); - } - else { - for (int i=0; i < joint->num; i++) { - if (joint->rel[i] == 1) { - // relative to b1 - dMULTIPLY0_331 (ax[i],joint->node[0].body->R,joint->axis[i]); - } - if (joint->rel[i] == 2) { - // relative to b2 - dMULTIPLY0_331 (ax[i],joint->node[1].body->R,joint->axis[i]); - } - else { - // global - just copy it - ax[i][0] = joint->axis[i][0]; - ax[i][1] = joint->axis[i][1]; - ax[i][2] = joint->axis[i][2]; - } - } - } -} - - -static void amotorComputeEulerAngles (dxJointAMotor *joint, dVector3 ax[3]) -{ - // assumptions: - // global axes already calculated --> ax - // axis[0] is relative to body 1 --> global ax[0] - // axis[2] is relative to body 2 --> global ax[2] - // ax[1] = ax[2] x ax[0] - // original ax[0] and ax[2] are perpendicular - // reference1 is perpendicular to ax[0] (in body 1 frame) - // reference2 is perpendicular to ax[2] (in body 2 frame) - // all ax[] and reference vectors are unit length - - // calculate references in global frame - dVector3 ref1,ref2; - dMULTIPLY0_331 (ref1,joint->node[0].body->R,joint->reference1); - dMULTIPLY0_331 (ref2,joint->node[1].body->R,joint->reference2); - - // get q perpendicular to both ax[0] and ref1, get first euler angle - dVector3 q; - dCROSS (q,=,ax[0],ref1); - joint->angle[0] = -dAtan2 (dDOT(ax[2],q),dDOT(ax[2],ref1)); - - // get q perpendicular to both ax[0] and ax[1], get second euler angle - dCROSS (q,=,ax[0],ax[1]); - joint->angle[1] = -dAtan2 (dDOT(ax[2],ax[0]),dDOT(ax[2],q)); - - // get q perpendicular to both ax[1] and ax[2], get third euler angle - dCROSS (q,=,ax[1],ax[2]); - joint->angle[2] = -dAtan2 (dDOT(ref2,ax[1]), dDOT(ref2,q)); -} - - -// set the reference vectors as follows: -// * reference1 = current axis[2] relative to body 1 -// * reference2 = current axis[0] relative to body 2 -// this assumes that: -// * axis[0] is relative to body 1 -// * axis[2] is relative to body 2 - -static void amotorSetEulerReferenceVectors (dxJointAMotor *j) -{ - if (j->node[0].body && j->node[1].body) { - dVector3 r; // axis[2] and axis[0] in global coordinates - dMULTIPLY0_331 (r,j->node[1].body->R,j->axis[2]); - dMULTIPLY1_331 (j->reference1,j->node[0].body->R,r); - dMULTIPLY0_331 (r,j->node[0].body->R,j->axis[0]); - dMULTIPLY1_331 (j->reference2,j->node[1].body->R,r); - } -} - - -static void amotorGetInfo1 (dxJointAMotor *j, dxJoint::Info1 *info) -{ - info->m = 0; - info->nub = 0; - - // compute the axes and angles, if in euler mode - if (j->mode == dAMotorEuler) { - dVector3 ax[3]; - amotorComputeGlobalAxes (j,ax); - amotorComputeEulerAngles (j,ax); - } - - // see if we're powered or at a joint limit for each axis - for (int i=0; i < j->num; i++) { - if (j->limot[i].testRotationalLimit (j->angle[i]) || - j->limot[i].fmax > 0) { - info->m++; - } - } -} - - -static void amotorGetInfo2 (dxJointAMotor *joint, dxJoint::Info2 *info) -{ - int i; - - // compute the axes (if not global) - dVector3 ax[3]; - amotorComputeGlobalAxes (joint,ax); - - // in euler angle mode we do not actually constrain the angular velocity - // along the axes axis[0] and axis[2] (although we do use axis[1]) : - // - // to get constrain w2-w1 along ...not - // ------ --------------------- ------ - // d(angle[0])/dt = 0 ax[1] x ax[2] ax[0] - // d(angle[1])/dt = 0 ax[1] - // d(angle[2])/dt = 0 ax[0] x ax[1] ax[2] - // - // constraining w2-w1 along an axis 'a' means that a'*(w2-w1)=0. - // to prove the result for angle[0], write the expression for angle[0] from - // GetInfo1 then take the derivative. to prove this for angle[2] it is - // easier to take the euler rate expression for d(angle[2])/dt with respect - // to the components of w and set that to 0. - - dVector3 *axptr[3]; - axptr[0] = &ax[0]; - axptr[1] = &ax[1]; - axptr[2] = &ax[2]; - - dVector3 ax0_cross_ax1; - dVector3 ax1_cross_ax2; - if (joint->mode == dAMotorEuler) { - dCROSS (ax0_cross_ax1,=,ax[0],ax[1]); - axptr[2] = &ax0_cross_ax1; - dCROSS (ax1_cross_ax2,=,ax[1],ax[2]); - axptr[0] = &ax1_cross_ax2; - } - - int row=0; - for (i=0; i < joint->num; i++) { - row += joint->limot[i].addLimot (joint,info,row,*(axptr[i]),1); - } -} - - -extern "C" void dJointSetAMotorNumAxes (dxJointAMotor *joint, int num) -{ - dAASSERT(joint && num >= 0 && num <= 3); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - if (joint->mode == dAMotorEuler) { - joint->num = 3; - } - else { - if (num < 0) num = 0; - if (num > 3) num = 3; - joint->num = num; - } -} - - -extern "C" void dJointSetAMotorAxis (dxJointAMotor *joint, int anum, int rel, - dReal x, dReal y, dReal z) -{ - dAASSERT(joint && anum >= 0 && anum <= 2 && rel >= 0 && rel <= 2); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - if (anum < 0) anum = 0; - if (anum > 2) anum = 2; - joint->rel[anum] = rel; - - // x,y,z is always in global coordinates regardless of rel, so we may have - // to convert it to be relative to a body - dVector3 r; - r[0] = x; - r[1] = y; - r[2] = z; - r[3] = 0; - if (rel > 0) { - if (rel==1) { - dMULTIPLY1_331 (joint->axis[anum],joint->node[0].body->R,r); - } - else { - dMULTIPLY1_331 (joint->axis[anum],joint->node[1].body->R,r); - } - } - else { - joint->axis[anum][0] = r[0]; - joint->axis[anum][1] = r[1]; - joint->axis[anum][2] = r[2]; - } - dNormalize3 (joint->axis[anum]); - if (joint->mode == dAMotorEuler) amotorSetEulerReferenceVectors (joint); -} - - -extern "C" void dJointSetAMotorAngle (dxJointAMotor *joint, int anum, - dReal angle) -{ - dAASSERT(joint && anum >= 0 && anum < 3); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - if (joint->mode == dAMotorUser) { - if (anum < 0) anum = 0; - if (anum > 3) anum = 3; - joint->angle[anum] = angle; - } -} - - -extern "C" void dJointSetAMotorParam (dxJointAMotor *joint, int parameter, - dReal value) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - int anum = parameter >> 8; - if (anum < 0) anum = 0; - if (anum > 2) anum = 2; - parameter &= 0xff; - joint->limot[anum].set (parameter, value); -} - - -extern "C" void dJointSetAMotorMode (dxJointAMotor *joint, int mode) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - joint->mode = mode; - if (joint->mode == dAMotorEuler) { - joint->num = 3; - amotorSetEulerReferenceVectors (joint); - } -} - - -extern "C" int dJointGetAMotorNumAxes (dxJointAMotor *joint) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - return joint->num; -} - - -extern "C" void dJointGetAMotorAxis (dxJointAMotor *joint, int anum, - dVector3 result) -{ - dAASSERT(joint && anum >= 0 && anum < 3); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - if (anum < 0) anum = 0; - if (anum > 2) anum = 2; - if (joint->rel[anum] > 0) { - if (joint->rel[anum]==1) { - dMULTIPLY0_331 (result,joint->node[0].body->R,joint->axis[anum]); - } - else { - dMULTIPLY0_331 (result,joint->node[1].body->R,joint->axis[anum]); - } - } - else { - result[0] = joint->axis[anum][0]; - result[1] = joint->axis[anum][1]; - result[2] = joint->axis[anum][2]; - } -} - - -extern "C" int dJointGetAMotorAxisRel (dxJointAMotor *joint, int anum) -{ - dAASSERT(joint && anum >= 0 && anum < 3); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - if (anum < 0) anum = 0; - if (anum > 2) anum = 2; - return joint->rel[anum]; -} - - -extern "C" dReal dJointGetAMotorAngle (dxJointAMotor *joint, int anum) -{ - dAASSERT(joint && anum >= 0 && anum < 3); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - if (anum < 0) anum = 0; - if (anum > 3) anum = 3; - return joint->angle[anum]; -} - - -extern "C" dReal dJointGetAMotorAngleRate (dxJointAMotor *joint, int anum) -{ - // @@@ - dDebug (0,"not yet implemented"); - return 0; -} - - -extern "C" dReal dJointGetAMotorParam (dxJointAMotor *joint, int parameter) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - int anum = parameter >> 8; - if (anum < 0) anum = 0; - if (anum > 2) anum = 2; - parameter &= 0xff; - return joint->limot[anum].get (parameter); -} - - -extern "C" int dJointGetAMotorMode (dxJointAMotor *joint) -{ - dAASSERT(joint); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - return joint->mode; -} - - -extern "C" void dJointAddAMotorTorques (dxJointAMotor *joint, dReal torque1, dReal torque2, dReal torque3) -{ - dVector3 axes[3]; - dAASSERT(joint); - dUASSERT(joint->vtable == &__damotor_vtable,"joint is not an amotor"); - - if (joint->num == 0) - return; - dUASSERT((joint->flags & dJOINT_REVERSE) == 0, "dJointAddAMotorTorques not yet implemented for reverse AMotor joints"); - - amotorComputeGlobalAxes (joint,axes); - axes[0][0] *= torque1; - axes[0][1] *= torque1; - axes[0][2] *= torque1; - if (joint->num >= 2) { - axes[0][0] += axes[1][0] * torque2; - axes[0][1] += axes[1][0] * torque2; - axes[0][2] += axes[1][0] * torque2; - if (joint->num >= 3) { - axes[0][0] += axes[2][0] * torque3; - axes[0][1] += axes[2][0] * torque3; - axes[0][2] += axes[2][0] * torque3; - } - } - - if (joint->node[0].body != 0) - dBodyAddTorque (joint->node[0].body,axes[0][0],axes[0][1],axes[0][2]); - if (joint->node[1].body != 0) - dBodyAddTorque(joint->node[1].body, -axes[0][0], -axes[0][1], -axes[0][2]); -} - - -dxJoint::Vtable __damotor_vtable = { - sizeof(dxJointAMotor), - (dxJoint::init_fn*) amotorInit, - (dxJoint::getInfo1_fn*) amotorGetInfo1, - (dxJoint::getInfo2_fn*) amotorGetInfo2, - dJointTypeAMotor}; - -//**************************************************************************** -// fixed joint - -static void fixedInit (dxJointFixed *j) -{ - dSetZero (j->offset,4); - dSetZero (j->qrel,4); -} - - -static void fixedGetInfo1 (dxJointFixed *j, dxJoint::Info1 *info) -{ - info->m = 6; - info->nub = 6; -} - - -static void fixedGetInfo2 (dxJointFixed *joint, dxJoint::Info2 *info) -{ - int s = info->rowskip; - - // Three rows for orientation - setFixedOrientation(joint, info, joint->qrel, 3); - - // Three rows for position. - // set jacobian - info->J1l[0] = 1; - info->J1l[s+1] = 1; - info->J1l[2*s+2] = 1; - - dVector3 ofs; - dMULTIPLY0_331 (ofs,joint->node[0].body->R,joint->offset); - if (joint->node[1].body) { - dCROSSMAT (info->J1a,ofs,s,+,-); - info->J2l[0] = -1; - info->J2l[s+1] = -1; - info->J2l[2*s+2] = -1; - } - - // set right hand side for the first three rows (linear) - dReal k = info->fps * info->erp; - if (joint->node[1].body) { - for (int j=0; j<3; j++) - info->c[j] = k * (joint->node[1].body->pos[j] - - joint->node[0].body->pos[j] + ofs[j]); - } - else { - for (int j=0; j<3; j++) - info->c[j] = k * (joint->offset[j] - joint->node[0].body->pos[j]); - } -} - - -extern "C" void dJointSetFixed (dxJointFixed *joint) -{ - dUASSERT(joint,"bad joint argument"); - dUASSERT(joint->vtable == &__dfixed_vtable,"joint is not fixed"); - int i; - - // This code is taken from sJointSetSliderAxis(), we should really put the - // common code in its own function. - // compute the offset between the bodies - if (joint->node[0].body) { - if (joint->node[1].body) { - dQMultiply1 (joint->qrel,joint->node[0].body->q,joint->node[1].body->q); - dReal ofs[4]; - for (i=0; i<4; i++) ofs[i] = joint->node[0].body->pos[i]; - for (i=0; i<4; i++) ofs[i] -= joint->node[1].body->pos[i]; - dMULTIPLY1_331 (joint->offset,joint->node[0].body->R,ofs); - } - else { - // set joint->qrel to the transpose of the first body's q - joint->qrel[0] = joint->node[0].body->q[0]; - for (i=1; i<4; i++) joint->qrel[i] = -joint->node[0].body->q[i]; - for (i=0; i<4; i++) joint->offset[i] = joint->node[0].body->pos[i]; - } - } -} - - -dxJoint::Vtable __dfixed_vtable = { - sizeof(dxJointFixed), - (dxJoint::init_fn*) fixedInit, - (dxJoint::getInfo1_fn*) fixedGetInfo1, - (dxJoint::getInfo2_fn*) fixedGetInfo2, - dJointTypeFixed}; - -//**************************************************************************** -// null joint - -static void nullGetInfo1 (dxJointNull *j, dxJoint::Info1 *info) -{ - info->m = 0; - info->nub = 0; -} - - -static void nullGetInfo2 (dxJointNull *joint, dxJoint::Info2 *info) -{ - dDebug (0,"this should never get called"); -} - - -dxJoint::Vtable __dnull_vtable = { - sizeof(dxJointNull), - (dxJoint::init_fn*) 0, - (dxJoint::getInfo1_fn*) nullGetInfo1, - (dxJoint::getInfo2_fn*) nullGetInfo2, - dJointTypeNull}; - -/******************** breakable joint contribution ***********************/ -extern "C" void dJointSetBreakable (dxJoint *joint, int b) { - dAASSERT(joint); - if (b) { - // we want this joint to be breakable but we must first check if it - // was already breakable - if (!joint->breakInfo) { - // allocate a dxJointBreakInfo struct - joint->breakInfo = new dxJointBreakInfo; - joint->breakInfo->flags = 0; - for (int i = 0; i < 3; i++) { - joint->breakInfo->b1MaxF[0] = 0; - joint->breakInfo->b1MaxT[0] = 0; - joint->breakInfo->b2MaxF[0] = 0; - joint->breakInfo->b2MaxT[0] = 0; - } - joint->breakInfo->callback = 0; - } - else { - // the joint was already breakable - return; - } - } - else { - // we want this joint to be unbreakable mut we must first check if - // it is alreay unbreakable - if (joint->breakInfo) { - // deallocate the dxJointBreakInfo struct - delete joint->breakInfo; - joint->breakInfo = 0; - } - else { - // the joint was already unbreakable - return; - } - } -} - -extern "C" void dJointSetBreakCallback (dxJoint *joint, dJointBreakCallback *callbackFunc) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointSetBreakCallback called on unbreakable joint"); - } -# endif - joint->breakInfo->callback = callbackFunc; -} - -extern "C" void dJointSetBreakMode (dxJoint *joint, int mode) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointSetBreakMode called on unbreakable joint"); - } -# endif - joint->breakInfo->flags = mode; -} - -extern "C" int dJointGetBreakMode (dxJoint *joint) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointGetBreakMode called on unbreakable joint"); - } -# endif - return joint->breakInfo->flags; -} - -extern "C" void dJointSetBreakForce (dxJoint *joint, int body, dReal x, dReal y, dReal z) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointSetBreakForce called on unbreakable joint"); - } -# endif - if (body) { - joint->breakInfo->b2MaxF[0] = x; - joint->breakInfo->b2MaxF[1] = y; - joint->breakInfo->b2MaxF[2] = z; - } - else { - joint->breakInfo->b1MaxF[0] = x; - joint->breakInfo->b1MaxF[1] = y; - joint->breakInfo->b1MaxF[2] = z; - } -} - -extern "C" void dJointSetBreakTorque (dxJoint *joint, int body, dReal x, dReal y, dReal z) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointSetBreakTorque called on unbreakable joint"); - } -# endif - if (body) { - joint->breakInfo->b2MaxT[0] = x; - joint->breakInfo->b2MaxT[1] = y; - joint->breakInfo->b2MaxT[2] = z; - } - else { - joint->breakInfo->b1MaxT[0] = x; - joint->breakInfo->b1MaxT[1] = y; - joint->breakInfo->b1MaxT[2] = z; - } -} - -extern "C" int dJointIsBreakable (dxJoint *joint) { - dAASSERT(joint); - return joint->breakInfo != 0; -} - -extern "C" void dJointGetBreakForce (dxJoint *joint, int body, dReal *force) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointGetBreakForce called on unbreakable joint"); - } -# endif - if (body) - for (int i=0; i<3; i++) force[i]=joint->breakInfo->b2MaxF[i]; - else - for (int i=0; i<3; i++) force[i]=joint->breakInfo->b1MaxF[i]; -} - -extern "C" void dJointGetBreakTorque (dxJoint *joint, int body, dReal *torque) { - dAASSERT(joint); -# ifndef dNODEBUG - // only works for a breakable joint - if (!joint->breakInfo) { - dDebug (0, "dJointGetBreakTorque called on unbreakable joint"); - } -# endif - if (body) - for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b2MaxT[i]; - else - for (int i=0; i<3; i++) torque[i]=joint->breakInfo->b1MaxT[i]; -} -/*************************************************************************/ diff --git a/libraries/ode-0.9/contrib/BreakableJoints/joint.h b/libraries/ode-0.9/contrib/BreakableJoints/joint.h deleted file mode 100644 index 0573119456..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/joint.h +++ /dev/null @@ -1,282 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_JOINT_H_ -#define _ODE_JOINT_H_ - - -#include "objects.h" -#include -#include "obstack.h" - - -// joint flags -enum { - // if this flag is set, the joint was allocated in a joint group - dJOINT_INGROUP = 1, - - // if this flag is set, the joint was attached with arguments (0,body). - // our convention is to treat all attaches as (body,0), i.e. so node[0].body - // is always nonzero, so this flag records the fact that the arguments were - // swapped. - dJOINT_REVERSE = 2, - - // if this flag is set, the joint can not have just one body attached to it, - // it must have either zero or two bodies attached. - dJOINT_TWOBODIES = 4 -}; - - -// there are two of these nodes in the joint, one for each connection to a -// body. these are node of a linked list kept by each body of it's connecting -// joints. but note that the body pointer in each node points to the body that -// makes use of the *other* node, not this node. this trick makes it a bit -// easier to traverse the body/joint graph. - -struct dxJointNode { - dxJoint *joint; // pointer to enclosing dxJoint object - dxBody *body; // *other* body this joint is connected to - dxJointNode *next; // next node in body's list of connected joints -}; - -/******************** breakable joint contribution ***********************/ -struct dxJointBreakInfo : public dBase { - int flags; - dReal b1MaxF[3]; // maximum force on body 1 - dReal b1MaxT[3]; // maximum torque on body 1 - dReal b2MaxF[3]; // maximum force on body 2 - dReal b2MaxT[3]; // maximum torque on body 2 - dJointBreakCallback *callback; // function that is called when this joint breaks -}; -/*************************************************************************/ - -struct dxJoint : public dObject { - // naming convention: the "first" body this is connected to is node[0].body, - // and the "second" body is node[1].body. if this joint is only connected - // to one body then the second body is 0. - - // info returned by getInfo1 function. the constraint dimension is m (<=6). - // i.e. that is the total number of rows in the jacobian. `nub' is the - // number of unbounded variables (which have lo,hi = -/+ infinity). - - struct Info1 { - int m,nub; - }; - - // info returned by getInfo2 function - - struct Info2 { - // integrator parameters: frames per second (1/stepsize), default error - // reduction parameter (0..1). - dReal fps,erp; - - // for the first and second body, pointers to two (linear and angular) - // n*3 jacobian sub matrices, stored by rows. these matrices will have - // been initialized to 0 on entry. if the second body is zero then the - // J2xx pointers may be 0. - dReal *J1l,*J1a,*J2l,*J2a; - - // elements to jump from one row to the next in J's - int rowskip; - - // right hand sides of the equation J*v = c + cfm * lambda. cfm is the - // "constraint force mixing" vector. c is set to zero on entry, cfm is - // set to a constant value (typically very small or zero) value on entry. - dReal *c,*cfm; - - // lo and hi limits for variables (set to -/+ infinity on entry). - dReal *lo,*hi; - - // findex vector for variables. see the LCP solver interface for a - // description of what this does. this is set to -1 on entry. - // note that the returned indexes are relative to the first index of - // the constraint. - int *findex; - }; - - // virtual function table: size of the joint structure, function pointers. - // we do it this way instead of using C++ virtual functions because - // sometimes we need to allocate joints ourself within a memory pool. - - typedef void init_fn (dxJoint *joint); - typedef void getInfo1_fn (dxJoint *joint, Info1 *info); - typedef void getInfo2_fn (dxJoint *joint, Info2 *info); - struct Vtable { - int size; - init_fn *init; - getInfo1_fn *getInfo1; - getInfo2_fn *getInfo2; - int typenum; // a dJointTypeXXX type number - }; - - Vtable *vtable; // virtual function table - int flags; // dJOINT_xxx flags - dxJointNode node[2]; // connections to bodies. node[1].body can be 0 - dJointFeedback *feedback; // optional feedback structure - - /******************** breakable joint contribution ***********************/ - // optional break info structure. if this is not NULL the the joint is - // breakable. - dxJointBreakInfo *breakInfo; - /*************************************************************************/ -}; - - -// joint group. NOTE: any joints in the group that have their world destroyed -// will have their world pointer set to 0. - -struct dxJointGroup : public dBase { - int num; // number of joints on the stack - dObStack stack; // a stack of (possibly differently sized) dxJoint -}; // objects. - - -// common limit and motor information for a single joint axis of movement -struct dxJointLimitMotor { - dReal vel,fmax; // powered joint: velocity, max force - dReal lostop,histop; // joint limits, relative to initial position - dReal fudge_factor; // when powering away from joint limits - dReal normal_cfm; // cfm to use when not at a stop - dReal stop_erp,stop_cfm; // erp and cfm for when at joint limit - dReal bounce; // restitution factor - // variables used between getInfo1() and getInfo2() - int limit; // 0=free, 1=at lo limit, 2=at hi limit - dReal limit_err; // if at limit, amount over limit - - void init (dxWorld *); - void set (int num, dReal value); - dReal get (int num); - int testRotationalLimit (dReal angle); - int addLimot (dxJoint *joint, dxJoint::Info2 *info, int row, - dVector3 ax1, int rotational); -}; - - -// ball and socket - -struct dxJointBall : public dxJoint { - dVector3 anchor1; // anchor w.r.t first body - dVector3 anchor2; // anchor w.r.t second body -}; -extern struct dxJoint::Vtable __dball_vtable; - - -// hinge - -struct dxJointHinge : public dxJoint { - dVector3 anchor1; // anchor w.r.t first body - dVector3 anchor2; // anchor w.r.t second body - dVector3 axis1; // axis w.r.t first body - dVector3 axis2; // axis w.r.t second body - dQuaternion qrel; // initial relative rotation body1 -> body2 - dxJointLimitMotor limot; // limit and motor information -}; -extern struct dxJoint::Vtable __dhinge_vtable; - - -// universal - -struct dxJointUniversal : public dxJoint { - dVector3 anchor1; // anchor w.r.t first body - dVector3 anchor2; // anchor w.r.t second body - dVector3 axis1; // axis w.r.t first body - dVector3 axis2; // axis w.r.t second body - dQuaternion qrel1; // initial relative rotation body1 -> virtual cross piece - dQuaternion qrel2; // initial relative rotation virtual cross piece -> body2 - dxJointLimitMotor limot1; // limit and motor information for axis1 - dxJointLimitMotor limot2; // limit and motor information for axis2 -}; -extern struct dxJoint::Vtable __duniversal_vtable; - - -// slider. if body2 is 0 then qrel is the absolute rotation of body1 and -// offset is the position of body1 center along axis1. - -struct dxJointSlider : public dxJoint { - dVector3 axis1; // axis w.r.t first body - dQuaternion qrel; // initial relative rotation body1 -> body2 - dVector3 offset; // point relative to body2 that should be - // aligned with body1 center along axis1 - dxJointLimitMotor limot; // limit and motor information -}; -extern struct dxJoint::Vtable __dslider_vtable; - - -// contact - -struct dxJointContact : public dxJoint { - int the_m; // number of rows computed by getInfo1 - dContact contact; -}; -extern struct dxJoint::Vtable __dcontact_vtable; - - -// hinge 2 - -struct dxJointHinge2 : public dxJoint { - dVector3 anchor1; // anchor w.r.t first body - dVector3 anchor2; // anchor w.r.t second body - dVector3 axis1; // axis 1 w.r.t first body - dVector3 axis2; // axis 2 w.r.t second body - dReal c0,s0; // cos,sin of desired angle between axis 1,2 - dVector3 v1,v2; // angle ref vectors embedded in first body - dxJointLimitMotor limot1; // limit+motor info for axis 1 - dxJointLimitMotor limot2; // limit+motor info for axis 2 - dReal susp_erp,susp_cfm; // suspension parameters (erp,cfm) -}; -extern struct dxJoint::Vtable __dhinge2_vtable; - - -// angular motor - -struct dxJointAMotor : public dxJoint { - int num; // number of axes (0..3) - int mode; // a dAMotorXXX constant - int rel[3]; // what the axes are relative to (global,b1,b2) - dVector3 axis[3]; // three axes - dxJointLimitMotor limot[3]; // limit+motor info for axes - dReal angle[3]; // user-supplied angles for axes - // these vectors are used for calculating euler angles - dVector3 reference1; // original axis[2], relative to body 1 - dVector3 reference2; // original axis[0], relative to body 2 -}; -extern struct dxJoint::Vtable __damotor_vtable; - - -// fixed - -struct dxJointFixed : public dxJoint { - dQuaternion qrel; // initial relative rotation body1 -> body2 - dVector3 offset; // relative offset between the bodies -}; -extern struct dxJoint::Vtable __dfixed_vtable; - - -// null joint, for testing only - -struct dxJointNull : public dxJoint { -}; -extern struct dxJoint::Vtable __dnull_vtable; - - - -#endif diff --git a/libraries/ode-0.9/contrib/BreakableJoints/objects.h b/libraries/ode-0.9/contrib/BreakableJoints/objects.h deleted file mode 100644 index de08391ede..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/objects.h +++ /dev/null @@ -1,252 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_OBJECTS_H_ -#define _ODE_OBJECTS_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* world */ - -dWorldID dWorldCreate(); -void dWorldDestroy (dWorldID); - -void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z); -void dWorldGetGravity (dWorldID, dVector3 gravity); -void dWorldSetERP (dWorldID, dReal erp); -dReal dWorldGetERP (dWorldID); -void dWorldSetCFM (dWorldID, dReal cfm); -dReal dWorldGetCFM (dWorldID); -void dWorldStep (dWorldID, dReal stepsize); -void dWorldImpulseToForce (dWorldID, dReal stepsize, - dReal ix, dReal iy, dReal iz, dVector3 force); - -/* StepFast1 functions */ - -void dWorldStepFast1(dWorldID, dReal stepsize, int maxiterations); -void dWorldSetAutoEnableDepthSF1(dWorldID, int autoEnableDepth); - -int dWorldGetAutoEnableDepthSF1(dWorldID); - -void dBodySetAutoDisableThresholdSF1(dBodyID, dReal autoDisableThreshold); - -/* These functions are not yet implemented by ODE. */ -/* -dReal dBodyGetAutoDisableThresholdSF1(dBodyID); - -void dBodySetAutoDisableStepsSF1(dBodyID, int AutoDisableSteps); - -int dBodyGetAutoDisableStepsSF1(dBodyID); - -void dBodySetAutoDisableSF1(dBodyID, int doAutoDisable); - -int dBodyGetAutoDisableSF1(dBodyID); -*/ - -/* bodies */ - -dBodyID dBodyCreate (dWorldID); -void dBodyDestroy (dBodyID); - -void dBodySetData (dBodyID, void *data); -void *dBodyGetData (dBodyID); - -void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z); -void dBodySetRotation (dBodyID, const dMatrix3 R); -void dBodySetQuaternion (dBodyID, const dQuaternion q); -void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z); -void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z); -const dReal * dBodyGetPosition (dBodyID); -const dReal * dBodyGetRotation (dBodyID); /* ptr to 4x3 rot matrix */ -const dReal * dBodyGetQuaternion (dBodyID); -const dReal * dBodyGetLinearVel (dBodyID); -const dReal * dBodyGetAngularVel (dBodyID); - -void dBodySetMass (dBodyID, const dMass *mass); -void dBodyGetMass (dBodyID, dMass *mass); - -void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz); -void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz); -void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz); -void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz); -void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); - -const dReal * dBodyGetForce (dBodyID); -const dReal * dBodyGetTorque (dBodyID); -void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z); -void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z); - -void dBodyGetRelPointPos (dBodyID, dReal px, dReal py, dReal pz, - dVector3 result); -void dBodyGetRelPointVel (dBodyID, dReal px, dReal py, dReal pz, - dVector3 result); -void dBodyGetPointVel (dBodyID, dReal px, dReal py, dReal pz, - dVector3 result); -void dBodyGetPosRelPoint (dBodyID, dReal px, dReal py, dReal pz, - dVector3 result); -void dBodyVectorToWorld (dBodyID, dReal px, dReal py, dReal pz, - dVector3 result); -void dBodyVectorFromWorld (dBodyID, dReal px, dReal py, dReal pz, - dVector3 result); - -void dBodySetFiniteRotationMode (dBodyID, int mode); -void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z); - -int dBodyGetFiniteRotationMode (dBodyID); -void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result); - -int dBodyGetNumJoints (dBodyID b); -dJointID dBodyGetJoint (dBodyID, int index); - -void dBodyEnable (dBodyID); -void dBodyDisable (dBodyID); -int dBodyIsEnabled (dBodyID); - -void dBodySetGravityMode (dBodyID b, int mode); -int dBodyGetGravityMode (dBodyID b); - - -/* joints */ - -dJointID dJointCreateBall (dWorldID, dJointGroupID); -dJointID dJointCreateHinge (dWorldID, dJointGroupID); -dJointID dJointCreateSlider (dWorldID, dJointGroupID); -dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *); -dJointID dJointCreateHinge2 (dWorldID, dJointGroupID); -dJointID dJointCreateUniversal (dWorldID, dJointGroupID); -dJointID dJointCreateFixed (dWorldID, dJointGroupID); -dJointID dJointCreateNull (dWorldID, dJointGroupID); -dJointID dJointCreateAMotor (dWorldID, dJointGroupID); - -void dJointDestroy (dJointID); - -dJointGroupID dJointGroupCreate (int max_size); -void dJointGroupDestroy (dJointGroupID); -void dJointGroupEmpty (dJointGroupID); - -void dJointAttach (dJointID, dBodyID body1, dBodyID body2); -void dJointSetData (dJointID, void *data); -void *dJointGetData (dJointID); -int dJointGetType (dJointID); -dBodyID dJointGetBody (dJointID, int index); - -void dJointSetFeedback (dJointID, dJointFeedback *); -dJointFeedback *dJointGetFeedback (dJointID); - -/******************** breakable joint contribution ***********************/ -void dJointSetBreakable (dJointID, int b); -void dJointSetBreakCallback (dJointID, dJointBreakCallback *callbackFunc); -void dJointSetBreakMode (dJointID, int mode); -int dJointGetBreakMode (dJointID); -void dJointSetBreakForce (dJointID, int body, dReal x, dReal y, dReal z); -void dJointSetBreakTorque (dJointID, int body, dReal x, dReal y, dReal z); -int dJointIsBreakable (dJointID); -void dJointGetBreakForce (dJointID, int body, dReal *force); -void dJointGetBreakTorque (dJointID, int body, dReal *torque); -/*************************************************************************/ - -void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z); -void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z); -void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z); -void dJointSetHingeParam (dJointID, int parameter, dReal value); -void dJointAddHingeTorque(dJointID joint, dReal torque); -void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z); -void dJointSetSliderParam (dJointID, int parameter, dReal value); -void dJointAddSliderForce(dJointID joint, dReal force); -void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z); -void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z); -void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z); -void dJointSetHinge2Param (dJointID, int parameter, dReal value); -void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2); -void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z); -void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z); -void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z); -void dJointSetUniversalParam (dJointID, int parameter, dReal value); -void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2); -void dJointSetFixed (dJointID); -void dJointSetAMotorNumAxes (dJointID, int num); -void dJointSetAMotorAxis (dJointID, int anum, int rel, - dReal x, dReal y, dReal z); -void dJointSetAMotorAngle (dJointID, int anum, dReal angle); -void dJointSetAMotorParam (dJointID, int parameter, dReal value); -void dJointSetAMotorMode (dJointID, int mode); -void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3); - -void dJointGetBallAnchor (dJointID, dVector3 result); -void dJointGetBallAnchor2 (dJointID, dVector3 result); -void dJointGetHingeAnchor (dJointID, dVector3 result); -void dJointGetHingeAnchor2 (dJointID, dVector3 result); -void dJointGetHingeAxis (dJointID, dVector3 result); -dReal dJointGetHingeParam (dJointID, int parameter); -dReal dJointGetHingeAngle (dJointID); -dReal dJointGetHingeAngleRate (dJointID); -dReal dJointGetSliderPosition (dJointID); -dReal dJointGetSliderPositionRate (dJointID); -void dJointGetSliderAxis (dJointID, dVector3 result); -dReal dJointGetSliderParam (dJointID, int parameter); -void dJointGetHinge2Anchor (dJointID, dVector3 result); -void dJointGetHinge2Anchor2 (dJointID, dVector3 result); -void dJointGetHinge2Axis1 (dJointID, dVector3 result); -void dJointGetHinge2Axis2 (dJointID, dVector3 result); -dReal dJointGetHinge2Param (dJointID, int parameter); -dReal dJointGetHinge2Angle1 (dJointID); -dReal dJointGetHinge2Angle1Rate (dJointID); -dReal dJointGetHinge2Angle2Rate (dJointID); -void dJointGetUniversalAnchor (dJointID, dVector3 result); -void dJointGetUniversalAnchor2 (dJointID, dVector3 result); -void dJointGetUniversalAxis1 (dJointID, dVector3 result); -void dJointGetUniversalAxis2 (dJointID, dVector3 result); -dReal dJointGetUniversalParam (dJointID, int parameter); -dReal dJointGetUniversalAngle1 (dJointID); -dReal dJointGetUniversalAngle2 (dJointID); -dReal dJointGetUniversalAngle1Rate (dJointID); -dReal dJointGetUniversalAngle2Rate (dJointID); -int dJointGetAMotorNumAxes (dJointID); -void dJointGetAMotorAxis (dJointID, int anum, dVector3 result); -int dJointGetAMotorAxisRel (dJointID, int anum); -dReal dJointGetAMotorAngle (dJointID, int anum); -dReal dJointGetAMotorAngleRate (dJointID, int anum); -dReal dJointGetAMotorParam (dJointID, int parameter); -int dJointGetAMotorMode (dJointID); - -int dAreConnected (dBodyID, dBodyID); -int dAreConnectedExcluding (dBodyID, dBodyID, int joint_type); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/contrib/BreakableJoints/ode.cpp b/libraries/ode-0.9/contrib/BreakableJoints/ode.cpp deleted file mode 100644 index 7137960dbc..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/ode.cpp +++ /dev/null @@ -1,1404 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifdef _MSC_VER -#pragma warning(disable:4291) // for VC++, no complaints about "no matching operator delete found" -#endif - -// this source file is mostly concerned with the data structures, not the -// numerics. - -#include "objects.h" -#include -#include "joint.h" -#include -#include -#include "step.h" -#include -#include - -// misc defines -#define ALLOCA dALLOCA16 - -//**************************************************************************** -// utility - -static inline void initObject (dObject *obj, dxWorld *w) -{ - obj->world = w; - obj->next = 0; - obj->tome = 0; - obj->userdata = 0; - obj->tag = 0; -} - - -// add an object `obj' to the list who's head pointer is pointed to by `first'. - -static inline void addObjectToList (dObject *obj, dObject **first) -{ - obj->next = *first; - obj->tome = first; - if (*first) (*first)->tome = &obj->next; - (*first) = obj; -} - - -// remove the object from the linked list - -static inline void removeObjectFromList (dObject *obj) -{ - if (obj->next) obj->next->tome = obj->tome; - *(obj->tome) = obj->next; - // safeguard - obj->next = 0; - obj->tome = 0; -} - - -// remove the joint from neighbour lists of all connected bodies - -static void removeJointReferencesFromAttachedBodies (dxJoint *j) -{ - for (int i=0; i<2; i++) { - dxBody *body = j->node[i].body; - if (body) { - dxJointNode *n = body->firstjoint; - dxJointNode *last = 0; - while (n) { - if (n->joint == j) { - if (last) last->next = n->next; - else body->firstjoint = n->next; - break; - } - last = n; - n = n->next; - } - } - } - j->node[0].body = 0; - j->node[0].next = 0; - j->node[1].body = 0; - j->node[1].next = 0; -} - -//**************************************************************************** -// island processing - -// this groups all joints and bodies in a world into islands. all objects -// in an island are reachable by going through connected bodies and joints. -// each island can be simulated separately. -// note that joints that are not attached to anything will not be included -// in any island, an so they do not affect the simulation. -// -// this function starts new island from unvisited bodies. however, it will -// never start a new islands from a disabled body. thus islands of disabled -// bodies will not be included in the simulation. disabled bodies are -// re-enabled if they are found to be part of an active island. - -static void processIslands (dxWorld *world, dReal stepsize) -{ - dxBody *b,*bb,**body; - dxJoint *j,**joint; - - // nothing to do if no bodies - if (world->nb <= 0) return; - - // make arrays for body and joint lists (for a single island) to go into - body = (dxBody**) ALLOCA (world->nb * sizeof(dxBody*)); - joint = (dxJoint**) ALLOCA (world->nj * sizeof(dxJoint*)); - int bcount = 0; // number of bodies in `body' - int jcount = 0; // number of joints in `joint' - - // set all body/joint tags to 0 - for (b=world->firstbody; b; b=(dxBody*)b->next) b->tag = 0; - for (j=world->firstjoint; j; j=(dxJoint*)j->next) j->tag = 0; - - // allocate a stack of unvisited bodies in the island. the maximum size of - // the stack can be the lesser of the number of bodies or joints, because - // new bodies are only ever added to the stack by going through untagged - // joints. all the bodies in the stack must be tagged! - int stackalloc = (world->nj < world->nb) ? world->nj : world->nb; - dxBody **stack = (dxBody**) ALLOCA (stackalloc * sizeof(dxBody*)); - - for (bb=world->firstbody; bb; bb=(dxBody*)bb->next) { - // get bb = the next enabled, untagged body, and tag it - if (bb->tag || (bb->flags & dxBodyDisabled)) continue; - bb->tag = 1; - - // tag all bodies and joints starting from bb. - int stacksize = 0; - b = bb; - body[0] = bb; - bcount = 1; - jcount = 0; - goto quickstart; - while (stacksize > 0) { - b = stack[--stacksize]; // pop body off stack - body[bcount++] = b; // put body on body list - quickstart: - - // traverse and tag all body's joints, add untagged connected bodies - // to stack - for (dxJointNode *n=b->firstjoint; n; n=n->next) { - if (!n->joint->tag) { - n->joint->tag = 1; - joint[jcount++] = n->joint; - if (n->body && !n->body->tag) { - n->body->tag = 1; - stack[stacksize++] = n->body; - } - } - } - dIASSERT(stacksize <= world->nb); - dIASSERT(stacksize <= world->nj); - } - - // now do something with body and joint lists - dInternalStepIsland (world,body,bcount,joint,jcount,stepsize); - - // what we've just done may have altered the body/joint tag values. - // we must make sure that these tags are nonzero. - // also make sure all bodies are in the enabled state. - int i; - for (i=0; itag = 1; - body[i]->flags &= ~dxBodyDisabled; - } - for (i=0; itag = 1; - } - - // if debugging, check that all objects (except for disabled bodies, - // unconnected joints, and joints that are connected to disabled bodies) - // were tagged. -# ifndef dNODEBUG - for (b=world->firstbody; b; b=(dxBody*)b->next) { - if (b->flags & dxBodyDisabled) { - if (b->tag) dDebug (0,"disabled body tagged"); - } - else { - if (!b->tag) dDebug (0,"enabled body not tagged"); - } - } - for (j=world->firstjoint; j; j=(dxJoint*)j->next) { - if ((j->node[0].body && (j->node[0].body->flags & dxBodyDisabled)==0) || - (j->node[1].body && (j->node[1].body->flags & dxBodyDisabled)==0)) { - if (!j->tag) dDebug (0,"attached enabled joint not tagged"); - } - else { - if (j->tag) dDebug (0,"unattached or disabled joint tagged"); - } - } -# endif - /******************** breakable joint contribution ***********************/ - dxJoint* nextJ; - if (!world->firstjoint) - nextJ = 0; - else - nextJ = (dxJoint*)world->firstjoint->next; - for (j=world->firstjoint; j; j=nextJ) { - nextJ = (dxJoint*)j->next; - // check if joint is breakable and broken - if (j->breakInfo && j->breakInfo->flags & dJOINT_BROKEN) { - // detach (break) the joint - dJointAttach (j, 0, 0); - // call the callback function if it is set - if (j->breakInfo->callback) j->breakInfo->callback (j); - // finally destroy the joint if the dJOINT_DELETE_ON_BREAK is set - if (j->breakInfo->flags & dJOINT_DELETE_ON_BREAK) dJointDestroy (j); - } - } - /*************************************************************************/ -} - -//**************************************************************************** -// debugging - -// see if an object list loops on itself (if so, it's bad). - -static int listHasLoops (dObject *first) -{ - if (first==0 || first->next==0) return 0; - dObject *a=first,*b=first->next; - int skip=0; - while (b) { - if (a==b) return 1; - b = b->next; - if (skip) a = a->next; - skip ^= 1; - } - return 0; -} - - -// check the validity of the world data structures - -static void checkWorld (dxWorld *w) -{ - dxBody *b; - dxJoint *j; - - // check there are no loops - if (listHasLoops (w->firstbody)) dDebug (0,"body list has loops"); - if (listHasLoops (w->firstjoint)) dDebug (0,"joint list has loops"); - - // check lists are well formed (check `tome' pointers) - for (b=w->firstbody; b; b=(dxBody*)b->next) { - if (b->next && b->next->tome != &b->next) - dDebug (0,"bad tome pointer in body list"); - } - for (j=w->firstjoint; j; j=(dxJoint*)j->next) { - if (j->next && j->next->tome != &j->next) - dDebug (0,"bad tome pointer in joint list"); - } - - // check counts - int n = 0; - for (b=w->firstbody; b; b=(dxBody*)b->next) n++; - if (w->nb != n) dDebug (0,"body count incorrect"); - n = 0; - for (j=w->firstjoint; j; j=(dxJoint*)j->next) n++; - if (w->nj != n) dDebug (0,"joint count incorrect"); - - // set all tag values to a known value - static int count = 0; - count++; - for (b=w->firstbody; b; b=(dxBody*)b->next) b->tag = count; - for (j=w->firstjoint; j; j=(dxJoint*)j->next) j->tag = count; - - // check all body/joint world pointers are ok - for (b=w->firstbody; b; b=(dxBody*)b->next) if (b->world != w) - dDebug (0,"bad world pointer in body list"); - for (j=w->firstjoint; j; j=(dxJoint*)j->next) if (j->world != w) - dDebug (0,"bad world pointer in joint list"); - - /* - // check for half-connected joints - actually now these are valid - for (j=w->firstjoint; j; j=(dxJoint*)j->next) { - if (j->node[0].body || j->node[1].body) { - if (!(j->node[0].body && j->node[1].body)) - dDebug (0,"half connected joint found"); - } - } - */ - - // check that every joint node appears in the joint lists of both bodies it - // attaches - for (j=w->firstjoint; j; j=(dxJoint*)j->next) { - for (int i=0; i<2; i++) { - if (j->node[i].body) { - int ok = 0; - for (dxJointNode *n=j->node[i].body->firstjoint; n; n=n->next) { - if (n->joint == j) ok = 1; - } - if (ok==0) dDebug (0,"joint not in joint list of attached body"); - } - } - } - - // check all body joint lists (correct body ptrs) - for (b=w->firstbody; b; b=(dxBody*)b->next) { - for (dxJointNode *n=b->firstjoint; n; n=n->next) { - if (&n->joint->node[0] == n) { - if (n->joint->node[1].body != b) - dDebug (0,"bad body pointer in joint node of body list (1)"); - } - else { - if (n->joint->node[0].body != b) - dDebug (0,"bad body pointer in joint node of body list (2)"); - } - if (n->joint->tag != count) dDebug (0,"bad joint node pointer in body"); - } - } - - // check all body pointers in joints, check they are distinct - for (j=w->firstjoint; j; j=(dxJoint*)j->next) { - if (j->node[0].body && (j->node[0].body == j->node[1].body)) - dDebug (0,"non-distinct body pointers in joint"); - if ((j->node[0].body && j->node[0].body->tag != count) || - (j->node[1].body && j->node[1].body->tag != count)) - dDebug (0,"bad body pointer in joint"); - } -} - - -void dWorldCheck (dxWorld *w) -{ - checkWorld (w); -} - -//**************************************************************************** -// body - -dxBody *dBodyCreate (dxWorld *w) -{ - dAASSERT (w); - dxBody *b = new dxBody; - initObject (b,w); - b->firstjoint = 0; - b->flags = 0; - b->geom = 0; - dMassSetParameters (&b->mass,1,0,0,0,1,1,1,0,0,0); - dSetZero (b->invI,4*3); - b->invI[0] = 1; - b->invI[5] = 1; - b->invI[10] = 1; - b->invMass = 1; - dSetZero (b->pos,4); - dSetZero (b->q,4); - b->q[0] = 1; - dRSetIdentity (b->R); - dSetZero (b->lvel,4); - dSetZero (b->avel,4); - dSetZero (b->facc,4); - dSetZero (b->tacc,4); - dSetZero (b->finite_rot_axis,4); - addObjectToList (b,(dObject **) &w->firstbody); - w->nb++; - return b; -} - - -void dBodyDestroy (dxBody *b) -{ - dAASSERT (b); - - // all geoms that link to this body must be notified that the body is about - // to disappear. note that the call to dGeomSetBody(geom,0) will result in - // dGeomGetBodyNext() returning 0 for the body, so we must get the next body - // before setting the body to 0. - dxGeom *next_geom = 0; - for (dxGeom *geom = b->geom; geom; geom = next_geom) { - next_geom = dGeomGetBodyNext (geom); - dGeomSetBody (geom,0); - } - - // detach all neighbouring joints, then delete this body. - dxJointNode *n = b->firstjoint; - while (n) { - // sneaky trick to speed up removal of joint references (black magic) - n->joint->node[(n == n->joint->node)].body = 0; - - dxJointNode *next = n->next; - n->next = 0; - removeJointReferencesFromAttachedBodies (n->joint); - n = next; - } - removeObjectFromList (b); - b->world->nb--; - delete b; -} - - -void dBodySetData (dBodyID b, void *data) -{ - dAASSERT (b); - b->userdata = data; -} - - -void *dBodyGetData (dBodyID b) -{ - dAASSERT (b); - return b->userdata; -} - - -void dBodySetPosition (dBodyID b, dReal x, dReal y, dReal z) -{ - dAASSERT (b); - b->pos[0] = x; - b->pos[1] = y; - b->pos[2] = z; - - // notify all attached geoms that this body has moved - for (dxGeom *geom = b->geom; geom; geom = dGeomGetBodyNext (geom)) - dGeomMoved (geom); -} - - -void dBodySetRotation (dBodyID b, const dMatrix3 R) -{ - dAASSERT (b && R); - dQuaternion q; - dRtoQ (R,q); - dNormalize4 (q); - b->q[0] = q[0]; - b->q[1] = q[1]; - b->q[2] = q[2]; - b->q[3] = q[3]; - dQtoR (b->q,b->R); - - // notify all attached geoms that this body has moved - for (dxGeom *geom = b->geom; geom; geom = dGeomGetBodyNext (geom)) - dGeomMoved (geom); -} - - -void dBodySetQuaternion (dBodyID b, const dQuaternion q) -{ - dAASSERT (b && q); - b->q[0] = q[0]; - b->q[1] = q[1]; - b->q[2] = q[2]; - b->q[3] = q[3]; - dNormalize4 (b->q); - dQtoR (b->q,b->R); - - // notify all attached geoms that this body has moved - for (dxGeom *geom = b->geom; geom; geom = dGeomGetBodyNext (geom)) - dGeomMoved (geom); -} - - -void dBodySetLinearVel (dBodyID b, dReal x, dReal y, dReal z) -{ - dAASSERT (b); - b->lvel[0] = x; - b->lvel[1] = y; - b->lvel[2] = z; -} - - -void dBodySetAngularVel (dBodyID b, dReal x, dReal y, dReal z) -{ - dAASSERT (b); - b->avel[0] = x; - b->avel[1] = y; - b->avel[2] = z; -} - - -const dReal * dBodyGetPosition (dBodyID b) -{ - dAASSERT (b); - return b->pos; -} - - -const dReal * dBodyGetRotation (dBodyID b) -{ - dAASSERT (b); - return b->R; -} - - -const dReal * dBodyGetQuaternion (dBodyID b) -{ - dAASSERT (b); - return b->q; -} - - -const dReal * dBodyGetLinearVel (dBodyID b) -{ - dAASSERT (b); - return b->lvel; -} - - -const dReal * dBodyGetAngularVel (dBodyID b) -{ - dAASSERT (b); - return b->avel; -} - - -void dBodySetMass (dBodyID b, const dMass *mass) -{ - dAASSERT (b && mass); - memcpy (&b->mass,mass,sizeof(dMass)); - if (dInvertPDMatrix (b->mass.I,b->invI,3)==0) { - dDEBUGMSG ("inertia must be positive definite"); - dRSetIdentity (b->invI); - } - b->invMass = dRecip(b->mass.mass); -} - - -void dBodyGetMass (dBodyID b, dMass *mass) -{ - dAASSERT (b && mass); - memcpy (mass,&b->mass,sizeof(dMass)); -} - - -void dBodyAddForce (dBodyID b, dReal fx, dReal fy, dReal fz) -{ - dAASSERT (b); - b->facc[0] += fx; - b->facc[1] += fy; - b->facc[2] += fz; -} - - -void dBodyAddTorque (dBodyID b, dReal fx, dReal fy, dReal fz) -{ - dAASSERT (b); - b->tacc[0] += fx; - b->tacc[1] += fy; - b->tacc[2] += fz; -} - - -void dBodyAddRelForce (dBodyID b, dReal fx, dReal fy, dReal fz) -{ - dAASSERT (b); - dVector3 t1,t2; - t1[0] = fx; - t1[1] = fy; - t1[2] = fz; - t1[3] = 0; - dMULTIPLY0_331 (t2,b->R,t1); - b->facc[0] += t2[0]; - b->facc[1] += t2[1]; - b->facc[2] += t2[2]; -} - - -void dBodyAddRelTorque (dBodyID b, dReal fx, dReal fy, dReal fz) -{ - dAASSERT (b); - dVector3 t1,t2; - t1[0] = fx; - t1[1] = fy; - t1[2] = fz; - t1[3] = 0; - dMULTIPLY0_331 (t2,b->R,t1); - b->tacc[0] += t2[0]; - b->tacc[1] += t2[1]; - b->tacc[2] += t2[2]; -} - - -void dBodyAddForceAtPos (dBodyID b, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) -{ - dAASSERT (b); - b->facc[0] += fx; - b->facc[1] += fy; - b->facc[2] += fz; - dVector3 f,q; - f[0] = fx; - f[1] = fy; - f[2] = fz; - q[0] = px - b->pos[0]; - q[1] = py - b->pos[1]; - q[2] = pz - b->pos[2]; - dCROSS (b->tacc,+=,q,f); -} - - -void dBodyAddForceAtRelPos (dBodyID b, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) -{ - dAASSERT (b); - dVector3 prel,f,p; - f[0] = fx; - f[1] = fy; - f[2] = fz; - f[3] = 0; - prel[0] = px; - prel[1] = py; - prel[2] = pz; - prel[3] = 0; - dMULTIPLY0_331 (p,b->R,prel); - b->facc[0] += f[0]; - b->facc[1] += f[1]; - b->facc[2] += f[2]; - dCROSS (b->tacc,+=,p,f); -} - - -void dBodyAddRelForceAtPos (dBodyID b, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) -{ - dAASSERT (b); - dVector3 frel,f; - frel[0] = fx; - frel[1] = fy; - frel[2] = fz; - frel[3] = 0; - dMULTIPLY0_331 (f,b->R,frel); - b->facc[0] += f[0]; - b->facc[1] += f[1]; - b->facc[2] += f[2]; - dVector3 q; - q[0] = px - b->pos[0]; - q[1] = py - b->pos[1]; - q[2] = pz - b->pos[2]; - dCROSS (b->tacc,+=,q,f); -} - - -void dBodyAddRelForceAtRelPos (dBodyID b, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) -{ - dAASSERT (b); - dVector3 frel,prel,f,p; - frel[0] = fx; - frel[1] = fy; - frel[2] = fz; - frel[3] = 0; - prel[0] = px; - prel[1] = py; - prel[2] = pz; - prel[3] = 0; - dMULTIPLY0_331 (f,b->R,frel); - dMULTIPLY0_331 (p,b->R,prel); - b->facc[0] += f[0]; - b->facc[1] += f[1]; - b->facc[2] += f[2]; - dCROSS (b->tacc,+=,p,f); -} - - -const dReal * dBodyGetForce (dBodyID b) -{ - dAASSERT (b); - return b->facc; -} - - -const dReal * dBodyGetTorque (dBodyID b) -{ - dAASSERT (b); - return b->tacc; -} - - -void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z) -{ - dAASSERT (b); - b->facc[0] = x; - b->facc[1] = y; - b->facc[2] = z; -} - - -void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z) -{ - dAASSERT (b); - b->tacc[0] = x; - b->tacc[1] = y; - b->tacc[2] = z; -} - - -void dBodyGetRelPointPos (dBodyID b, dReal px, dReal py, dReal pz, - dVector3 result) -{ - dAASSERT (b); - dVector3 prel,p; - prel[0] = px; - prel[1] = py; - prel[2] = pz; - prel[3] = 0; - dMULTIPLY0_331 (p,b->R,prel); - result[0] = p[0] + b->pos[0]; - result[1] = p[1] + b->pos[1]; - result[2] = p[2] + b->pos[2]; -} - - -void dBodyGetRelPointVel (dBodyID b, dReal px, dReal py, dReal pz, - dVector3 result) -{ - dAASSERT (b); - dVector3 prel,p; - prel[0] = px; - prel[1] = py; - prel[2] = pz; - prel[3] = 0; - dMULTIPLY0_331 (p,b->R,prel); - result[0] = b->lvel[0]; - result[1] = b->lvel[1]; - result[2] = b->lvel[2]; - dCROSS (result,+=,b->avel,p); -} - - -void dBodyGetPointVel (dBodyID b, dReal px, dReal py, dReal pz, - dVector3 result) -{ - dAASSERT (b); - dVector3 p; - p[0] = px - b->pos[0]; - p[1] = py - b->pos[1]; - p[2] = pz - b->pos[2]; - p[3] = 0; - result[0] = b->lvel[0]; - result[1] = b->lvel[1]; - result[2] = b->lvel[2]; - dCROSS (result,+=,b->avel,p); -} - - -void dBodyGetPosRelPoint (dBodyID b, dReal px, dReal py, dReal pz, - dVector3 result) -{ - dAASSERT (b); - dVector3 prel; - prel[0] = px - b->pos[0]; - prel[1] = py - b->pos[1]; - prel[2] = pz - b->pos[2]; - prel[3] = 0; - dMULTIPLY1_331 (result,b->R,prel); -} - - -void dBodyVectorToWorld (dBodyID b, dReal px, dReal py, dReal pz, - dVector3 result) -{ - dAASSERT (b); - dVector3 p; - p[0] = px; - p[1] = py; - p[2] = pz; - p[3] = 0; - dMULTIPLY0_331 (result,b->R,p); -} - - -void dBodyVectorFromWorld (dBodyID b, dReal px, dReal py, dReal pz, - dVector3 result) -{ - dAASSERT (b); - dVector3 p; - p[0] = px; - p[1] = py; - p[2] = pz; - p[3] = 0; - dMULTIPLY1_331 (result,b->R,p); -} - - -void dBodySetFiniteRotationMode (dBodyID b, int mode) -{ - dAASSERT (b); - b->flags &= ~(dxBodyFlagFiniteRotation | dxBodyFlagFiniteRotationAxis); - if (mode) { - b->flags |= dxBodyFlagFiniteRotation; - if (b->finite_rot_axis[0] != 0 || b->finite_rot_axis[1] != 0 || - b->finite_rot_axis[2] != 0) { - b->flags |= dxBodyFlagFiniteRotationAxis; - } - } -} - - -void dBodySetFiniteRotationAxis (dBodyID b, dReal x, dReal y, dReal z) -{ - dAASSERT (b); - b->finite_rot_axis[0] = x; - b->finite_rot_axis[1] = y; - b->finite_rot_axis[2] = z; - if (x != 0 || y != 0 || z != 0) { - dNormalize3 (b->finite_rot_axis); - b->flags |= dxBodyFlagFiniteRotationAxis; - } - else { - b->flags &= ~dxBodyFlagFiniteRotationAxis; - } -} - - -int dBodyGetFiniteRotationMode (dBodyID b) -{ - dAASSERT (b); - return ((b->flags & dxBodyFlagFiniteRotation) != 0); -} - - -void dBodyGetFiniteRotationAxis (dBodyID b, dVector3 result) -{ - dAASSERT (b); - result[0] = b->finite_rot_axis[0]; - result[1] = b->finite_rot_axis[1]; - result[2] = b->finite_rot_axis[2]; -} - - -int dBodyGetNumJoints (dBodyID b) -{ - dAASSERT (b); - int count=0; - for (dxJointNode *n=b->firstjoint; n; n=n->next, count++); - return count; -} - - -dJointID dBodyGetJoint (dBodyID b, int index) -{ - dAASSERT (b); - int i=0; - for (dxJointNode *n=b->firstjoint; n; n=n->next, i++) { - if (i == index) return n->joint; - } - return 0; -} - - -void dBodyEnable (dBodyID b) -{ - dAASSERT (b); - b->flags &= ~dxBodyDisabled; -} - - -void dBodyDisable (dBodyID b) -{ - dAASSERT (b); - b->flags |= dxBodyDisabled; -} - - -int dBodyIsEnabled (dBodyID b) -{ - dAASSERT (b); - return ((b->flags & dxBodyDisabled) == 0); -} - - -void dBodySetGravityMode (dBodyID b, int mode) -{ - dAASSERT (b); - if (mode) b->flags &= ~dxBodyNoGravity; - else b->flags |= dxBodyNoGravity; -} - - -int dBodyGetGravityMode (dBodyID b) -{ - dAASSERT (b); - return ((b->flags & dxBodyNoGravity) == 0); -} - -//**************************************************************************** -// joints - -static void dJointInit (dxWorld *w, dxJoint *j) -{ - dIASSERT (w && j); - initObject (j,w); - j->vtable = 0; - j->flags = 0; - j->node[0].joint = j; - j->node[0].body = 0; - j->node[0].next = 0; - j->node[1].joint = j; - j->node[1].body = 0; - j->node[1].next = 0; - addObjectToList (j,(dObject **) &w->firstjoint); - w->nj++; -} - - -static dxJoint *createJoint (dWorldID w, dJointGroupID group, - dxJoint::Vtable *vtable) -{ - dIASSERT (w && vtable); - dxJoint *j; - if (group) { - j = (dxJoint*) group->stack.alloc (vtable->size); - group->num++; - } - else j = (dxJoint*) dAlloc (vtable->size); - dJointInit (w,j); - j->vtable = vtable; - if (group) j->flags |= dJOINT_INGROUP; - if (vtable->init) vtable->init (j); - j->feedback = 0; - /******************** breakable joint contribution ***********************/ - j->breakInfo = 0; - /*************************************************************************/ - return j; -} - - -dxJoint * dJointCreateBall (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__dball_vtable); -} - - -dxJoint * dJointCreateHinge (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__dhinge_vtable); -} - - -dxJoint * dJointCreateSlider (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__dslider_vtable); -} - - -dxJoint * dJointCreateContact (dWorldID w, dJointGroupID group, - const dContact *c) -{ - dAASSERT (w && c); - dxJointContact *j = (dxJointContact *) - createJoint (w,group,&__dcontact_vtable); - j->contact = *c; - return j; -} - - -dxJoint * dJointCreateHinge2 (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__dhinge2_vtable); -} - - -dxJoint * dJointCreateUniversal (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__duniversal_vtable); -} - - -dxJoint * dJointCreateFixed (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__dfixed_vtable); -} - - -dxJoint * dJointCreateNull (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__dnull_vtable); -} - - -dxJoint * dJointCreateAMotor (dWorldID w, dJointGroupID group) -{ - dAASSERT (w); - return createJoint (w,group,&__damotor_vtable); -} - - -void dJointDestroy (dxJoint *j) -{ - dAASSERT (j); - if (j->flags & dJOINT_INGROUP) return; - removeJointReferencesFromAttachedBodies (j); - removeObjectFromList (j); - /******************** breakable joint contribution ***********************/ - if (j->breakInfo) delete j->breakInfo; - /*************************************************************************/ - j->world->nj--; - dFree (j,j->vtable->size); -} - - -dJointGroupID dJointGroupCreate (int max_size) -{ - // not any more ... dUASSERT (max_size > 0,"max size must be > 0"); - dxJointGroup *group = new dxJointGroup; - group->num = 0; - return group; -} - - -void dJointGroupDestroy (dJointGroupID group) -{ - dAASSERT (group); - dJointGroupEmpty (group); - delete group; -} - - -void dJointGroupEmpty (dJointGroupID group) -{ - // the joints in this group are detached starting from the most recently - // added (at the top of the stack). this helps ensure that the various - // linked lists are not traversed too much, as the joints will hopefully - // be at the start of those lists. - // if any group joints have their world pointer set to 0, their world was - // previously destroyed. no special handling is required for these joints. - - dAASSERT (group); - int i; - dxJoint **jlist = (dxJoint**) ALLOCA (group->num * sizeof(dxJoint*)); - dxJoint *j = (dxJoint*) group->stack.rewind(); - for (i=0; i < group->num; i++) { - jlist[i] = j; - j = (dxJoint*) (group->stack.next (j->vtable->size)); - } - for (i=group->num-1; i >= 0; i--) { - if (jlist[i]->world) { - removeJointReferencesFromAttachedBodies (jlist[i]); - removeObjectFromList (jlist[i]); - jlist[i]->world->nj--; - } - } - group->num = 0; - group->stack.freeAll(); -} - - -void dJointAttach (dxJoint *joint, dxBody *body1, dxBody *body2) -{ - // check arguments - dUASSERT (joint,"bad joint argument"); - dUASSERT (body1 == 0 || body1 != body2,"can't have body1==body2"); - dxWorld *world = joint->world; - dUASSERT ( (!body1 || body1->world == world) && - (!body2 || body2->world == world), - "joint and bodies must be in same world"); - - // check if the joint can not be attached to just one body - dUASSERT (!((joint->flags & dJOINT_TWOBODIES) && - ((body1 != 0) ^ (body2 != 0))), - "joint can not be attached to just one body"); - - // remove any existing body attachments - if (joint->node[0].body || joint->node[1].body) { - removeJointReferencesFromAttachedBodies (joint); - } - - // if a body is zero, make sure that it is body2, so 0 --> node[1].body - if (body1==0) { - body1 = body2; - body2 = 0; - joint->flags |= dJOINT_REVERSE; - } - else { - joint->flags &= (~dJOINT_REVERSE); - } - - // attach to new bodies - joint->node[0].body = body1; - joint->node[1].body = body2; - if (body1) { - joint->node[1].next = body1->firstjoint; - body1->firstjoint = &joint->node[1]; - } - else joint->node[1].next = 0; - if (body2) { - joint->node[0].next = body2->firstjoint; - body2->firstjoint = &joint->node[0]; - } - else { - joint->node[0].next = 0; - } -} - - -void dJointSetData (dxJoint *joint, void *data) -{ - dAASSERT (joint); - joint->userdata = data; -} - - -void *dJointGetData (dxJoint *joint) -{ - dAASSERT (joint); - return joint->userdata; -} - - -int dJointGetType (dxJoint *joint) -{ - dAASSERT (joint); - return joint->vtable->typenum; -} - - -dBodyID dJointGetBody (dxJoint *joint, int index) -{ - dAASSERT (joint); - if (index >= 0 && index < 2) return joint->node[index].body; - else return 0; -} - - -void dJointSetFeedback (dxJoint *joint, dJointFeedback *f) -{ - dAASSERT (joint); - joint->feedback = f; -} - - -dJointFeedback *dJointGetFeedback (dxJoint *joint) -{ - dAASSERT (joint); - return joint->feedback; -} - - -int dAreConnected (dBodyID b1, dBodyID b2) -{ - dAASSERT (b1 && b2); - // look through b1's neighbour list for b2 - for (dxJointNode *n=b1->firstjoint; n; n=n->next) { - if (n->body == b2) return 1; - } - return 0; -} - - -int dAreConnectedExcluding (dBodyID b1, dBodyID b2, int joint_type) -{ - dAASSERT (b1 && b2); - // look through b1's neighbour list for b2 - for (dxJointNode *n=b1->firstjoint; n; n=n->next) { - if (dJointGetType (n->joint) != joint_type && n->body == b2) return 1; - } - return 0; -} - -//**************************************************************************** -// world - -dxWorld * dWorldCreate() -{ - dxWorld *w = new dxWorld; - w->firstbody = 0; - w->firstjoint = 0; - w->nb = 0; - w->nj = 0; - dSetZero (w->gravity,4); - w->global_erp = REAL(0.2); -#if defined(dSINGLE) - w->global_cfm = 1e-5f; -#elif defined(dDOUBLE) - w->global_cfm = 1e-10; -#else - #error dSINGLE or dDOUBLE must be defined -#endif - return w; -} - - -void dWorldDestroy (dxWorld *w) -{ - // delete all bodies and joints - dAASSERT (w); - dxBody *nextb, *b = w->firstbody; - while (b) { - nextb = (dxBody*) b->next; - delete b; - b = nextb; - } - dxJoint *nextj, *j = w->firstjoint; - while (j) { - nextj = (dxJoint*)j->next; - if (j->flags & dJOINT_INGROUP) { - // the joint is part of a group, so "deactivate" it instead - j->world = 0; - j->node[0].body = 0; - j->node[0].next = 0; - j->node[1].body = 0; - j->node[1].next = 0; - dMessage (0,"warning: destroying world containing grouped joints"); - } - else { - dFree (j,j->vtable->size); - } - j = nextj; - } - delete w; -} - - -void dWorldSetGravity (dWorldID w, dReal x, dReal y, dReal z) -{ - dAASSERT (w); - w->gravity[0] = x; - w->gravity[1] = y; - w->gravity[2] = z; -} - - -void dWorldGetGravity (dWorldID w, dVector3 g) -{ - dAASSERT (w); - g[0] = w->gravity[0]; - g[1] = w->gravity[1]; - g[2] = w->gravity[2]; -} - - -void dWorldSetERP (dWorldID w, dReal erp) -{ - dAASSERT (w); - w->global_erp = erp; -} - - -dReal dWorldGetERP (dWorldID w) -{ - dAASSERT (w); - return w->global_erp; -} - - -void dWorldSetCFM (dWorldID w, dReal cfm) -{ - dAASSERT (w); - w->global_cfm = cfm; -} - - -dReal dWorldGetCFM (dWorldID w) -{ - dAASSERT (w); - return w->global_cfm; -} - - -void dWorldStep (dWorldID w, dReal stepsize) -{ - dUASSERT (w,"bad world argument"); - dUASSERT (stepsize > 0,"stepsize must be > 0"); - processIslands (w,stepsize); -} - - -void dWorldImpulseToForce (dWorldID w, dReal stepsize, - dReal ix, dReal iy, dReal iz, - dVector3 force) -{ - dAASSERT (w); - stepsize = dRecip(stepsize); - force[0] = stepsize * ix; - force[1] = stepsize * iy; - force[2] = stepsize * iz; - // @@@ force[3] = 0; -} - -//**************************************************************************** -// testing - -#define NUM 100 - -#define DO(x) - - -extern "C" void dTestDataStructures() -{ - int i; - DO(printf ("testDynamicsStuff()\n")); - - dBodyID body [NUM]; - int nb = 0; - dJointID joint [NUM]; - int nj = 0; - - for (i=0; i 0.5) { - DO(printf ("creating body\n")); - body[nb] = dBodyCreate (w); - DO(printf ("\t--> %p\n",body[nb])); - nb++; - checkWorld (w); - DO(printf ("%d BODIES, %d JOINTS\n",nb,nj)); - } - if (nj < NUM && nb > 2 && dRandReal() > 0.5) { - dBodyID b1 = body [dRand() % nb]; - dBodyID b2 = body [dRand() % nb]; - if (b1 != b2) { - DO(printf ("creating joint, attaching to %p,%p\n",b1,b2)); - joint[nj] = dJointCreateBall (w,0); - DO(printf ("\t-->%p\n",joint[nj])); - checkWorld (w); - dJointAttach (joint[nj],b1,b2); - nj++; - checkWorld (w); - DO(printf ("%d BODIES, %d JOINTS\n",nb,nj)); - } - } - if (nj > 0 && nb > 2 && dRandReal() > 0.5) { - dBodyID b1 = body [dRand() % nb]; - dBodyID b2 = body [dRand() % nb]; - if (b1 != b2) { - int k = dRand() % nj; - DO(printf ("reattaching joint %p\n",joint[k])); - dJointAttach (joint[k],b1,b2); - checkWorld (w); - DO(printf ("%d BODIES, %d JOINTS\n",nb,nj)); - } - } - if (nb > 0 && dRandReal() > 0.5) { - int k = dRand() % nb; - DO(printf ("destroying body %p\n",body[k])); - dBodyDestroy (body[k]); - checkWorld (w); - for (; k < (NUM-1); k++) body[k] = body[k+1]; - nb--; - DO(printf ("%d BODIES, %d JOINTS\n",nb,nj)); - } - if (nj > 0 && dRandReal() > 0.5) { - int k = dRand() % nj; - DO(printf ("destroying joint %p\n",joint[k])); - dJointDestroy (joint[k]); - checkWorld (w); - for (; k < (NUM-1); k++) joint[k] = joint[k+1]; - nj--; - DO(printf ("%d BODIES, %d JOINTS\n",nb,nj)); - } - } - - /* - printf ("creating world\n"); - dWorldID w = dWorldCreate(); - checkWorld (w); - printf ("creating body\n"); - dBodyID b1 = dBodyCreate (w); - checkWorld (w); - printf ("creating body\n"); - dBodyID b2 = dBodyCreate (w); - checkWorld (w); - printf ("creating joint\n"); - dJointID j = dJointCreateBall (w); - checkWorld (w); - printf ("attaching joint\n"); - dJointAttach (j,b1,b2); - checkWorld (w); - printf ("destroying joint\n"); - dJointDestroy (j); - checkWorld (w); - printf ("destroying body\n"); - dBodyDestroy (b1); - checkWorld (w); - printf ("destroying body\n"); - dBodyDestroy (b2); - checkWorld (w); - printf ("destroying world\n"); - dWorldDestroy (w); - */ -} diff --git a/libraries/ode-0.9/contrib/BreakableJoints/step.cpp b/libraries/ode-0.9/contrib/BreakableJoints/step.cpp deleted file mode 100644 index 38aed6ccad..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/step.cpp +++ /dev/null @@ -1,1170 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include "objects.h" -#include "joint.h" -#include -#include -#include -#include -#include -#include -#include "lcp.h" - -//**************************************************************************** -// misc defines - -#define FAST_FACTOR -//#define TIMING - -#define ALLOCA dALLOCA16 - -//**************************************************************************** -// debugging - comparison of various vectors and matrices produced by the -// slow and fast versions of the stepper. - -//#define COMPARE_METHODS - -#ifdef COMPARE_METHODS -#include "testing.h" -dMatrixComparison comparator; -#endif - -//**************************************************************************** -// special matrix multipliers - -// this assumes the 4th and 8th rows of B and C are zero. - -static void Multiply2_p8r (dReal *A, dReal *B, dReal *C, - int p, int r, int Askip) -{ - int i,j; - dReal sum,*bb,*cc; - dIASSERT (p>0 && r>0 && A && B && C); - bb = B; - for (i=p; i; i--) { - cc = C; - for (j=r; j; j--) { - sum = bb[0]*cc[0]; - sum += bb[1]*cc[1]; - sum += bb[2]*cc[2]; - sum += bb[4]*cc[4]; - sum += bb[5]*cc[5]; - sum += bb[6]*cc[6]; - *(A++) = sum; - cc += 8; - } - A += Askip - r; - bb += 8; - } -} - - -// this assumes the 4th and 8th rows of B and C are zero. - -static void MultiplyAdd2_p8r (dReal *A, dReal *B, dReal *C, - int p, int r, int Askip) -{ - int i,j; - dReal sum,*bb,*cc; - dIASSERT (p>0 && r>0 && A && B && C); - bb = B; - for (i=p; i; i--) { - cc = C; - for (j=r; j; j--) { - sum = bb[0]*cc[0]; - sum += bb[1]*cc[1]; - sum += bb[2]*cc[2]; - sum += bb[4]*cc[4]; - sum += bb[5]*cc[5]; - sum += bb[6]*cc[6]; - *(A++) += sum; - cc += 8; - } - A += Askip - r; - bb += 8; - } -} - - -// this assumes the 4th and 8th rows of B are zero. - -static void Multiply0_p81 (dReal *A, dReal *B, dReal *C, int p) -{ - int i; - dIASSERT (p>0 && A && B && C); - dReal sum; - for (i=p; i; i--) { - sum = B[0]*C[0]; - sum += B[1]*C[1]; - sum += B[2]*C[2]; - sum += B[4]*C[4]; - sum += B[5]*C[5]; - sum += B[6]*C[6]; - *(A++) = sum; - B += 8; - } -} - - -// this assumes the 4th and 8th rows of B are zero. - -static void MultiplyAdd0_p81 (dReal *A, dReal *B, dReal *C, int p) -{ - int i; - dIASSERT (p>0 && A && B && C); - dReal sum; - for (i=p; i; i--) { - sum = B[0]*C[0]; - sum += B[1]*C[1]; - sum += B[2]*C[2]; - sum += B[4]*C[4]; - sum += B[5]*C[5]; - sum += B[6]*C[6]; - *(A++) += sum; - B += 8; - } -} - - -// this assumes the 4th and 8th rows of B are zero. - -static void MultiplyAdd1_8q1 (dReal *A, dReal *B, dReal *C, int q) -{ - int k; - dReal sum; - dIASSERT (q>0 && A && B && C); - sum = 0; - for (k=0; k0 && A && B && C); - sum = 0; - for (k=0; kpos[j] += h * b->lvel[j]; - - if (b->flags & dxBodyFlagFiniteRotation) { - dVector3 irv; // infitesimal rotation vector - dQuaternion q; // quaternion for finite rotation - - if (b->flags & dxBodyFlagFiniteRotationAxis) { - // split the angular velocity vector into a component along the finite - // rotation axis, and a component orthogonal to it. - dVector3 frv,irv; // finite rotation vector - dReal k = dDOT (b->finite_rot_axis,b->avel); - frv[0] = b->finite_rot_axis[0] * k; - frv[1] = b->finite_rot_axis[1] * k; - frv[2] = b->finite_rot_axis[2] * k; - irv[0] = b->avel[0] - frv[0]; - irv[1] = b->avel[1] - frv[1]; - irv[2] = b->avel[2] - frv[2]; - - // make a rotation quaternion q that corresponds to frv * h. - // compare this with the full-finite-rotation case below. - h *= REAL(0.5); - dReal theta = k * h; - q[0] = dCos(theta); - dReal s = sinc(theta) * h; - q[1] = frv[0] * s; - q[2] = frv[1] * s; - q[3] = frv[2] * s; - } - else { - // make a rotation quaternion q that corresponds to w * h - dReal wlen = dSqrt (b->avel[0]*b->avel[0] + b->avel[1]*b->avel[1] + - b->avel[2]*b->avel[2]); - h *= REAL(0.5); - dReal theta = wlen * h; - q[0] = dCos(theta); - dReal s = sinc(theta) * h; - q[1] = b->avel[0] * s; - q[2] = b->avel[1] * s; - q[3] = b->avel[2] * s; - } - - // do the finite rotation - dQuaternion q2; - dQMultiply0 (q2,q,b->q); - for (j=0; j<4; j++) b->q[j] = q2[j]; - - // do the infitesimal rotation if required - if (b->flags & dxBodyFlagFiniteRotationAxis) { - dReal dq[4]; - dWtoDQ (irv,b->q,dq); - for (j=0; j<4; j++) b->q[j] += h * dq[j]; - } - } - else { - // the normal way - do an infitesimal rotation - dReal dq[4]; - dWtoDQ (b->avel,b->q,dq); - for (j=0; j<4; j++) b->q[j] += h * dq[j]; - } - - // normalize the quaternion and convert it to a rotation matrix - dNormalize4 (b->q); - dQtoR (b->q,b->R); - - // notify all attached geoms that this body has moved - for (dxGeom *geom = b->geom; geom; geom = dGeomGetBodyNext (geom)) - dGeomMoved (geom); -} - -//**************************************************************************** -// the slow, but sure way -// note that this does not do any joint feedback! - -// given lists of bodies and joints that form an island, perform a first -// order timestep. -// -// `body' is the body array, `nb' is the size of the array. -// `_joint' is the body array, `nj' is the size of the array. - -void dInternalStepIsland_x1 (dxWorld *world, dxBody * const *body, int nb, - dxJoint * const *_joint, int nj, dReal stepsize) -{ - int i,j,k; - int n6 = 6*nb; - -# ifdef TIMING - dTimerStart("preprocessing"); -# endif - - // number all bodies in the body list - set their tag values - for (i=0; itag = i; - - // make a local copy of the joint array, because we might want to modify it. - // (the "dxJoint *const*" declaration says we're allowed to modify the joints - // but not the joint array, because the caller might need it unchanged). - dxJoint **joint = (dxJoint**) ALLOCA (nj * sizeof(dxJoint*)); - memcpy (joint,_joint,nj * sizeof(dxJoint*)); - - // for all bodies, compute the inertia tensor and its inverse in the global - // frame, and compute the rotational force and add it to the torque - // accumulator. - // @@@ check computation of rotational force. - dReal *I = (dReal*) ALLOCA (3*nb*4 * sizeof(dReal)); - dReal *invI = (dReal*) ALLOCA (3*nb*4 * sizeof(dReal)); - - //dSetZero (I,3*nb*4); - //dSetZero (invI,3*nb*4); - for (i=0; imass.I,body[i]->R); - dMULTIPLY0_333 (I+i*12,body[i]->R,tmp); - // compute inverse inertia tensor in global frame - dMULTIPLY2_333 (tmp,body[i]->invI,body[i]->R); - dMULTIPLY0_333 (invI+i*12,body[i]->R,tmp); - // compute rotational force - dMULTIPLY0_331 (tmp,I+i*12,body[i]->avel); - dCROSS (body[i]->tacc,-=,body[i]->avel,tmp); - } - - // add the gravity force to all bodies - for (i=0; iflags & dxBodyNoGravity)==0) { - body[i]->facc[0] += body[i]->mass.mass * world->gravity[0]; - body[i]->facc[1] += body[i]->mass.mass * world->gravity[1]; - body[i]->facc[2] += body[i]->mass.mass * world->gravity[2]; - } - } - - // get m = total constraint dimension, nub = number of unbounded variables. - // create constraint offset array and number-of-rows array for all joints. - // the constraints are re-ordered as follows: the purely unbounded - // constraints, the mixed unbounded + LCP constraints, and last the purely - // LCP constraints. - // - // joints with m=0 are inactive and are removed from the joints array - // entirely, so that the code that follows does not consider them. - int m = 0; - dxJoint::Info1 *info = (dxJoint::Info1*) ALLOCA (nj*sizeof(dxJoint::Info1)); - int *ofs = (int*) ALLOCA (nj*sizeof(int)); - for (i=0, j=0; jvtable->getInfo1 (joint[j],info+i); - dIASSERT (info[i].m >= 0 && info[i].m <= 6 && - info[i].nub >= 0 && info[i].nub <= info[i].m); - if (info[i].m > 0) { - joint[i] = joint[j]; - i++; - } - } - nj = i; - - // the purely unbounded constraints - for (i=0; i 0 && info[i].nub < info[i].m) { - ofs[i] = m; - m += info[i].m; - } - // the purely LCP constraints - for (i=0; iinvMass; - MM[nskip+1] = body[i]->invMass; - MM[2*nskip+2] = body[i]->invMass; - MM += 3*nskip+3; - for (j=0; j<3; j++) for (k=0; k<3; k++) { - MM[j*nskip+k] = invI[i*12+j*4+k]; - } - } - - // assemble some body vectors: fe = external forces, v = velocities - dReal *fe = (dReal*) ALLOCA (n6 * sizeof(dReal)); - dReal *v = (dReal*) ALLOCA (n6 * sizeof(dReal)); - //dSetZero (fe,n6); - //dSetZero (v,n6); - for (i=0; ifacc[j]; - for (j=0; j<3; j++) fe[i*6+3+j] = body[i]->tacc[j]; - for (j=0; j<3; j++) v[i*6+j] = body[i]->lvel[j]; - for (j=0; j<3; j++) v[i*6+3+j] = body[i]->avel[j]; - } - - // this will be set to the velocity update - dReal *vnew = (dReal*) ALLOCA (n6 * sizeof(dReal)); - dSetZero (vnew,n6); - - // if there are constraints, compute cforce - if (m > 0) { - // create a constraint equation right hand side vector `c', a constraint - // force mixing vector `cfm', and LCP low and high bound vectors, and an - // 'findex' vector. - dReal *c = (dReal*) ALLOCA (m*sizeof(dReal)); - dReal *cfm = (dReal*) ALLOCA (m*sizeof(dReal)); - dReal *lo = (dReal*) ALLOCA (m*sizeof(dReal)); - dReal *hi = (dReal*) ALLOCA (m*sizeof(dReal)); - int *findex = (int*) alloca (m*sizeof(int)); - dSetZero (c,m); - dSetValue (cfm,m,world->global_cfm); - dSetValue (lo,m,-dInfinity); - dSetValue (hi,m, dInfinity); - for (i=0; iglobal_erp; - for (i=0; inode[0].body->tag; - Jinfo.J1a = Jinfo.J1l + 3; - if (joint[i]->node[1].body) { - Jinfo.J2l = J + nskip*ofs[i] + 6*joint[i]->node[1].body->tag; - Jinfo.J2a = Jinfo.J2l + 3; - } - else { - Jinfo.J2l = 0; - Jinfo.J2a = 0; - } - Jinfo.c = c + ofs[i]; - Jinfo.cfm = cfm + ofs[i]; - Jinfo.lo = lo + ofs[i]; - Jinfo.hi = hi + ofs[i]; - Jinfo.findex = findex + ofs[i]; - joint[i]->vtable->getInfo2 (joint[i],&Jinfo); - // adjust returned findex values for global index numbering - for (j=0; j= 0) findex[ofs[i] + j] += ofs[i]; - } - } - - // compute A = J*invM*J' -# ifdef TIMING - dTimerNow ("compute A"); -# endif - dReal *JinvM = (dReal*) ALLOCA (m*nskip*sizeof(dReal)); - //dSetZero (JinvM,m*nskip); - dMultiply0 (JinvM,J,invM,m,n6,n6); - int mskip = dPAD(m); - dReal *A = (dReal*) ALLOCA (m*mskip*sizeof(dReal)); - //dSetZero (A,m*mskip); - dMultiply2 (A,JinvM,J,m,n6,m); - - // add cfm to the diagonal of A - for (i=0; ilvel[j] = vnew[i*6+j]; - for (j=0; j<3; j++) body[i]->avel[j] = vnew[i*6+3+j]; - } - - // update the position and orientation from the new linear/angular velocity - // (over the given timestep) -# ifdef TIMING - dTimerNow ("update position"); -# endif - for (i=0; ifacc[0] = 0; - body[i]->facc[1] = 0; - body[i]->facc[2] = 0; - body[i]->facc[3] = 0; - body[i]->tacc[0] = 0; - body[i]->tacc[1] = 0; - body[i]->tacc[2] = 0; - body[i]->tacc[3] = 0; - } - -# ifdef TIMING - dTimerEnd(); - if (m > 0) dTimerReport (stdout,1); -# endif -} - -//**************************************************************************** -// an optimized version of dInternalStepIsland1() - -void dInternalStepIsland_x2 (dxWorld *world, dxBody * const *body, int nb, - dxJoint * const *_joint, int nj, dReal stepsize) -{ - int i,j,k; -# ifdef TIMING - dTimerStart("preprocessing"); -# endif - - dReal stepsize1 = dRecip(stepsize); - - // number all bodies in the body list - set their tag values - for (i=0; itag = i; - - // make a local copy of the joint array, because we might want to modify it. - // (the "dxJoint *const*" declaration says we're allowed to modify the joints - // but not the joint array, because the caller might need it unchanged). - dxJoint **joint = (dxJoint**) ALLOCA (nj * sizeof(dxJoint*)); - memcpy (joint,_joint,nj * sizeof(dxJoint*)); - - // for all bodies, compute the inertia tensor and its inverse in the global - // frame, and compute the rotational force and add it to the torque - // accumulator. I and invI are vertically stacked 3x4 matrices, one per body. - // @@@ check computation of rotational force. - dReal *I = (dReal*) ALLOCA (3*nb*4 * sizeof(dReal)); - dReal *invI = (dReal*) ALLOCA (3*nb*4 * sizeof(dReal)); - - //dSetZero (I,3*nb*4); - //dSetZero (invI,3*nb*4); - for (i=0; imass.I,body[i]->R); - dMULTIPLY0_333 (I+i*12,body[i]->R,tmp); - // compute inverse inertia tensor in global frame - dMULTIPLY2_333 (tmp,body[i]->invI,body[i]->R); - dMULTIPLY0_333 (invI+i*12,body[i]->R,tmp); - // compute rotational force - dMULTIPLY0_331 (tmp,I+i*12,body[i]->avel); - dCROSS (body[i]->tacc,-=,body[i]->avel,tmp); - } - - // add the gravity force to all bodies - for (i=0; iflags & dxBodyNoGravity)==0) { - body[i]->facc[0] += body[i]->mass.mass * world->gravity[0]; - body[i]->facc[1] += body[i]->mass.mass * world->gravity[1]; - body[i]->facc[2] += body[i]->mass.mass * world->gravity[2]; - } - } - - // get m = total constraint dimension, nub = number of unbounded variables. - // create constraint offset array and number-of-rows array for all joints. - // the constraints are re-ordered as follows: the purely unbounded - // constraints, the mixed unbounded + LCP constraints, and last the purely - // LCP constraints. this assists the LCP solver to put all unbounded - // variables at the start for a quick factorization. - // - // joints with m=0 are inactive and are removed from the joints array - // entirely, so that the code that follows does not consider them. - // also number all active joints in the joint list (set their tag values). - // inactive joints receive a tag value of -1. - - int m = 0; - dxJoint::Info1 *info = (dxJoint::Info1*) ALLOCA (nj*sizeof(dxJoint::Info1)); - int *ofs = (int*) ALLOCA (nj*sizeof(int)); - for (i=0, j=0; jvtable->getInfo1 (joint[j],info+i); - dIASSERT (info[i].m >= 0 && info[i].m <= 6 && - info[i].nub >= 0 && info[i].nub <= info[i].m); - if (info[i].m > 0) { - joint[i] = joint[j]; - joint[i]->tag = i; - i++; - } - else { - joint[j]->tag = -1; - } - } - nj = i; - - // the purely unbounded constraints - for (i=0; i 0 && info[i].nub < info[i].m) { - ofs[i] = m; - m += info[i].m; - } - // the purely LCP constraints - for (i=0; i 0) { - // create a constraint equation right hand side vector `c', a constraint - // force mixing vector `cfm', and LCP low and high bound vectors, and an - // 'findex' vector. - dReal *c = (dReal*) ALLOCA (m*sizeof(dReal)); - dReal *cfm = (dReal*) ALLOCA (m*sizeof(dReal)); - dReal *lo = (dReal*) ALLOCA (m*sizeof(dReal)); - dReal *hi = (dReal*) ALLOCA (m*sizeof(dReal)); - int *findex = (int*) alloca (m*sizeof(int)); - dSetZero (c,m); - dSetValue (cfm,m,world->global_cfm); - dSetValue (lo,m,-dInfinity); - dSetValue (hi,m, dInfinity); - for (i=0; iglobal_erp; - for (i=0; ivtable->getInfo2 (joint[i],&Jinfo); - // adjust returned findex values for global index numbering - for (j=0; j= 0) findex[ofs[i] + j] += ofs[i]; - } - } - - // compute A = J*invM*J'. first compute JinvM = J*invM. this has the same - // format as J so we just go through the constraints in J multiplying by - // the appropriate scalars and matrices. -# ifdef TIMING - dTimerNow ("compute A"); -# endif - dReal *JinvM = (dReal*) ALLOCA (2*m*8*sizeof(dReal)); - dSetZero (JinvM,2*m*8); - for (i=0; inode[0].body->tag; - dReal body_invMass = body[b]->invMass; - dReal *body_invI = invI + b*12; - dReal *Jsrc = J + 2*8*ofs[i]; - dReal *Jdst = JinvM + 2*8*ofs[i]; - for (j=info[i].m-1; j>=0; j--) { - for (k=0; k<3; k++) Jdst[k] = Jsrc[k] * body_invMass; - dMULTIPLY0_133 (Jdst+4,Jsrc+4,body_invI); - Jsrc += 8; - Jdst += 8; - } - if (joint[i]->node[1].body) { - b = joint[i]->node[1].body->tag; - body_invMass = body[b]->invMass; - body_invI = invI + b*12; - for (j=info[i].m-1; j>=0; j--) { - for (k=0; k<3; k++) Jdst[k] = Jsrc[k] * body_invMass; - dMULTIPLY0_133 (Jdst+4,Jsrc+4,body_invI); - Jsrc += 8; - Jdst += 8; - } - } - } - - // now compute A = JinvM * J'. A's rows and columns are grouped by joint, - // i.e. in the same way as the rows of J. block (i,j) of A is only nonzero - // if joints i and j have at least one body in common. this fact suggests - // the algorithm used to fill A: - // - // for b = all bodies - // n = number of joints attached to body b - // for i = 1..n - // for j = i+1..n - // ii = actual joint number for i - // jj = actual joint number for j - // // (ii,jj) will be set to all pairs of joints around body b - // compute blockwise: A(ii,jj) += JinvM(ii) * J(jj)' - // - // this algorithm catches all pairs of joints that have at least one body - // in common. it does not compute the diagonal blocks of A however - - // another similar algorithm does that. - - int mskip = dPAD(m); - dReal *A = (dReal*) ALLOCA (m*mskip*sizeof(dReal)); - dSetZero (A,m*mskip); - for (i=0; ifirstjoint; n1; n1=n1->next) { - for (dxJointNode *n2=n1->next; n2; n2=n2->next) { - // get joint numbers and ensure ofs[j1] >= ofs[j2] - int j1 = n1->joint->tag; - int j2 = n2->joint->tag; - if (ofs[j1] < ofs[j2]) { - int tmp = j1; - j1 = j2; - j2 = tmp; - } - - // if either joint was tagged as -1 then it is an inactive (m=0) - // joint that should not be considered - if (j1==-1 || j2==-1) continue; - - // determine if body i is the 1st or 2nd body of joints j1 and j2 - int jb1 = (joint[j1]->node[1].body == body[i]); - int jb2 = (joint[j2]->node[1].body == body[i]); - // jb1/jb2 must be 0 for joints with only one body - dIASSERT(joint[j1]->node[1].body || jb1==0); - dIASSERT(joint[j2]->node[1].body || jb2==0); - - // set block of A - MultiplyAdd2_p8r (A + ofs[j1]*mskip + ofs[j2], - JinvM + 2*8*ofs[j1] + jb1*8*info[j1].m, - J + 2*8*ofs[j2] + jb2*8*info[j2].m, - info[j1].m,info[j2].m, mskip); - } - } - } - // compute diagonal blocks of A - for (i=0; inode[1].body) { - MultiplyAdd2_p8r (A + ofs[i]*(mskip+1), - JinvM + 2*8*ofs[i] + 8*info[i].m, - J + 2*8*ofs[i] + 8*info[i].m, - info[i].m,info[i].m, mskip); - } - } - - // add cfm to the diagonal of A - for (i=0; iinvMass; - dReal *body_invI = invI + i*12; - for (j=0; j<3; j++) tmp1[i*8+j] = body[i]->facc[j] * body_invMass + - body[i]->lvel[j] * stepsize1; - dMULTIPLY0_331 (tmp1 + i*8 + 4,body_invI,body[i]->tacc); - for (j=0; j<3; j++) tmp1[i*8+4+j] += body[i]->avel[j] * stepsize1; - } - // put J*tmp1 into rhs - dReal *rhs = (dReal*) ALLOCA (m * sizeof(dReal)); - //dSetZero (rhs,m); - for (i=0; inode[0].body->tag, info[i].m); - if (joint[i]->node[1].body) { - MultiplyAdd0_p81 (rhs+ofs[i],JJ + 8*info[i].m, - tmp1 + 8*joint[i]->node[1].body->tag, info[i].m); - } - } - // complete rhs - for (i=0; inode[0].body; - dxBody* b2 = joint[i]->node[1].body; - dJointFeedback *fb = joint[i]->feedback; - -/******************** breakable joint contribution ***********************/ - // this saves us a few dereferences - dxJointBreakInfo *jBI = joint[i]->breakInfo; - // we need joint feedback if the joint is breakable or if the user - // requested feedback. - if (jBI||fb) { - // we need feedback on the amount of force that this joint is - // applying to the bodies. we use a slightly slower computation - // that splits out the force components and puts them in the - // feedback structure. - dJointFeedback temp_fb; // temporary storage for joint feedback - dReal data1[8],data2[8]; - Multiply1_8q1 (data1, JJ, lambda+ofs[i], info[i].m); - dReal *cf1 = cforce + 8*b1->tag; - cf1[0] += (temp_fb.f1[0] = data1[0]); - cf1[1] += (temp_fb.f1[1] = data1[1]); - cf1[2] += (temp_fb.f1[2] = data1[2]); - cf1[4] += (temp_fb.t1[0] = data1[4]); - cf1[5] += (temp_fb.t1[1] = data1[5]); - cf1[6] += (temp_fb.t1[2] = data1[6]); - if (b2) { - Multiply1_8q1 (data2, JJ + 8*info[i].m, lambda+ofs[i], info[i].m); - dReal *cf2 = cforce + 8*b2->tag; - cf2[0] += (temp_fb.f2[0] = data2[0]); - cf2[1] += (temp_fb.f2[1] = data2[1]); - cf2[2] += (temp_fb.f2[2] = data2[2]); - cf2[4] += (temp_fb.t2[0] = data2[4]); - cf2[5] += (temp_fb.t2[1] = data2[5]); - cf2[6] += (temp_fb.t2[2] = data2[6]); - } - // if the user requested so we must copy the feedback information to - // the feedback struct that the user suplied. - if (fb) { - // copy temp_fb to fb - fb->f1[0] = temp_fb.f1[0]; - fb->f1[1] = temp_fb.f1[1]; - fb->f1[2] = temp_fb.f1[2]; - fb->t1[0] = temp_fb.t1[0]; - fb->t1[1] = temp_fb.t1[1]; - fb->t1[2] = temp_fb.t1[2]; - if (b2) { - fb->f2[0] = temp_fb.f2[0]; - fb->f2[1] = temp_fb.f2[1]; - fb->f2[2] = temp_fb.f2[2]; - fb->t2[0] = temp_fb.t2[0]; - fb->t2[1] = temp_fb.t2[1]; - fb->t2[2] = temp_fb.t2[2]; - } - } - // if the joint is breakable we need to check the breaking conditions - if (jBI) { - dReal relCF1[3]; - dReal relCT1[3]; - // multiply the force and torque vectors by the rotation matrix of body 1 - dMULTIPLY1_331 (&relCF1[0],b1->R,&temp_fb.f1[0]); - dMULTIPLY1_331 (&relCT1[0],b1->R,&temp_fb.t1[0]); - if (jBI->flags & dJOINT_BREAK_AT_B1_FORCE) { - // check if the force is to high - for (int i = 0; i < 3; i++) { - if (relCF1[i] > jBI->b1MaxF[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - if (jBI->flags & dJOINT_BREAK_AT_B1_TORQUE) { - // check if the torque is to high - for (int i = 0; i < 3; i++) { - if (relCT1[i] > jBI->b1MaxT[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - if (b2) { - dReal relCF2[3]; - dReal relCT2[3]; - // multiply the force and torque vectors by the rotation matrix of body 2 - dMULTIPLY1_331 (&relCF2[0],b2->R,&temp_fb.f2[0]); - dMULTIPLY1_331 (&relCT2[0],b2->R,&temp_fb.t2[0]); - if (jBI->flags & dJOINT_BREAK_AT_B2_FORCE) { - // check if the force is to high - for (int i = 0; i < 3; i++) { - if (relCF2[i] > jBI->b2MaxF[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - if (jBI->flags & dJOINT_BREAK_AT_B2_TORQUE) { - // check if the torque is to high - for (int i = 0; i < 3; i++) { - if (relCT2[i] > jBI->b2MaxT[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - } - doneCheckingBreaks: - ; - } - } -/*************************************************************************/ - else { - // no feedback is required, let's compute cforce the faster way - MultiplyAdd1_8q1 (cforce + 8*b1->tag,JJ, lambda+ofs[i], info[i].m); - if (b2) { - MultiplyAdd1_8q1 (cforce + 8*b2->tag, - JJ + 8*info[i].m, lambda+ofs[i], info[i].m); - } - } - } - } - - // compute the velocity update -# ifdef TIMING - dTimerNow ("compute velocity update"); -# endif - - // add fe to cforce - for (i=0; ifacc[j]; - for (j=0; j<3; j++) cforce[i*8+4+j] += body[i]->tacc[j]; - } - // multiply cforce by stepsize - for (i=0; i < nb*8; i++) cforce[i] *= stepsize; - // add invM * cforce to the body velocity - for (i=0; iinvMass; - dReal *body_invI = invI + i*12; - for (j=0; j<3; j++) body[i]->lvel[j] += body_invMass * cforce[i*8+j]; - dMULTIPLYADD0_331 (body[i]->avel,body_invI,cforce+i*8+4); - } - - // update the position and orientation from the new linear/angular velocity - // (over the given timestep) -# ifdef TIMING - dTimerNow ("update position"); -# endif - for (i=0; ilvel[j]; - for (j=0; j<3; j++) tmp_vnew[i*6+3+j] = body[i]->avel[j]; - } - comparator.nextMatrix (tmp_vnew,nb*6,1,0,"vnew"); -# endif - -# ifdef TIMING - dTimerNow ("tidy up"); -# endif - - // zero all force accumulators - for (i=0; ifacc[0] = 0; - body[i]->facc[1] = 0; - body[i]->facc[2] = 0; - body[i]->facc[3] = 0; - body[i]->tacc[0] = 0; - body[i]->tacc[1] = 0; - body[i]->tacc[2] = 0; - body[i]->tacc[3] = 0; - } - -# ifdef TIMING - dTimerEnd(); - if (m > 0) dTimerReport (stdout,1); -# endif -} - -//**************************************************************************** - -void dInternalStepIsland (dxWorld *world, dxBody * const *body, int nb, - dxJoint * const *joint, int nj, dReal stepsize) -{ -# ifndef COMPARE_METHODS - dInternalStepIsland_x2 (world,body,nb,joint,nj,stepsize); -# endif - -# ifdef COMPARE_METHODS - int i; - - // save body state - dxBody *state = (dxBody*) ALLOCA (nb*sizeof(dxBody)); - for (i=0; i -#include -#include -#include -#include -#include -#include -#include "lcp.h" -#include "step.h" - - -// misc defines - -#define ALLOCA dALLOCA16 - -#define RANDOM_JOINT_ORDER -//#define FAST_FACTOR //use a factorization approximation to the LCP solver (fast, theoretically less accurate) -#define SLOW_LCP //use the old LCP solver -//#define NO_ISLANDS //does not perform island creation code (3~4% of simulation time), body disabling doesn't work -//#define TIMING - - -static int autoEnableDepth = 2; - -void dWorldSetAutoEnableDepthSF1 (dxWorld *world, int autodepth) -{ - if (autodepth > 0) - autoEnableDepth = autodepth; - else - autoEnableDepth = 0; -} - -int dWorldGetAutoEnableDepthSF1 (dxWorld *world) -{ - return autoEnableDepth; -} - -//little bit of math.... the _sym_ functions assume the return matrix will be symmetric -static void -Multiply2_sym_p8p (dReal * A, dReal * B, dReal * C, int p, int Askip) -{ - int i, j; - dReal sum, *aa, *ad, *bb, *cc; - dIASSERT (p > 0 && A && B && C); - bb = B; - for (i = 0; i < p; i++) - { - //aa is going accross the matrix, ad down - aa = ad = A; - cc = C; - for (j = i; j < p; j++) - { - sum = bb[0] * cc[0]; - sum += bb[1] * cc[1]; - sum += bb[2] * cc[2]; - sum += bb[4] * cc[4]; - sum += bb[5] * cc[5]; - sum += bb[6] * cc[6]; - *(aa++) = *ad = sum; - ad += Askip; - cc += 8; - } - bb += 8; - A += Askip + 1; - C += 8; - } -} - -static void -MultiplyAdd2_sym_p8p (dReal * A, dReal * B, dReal * C, int p, int Askip) -{ - int i, j; - dReal sum, *aa, *ad, *bb, *cc; - dIASSERT (p > 0 && A && B && C); - bb = B; - for (i = 0; i < p; i++) - { - //aa is going accross the matrix, ad down - aa = ad = A; - cc = C; - for (j = i; j < p; j++) - { - sum = bb[0] * cc[0]; - sum += bb[1] * cc[1]; - sum += bb[2] * cc[2]; - sum += bb[4] * cc[4]; - sum += bb[5] * cc[5]; - sum += bb[6] * cc[6]; - *(aa++) += sum; - *ad += sum; - ad += Askip; - cc += 8; - } - bb += 8; - A += Askip + 1; - C += 8; - } -} - - -// this assumes the 4th and 8th rows of B are zero. - -static void -Multiply0_p81 (dReal * A, dReal * B, dReal * C, int p) -{ - int i; - dIASSERT (p > 0 && A && B && C); - dReal sum; - for (i = p; i; i--) - { - sum = B[0] * C[0]; - sum += B[1] * C[1]; - sum += B[2] * C[2]; - sum += B[4] * C[4]; - sum += B[5] * C[5]; - sum += B[6] * C[6]; - *(A++) = sum; - B += 8; - } -} - - -// this assumes the 4th and 8th rows of B are zero. - -static void -MultiplyAdd0_p81 (dReal * A, dReal * B, dReal * C, int p) -{ - int i; - dIASSERT (p > 0 && A && B && C); - dReal sum; - for (i = p; i; i--) - { - sum = B[0] * C[0]; - sum += B[1] * C[1]; - sum += B[2] * C[2]; - sum += B[4] * C[4]; - sum += B[5] * C[5]; - sum += B[6] * C[6]; - *(A++) += sum; - B += 8; - } -} - - -// this assumes the 4th and 8th rows of B are zero. - -static void -Multiply1_8q1 (dReal * A, dReal * B, dReal * C, int q) -{ - int k; - dReal sum; - dIASSERT (q > 0 && A && B && C); - sum = 0; - for (k = 0; k < q; k++) - sum += B[k * 8] * C[k]; - A[0] = sum; - sum = 0; - for (k = 0; k < q; k++) - sum += B[1 + k * 8] * C[k]; - A[1] = sum; - sum = 0; - for (k = 0; k < q; k++) - sum += B[2 + k * 8] * C[k]; - A[2] = sum; - sum = 0; - for (k = 0; k < q; k++) - sum += B[4 + k * 8] * C[k]; - A[4] = sum; - sum = 0; - for (k = 0; k < q; k++) - sum += B[5 + k * 8] * C[k]; - A[5] = sum; - sum = 0; - for (k = 0; k < q; k++) - sum += B[6 + k * 8] * C[k]; - A[6] = sum; -} - -//**************************************************************************** -// body rotation - -// return sin(x)/x. this has a singularity at 0 so special handling is needed -// for small arguments. - -static inline dReal -sinc (dReal x) -{ - // if |x| < 1e-4 then use a taylor series expansion. this two term expansion - // is actually accurate to one LS bit within this range if double precision - // is being used - so don't worry! - if (dFabs (x) < 1.0e-4) - return REAL (1.0) - x * x * REAL (0.166666666666666666667); - else - return dSin (x) / x; -} - - -// given a body b, apply its linear and angular rotation over the time -// interval h, thereby adjusting its position and orientation. - -static inline void -moveAndRotateBody (dxBody * b, dReal h) -{ - int j; - - // handle linear velocity - for (j = 0; j < 3; j++) - b->pos[j] += h * b->lvel[j]; - - if (b->flags & dxBodyFlagFiniteRotation) - { - dVector3 irv; // infitesimal rotation vector - dQuaternion q; // quaternion for finite rotation - - if (b->flags & dxBodyFlagFiniteRotationAxis) - { - // split the angular velocity vector into a component along the finite - // rotation axis, and a component orthogonal to it. - dVector3 frv, irv; // finite rotation vector - dReal k = dDOT (b->finite_rot_axis, b->avel); - frv[0] = b->finite_rot_axis[0] * k; - frv[1] = b->finite_rot_axis[1] * k; - frv[2] = b->finite_rot_axis[2] * k; - irv[0] = b->avel[0] - frv[0]; - irv[1] = b->avel[1] - frv[1]; - irv[2] = b->avel[2] - frv[2]; - - // make a rotation quaternion q that corresponds to frv * h. - // compare this with the full-finite-rotation case below. - h *= REAL (0.5); - dReal theta = k * h; - q[0] = dCos (theta); - dReal s = sinc (theta) * h; - q[1] = frv[0] * s; - q[2] = frv[1] * s; - q[3] = frv[2] * s; - } - else - { - // make a rotation quaternion q that corresponds to w * h - dReal wlen = dSqrt (b->avel[0] * b->avel[0] + b->avel[1] * b->avel[1] + b->avel[2] * b->avel[2]); - h *= REAL (0.5); - dReal theta = wlen * h; - q[0] = dCos (theta); - dReal s = sinc (theta) * h; - q[1] = b->avel[0] * s; - q[2] = b->avel[1] * s; - q[3] = b->avel[2] * s; - } - - // do the finite rotation - dQuaternion q2; - dQMultiply0 (q2, q, b->q); - for (j = 0; j < 4; j++) - b->q[j] = q2[j]; - - // do the infitesimal rotation if required - if (b->flags & dxBodyFlagFiniteRotationAxis) - { - dReal dq[4]; - dWtoDQ (irv, b->q, dq); - for (j = 0; j < 4; j++) - b->q[j] += h * dq[j]; - } - } - else - { - // the normal way - do an infitesimal rotation - dReal dq[4]; - dWtoDQ (b->avel, b->q, dq); - for (j = 0; j < 4; j++) - b->q[j] += h * dq[j]; - } - - // normalize the quaternion and convert it to a rotation matrix - dNormalize4 (b->q); - dQtoR (b->q, b->R); - - // notify all attached geoms that this body has moved - for (dxGeom * geom = b->geom; geom; geom = dGeomGetBodyNext (geom)) - dGeomMoved (geom); -} - -//**************************************************************************** -//This is an implementation of the iterated/relaxation algorithm. -//Here is a quick overview of the algorithm per Sergi Valverde's posts to the -//mailing list: -// -// for i=0..N-1 do -// for c = 0..C-1 do -// Solve constraint c-th -// Apply forces to constraint bodies -// next -// next -// Integrate bodies - -void -dInternalStepFast (dxWorld * world, dxBody * body[2], dReal * GI[2], dReal * GinvI[2], dxJoint * joint, dxJoint::Info1 info, dxJoint::Info2 Jinfo, dReal stepsize) -{ - int i, j, k; -# ifdef TIMING - dTimerNow ("constraint preprocessing"); -# endif - - dReal stepsize1 = dRecip (stepsize); - - int m = info.m; - // nothing to do if no constraints. - if (m <= 0) - return; - - int nub = 0; - if (info.nub == info.m) - nub = m; - - // compute A = J*invM*J'. first compute JinvM = J*invM. this has the same - // format as J so we just go through the constraints in J multiplying by - // the appropriate scalars and matrices. -# ifdef TIMING - dTimerNow ("compute A"); -# endif - dReal JinvM[2 * 6 * 8]; - //dSetZero (JinvM, 2 * m * 8); - - dReal *Jsrc = Jinfo.J1l; - dReal *Jdst = JinvM; - if (body[0]) - { - for (j = m - 1; j >= 0; j--) - { - for (k = 0; k < 3; k++) - Jdst[k] = Jsrc[k] * body[0]->invMass; - dMULTIPLY0_133 (Jdst + 4, Jsrc + 4, GinvI[0]); - Jsrc += 8; - Jdst += 8; - } - } - if (body[1]) - { - Jsrc = Jinfo.J2l; - Jdst = JinvM + 8 * m; - for (j = m - 1; j >= 0; j--) - { - for (k = 0; k < 3; k++) - Jdst[k] = Jsrc[k] * body[1]->invMass; - dMULTIPLY0_133 (Jdst + 4, Jsrc + 4, GinvI[1]); - Jsrc += 8; - Jdst += 8; - } - } - - - // now compute A = JinvM * J'. - int mskip = dPAD (m); - dReal A[6 * 8]; - //dSetZero (A, 6 * 8); - - if (body[0]) - Multiply2_sym_p8p (A, JinvM, Jinfo.J1l, m, mskip); - if (body[1]) - MultiplyAdd2_sym_p8p (A, JinvM + 8 * m, Jinfo.J2l, m, mskip); - - // add cfm to the diagonal of A - for (i = 0; i < m; i++) - A[i * mskip + i] += Jinfo.cfm[i] * stepsize1; - - // compute the right hand side `rhs' -# ifdef TIMING - dTimerNow ("compute rhs"); -# endif - dReal tmp1[16]; - //dSetZero (tmp1, 16); - // put v/h + invM*fe into tmp1 - for (i = 0; i < 2; i++) - { - if (!body[i]) - continue; - for (j = 0; j < 3; j++) - tmp1[i * 8 + j] = body[i]->facc[j] * body[i]->invMass + body[i]->lvel[j] * stepsize1; - dMULTIPLY0_331 (tmp1 + i * 8 + 4, GinvI[i], body[i]->tacc); - for (j = 0; j < 3; j++) - tmp1[i * 8 + 4 + j] += body[i]->avel[j] * stepsize1; - } - // put J*tmp1 into rhs - dReal rhs[6]; - //dSetZero (rhs, 6); - - if (body[0]) - Multiply0_p81 (rhs, Jinfo.J1l, tmp1, m); - if (body[1]) - MultiplyAdd0_p81 (rhs, Jinfo.J2l, tmp1 + 8, m); - - // complete rhs - for (i = 0; i < m; i++) - rhs[i] = Jinfo.c[i] * stepsize1 - rhs[i]; - -#ifdef SLOW_LCP - // solve the LCP problem and get lambda. - // this will destroy A but that's okay -# ifdef TIMING - dTimerNow ("solving LCP problem"); -# endif - dReal *lambda = (dReal *) ALLOCA (m * sizeof (dReal)); - dReal *residual = (dReal *) ALLOCA (m * sizeof (dReal)); - dReal lo[6], hi[6]; - memcpy (lo, Jinfo.lo, m * sizeof (dReal)); - memcpy (hi, Jinfo.hi, m * sizeof (dReal)); - dSolveLCP (m, A, lambda, rhs, residual, nub, lo, hi, Jinfo.findex); -#endif - - // LCP Solver replacement: - // This algorithm goes like this: - // Do a straightforward LDLT factorization of the matrix A, solving for - // A*x = rhs - // For each x[i] that is outside of the bounds of lo[i] and hi[i], - // clamp x[i] into that range. - // Substitute into A the now known x's - // subtract the residual away from the rhs. - // Remove row and column i from L, updating the factorization - // place the known x's at the end of the array, keeping up with location in p - // Repeat until all constraints have been clamped or all are within bounds - // - // This is probably only faster in the single joint case where only one repeat is - // the norm. - -#ifdef FAST_FACTOR - // factorize A (L*D*L'=A) -# ifdef TIMING - dTimerNow ("factorize A"); -# endif - dReal d[6]; - dReal L[6 * 8]; - memcpy (L, A, m * mskip * sizeof (dReal)); - dFactorLDLT (L, d, m, mskip); - - // compute lambda -# ifdef TIMING - dTimerNow ("compute lambda"); -# endif - - int left = m; //constraints left to solve. - int remove[6]; - dReal lambda[6]; - dReal x[6]; - int p[6]; - for (i = 0; i < 6; i++) - p[i] = i; - while (true) - { - memcpy (x, rhs, left * sizeof (dReal)); - dSolveLDLT (L, d, x, left, mskip); - - int fixed = 0; - for (i = 0; i < left; i++) - { - j = p[i]; - remove[i] = false; - // This isn't the exact same use of findex as dSolveLCP.... since x[findex] - // may change after I've already clamped x[i], but it should be close - if (Jinfo.findex[j] > -1) - { - dReal f = fabs (Jinfo.hi[j] * x[p[Jinfo.findex[j]]]); - if (x[i] > f) - x[i] = f; - else if (x[i] < -f) - x[i] = -f; - else - continue; - } - else - { - if (x[i] > Jinfo.hi[j]) - x[i] = Jinfo.hi[j]; - else if (x[i] < Jinfo.lo[j]) - x[i] = Jinfo.lo[j]; - else - continue; - } - remove[i] = true; - fixed++; - } - if (fixed == 0 || fixed == left) //no change or all constraints solved - break; - - for (i = 0; i < left; i++) //sub in to right hand side. - if (remove[i]) - for (j = 0; j < left; j++) - if (!remove[j]) - rhs[j] -= A[j * mskip + i] * x[i]; - - for (int r = left - 1; r >= 0; r--) //eliminate row/col for fixed variables - { - if (remove[r]) - { - //dRemoveLDLT adapted for use without row pointers. - if (r == left - 1) - { - left--; - continue; // deleting last row/col is easy - } - else if (r == 0) - { - dReal a[6]; - for (i = 0; i < left; i++) - a[i] = -A[i * mskip]; - a[0] += REAL (1.0); - dLDLTAddTL (L, d, a, left, mskip); - } - else - { - dReal t[6]; - dReal a[6]; - for (i = 0; i < r; i++) - t[i] = L[r * mskip + i] / d[i]; - for (i = 0; i < left - r; i++) - a[i] = dDot (L + (r + i) * mskip, t, r) - A[(r + i) * mskip + r]; - a[0] += REAL (1.0); - dLDLTAddTL (L + r * mskip + r, d + r, a, left - r, mskip); - } - - dRemoveRowCol (L, left, mskip, r); - //end dRemoveLDLT - - left--; - if (r < (left - 1)) - { - dReal tx = x[r]; - memmove (d + r, d + r + 1, (left - r) * sizeof (dReal)); - memmove (rhs + r, rhs + r + 1, (left - r) * sizeof (dReal)); - //x will get written over by rhs anyway, no need to move it around - //just store the fixed value we just discovered in it. - x[left] = tx; - for (i = 0; i < m; i++) - if (p[i] > r && p[i] <= left) - p[i]--; - p[r] = left; - } - } - } - } - - for (i = 0; i < m; i++) - lambda[i] = x[p[i]]; -# endif - // compute the constraint force `cforce' -# ifdef TIMING - dTimerNow ("compute constraint force"); -#endif - - // compute cforce = J'*lambda - dJointFeedback *fb = joint->feedback; - dReal cforce[16]; - //dSetZero (cforce, 16); - -/******************** breakable joint contribution ***********************/ - // this saves us a few dereferences - dxJointBreakInfo *jBI = joint->breakInfo; - // we need joint feedback if the joint is breakable or if the user - // requested feedback. - if (jBI||fb) { - // we need feedback on the amount of force that this joint is - // applying to the bodies. we use a slightly slower computation - // that splits out the force components and puts them in the - // feedback structure. - dJointFeedback temp_fb; // temporary storage for joint feedback - dReal data1[8],data2[8]; - if (body[0]) - { - Multiply1_8q1 (data1, Jinfo.J1l, lambda, m); - dReal *cf1 = cforce; - cf1[0] = (temp_fb.f1[0] = data1[0]); - cf1[1] = (temp_fb.f1[1] = data1[1]); - cf1[2] = (temp_fb.f1[2] = data1[2]); - cf1[4] = (temp_fb.t1[0] = data1[4]); - cf1[5] = (temp_fb.t1[1] = data1[5]); - cf1[6] = (temp_fb.t1[2] = data1[6]); - } - if (body[1]) - { - Multiply1_8q1 (data2, Jinfo.J2l, lambda, m); - dReal *cf2 = cforce + 8; - cf2[0] = (temp_fb.f2[0] = data2[0]); - cf2[1] = (temp_fb.f2[1] = data2[1]); - cf2[2] = (temp_fb.f2[2] = data2[2]); - cf2[4] = (temp_fb.t2[0] = data2[4]); - cf2[5] = (temp_fb.t2[1] = data2[5]); - cf2[6] = (temp_fb.t2[2] = data2[6]); - } - // if the user requested so we must copy the feedback information to - // the feedback struct that the user suplied. - if (fb) { - // copy temp_fb to fb - fb->f1[0] = temp_fb.f1[0]; - fb->f1[1] = temp_fb.f1[1]; - fb->f1[2] = temp_fb.f1[2]; - fb->t1[0] = temp_fb.t1[0]; - fb->t1[1] = temp_fb.t1[1]; - fb->t1[2] = temp_fb.t1[2]; - if (body[1]) { - fb->f2[0] = temp_fb.f2[0]; - fb->f2[1] = temp_fb.f2[1]; - fb->f2[2] = temp_fb.f2[2]; - fb->t2[0] = temp_fb.t2[0]; - fb->t2[1] = temp_fb.t2[1]; - fb->t2[2] = temp_fb.t2[2]; - } - } - // if the joint is breakable we need to check the breaking conditions - if (jBI) { - dReal relCF1[3]; - dReal relCT1[3]; - // multiply the force and torque vectors by the rotation matrix of body 1 - dMULTIPLY1_331 (&relCF1[0],body[0]->R,&temp_fb.f1[0]); - dMULTIPLY1_331 (&relCT1[0],body[0]->R,&temp_fb.t1[0]); - if (jBI->flags & dJOINT_BREAK_AT_B1_FORCE) { - // check if the force is to high - for (int i = 0; i < 3; i++) { - if (relCF1[i] > jBI->b1MaxF[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - if (jBI->flags & dJOINT_BREAK_AT_B1_TORQUE) { - // check if the torque is to high - for (int i = 0; i < 3; i++) { - if (relCT1[i] > jBI->b1MaxT[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - if (body[1]) { - dReal relCF2[3]; - dReal relCT2[3]; - // multiply the force and torque vectors by the rotation matrix of body 2 - dMULTIPLY1_331 (&relCF2[0],body[1]->R,&temp_fb.f2[0]); - dMULTIPLY1_331 (&relCT2[0],body[1]->R,&temp_fb.t2[0]); - if (jBI->flags & dJOINT_BREAK_AT_B2_FORCE) { - // check if the force is to high - for (int i = 0; i < 3; i++) { - if (relCF2[i] > jBI->b2MaxF[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - if (jBI->flags & dJOINT_BREAK_AT_B2_TORQUE) { - // check if the torque is to high - for (int i = 0; i < 3; i++) { - if (relCT2[i] > jBI->b2MaxT[i]) { - jBI->flags |= dJOINT_BROKEN; - goto doneCheckingBreaks; - } - } - } - } - doneCheckingBreaks: - ; - } - } -/*************************************************************************/ - else - { - // no feedback is required, let's compute cforce the faster way - if (body[0]) - Multiply1_8q1 (cforce, Jinfo.J1l, lambda, m); - if (body[1]) - Multiply1_8q1 (cforce + 8, Jinfo.J2l, lambda, m); - } - - for (i = 0; i < 2; i++) - { - if (!body[i]) - continue; - for (j = 0; j < 3; j++) - { - body[i]->facc[j] += cforce[i * 8 + j]; - body[i]->tacc[j] += cforce[i * 8 + 4 + j]; - } - } -} - -void -dInternalStepIslandFast (dxWorld * world, dxBody * const *bodies, int nb, dxJoint * const *_joints, int nj, dReal stepsize, int maxiterations) -{ -# ifdef TIMING - dTimerNow ("preprocessing"); -# endif - dxBody *bodyPair[2], *body; - dReal *GIPair[2], *GinvIPair[2]; - dxJoint *joint; - int iter, b, j, i; - dReal ministep = stepsize / maxiterations; - - // make a local copy of the joint array, because we might want to modify it. - // (the "dxJoint *const*" declaration says we're allowed to modify the joints - // but not the joint array, because the caller might need it unchanged). - dxJoint **joints = (dxJoint **) ALLOCA (nj * sizeof (dxJoint *)); - memcpy (joints, _joints, nj * sizeof (dxJoint *)); - - // get m = total constraint dimension, nub = number of unbounded variables. - // create constraint offset array and number-of-rows array for all joints. - // the constraints are re-ordered as follows: the purely unbounded - // constraints, the mixed unbounded + LCP constraints, and last the purely - // LCP constraints. this assists the LCP solver to put all unbounded - // variables at the start for a quick factorization. - // - // joints with m=0 are inactive and are removed from the joints array - // entirely, so that the code that follows does not consider them. - // also number all active joints in the joint list (set their tag values). - // inactive joints receive a tag value of -1. - - int m = 0; - dxJoint::Info1 * info = (dxJoint::Info1 *) ALLOCA (nj * sizeof (dxJoint::Info1)); - int *ofs = (int *) ALLOCA (nj * sizeof (int)); - for (i = 0, j = 0; j < nj; j++) - { // i=dest, j=src - joints[j]->vtable->getInfo1 (joints[j], info + i); - dIASSERT (info[i].m >= 0 && info[i].m <= 6 && info[i].nub >= 0 && info[i].nub <= info[i].m); - if (info[i].m > 0) - { - joints[i] = joints[j]; - joints[i]->tag = i; - i++; - } - else - { - joints[j]->tag = -1; - } - } - nj = i; - - // the purely unbounded constraints - for (i = 0; i < nj; i++) - { - ofs[i] = m; - m += info[i].m; - } - dReal *c = NULL; - dReal *cfm = NULL; - dReal *lo = NULL; - dReal *hi = NULL; - int *findex = NULL; - - dReal *J = NULL; - dxJoint::Info2 * Jinfo = NULL; - - if (m) - { - // create a constraint equation right hand side vector `c', a constraint - // force mixing vector `cfm', and LCP low and high bound vectors, and an - // 'findex' vector. - c = (dReal *) ALLOCA (m * sizeof (dReal)); - cfm = (dReal *) ALLOCA (m * sizeof (dReal)); - lo = (dReal *) ALLOCA (m * sizeof (dReal)); - hi = (dReal *) ALLOCA (m * sizeof (dReal)); - findex = (int *) ALLOCA (m * sizeof (int)); - dSetZero (c, m); - dSetValue (cfm, m, world->global_cfm); - dSetValue (lo, m, -dInfinity); - dSetValue (hi, m, dInfinity); - for (i = 0; i < m; i++) - findex[i] = -1; - - // get jacobian data from constraints. a (2*m)x8 matrix will be created - // to store the two jacobian blocks from each constraint. it has this - // format: - // - // l l l 0 a a a 0 \ . - // l l l 0 a a a 0 }-- jacobian body 1 block for joint 0 (3 rows) - // l l l 0 a a a 0 / - // l l l 0 a a a 0 \ . - // l l l 0 a a a 0 }-- jacobian body 2 block for joint 0 (3 rows) - // l l l 0 a a a 0 / - // l l l 0 a a a 0 }--- jacobian body 1 block for joint 1 (1 row) - // l l l 0 a a a 0 }--- jacobian body 2 block for joint 1 (1 row) - // etc... - // - // (lll) = linear jacobian data - // (aaa) = angular jacobian data - // -# ifdef TIMING - dTimerNow ("create J"); -# endif - J = (dReal *) ALLOCA (2 * m * 8 * sizeof (dReal)); - dSetZero (J, 2 * m * 8); - Jinfo = (dxJoint::Info2 *) ALLOCA (nj * sizeof (dxJoint::Info2)); - for (i = 0; i < nj; i++) - { - Jinfo[i].rowskip = 8; - Jinfo[i].fps = dRecip (stepsize); - Jinfo[i].erp = world->global_erp; - Jinfo[i].J1l = J + 2 * 8 * ofs[i]; - Jinfo[i].J1a = Jinfo[i].J1l + 4; - Jinfo[i].J2l = Jinfo[i].J1l + 8 * info[i].m; - Jinfo[i].J2a = Jinfo[i].J2l + 4; - Jinfo[i].c = c + ofs[i]; - Jinfo[i].cfm = cfm + ofs[i]; - Jinfo[i].lo = lo + ofs[i]; - Jinfo[i].hi = hi + ofs[i]; - Jinfo[i].findex = findex + ofs[i]; - //joints[i]->vtable->getInfo2 (joints[i], Jinfo+i); - } - - } - - dReal *saveFacc = (dReal *) ALLOCA (nb * 4 * sizeof (dReal)); - dReal *saveTacc = (dReal *) ALLOCA (nb * 4 * sizeof (dReal)); - dReal *globalI = (dReal *) ALLOCA (nb * 12 * sizeof (dReal)); - dReal *globalInvI = (dReal *) ALLOCA (nb * 12 * sizeof (dReal)); - for (b = 0; b < nb; b++) - { - for (i = 0; i < 4; i++) - { - saveFacc[b * 4 + i] = bodies[b]->facc[i]; - saveTacc[b * 4 + i] = bodies[b]->tacc[i]; - bodies[b]->tag = b; - } - } - - for (iter = 0; iter < maxiterations; iter++) - { -# ifdef TIMING - dTimerNow ("applying inertia and gravity"); -# endif - dReal tmp[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - - for (b = 0; b < nb; b++) - { - body = bodies[b]; - - // for all bodies, compute the inertia tensor and its inverse in the global - // frame, and compute the rotational force and add it to the torque - // accumulator. I and invI are vertically stacked 3x4 matrices, one per body. - // @@@ check computation of rotational force. - - // compute inertia tensor in global frame - dMULTIPLY2_333 (tmp, body->mass.I, body->R); - dMULTIPLY0_333 (globalI + b * 12, body->R, tmp); - // compute inverse inertia tensor in global frame - dMULTIPLY2_333 (tmp, body->invI, body->R); - dMULTIPLY0_333 (globalInvI + b * 12, body->R, tmp); - - for (i = 0; i < 4; i++) - body->tacc[i] = saveTacc[b * 4 + i]; - // compute rotational force - dMULTIPLY0_331 (tmp, globalI + b * 12, body->avel); - dCROSS (body->tacc, -=, body->avel, tmp); - - // add the gravity force to all bodies - if ((body->flags & dxBodyNoGravity) == 0) - { - body->facc[0] = saveFacc[b * 4 + 0] + body->mass.mass * world->gravity[0]; - body->facc[1] = saveFacc[b * 4 + 1] + body->mass.mass * world->gravity[1]; - body->facc[2] = saveFacc[b * 4 + 2] + body->mass.mass * world->gravity[2]; - body->facc[3] = 0; - } - - } - -#ifdef RANDOM_JOINT_ORDER -#ifdef TIMING - dTimerNow ("randomizing joint order"); -#endif - //randomize the order of the joints by looping through the array - //and swapping the current joint pointer with a random one before it. - for (j = 0; j < nj; j++) - { - joint = joints[j]; - dxJoint::Info1 i1 = info[j]; - dxJoint::Info2 i2 = Jinfo[j]; - int r = rand () % (j + 1); - joints[j] = joints[r]; - info[j] = info[r]; - Jinfo[j] = Jinfo[r]; - joints[r] = joint; - info[r] = i1; - Jinfo[r] = i2; - } -#endif - - //now iterate through the random ordered joint array we created. - for (j = 0; j < nj; j++) - { -#ifdef TIMING - dTimerNow ("setting up joint"); -#endif - joint = joints[j]; - bodyPair[0] = joint->node[0].body; - bodyPair[1] = joint->node[1].body; - - if (bodyPair[0] && (bodyPair[0]->flags & dxBodyDisabled)) - bodyPair[0] = 0; - if (bodyPair[1] && (bodyPair[1]->flags & dxBodyDisabled)) - bodyPair[1] = 0; - - //if this joint is not connected to any enabled bodies, skip it. - if (!bodyPair[0] && !bodyPair[1]) - continue; - - if (bodyPair[0]) - { - GIPair[0] = globalI + bodyPair[0]->tag * 12; - GinvIPair[0] = globalInvI + bodyPair[0]->tag * 12; - } - if (bodyPair[1]) - { - GIPair[1] = globalI + bodyPair[1]->tag * 12; - GinvIPair[1] = globalInvI + bodyPair[1]->tag * 12; - } - - joints[j]->vtable->getInfo2 (joints[j], Jinfo + j); - - //dInternalStepIslandFast is an exact copy of the old routine with one - //modification: the calculated forces are added back to the facc and tacc - //vectors instead of applying them to the bodies and moving them. - if (info[j].m > 0) - { - dInternalStepFast (world, bodyPair, GIPair, GinvIPair, joint, info[j], Jinfo[j], ministep); - } - } - // } -# ifdef TIMING - dTimerNow ("moving bodies"); -# endif - //Now we can simulate all the free floating bodies, and move them. - for (b = 0; b < nb; b++) - { - body = bodies[b]; - - for (i = 0; i < 4; i++) - { - body->facc[i] *= ministep; - body->tacc[i] *= ministep; - } - - //apply torque - dMULTIPLYADD0_331 (body->avel, globalInvI + b * 12, body->tacc); - - //apply force - for (i = 0; i < 3; i++) - body->lvel[i] += body->invMass * body->facc[i]; - - //move It! - moveAndRotateBody (body, ministep); - } - } - for (b = 0; b < nb; b++) - for (j = 0; j < 4; j++) - bodies[b]->facc[j] = bodies[b]->tacc[j] = 0; -} - - -#ifdef NO_ISLANDS - -// Since the iterative algorithm doesn't care about islands of bodies, this is a -// faster algorithm that just sends it all the joints and bodies in one array. -// It's downfall is it's inability to handle disabled bodies as well as the old one. -static void -processIslandsFast (dxWorld * world, dReal stepsize, int maxiterations) -{ - // nothing to do if no bodies - if (world->nb <= 0) - return; - -# ifdef TIMING - dTimerStart ("creating joint and body arrays"); -# endif - dxBody **bodies, *body; - dxJoint **joints, *joint; - joints = (dxJoint **) ALLOCA (world->nj * sizeof (dxJoint *)); - bodies = (dxBody **) ALLOCA (world->nb * sizeof (dxBody *)); - - int nj = 0; - for (joint = world->firstjoint; joint; joint = (dxJoint *) joint->next) - joints[nj++] = joint; - - int nb = 0; - for (body = world->firstbody; body; body = (dxBody *) body->next) - bodies[nb++] = body; - - dInternalStepIslandFast (world, bodies, nb, joints, nj, stepsize, maxiterations); -# ifdef TIMING - dTimerEnd (); - dTimerReport (stdout, 1); -# endif -} - -#else - -//**************************************************************************** -// island processing - -// this groups all joints and bodies in a world into islands. all objects -// in an island are reachable by going through connected bodies and joints. -// each island can be simulated separately. -// note that joints that are not attached to anything will not be included -// in any island, an so they do not affect the simulation. -// -// this function starts new island from unvisited bodies. however, it will -// never start a new islands from a disabled body. thus islands of disabled -// bodies will not be included in the simulation. disabled bodies are -// re-enabled if they are found to be part of an active island. - -static void -processIslandsFast (dxWorld * world, dReal stepsize, int maxiterations) -{ -#ifdef TIMING - dTimerStart ("Island Setup"); -#endif - dxBody *b, *bb, **body; - dxJoint *j, **joint; - - // nothing to do if no bodies - if (world->nb <= 0) - return; - - // make arrays for body and joint lists (for a single island) to go into - body = (dxBody **) ALLOCA (world->nb * sizeof (dxBody *)); - joint = (dxJoint **) ALLOCA (world->nj * sizeof (dxJoint *)); - int bcount = 0; // number of bodies in `body' - int jcount = 0; // number of joints in `joint' - int tbcount = 0; - int tjcount = 0; - - // set all body/joint tags to 0 - for (b = world->firstbody; b; b = (dxBody *) b->next) - b->tag = 0; - for (j = world->firstjoint; j; j = (dxJoint *) j->next) - j->tag = 0; - - // allocate a stack of unvisited bodies in the island. the maximum size of - // the stack can be the lesser of the number of bodies or joints, because - // new bodies are only ever added to the stack by going through untagged - // joints. all the bodies in the stack must be tagged! - int stackalloc = (world->nj < world->nb) ? world->nj : world->nb; - dxBody **stack = (dxBody **) ALLOCA (stackalloc * sizeof (dxBody *)); - int *autostack = (int *) ALLOCA (stackalloc * sizeof (int)); - - for (bb = world->firstbody; bb; bb = (dxBody *) bb->next) - { -#ifdef TIMING - dTimerNow ("Island Processing"); -#endif - // get bb = the next enabled, untagged body, and tag it - if (bb->tag || (bb->flags & dxBodyDisabled)) - continue; - bb->tag = 1; - - // tag all bodies and joints starting from bb. - int stacksize = 0; - int autoDepth = autoEnableDepth; - b = bb; - body[0] = bb; - bcount = 1; - jcount = 0; - goto quickstart; - while (stacksize > 0) - { - b = stack[--stacksize]; // pop body off stack - autoDepth = autostack[stacksize]; - body[bcount++] = b; // put body on body list - quickstart: - - // traverse and tag all body's joints, add untagged connected bodies - // to stack - for (dxJointNode * n = b->firstjoint; n; n = n->next) - { - if (!n->joint->tag) - { - int thisDepth = autoEnableDepth; - n->joint->tag = 1; - joint[jcount++] = n->joint; - if (n->body && !n->body->tag) - { - if (n->body->flags & dxBodyDisabled) - thisDepth = autoDepth - 1; - if (thisDepth < 0) - continue; - n->body->flags &= ~dxBodyDisabled; - n->body->tag = 1; - autostack[stacksize] = thisDepth; - stack[stacksize++] = n->body; - } - } - } - dIASSERT (stacksize <= world->nb); - dIASSERT (stacksize <= world->nj); - } - - // now do something with body and joint lists - dInternalStepIslandFast (world, body, bcount, joint, jcount, stepsize, maxiterations); - - // what we've just done may have altered the body/joint tag values. - // we must make sure that these tags are nonzero. - // also make sure all bodies are in the enabled state. - int i; - for (i = 0; i < bcount; i++) - { - body[i]->tag = 1; - body[i]->flags &= ~dxBodyDisabled; - } - for (i = 0; i < jcount; i++) - joint[i]->tag = 1; - - tbcount += bcount; - tjcount += jcount; - } - -#ifdef TIMING - dMessage(0, "Total joints processed: %i, bodies: %i", tjcount, tbcount); -#endif - - // if debugging, check that all objects (except for disabled bodies, - // unconnected joints, and joints that are connected to disabled bodies) - // were tagged. -# ifndef dNODEBUG - for (b = world->firstbody; b; b = (dxBody *) b->next) - { - if (b->flags & dxBodyDisabled) - { - if (b->tag) - dDebug (0, "disabled body tagged"); - } - else - { - if (!b->tag) - dDebug (0, "enabled body not tagged"); - } - } - for (j = world->firstjoint; j; j = (dxJoint *) j->next) - { - if ((j->node[0].body && (j->node[0].body->flags & dxBodyDisabled) == 0) || (j->node[1].body && (j->node[1].body->flags & dxBodyDisabled) == 0)) - { - if (!j->tag) - dDebug (0, "attached enabled joint not tagged"); - } - else - { - if (j->tag) - dDebug (0, "unattached or disabled joint tagged"); - } - } -# endif - /******************** breakable joint contribution ***********************/ - dxJoint* nextJ; - if (!world->firstjoint) - nextJ = 0; - else - nextJ = (dxJoint*)world->firstjoint->next; - for (j=world->firstjoint; j; j=nextJ) { - nextJ = (dxJoint*)j->next; - // check if joint is breakable and broken - if (j->breakInfo && j->breakInfo->flags & dJOINT_BROKEN) { - // detach (break) the joint - dJointAttach (j, 0, 0); - // call the callback function if it is set - if (j->breakInfo->callback) j->breakInfo->callback (j); - // finally destroy the joint if the dJOINT_DELETE_ON_BREAK is set - if (j->breakInfo->flags & dJOINT_DELETE_ON_BREAK) dJointDestroy (j); - } - } - /*************************************************************************/ - -# ifdef TIMING - dTimerEnd (); - dTimerReport (stdout, 1); -# endif -} - -#endif - - -void dWorldStepFast1 (dWorldID w, dReal stepsize, int maxiterations) -{ - dUASSERT (w, "bad world argument"); - dUASSERT (stepsize > 0, "stepsize must be > 0"); - processIslandsFast (w, stepsize, maxiterations); -} diff --git a/libraries/ode-0.9/contrib/BreakableJoints/test_breakable.cpp b/libraries/ode-0.9/contrib/BreakableJoints/test_breakable.cpp deleted file mode 100644 index bfed3a32f7..0000000000 --- a/libraries/ode-0.9/contrib/BreakableJoints/test_breakable.cpp +++ /dev/null @@ -1,416 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -buggy with suspension. -this also shows you how to use geom groups. - -*/ - - -#include - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCappedCylinder dsDrawCappedCylinderD -#endif - - -// some constants - -#define LENGTH 0.7 // chassis length -#define WIDTH 0.4 // chassis width -#define HEIGHT 0.2 // chassis height -#define RADIUS 0.22 // wheel radius -#define STARTZ 0.4 // starting height of chassis -#define CMASS 1 // chassis mass -#define WMASS 0.2 // wheel mass - -// dynamics and collision objects (chassis, 4 wheels, environment, obstacles, chain) -static dWorldID world; -static dSpaceID space; - -// chain stuff -static const float chain_radius = 0.1; -static const float chain_mass = 0.1; -static const int chain_num = 10; -static dBodyID chain_body[chain_num]; -static dGeomID chain_geom[chain_num]; -static dJointID chain_joint[chain_num-1]; - -// 1 chasses, 4 wheels -static dBodyID body[5]; -// joint[0] is left front wheel, joint[1] is right front wheel -static dJointID joint[4]; -static int joint_exists[4]; -static dJointGroupID contactgroup; -static dGeomID ground; -static dSpaceID car_space; -static dGeomID box[1]; -static dGeomID sphere[4]; -static dGeomID ground_box; -static const int obstacle_num = 25; -static dGeomID obstacle[obstacle_num]; - -// things that the user controls - -static dReal speed=0,steer=0; // user commands - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i,n; - -// // do not collide objects that are connected -// dBodyID b1 = dGeomGetBody (o1), -// b2 = dGeomGetBody (o2); -// if (b1 && b2 && dAreConnected(b1, b2)) return; - - const int N = 10; - dContact contact[N]; - n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); - if (n > 0) { - for (i=0; i 0.1) v = 0.1; - if (v < -0.1) v = -0.1; - v *= 10.0; - dJointSetHinge2Param (joint[i],dParamVel,v); - dJointSetHinge2Param (joint[i],dParamFMax,0.2); - dJointSetHinge2Param (joint[i],dParamLoStop,-0.75); - dJointSetHinge2Param (joint[i],dParamHiStop,0.75); - dJointSetHinge2Param (joint[i],dParamFudgeFactor,0.1); - } - } - - dSpaceCollide (space,0,&nearCallback); - //dWorldStep (world,0.05); - dWorldStepFast1 (world,0.05,5); - - // remove all contact joints - dJointGroupEmpty (contactgroup); - } - - dsSetColor (0,1,1); - dsSetTexture (DS_WOOD); - dReal sides[3] = {LENGTH,WIDTH,HEIGHT}; - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides); - dsSetColor (1,1,1); - for (i=1; i<=4; i++) - dsDrawCylinder (dBodyGetPosition(body[i]), - dBodyGetRotation(body[i]), - 0.2, - RADIUS); - - dVector3 ss; - dGeomBoxGetLengths (ground_box,ss); - dsDrawBox (dGeomGetPosition(ground_box),dGeomGetRotation(ground_box),ss); - - dsSetColor (1,0,0); - for (i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCappedCylinder dsDrawCappedCylinderD -#endif - - -// some constants - -#define LENGTH 0.7 // chassis length -#define WIDTH 0.5 // chassis width -#define HEIGHT 0.2 // chassis height -#define RADIUS 0.18 // wheel radius -#define STARTZ 0.5 // starting height of chassis -#define CMASS 1 // chassis mass -#define WMASS 0.2 // wheel mass - - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; -static dBodyID body[4]; -static dJointID joint[3]; // joint[0] is the front wheel -static dJointGroupID contactgroup; -static dGeomID ground; -static dSpaceID car_space; -static dGeomID box[1]; -static dGeomID sphere[3]; -static dGeomID ground_box; - - -// things that the user controls - -static dReal speed=0,steer=0; // user commands - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i,n; - - // only collide things with the ground - int g1 = (o1 == ground || o1 == ground_box); - int g2 = (o2 == ground || o2 == ground_box); - if (!(g1 ^ g2)) return; - - const int N = 10; - dContact contact[N]; - n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); - if (n > 0) { - for (i=0; i 0.1) v = 0.1; - if (v < -0.1) v = -0.1; - v *= 10.0; - dJointSetHinge2Param (joint[0],dParamVel,v); - dJointSetHinge2Param (joint[0],dParamFMax,0.2); - dJointSetHinge2Param (joint[0],dParamLoStop,-0.75); - dJointSetHinge2Param (joint[0],dParamHiStop,0.75); - dJointSetHinge2Param (joint[0],dParamFudgeFactor,0.1); - - dSpaceCollide (space,0,&nearCallback); - dWorldStep (world,0.05); - - // remove all contact joints - dJointGroupEmpty (contactgroup); - } - - dsSetColor (0,1,1); - dsSetTexture (DS_WOOD); - dReal sides[3] = {LENGTH,WIDTH,HEIGHT}; - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides); - dsSetColor (1,1,1); - for (i=1; i<=3; i++) dsDrawCylinder (dBodyGetPosition(body[i]), - dBodyGetRotation(body[i]),0.02f,RADIUS); - - dVector3 ss; - dGeomBoxGetLengths (ground_box,ss); - dsDrawBox (dGeomGetPosition(ground_box),dGeomGetRotation(ground_box),ss); - - /* - printf ("%.10f %.10f %.10f %.10f\n", - dJointGetHingeAngle (joint[1]), - dJointGetHingeAngle (joint[2]), - dJointGetHingeAngleRate (joint[1]), - dJointGetHingeAngleRate (joint[2])); - */ -} - - -int main (int argc, char **argv) -{ - int i; - dMass m; - - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - // create world - - world = dWorldCreate(); - space = dHashSpaceCreate (0); - contactgroup = dJointGroupCreate (0); - dWorldSetGravity (world,0,0,-0.5); - ground = dCreatePlane (space,0,0,1,0); - - // chassis body - body[0] = dBodyCreate (world); - dBodySetPosition (body[0],0,0,STARTZ); - dMassSetBox (&m,1,LENGTH,WIDTH,HEIGHT); - dMassAdjust (&m,CMASS); - dBodySetMass (body[0],&m); - box[0] = dCreateBox (0,LENGTH,WIDTH,HEIGHT); - dGeomSetBody (box[0],body[0]); - - // wheel bodies - for (i=1; i<=3; i++) { - body[i] = dBodyCreate (world); - dQuaternion q; - dQFromAxisAndAngle (q,1,0,0,M_PI*0.5); - dBodySetQuaternion (body[i],q); - dMassSetSphere (&m,1,RADIUS); - dMassAdjust (&m,WMASS); - dBodySetMass (body[i],&m); - sphere[i-1] = dCreateSphere (0,RADIUS); - dGeomSetBody (sphere[i-1],body[i]); - } - dBodySetPosition (body[1],0.5*LENGTH,0,STARTZ-HEIGHT*0.5); - dBodySetPosition (body[2],-0.5*LENGTH, WIDTH*0.5,STARTZ-HEIGHT*0.5); - dBodySetPosition (body[3],-0.5*LENGTH,-WIDTH*0.5,STARTZ-HEIGHT*0.5); - - // front wheel hinge - /* - joint[0] = dJointCreateHinge2 (world,0); - dJointAttach (joint[0],body[0],body[1]); - const dReal *a = dBodyGetPosition (body[1]); - dJointSetHinge2Anchor (joint[0],a[0],a[1],a[2]); - dJointSetHinge2Axis1 (joint[0],0,0,1); - dJointSetHinge2Axis2 (joint[0],0,1,0); - */ - - // front and back wheel hinges - for (i=0; i<3; i++) { - joint[i] = dJointCreateHinge2 (world,0); - dJointAttach (joint[i],body[0],body[i+1]); - const dReal *a = dBodyGetPosition (body[i+1]); - dJointSetHinge2Anchor (joint[i],a[0],a[1],a[2]); - dJointSetHinge2Axis1 (joint[i],0,0,1); - dJointSetHinge2Axis2 (joint[i],0,1,0); - - // breakable joints contribution - // the wheels can break - dJointSetBreakable (joint[i], 1); - // the wheels wil break at a specific force - dJointSetBreakMode (joint[i], dJOINT_BREAK_AT_B1_FORCE|dJOINT_BREAK_AT_B2_FORCE); - // specify the force for the first body connected to the joint ... - dJointSetBreakForce (joint[i], 0, 1.5, 1.5, 1.5); - // and for the second body - dJointSetBreakForce (joint[i], 1, 1.5, 1.5, 1.5); - } - - // set joint suspension - for (i=0; i<3; i++) { - dJointSetHinge2Param (joint[i],dParamSuspensionERP,0.4); - dJointSetHinge2Param (joint[i],dParamSuspensionCFM,0.8); - } - - // lock back wheels along the steering axis - for (i=1; i<3; i++) { - // set stops to make sure wheels always stay in alignment - dJointSetHinge2Param (joint[i],dParamLoStop,0); - dJointSetHinge2Param (joint[i],dParamHiStop,0); - // the following alternative method is no good as the wheels may get out - // of alignment: - // dJointSetHinge2Param (joint[i],dParamVel,0); - // dJointSetHinge2Param (joint[i],dParamFMax,dInfinity); - } - - // create car space and add it to the top level space - car_space = dSimpleSpaceCreate (space); - dSpaceSetCleanup (car_space,0); - dSpaceAdd (car_space,box[0]); - dSpaceAdd (car_space,sphere[0]); - dSpaceAdd (car_space,sphere[1]); - dSpaceAdd (car_space,sphere[2]); - - // environment - ground_box = dCreateBox (space,2,1.5,1); - dMatrix3 R; - dRFromAxisAndAngle (R,0,1,0,-0.15); - dGeomSetPosition (ground_box,2,0,-0.34); - dGeomSetRotation (ground_box,R); - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dJointGroupDestroy (contactgroup); - dSpaceDestroy (space); - dWorldDestroy (world); - dGeomDestroy (box[0]); - dGeomDestroy (sphere[0]); - dGeomDestroy (sphere[1]); - dGeomDestroy (sphere[2]); - - return 0; -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/AssemblyInfo.cpp b/libraries/ode-0.9/contrib/DotNetManaged/AssemblyInfo.cpp deleted file mode 100644 index e550a32282..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/AssemblyInfo.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "stdafx.h" - -using namespace System::Reflection; -using namespace System::Runtime::CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly:AssemblyTitleAttribute("")]; -[assembly:AssemblyDescriptionAttribute("")]; -[assembly:AssemblyConfigurationAttribute("")]; -[assembly:AssemblyCompanyAttribute("")]; -[assembly:AssemblyProductAttribute("")]; -[assembly:AssemblyCopyrightAttribute("")]; -[assembly:AssemblyTrademarkAttribute("")]; -[assembly:AssemblyCultureAttribute("")]; - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the value or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly:AssemblyVersionAttribute("1.0.*")]; - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project directory. -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly:AssemblyDelaySignAttribute(false)]; -[assembly:AssemblyKeyFileAttribute("")]; -[assembly:AssemblyKeyNameAttribute("")]; - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Body.cpp b/libraries/ode-0.9/contrib/DotNetManaged/Body.cpp deleted file mode 100644 index c95ae57909..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Body.cpp +++ /dev/null @@ -1,322 +0,0 @@ -#include "StdAfx.h" - -#include -#include "Body.h" - -namespace ODEManaged -{ - - //Constructors - - Body::Body(void) - { - _id = 0; - } - - Body::Body(World &world) - { - _id = dBodyCreate(world.Id()); - } - - - //Destructor - - Body::~Body(void) - { - dBodyDestroy(this->_id); - } - - - //Methods - - //Id - dBodyID Body::Id() - { - return _id; - } - - - //SetData - void Body::SetData(void *data) - { - dBodySetData(this->_id, data); - } - - //GetData - void *Body::GetData(void) - { - return dBodyGetData(this->_id); - } - - - //SetPosition - void Body::SetPosition (double x, double y, double z) - { - dBodySetPosition(this->_id, x, y, z); - } - - - //Overloaded GetPosition - Vector3 Body::GetPosition(void) - { - Vector3 retVal; - const dReal *temp; - temp = dBodyGetPosition(this->_id); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - }; - - void Body::GetPosition(double position __gc[]) - { - const dReal *temp; - temp = dBodyGetPosition(this->_id); - position[0] = temp[0]; - position[1] = temp[1]; - position[2] = temp[2]; - } - - - //SetRotationIdentity - void Body::SetRotationIdentity(void) - { - dMatrix3 temp; - dRSetIdentity(temp); - dBodySetRotation(this->_id, temp); - } - - - //SetRotation (left handed system=>transpose) - void Body::SetRotation(Matrix3 rotation) - { - dMatrix3 temp; - temp[0] = rotation.m11; - temp[4] = rotation.m12; - temp[8] = rotation.m13; - temp[1] = rotation.m21; - temp[5] = rotation.m22; - temp[9] = rotation.m23; - temp[2] = rotation.m31; - temp[6] = rotation.m32; - temp[10] = rotation.m33; - dBodySetRotation(this->_id, temp); - } - - //GetRotation (left handed system=>transpose) - Matrix3 Body::GetRotation(void) - { - Matrix3 retVal; - //const dMatrix3 *m; - const dReal *temp; - temp = dBodyGetRotation(this->_id); - retVal.m11 = temp[0]; - retVal.m12 = temp[4]; - retVal.m13 = temp[8]; - retVal.m21 = temp[1]; - retVal.m22 = temp[5]; - retVal.m23 = temp[9]; - retVal.m31 = temp[2]; - retVal.m32 = temp[6]; - retVal.m33 = temp[10]; - return retVal; - } - - - //Overloaded SetMass - void Body::SetMass(double mass, Vector3 centerOfGravity, Matrix3 inertia) - { - dMass *temp = new dMass(); - dMassSetParameters(temp, mass, - centerOfGravity.x, - centerOfGravity.y, - centerOfGravity.z, - inertia.m11, inertia.m22, - inertia.m33, inertia.m12, - inertia.m13, inertia.m23); - - dBodySetMass(this->_id, temp); - } - - - //SetMassSphere - void Body::SetMassSphere(double density, double radius) - { - dMass *temp = new dMass(); - dMassSetSphere(temp, density, radius); - dBodySetMass(this->_id, temp); - } - - - //SetMassBox - void Body::SetMassBox(double density, double sideX, double sideY, double sideZ) - { - dMass *temp = new dMass(); - dMassSetBox(temp, density, sideX, sideY, sideZ); - dBodySetMass(this->_id, temp); - } - - - //SetMassCappedCylinder - void Body::SetMassCappedCylinder(double density, int axis, double cylinderRadius, double cylinderLength) - { - dMass *temp = new dMass(); - dMassSetCappedCylinder(temp, density, axis, - cylinderRadius, - cylinderLength); - - dBodySetMass(this->_id, temp); - } - - - //AddForce - void Body::AddForce(double fX, double fY, double fZ) - { - dBodyAddForce(this->_id, fX, fY, fZ); - } - - - //AddRelForce - void Body::AddRelForce(double fX, double fY, double fZ) - { - dBodyAddRelForce(this->_id, fX,fY,fZ); - } - - - //AddForceAtPos - void Body::AddForceAtPos(double fX, double fY, double fZ, double pX, double pY, double pZ) - { - dBodyAddForceAtPos(this->_id, fX, fY, fZ, pX, pY, pZ); - } - - - //AddRelForceAtPos - void Body::AddRelForceAtPos(double fX, double fY, double fZ, double pX, double pY, double pZ) - { - dBodyAddRelForceAtPos(this->_id, fX, fY, fZ, pX, pY, pZ); - } - - - //AddRelForceAtRelPos - void Body::AddRelForceAtRelPos(double fX, double fY, double fZ, double pX, double pY, double pZ) - { - dBodyAddRelForceAtRelPos(this->_id, fX, fY, fZ, pX, pY, pZ); - } - - - //ApplyLinearVelocityDrag - void Body::ApplyLinearVelocityDrag(double dragCoef) - { - const dReal *temp; - double fX; - double fY; - double fZ; - temp = dBodyGetLinearVel(this->_id); - fX = temp[0]*dragCoef*-1; - fY = temp[1]*dragCoef*-1; - fZ = temp[2]*dragCoef*-1; - dBodyAddForce(this->_id, fX, fY, fZ); - } - - - //ApplyAngularVelocityDrag - void Body::ApplyAngularVelocityDrag(double dragCoef) - { - const dReal *temp; - double fX; - double fY; - double fZ; - temp = dBodyGetAngularVel(this->_id); - fX = temp[0]*dragCoef*-1; - fY = temp[1]*dragCoef*-1; - fZ = temp[2]*dragCoef*-1; - dBodyAddTorque(this->_id, fX, fY, fZ); - } - - - //AddTorque - void Body::AddTorque(double fX, double fY, double fZ) - { - dBodyAddTorque(this->_id, fX, fY, fZ); - } - - - //AddRelTorque - void Body::AddRelTorque(double fX, double fY, double fZ) - { - dBodyAddRelTorque(this->_id, fX,fY,fZ); - } - - - //SetLinearVelocity - void Body::SetLinearVelocity(double x, double y, double z) - { - dBodySetLinearVel(this->_id, x, y, z); - } - - - //GetLinearVelocity - Vector3 Body::GetLinearVelocity(void) - { - Vector3 retVal; - const dReal *temp; - temp = dBodyGetLinearVel(this->_id); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //SetAngularVelocity - void Body::SetAngularVelocity(double x, double y, double z) - { - dBodySetAngularVel(this->_id, x, y, z); - } - - //GetAngularVelocity - Vector3 Body::GetAngularVelocity(void) - { - Vector3 retVal; - const dReal *temp; - temp = dBodyGetAngularVel(this->_id); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //GetRelPointPos - Vector3 Body::GetRelPointPos(double pX, double pY, double pZ) - { - Vector3 retVal; - dVector3 temp; - dBodyGetRelPointPos(this->_id, pX, pY, pZ, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //GetRelPointVel - Vector3 Body::GetRelPointVel(double pX, double pY, double pZ) - { - Vector3 retVal; - dVector3 temp; - dBodyGetRelPointVel(this->_id, pX, pY, pZ, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //ConnectedTo - int Body::ConnectedTo(const Body &b) - { - return dAreConnected(this->_id, b._id); - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Body.h b/libraries/ode-0.9/contrib/DotNetManaged/Body.h deleted file mode 100644 index 9347c179ef..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Body.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include "World.h" -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class Body - { - public: - - //Constructors and Destructors - - Body(void); - Body(World &world); - - ~Body(void); - - - //Public Methods - - dBodyID Id(); - void SetData (void *data); - void *GetData (void); - - //POSITION - void SetPosition(double x, double y, double z); - Vector3 GetPosition(void); - void GetPosition(double position __gc[]); - - //ROTATION - void SetRotationIdentity(void); - void SetRotation(Matrix3 rotation); - Matrix3 GetRotation(void); - - //MASS - void SetMass(double mass, Vector3 centerOfGravity, Matrix3 inertia); - void SetMassSphere(double density, double radius); - void SetMassBox(double density, double sideX, double sideY, double sideZ); - void SetMassCappedCylinder(double density, int axis, double cylinderRadius, double cylinderLength); - - //FORCE AND TORQUE - void AddForce(double fX, double fY, double fZ); - void AddRelForce(double fX, double fY, double fZ); - void AddForceAtPos(double fX, double fY, double fZ,double pX, double pY, double pZ); - void AddRelForceAtPos(double fX, double fY, double fZ,double pX, double pY, double pZ); - void AddRelForceAtRelPos(double fX, double fY, double fZ,double pX, double pY, double pZ); - void ApplyLinearVelocityDrag(double dragCoef); - void ApplyAngularVelocityDrag(double dragCoef); - - - void AddTorque(double fX, double fY, double fZ); - void AddRelTorque(double fX, double fY, double fZ); - - //LINEAR VELOCITY - void SetLinearVelocity (double x, double y, double z); - Vector3 GetLinearVelocity(void); - - //ANGULAR VELOCITY - void SetAngularVelocity (double x, double y, double z); - Vector3 GetAngularVelocity(void); - - //POINT - Vector3 GetRelPointPos(double pX, double pY, double pZ); - Vector3 GetRelPointVel(double pX, double pY, double pZ); - - //CONNECTED TO - int ConnectedTo (const Body &b); - - private: - - dBodyID _id; - - }; -} - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/CommonMgd.h b/libraries/ode-0.9/contrib/DotNetManaged/CommonMgd.h deleted file mode 100644 index 143397d179..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/CommonMgd.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -namespace ODEManaged -{ - - __value public struct Vector3 - { - double x; - double y; - double z; - }; - - - __value public struct Vector4 - { - double W; - double x; - double y; - double z; - }; - - - __value public struct Matrix3 - { - double m11; - double m12; - double m13; - double m21; - double m22; - double m23; - double m31; - double m32; - double m33; - }; - - //__value public struct NearCallback - //{ - // void *data; - // dGeomID o1; - // dGeomID o2; - //}; - -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/DotNetManaged/DotNetManaged.sln b/libraries/ode-0.9/contrib/DotNetManaged/DotNetManaged.sln deleted file mode 100644 index 2694a266d5..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/DotNetManaged.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 7.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DotNetManaged", "DotNetManaged.vcproj", "{4B75AC19-971A-4CC6-A4F5-0695C9F8562F}" -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = Debug - ConfigName.1 = Release - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {4B75AC19-971A-4CC6-A4F5-0695C9F8562F}.Debug.ActiveCfg = Debug|Win32 - {4B75AC19-971A-4CC6-A4F5-0695C9F8562F}.Debug.Build.0 = Debug|Win32 - {4B75AC19-971A-4CC6-A4F5-0695C9F8562F}.Release.ActiveCfg = Release|Win32 - {4B75AC19-971A-4CC6-A4F5-0695C9F8562F}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/libraries/ode-0.9/contrib/DotNetManaged/DotNetManaged.vcproj b/libraries/ode-0.9/contrib/DotNetManaged/DotNetManaged.vcproj deleted file mode 100644 index 2f5bb6cbd9..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/DotNetManaged.vcproj +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Geom.cpp b/libraries/ode-0.9/contrib/DotNetManaged/Geom.cpp deleted file mode 100644 index 3655466ad5..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Geom.cpp +++ /dev/null @@ -1,219 +0,0 @@ - -#include "StdAfx.h" - -#include -#include "Geom.h" - - -namespace ODEManaged -{ - - //Constructors - - Geom::Geom(void) - { - _id = 0; - } - - - //Destructor - - Geom::~Geom(void) - { - dGeomDestroy(this->_id); - } - - - //Methods - - //Id - dGeomID Geom::Id(void) - { - return _id; - } - - - //GetBody - dBodyID Geom::GetBody(void) - { - return dGeomGetBody(this->_id); - } - - - //Overloaded SetBody - void Geom::SetBody(Body &body) - { - dGeomSetBody(this->_id, body.Id()); - } - - //void Geom::SetBody(dBodyID b) - //{ - // dGeomSetBody(this->_id, b); - //} - - - //SetPosition - void Geom::SetPosition(double x, double y, double z) - { - dGeomSetPosition(this->_id, x, y, z); - } - - - //SetRotation - void Geom::SetRotation(Matrix3 rotation) - { - dMatrix3 temp; - temp[0] = rotation.m11; - temp[4] = rotation.m12; - temp[8] = rotation.m13; - temp[1] = rotation.m21; - temp[5] = rotation.m22; - temp[9] = rotation.m23; - temp[2] = rotation.m31; - temp[6] = rotation.m32; - temp[10] = rotation.m33; - dGeomSetRotation(_id, temp); - } - - - //Destroy - void Geom::Destroy() - { - if(this->_id) dGeomDestroy(this->_id); - _id = 0; - } - - - //SetData - void Geom::SetData(void *data) - { - dGeomSetData(this->_id, data); - } - - - //GetData - void *Geom::GetData(void) - { - return dGeomGetData(this->_id); - } - - - //GetPosition - Vector3 Geom::GetPosition(void) - { - Vector3 retVal; - const dReal *temp; - temp = dGeomGetPosition(this->_id); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //GetRotation (left handed system=>transpose) - Matrix3 Geom::GetRotation(void) - { - Matrix3 retVal; - const dReal *temp; - temp = dGeomGetRotation(this->_id); - retVal.m11 = temp[0]; - retVal.m12 = temp[4]; - retVal.m13 = temp[8]; - retVal.m21 = temp[1]; - retVal.m22 = temp[5]; - retVal.m23 = temp[9]; - retVal.m31 = temp[2]; - retVal.m32 = temp[6]; - retVal.m33 = temp[10]; - return retVal; - } - - - //CreateSphere - void Geom::CreateSphere(Space &space, double radius) - { - if(this->_id) dGeomDestroy(this->_id); - _id = dCreateSphere(space.Id(), radius); - } - - - //CreateBox - void Geom::CreateBox(Space &space, double lx, double ly, double lz) - { - if(this->_id) dGeomDestroy(this->_id); - _id = dCreateBox(space.Id(), lx, ly, lz); - } - - - //CreatePlane - void Geom::CreatePlane(Space &space, double a, double b, double c, double d) - { - if(this->_id) dGeomDestroy(this->_id); - _id = dCreatePlane(space.Id(), a, b, c, d); - } - - - //CreateCCylinder - void Geom::CreateCCylinder(Space &space, double radius, double length) - { - if(this->_id) dGeomDestroy(this->_id); - _id = dCreateCCylinder(space.Id(), radius, length); - } - - - //SphereGetRadius - double Geom::SphereGetRadius(void) - { - return dGeomSphereGetRadius(this->_id); - } - - - //BoxGetLengths - Vector3 Geom::BoxGetLengths(void) - { - Vector3 retVal; - dVector3 temp; - dGeomBoxGetLengths(this->_id, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //PlaneGetParams - Vector4 Geom::PlaneGetParams(void) - { - Vector4 retVal; - dVector4 temp; - dGeomPlaneGetParams(this->_id, temp); - retVal.W = temp[0]; - retVal.x = temp[1]; - retVal.y = temp[2]; - retVal.z = temp[3]; - return retVal; - } - - - //CCylinderGetParams - void Geom::CCylinderGetParams(double *radius, double *length) - { - dGeomCCylinderGetParams(this->_id, radius, length); - } - - - //GetClass - int Geom::GetClass(void) - { - return dGeomGetClass(this->_id); - } - -} - - - - - - - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Geom.h b/libraries/ode-0.9/contrib/DotNetManaged/Geom.h deleted file mode 100644 index 83a6faf705..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Geom.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include "Body.h" -#include "Space.h" -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class Geom - { - public: - - - //Constructor - - Geom (void); - - - //Destructor - - ~Geom (void); - - - //Methods - - //Basic Stuff - - dGeomID Id (void); - dBodyID GetBody (void); - - //Overloaded SetBody - void SetBody (Body &body); - /*void SetBody (dBodyID b);*/ - - Vector3 GetPosition (void); - void SetPosition (double x, double y, double z); - - Matrix3 GetRotation (void); - void SetRotation (Matrix3 rotation); - - void SetData (void *data); - void *GetData (void); - - - //Create Objects - - void CreateSphere (Space &space, double radius); - void CreateBox (Space &space, double lx, double ly, double lz); - void CreatePlane (Space &space, double a, double b, double c, double d); - void CreateCCylinder (Space &space, double radius, double length); - - - //Destroy Objects - - void Destroy (void); - - - //Get Object's Parameters - - double SphereGetRadius (void); - Vector3 BoxGetLengths (void); - Vector4 PlaneGetParams (void); - void CCylinderGetParams (double *radius, double *length); - int GetClass (void); - - - //Properties - - private: - - dGeomID _id; - - }; - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Joint.cpp b/libraries/ode-0.9/contrib/DotNetManaged/Joint.cpp deleted file mode 100644 index e2d8de697d..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Joint.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "StdAfx.h" - -#include -#include "joint.h" -#include "CommonMgd.h" -#include "world.h" - -namespace ODEManaged -{ - - //Constructor - - Joint::Joint(void) - { - _id=0; - } - - - //Destructor - - Joint::~Joint(void) - { - dJointDestroy(this->_id); - } - - - //Methods - - //Id - dJointID Joint::Id(void) - { - return _id; - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Joint.h b/libraries/ode-0.9/contrib/DotNetManaged/Joint.h deleted file mode 100644 index d9ab254d37..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Joint.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "JointGroup.h" -#include "World.h" -#include "Body.h" - -namespace ODEManaged -{ - __gc public class Joint - { - protected: - //Constructor and Destructor Defenition - Joint(void); - ~Joint(void); - - //Public Methods - dJointID Id(void); - - dJointID _id; - }; -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointAMotor.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointAMotor.cpp deleted file mode 100644 index c5a4543ca5..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointAMotor.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "StdAfx.h" - -#include -#include "JointAMotor.h" - -namespace ODEManaged -{ - - //Constructors - - JointAMotor::JointAMotor(void) : Joint(){} - - - JointAMotor::JointAMotor(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateAMotor(world.Id(), 0); - } - - - JointAMotor::JointAMotor(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateAMotor(world.Id(), jointGroup.Id()); - } - - - //Destructor - - JointAMotor::~JointAMotor(void){} - - - //Methods - - //Overloaded Create - void JointAMotor::Create(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateAMotor(world.Id(), jointGroup.Id()); - } - - void JointAMotor::Create(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateAMotor(world.Id(), 0); - } - - - //Overloaded Attach - void JointAMotor::Attach(Body &body1, Body &body2) - { - dJointAttach(this->_id, body1.Id(), body2.Id()); - } - - void JointAMotor::Attach(Body &body1) - { - dJointAttach(this->_id, body1.Id(), 0); - } - - - //SetNumAxes - - void JointAMotor::SetNumAxes(int num) - { - dJointSetAMotorNumAxes(this->_id, num); - } - - - //GetNumAxes - - int JointAMotor::GetNumAxes(void) - { - return dJointGetAMotorNumAxes(this->_id); - } - - - //SetAxis - - void JointAMotor::SetAxis(int anum, int rel, double x, double y ,double z) - { - dJointSetAMotorAxis(this->_id, anum, rel, x, y, z); - } - - - //GetAxis - - Vector3 JointAMotor::GetAxis(int anum) - { - Vector3 retVal; - dVector3 temp; - dJointGetAMotorAxis(this->_id, anum, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //SetAngle - - void JointAMotor::SetAngle(int anum, double angle) - { - dJointSetAMotorAngle(this->_id, anum, angle); - } - - - //GetAngle - - double JointAMotor::GetAngle(int anum) - { - return dJointGetAMotorAngle(this->_id, anum); - } - - - //SetParam - - void JointAMotor::SetParam(int parameter, double value) - { - dJointSetAMotorParam(this->_id, parameter, value); - } - - - //GetParam - - double JointAMotor::GetParam(int parameter) - { - return dJointGetAMotorParam(this->_id, parameter); - } - - - //SetMode - - void JointAMotor::SetMode(int mode) - { - dJointSetAMotorMode(this->_id, mode); - } - - - //GetMode - - int JointAMotor::GetMode(void) - { - return dJointGetAMotorMode(this->_id); - } - - - //GetAxisRel - - int JointAMotor::GetAxisRel(int anum) - { - return dJointGetAMotorAxisRel(this->_id, anum); - } - - - //GetAngleRate - - double JointAMotor::GetAngleRate(int anum) - { - return dJointGetAMotorAngleRate(this->_id, anum); - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointAMotor.h b/libraries/ode-0.9/contrib/DotNetManaged/JointAMotor.h deleted file mode 100644 index aa3ca4b9c1..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointAMotor.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include "Joint.h" - -namespace ODEManaged -{ - __gc public class JointAMotor : public Joint - { - public: - - - //Constructors - - JointAMotor (void); - JointAMotor (World &world); - JointAMotor (World &world, JointGroup &jointGroup); - - - //Destructor - - virtual ~JointAMotor (void); - - - //Methods - - //Basic Stuff - - //Overloaded Create - void Create (World &world, JointGroup &jointGroup); - void Create (World &world); - - void SetNumAxes (int num); - int GetNumAxes (void); - - void SetAxis (int anum, int rel, double x, double y, double z); - Vector3 GetAxis (int anum); - - void SetAngle (int anum, double angle); - double GetAngle (int anum); - - void SetMode (int mode); - int GetMode (void); - - int GetAxisRel (int anum); - double GetAngleRate (int anum); - - //Overloaded Attach - void Attach (Body &body1, Body &body2); - void Attach (Body &body1); - - - //Movement Parameters - - void SetParam (int parameter, double value); - double GetParam (int parameter); - - - - - - }; -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointBall.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointBall.cpp deleted file mode 100644 index d9336c9da6..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointBall.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "StdAfx.h" - -#include -#include "jointball.h" - -namespace ODEManaged -{ - - //Constructors - - JointBall::JointBall(void) : Joint(){} - - - JointBall::JointBall(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateBall(world.Id(), 0); - } - - - JointBall::JointBall(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateBall(world.Id(), jointGroup.Id()); - } - - - //Destructor - - JointBall::~JointBall(void){} - - - //Methods - - //Overloaded Create - void JointBall::Create(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateBall(world.Id(), jointGroup.Id()); - } - - void JointBall::Create(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateBall(world.Id(), 0); - } - - - //Overloaded Attach - void JointBall::Attach(Body &body1, Body &body2) - { - dJointAttach(this->_id, body1.Id(), body2.Id()); - } - - void JointBall::Attach(Body &body1) - { - dJointAttach(this->_id, body1.Id(), 0); - } - - - //SetAnchor - void JointBall::SetAnchor(double x, double y ,double z) - { - dJointSetBallAnchor(this->_id, x, y, z); - } - - //GetAnchor - Vector3 JointBall::GetAnchor(void) - { - Vector3 retVal; - dVector3 temp; - dJointGetBallAnchor(this->_id,temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointBall.h b/libraries/ode-0.9/contrib/DotNetManaged/JointBall.h deleted file mode 100644 index 2355bddaf5..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointBall.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "Joint.h" - -namespace ODEManaged -{ - __gc public class JointBall : public Joint - { - public: - - //Constructors - - JointBall(void); - JointBall(World &world); - JointBall(World &world, JointGroup &jointGroup); - - - //Destructors - - virtual ~JointBall(void); - - - //Methods - - //Overloaded Create - void Create(World &world, JointGroup &jointGroup); - void Create(World &world); - - //Overloaded Attach - void Attach(Body &body1, Body &body2); - void Attach(Body &body1); - - void SetAnchor(double x, double y, double z); - Vector3 GetAnchor(void); - - }; - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointFixed.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointFixed.cpp deleted file mode 100644 index afe922257e..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointFixed.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "StdAfx.h" - -#include -#include "jointfixed.h" - -namespace ODEManaged -{ - - //Constructors - - JointFixed::JointFixed(void) : Joint(){} - - - JointFixed::JointFixed(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateFixed(world.Id(),0); - } - - - JointFixed::JointFixed(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateFixed(world.Id(), jointGroup.Id()); - } - - - //Destructor - - JointFixed::~JointFixed(void){} - - - //Methods - - //Overloaded Create - void JointFixed::Create(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateFixed(world.Id(), jointGroup.Id()); - } - - void JointFixed::Create(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateFixed(world.Id(), 0); - } - - - //Overloaded Attach - void JointFixed::Attach(Body &body1, Body &body2) - { - dJointAttach(this->_id, body1.Id(), body2.Id()); - } - - void JointFixed::Attach(Body &body1) - { - dJointAttach(this->_id, body1.Id(), 0); - } - - - //Fixed - void JointFixed::SetFixed(void) - { - dJointSetFixed(this->_id); - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointFixed.h b/libraries/ode-0.9/contrib/DotNetManaged/JointFixed.h deleted file mode 100644 index 5ca50dc772..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointFixed.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "Joint.h" - -namespace ODEManaged -{ - __gc public class JointFixed : public Joint - { - public: - - //Constructors - - JointFixed(void); - JointFixed(World &world); - JointFixed(World &world, JointGroup &jointGroup); - - - //Destructor - - virtual ~JointFixed(void); - - - //Methods - - //Overloaded Create - void Create(World &world, JointGroup &jointGroup); - void Create(World &world); - - //Overloaded Attach - void Attach(Body &body1, Body &body2); - void Attach(Body &body1); - - void SetFixed(void); - - }; - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointGroup.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointGroup.cpp deleted file mode 100644 index 925751ffd6..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointGroup.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "StdAfx.h" - -#include -#include "jointgroup.h" - -namespace ODEManaged -{ - - //Constructors - - JointGroup::JointGroup(void) - { - _id=0; - } - - JointGroup::JointGroup (int maxSize) - { - _id = dJointGroupCreate(maxSize); - } - - - //Destructor - - JointGroup::~JointGroup(void) - { - dJointGroupDestroy(this->_id); - } - - - //Methods - - //ID - dJointGroupID JointGroup::Id() - { - return _id; - } - - - //Create - void JointGroup::Create (int maxSize) - { - if(_id) dJointGroupDestroy(_id); - _id = dJointGroupCreate(maxSize); - } - - - //Empty - void JointGroup::Empty (void) - { - dJointGroupEmpty(this->_id); - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointGroup.h b/libraries/ode-0.9/contrib/DotNetManaged/JointGroup.h deleted file mode 100644 index b62ced0f64..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointGroup.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -namespace ODEManaged -{ - __gc public class JointGroup - { - public: - - //Constructors - - JointGroup(void); - JointGroup(int maxSize); - - - //Destructor - - ~JointGroup(void); - - - //Methods - - dJointGroupID Id(void); - void Create(int maxSize); - void Empty(void); - - - private: - - dJointGroupID _id; - - }; - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointHinge.cpp deleted file mode 100644 index 85d420bdff..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include "stdafx.h" - -#include -#include "jointhinge.h" - -namespace ODEManaged -{ - - //Constructors - - JointHinge::JointHinge(void) : Joint(){} - - - JointHinge::JointHinge(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge(world.Id(), 0); - } - - - JointHinge::JointHinge(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge(world.Id(), jointGroup.Id()); - } - - - //Destructor - - JointHinge::~JointHinge(void){} - - - //Methods - - //Overloaded Create - void JointHinge::Create(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge(world.Id(), jointGroup.Id()); - } - - void JointHinge::Create(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge(world.Id(), 0); - } - - - //Overloaded Attach - void JointHinge::Attach(Body &body1, Body &body2) - { - dJointAttach(this->_id, body1.Id(), body2.Id()); - } - - void JointHinge::Attach(Body &body1) - { - dJointAttach(this->_id, body1.Id(), 0); - } - - - //SetAxis - void JointHinge::SetAxis(double x, double y, double z) - { - dJointSetHingeAxis(this->_id, x, y, z); - } - - //GetAxis - Vector3 JointHinge::GetAxis(void) - { - Vector3 retVal; - dVector3 temp; - dJointGetHingeAxis(this->_id, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //SetAnchor - void JointHinge::SetAnchor(double x, double y, double z) - { - dJointSetHingeAnchor(this->_id, x, y, z); - } - - //GetAnchor - Vector3 JointHinge::GetAnchor(void) - { - Vector3 retVal; - dVector3 temp; - dJointGetHingeAnchor(this->_id, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //Movement Parameters - - //SetAllMovParams - void JointHinge::SetAllMovParams(double LoStop, double HiStop, - double Velocity, double MaxForce, - double FudgeFactor, double Bounce, - double StopERP, double StopCFM) - { - if (LoStop > -3.141592653 && LoStop <= 0) - dJointSetHingeParam(this->_id, dParamLoStop, LoStop); - - if (HiStop < 3.141592653 && HiStop >= 0) - dJointSetHingeParam(this->_id, dParamHiStop, HiStop); - - dJointSetHingeParam(this->_id, dParamVel, Velocity); - dJointSetHingeParam(this->_id, dParamFMax, MaxForce); - dJointSetHingeParam(this->_id, dParamFudgeFactor, FudgeFactor); - dJointSetHingeParam(this->_id, dParamBounce, Bounce); - dJointSetHingeParam(this->_id, dParamStopERP, StopERP); - dJointSetHingeParam(this->_id, dParamStopCFM, StopCFM); - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge.h b/libraries/ode-0.9/contrib/DotNetManaged/JointHinge.h deleted file mode 100644 index 3115845fb8..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge.h +++ /dev/null @@ -1,195 +0,0 @@ -#pragma once - -#include "Joint.h" -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class JointHinge : public Joint - { - public: - - //Constructors - - JointHinge(void); - JointHinge(World &world); - JointHinge(World &world, JointGroup &jointGroup); - - - //Destructor - - virtual~JointHinge(void); - - - //Methods - - //Overloaded Create - void Create(World &world, JointGroup &jointGroup); - void Create(World &world); - - //Overloaded Attach - void Attach(Body &body1, Body &body2); - void Attach(Body &body1); - - void SetAnchor(double x, double y, double z); - Vector3 GetAnchor(void); - - void SetAxis(double x, double y, double z); - Vector3 GetAxis(void); - - void SetAllMovParams(double LoStop, double HiStop, - double Velocity, double MaxForce, - double FudgeFactor, double Bounce, - double StopERP, double StopCFM); - - - //Properties - - //LoStop - __property double get_LoStop(void) - { - return dJointGetHingeParam(this->_id, dParamLoStop); - } - - __property void set_LoStop(double value) - { - if (value > -3.141592653 && value <= 0) - dJointSetHingeParam(this->_id, dParamLoStop, value); - } - - - //HiStop - __property double get_HiStop(void) - { - return dJointGetHingeParam(this->_id, dParamHiStop); - } - - __property void set_HiStop(double value) - { - if (value < 3.141592653 && value >= 0) - dJointSetHingeParam(this->_id, dParamHiStop, value); - } - - - //Velocity - __property double get_Velocity(void) - { - return dJointGetHingeParam(this->_id, dParamVel); - } - - __property void set_Velocity(double value) - { - dJointSetHingeParam(this->_id, dParamVel, value); - } - - - //MaxForce - __property double get_MaxForce(void) - { - return dJointGetHingeParam(this->_id, dParamFMax); - } - - __property void set_MaxForce(double value) - { - dJointSetHingeParam(this->_id, dParamFMax, value); - } - - - //FudgeFactor - __property double get_FudgeFactor(void) - { - return dJointGetHingeParam(this->_id, dParamFudgeFactor); - } - - __property void set_FudgeFactor(double value) - { - dJointSetHingeParam(this->_id, dParamFudgeFactor, value); - } - - - //Bounce - __property double get_Bounce(void) - { - return dJointGetHingeParam(this->_id, dParamBounce); - } - - __property void set_Bounce(double value) - { - dJointSetHingeParam(this->_id, dParamBounce, value); - } - - - //StopERP - __property double get_StopERP(void) - { - return dJointGetHingeParam(this->_id, dParamStopERP); - } - - __property void set_StopERP(double value) - { - dJointSetHingeParam(this->_id, dParamStopERP, value); - } - - - //StopCFM - __property double get_StopCFM(void) - { - return dJointGetHingeParam(this->_id, dParamStopCFM); - } - - __property void set_StopCFM(double value) - { - dJointSetHingeParam(this->_id, dParamStopCFM, value); - } - - - //GetAngle - __property double get_Angle(void) - { - return dJointGetHingeAngle(this->_id); - } - - - //GetAngleRate - __property double get_AngleRate(void) - { - return dJointGetHingeAngleRate(this->_id); - } - - }; - -} - -// void SetSuspensionERP(double value); -// double GetSuspensionERP(void); - -// void SetSuspensionCFM(double value); -// double GetSuspensionCFM(void); - -/* - //SetSuspensionERP - void JointHinge::SetSuspensionERP(double value) - { - dJointSetHingeParam(this->_id, dParamSuspensionERP, value); - } - - //GetSuspensionERP - double JointHinge::GetSuspensionERP(void) - { - return dJointGetHingeParam(this->_id, dParamSuspensionERP); - } - - - //SetSuspensionCFM - void JointHinge::SetSuspensionCFM(double value) - { - dJointSetHingeParam(this->_id, dParamSuspensionCFM, value); - } - - //GetSuspensionCFM - double JointHinge::GetSuspensionCFM(void) - { - return dJointGetHingeParam(this->_id, dParamSuspensionCFM); - } - -*/ diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge2.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointHinge2.cpp deleted file mode 100644 index 94fd7a7b47..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge2.cpp +++ /dev/null @@ -1,133 +0,0 @@ -#include "StdAfx.h" - -#include -#include "jointhinge2.h" - -namespace ODEManaged -{ - //Constructors - JointHinge2::JointHinge2(void) : Joint(){} - - JointHinge2::JointHinge2(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge2(world.Id(),0); - } - - JointHinge2::JointHinge2(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge2(world.Id(), jointGroup.Id()); - } - - //Destructor - JointHinge2::~JointHinge2(void){} - - //CreateHinge2 (overload 1) - void JointHinge2::Create(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge2(world.Id(), jointGroup.Id()); - } - - //CreateHinge2 (overload 2) - void JointHinge2::Create(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateHinge2(world.Id(),0); - } - - //SetAnchor1 - void JointHinge2::SetAnchor (double x, double y ,double z) - { - dJointSetHinge2Anchor(_id, x,y,z); - } - - //GetAnchor1 - Vector3 JointHinge2::GetAnchor() - { - Vector3 retVal; - dVector3 temp; - dJointGetHinge2Anchor(_id,temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - //SetAxis1 - void JointHinge2::SetAxis1 (double x, double y ,double z) - { - dJointSetHinge2Axis1(_id, x,y,z); - } - - //GetAxis1 - Vector3 JointHinge2::GetAxis1() - { - Vector3 retVal; - dVector3 temp; - dJointGetHinge2Axis1(_id,temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - //SetAxis2 - void JointHinge2::SetAxis2 (double x, double y ,double z) - { - dJointSetHinge2Axis2(_id, x,y,z); - } - - //GetAxis2 - Vector3 JointHinge2::GetAxis2() - { - Vector3 retVal; - dVector3 temp; - dJointGetHinge2Axis2(_id,temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - //GetAngle1 - double JointHinge2::GetAngle1 () - { - return dJointGetHinge2Angle1(this->_id); - } - - //GetAngle1Rate - double JointHinge2::GetAngle1Rate () - { - return dJointGetHinge2Angle1Rate(this->_id); - } - - ////GetAngle hmm, this doesn't exist - //double JointHinge2::GetAngle2 () - //{ - // return dJointGetHinge2Angle2(this->_id); - //} - - //GetAngle2Rate - double JointHinge2::GetAngle2Rate () - { - return dJointGetHinge2Angle2Rate(this->_id); - } - - - //Attach (overload 1) - void JointHinge2::Attach (Body &body1, Body &body2) - { - dJointAttach(_id, body1.Id(),body2.Id()); - } - - //Attach (overload 2) - //TODO: possibly add an overload that takes anchor as a param also. - void JointHinge2::Attach (Body &body1) - { - dJointAttach(_id, body1.Id(),0); - } - - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge2.h b/libraries/ode-0.9/contrib/DotNetManaged/JointHinge2.h deleted file mode 100644 index e883ea820c..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointHinge2.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "Joint.h" -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class JointHinge2 : public Joint - { - public: - - - //Constructors - - JointHinge2 (void); - JointHinge2 (World &world); - JointHinge2 (World &world, JointGroup &jointGroup); - - //Destructors - - virtual ~JointHinge2 (void); - - - //Methods - - //Overloaded Hinge.Create - void Create (World &world, JointGroup &jointGroup); - void Create (World &world); - - void SetAnchor (double x, double y, double z); - Vector3 GetAnchor (void); - - void SetAxis1 (double x, double y, double z); - Vector3 GetAxis1 (void); - - void SetAxis2 (double x, double y, double z); - Vector3 GetAxis2 (void); - - double GetAngle1 (void); - double GetAngle1Rate (void); - - //double GetAngle2 (void); - double GetAngle2Rate (void); - - void Attach (Body &body1, Body &body2); - void Attach( Body &body1); - }; -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointSlider.cpp b/libraries/ode-0.9/contrib/DotNetManaged/JointSlider.cpp deleted file mode 100644 index ab7ebd6965..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointSlider.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "StdAfx.h" - -#include -#include "jointslider.h" - -namespace ODEManaged -{ - - //Constructors - - JointSlider::JointSlider(void) : Joint(){} - - - JointSlider::JointSlider(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateSlider(world.Id(), 0); - } - - - JointSlider::JointSlider(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateSlider(world.Id(), jointGroup.Id()); - } - - - //Destructor - - JointSlider::~JointSlider(void){} - - - //Methods - - //Overloaded Create - void JointSlider::Create(World &world, JointGroup &jointGroup) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateSlider(world.Id(), jointGroup.Id()); - } - - void JointSlider::Create(World &world) - { - if(this->_id) dJointDestroy(this->_id); - _id = dJointCreateSlider(world.Id(), 0); - } - - - //Overloaded Attach - void JointSlider::Attach(Body &body1, Body &body2) - { - dJointAttach(this->_id, body1.Id(), body2.Id()); - } - - void JointSlider::Attach(Body &body1) - { - dJointAttach(this->_id, body1.Id(), 0); - } - - - //SetAxis - void JointSlider::SetAxis(double x, double y, double z) - { - dJointSetSliderAxis(this->_id, x, y, z); - } - - //GetAxis - Vector3 JointSlider::GetAxis(void) - { - Vector3 retVal; - dVector3 temp; - dJointGetSliderAxis(this->_id, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - - //Movement Parameters - - //SetAllMovParams - void JointSlider::SetAllMovParams(double LoStop, double HiStop, - double Velocity, double MaxForce, - double FudgeFactor, double Bounce, - double StopERP, double StopCFM) - { - if (LoStop <= 0) - dJointSetHingeParam(this->_id, dParamLoStop, LoStop); - - if (HiStop >= 0) - dJointSetHingeParam(this->_id, dParamHiStop, HiStop); - - dJointSetSliderParam(this->_id, dParamVel, Velocity); - dJointSetSliderParam(this->_id, dParamFMax, MaxForce); - dJointSetSliderParam(this->_id, dParamFudgeFactor, FudgeFactor); - dJointSetSliderParam(this->_id, dParamBounce, Bounce); - dJointSetSliderParam(this->_id, dParamStopERP, StopERP); - dJointSetSliderParam(this->_id, dParamStopCFM, StopCFM); - } - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/JointSlider.h b/libraries/ode-0.9/contrib/DotNetManaged/JointSlider.h deleted file mode 100644 index 7e96e5974b..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/JointSlider.h +++ /dev/null @@ -1,158 +0,0 @@ -#pragma once - -#include "Joint.h" -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class JointSlider : public Joint - { - public: - - - //Constructors - - JointSlider(void); - JointSlider(World &world); - JointSlider(World &world, JointGroup &jointGroup); - - - //Destructors - - virtual ~JointSlider(void); - - - //Methods - - //Overloaded Create - void Create(World &world, JointGroup &jointGroup); - void Create(World &world); - - //Overloaded Attach - void Attach(Body &body1, Body &body2); - void Attach(Body &body1); - - void SetAxis(double x, double y, double z); - Vector3 GetAxis(void); - - void SetAllMovParams(double LoStop, double HiStop, - double Velocity, double MaxForce, - double FudgeFactor, double Bounce, - double StopERP, double StopCFM); - - - //Properties - - //LoStop - __property double get_LoStop(void) - { - return dJointGetSliderParam(this->_id, dParamLoStop); - } - - __property void set_LoStop(double value) - { - if (value <=0) - dJointSetSliderParam(this->_id, dParamLoStop, value); - } - - - //HiStop - __property double get_HiStop(void) - { - return dJointGetSliderParam(this->_id, dParamHiStop); - } - - __property void set_HiStop(double value) - { - if (value >= 0) - dJointSetSliderParam(this->_id, dParamHiStop, value); - } - - - //Velocity - __property double get_Velocity(void) - { - return dJointGetSliderParam(this->_id, dParamVel); - } - - __property void set_Velocity(double value) - { - dJointSetSliderParam(this->_id, dParamVel, value); - } - - - //MaxForce - __property double get_MaxForce(void) - { - return dJointGetSliderParam(this->_id, dParamFMax); - } - - __property void set_MaxForce(double value) - { - dJointSetSliderParam(this->_id, dParamFMax, value); - } - - - //FudgeFactor - __property double get_FudgeFactor(void) - { - return dJointGetSliderParam(this->_id, dParamFudgeFactor); - } - - __property void set_FudgeFactor(double value) - { - dJointSetSliderParam(this->_id, dParamFudgeFactor, value); - } - - - //Bounce - __property double get_Bounce(void) - { - return dJointGetSliderParam(this->_id, dParamBounce); - } - - __property void set_Bounce(double value) - { - dJointSetSliderParam(this->_id, dParamBounce, value); - } - - - //StopERP - __property double get_StopERP(void) - { - return dJointGetSliderParam(this->_id, dParamStopERP); - } - - __property void set_StopERP(double value) - { - dJointSetSliderParam(this->_id, dParamStopERP, value); - } - - - //StopCFM - __property double get_StopCFM(void) - { - return dJointGetSliderParam(this->_id, dParamStopCFM); - } - - __property void set_StopCFM(double value) - { - dJointSetSliderParam(this->_id, dParamStopCFM, value); - } - - - //GetAngle - __property double get_Position(void) - { - return dJointGetSliderPosition(this->_id); - } - - - //GetAngleRate - __property double get_PositionRate(void) - { - return dJointGetSliderPositionRate(this->_id); - } - - }; -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Release/ode.dll b/libraries/ode-0.9/contrib/DotNetManaged/Release/ode.dll deleted file mode 100755 index ccf2a41263..0000000000 Binary files a/libraries/ode-0.9/contrib/DotNetManaged/Release/ode.dll and /dev/null differ diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Space.cpp b/libraries/ode-0.9/contrib/DotNetManaged/Space.cpp deleted file mode 100644 index c9a7e190f6..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Space.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "StdAfx.h" - -#include -#include "Space.h" -#include "TEST.h" - -namespace ODEManaged -{ - - //Constructor - - Space::Space(void) - { - _id = dSimpleSpaceCreate(); - } - - Space::Space(int minlevel, int maxlevel) - { - _id = dHashSpaceCreate(); - dHashSpaceSetLevels(this->_id, minlevel, maxlevel); - } - - - //Destructor - - Space::~Space(void) - { - dSpaceDestroy(this->_id); - } - - - //Methods - - //Id - dSpaceID Space::Id() - { - return _id; - } - - - //Collide - void Space::Collide(void *data, dNearCallback *callback) - { - dSpaceCollide(this->_id, data, callback); - } - - - - - - - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Space.h b/libraries/ode-0.9/contrib/DotNetManaged/Space.h deleted file mode 100644 index 78e81ad64e..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Space.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class Space - { - public: - - //Constructor - - Space(void); - Space(int minlevel, int maxlevel); - - //Destructor - - ~Space(void); - - - //Methods - - dSpaceID Id(void); - void Collide(void *data, dNearCallback *callback); - - - private: - - dSpaceID _id; - - }; - -} diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Stdafx.cpp b/libraries/ode-0.9/contrib/DotNetManaged/Stdafx.cpp deleted file mode 100644 index b6c9d98811..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Stdafx.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// ODEManaged.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" diff --git a/libraries/ode-0.9/contrib/DotNetManaged/Stdafx.h b/libraries/ode-0.9/contrib/DotNetManaged/Stdafx.h deleted file mode 100644 index 22227596cd..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/Stdafx.h +++ /dev/null @@ -1,12 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#using - - - - - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/TEST.h b/libraries/ode-0.9/contrib/DotNetManaged/TEST.h deleted file mode 100644 index e2cdbc36c2..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/TEST.h +++ /dev/null @@ -1,17 +0,0 @@ - -#pragma once - -#include "CommonMgd.h" - -namespace ODEManaged -{ - -void RnearCallback(void *data, dGeomID o1, dGeomID o2) - { - } - -} - - - - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/World.cpp b/libraries/ode-0.9/contrib/DotNetManaged/World.cpp deleted file mode 100644 index beab21a4c5..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/World.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "StdAfx.h" - -#include -#include "World.h" - -namespace ODEManaged -{ - - //Constructor - - World::World(void) - { - /*dWorldID _temp = dWorldCreate(); - _id = _temp;*/ - _id = dWorldCreate(); - } - - - //Destructor - - World::~World(void) - { - dWorldDestroy(this->_id); - } - - - //Methods - - //Id - dWorldID World::Id() - { - return _id; - } - - - //SetGravity - void World::SetGravity(double x, double y, double z) - { - dWorldSetGravity(this->_id, x, y, z); - } - - - //Overloaded GetGravity - Vector3 World::GetGravity(void) - { - Vector3 retVal; - dVector3 temp; - dWorldGetGravity(this->_id, temp); - retVal.x = temp[0]; - retVal.y = temp[1]; - retVal.z = temp[2]; - return retVal; - } - - void World::GetGravity(double gravity __gc[]) - { - dVector3 temp; - dWorldGetGravity(this->_id, temp); - gravity[0] = temp[0]; - gravity[1] = temp[1]; - gravity[2] = temp[2]; - } - - - //Step - void World::Step(double stepSize) - { - dWorldStep(this->_id, stepSize); - } - -} - - - diff --git a/libraries/ode-0.9/contrib/DotNetManaged/World.h b/libraries/ode-0.9/contrib/DotNetManaged/World.h deleted file mode 100644 index c4c60e5438..0000000000 --- a/libraries/ode-0.9/contrib/DotNetManaged/World.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#include "CommonMgd.h" - -namespace ODEManaged -{ - __gc public class World - { - public: - - //Constructor - - World(void); - - - //Destructor - - ~World(void); - - - // Methods - - dWorldID Id(void); - - void SetGravity(double x, double y, double z); - - //Overloaded GetGravity - Vector3 GetGravity(void); - void GetGravity(double gravity __gc[]); - - void Step(double stepSize); - - - //Properties - - //Constraint Force Mixing - __property void set_CFM(double cfm) - { - dWorldSetCFM(this->_id,cfm); - } - - __property double get_CFM(void) - { - return dWorldGetCFM(this->_id); - } - - - //Error Reduction Parameter - __property void set_ERP(double erp) - { - dWorldSetERP(this->_id,erp); - } - - __property double get_ERP(void) - { - return dWorldGetERP(this->_id); - } - - - private: - - dWorldID _id; - - }; - -} - diff --git a/libraries/ode-0.9/contrib/GeomTransformGroup/GeomTransformGroup.cpp b/libraries/ode-0.9/contrib/GeomTransformGroup/GeomTransformGroup.cpp deleted file mode 100644 index 26b77b0401..0000000000 --- a/libraries/ode-0.9/contrib/GeomTransformGroup/GeomTransformGroup.cpp +++ /dev/null @@ -1,218 +0,0 @@ - -/* ************************************************************************ */ -/* - grouped and transformed geometry functions - author: Tim Schmidt tisch@uni-paderborn.de -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "objects.h" -#include "array.h" -#include "geom_internal.h" - -// given a pointer `p' to a dContactGeom, return the dContactGeom at -// p + skip bytes. - -#define CONTACT(p,skip) ((dContactGeom*) (((char*)p) + (skip))) - - -// ############################################################################ - -int dGeomTransformGroupClass = -1; -// ############################################################################ - -struct dxGeomTransformGroup { - dArray parts; // all the geoms that make up the group - dVector3 relativePosition; - dMatrix3 relativeRotation; -}; -// ############################################################################ - -void dGeomTransformGroupSetRelativePosition (dxGeom *g, dReal x, dReal y, dReal z) -{ - dAASSERT (g); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - transformGroup->relativePosition[0] = x; - transformGroup->relativePosition[1] = y; - transformGroup->relativePosition[2] = z; -} -// ############################################################################ - -void dGeomTransformGroupSetRelativeRotation (dxGeom *g, const dMatrix3 R) -{ - dAASSERT (g); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - memcpy (transformGroup->relativeRotation,R,sizeof(dMatrix3)); -} -// ############################################################################ - -const dReal * dGeomTransformGroupGetRelativePosition (dxGeom *g) -{ - dAASSERT (g); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - return transformGroup->relativePosition; -} -// ############################################################################ - -const dReal * dGeomTransformGroupGetRelativeRotation (dxGeom *g) -{ - dAASSERT (g); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - return transformGroup->relativeRotation; -} -// ############################################################################ - -static void computeFinalTransformation (const dxGeom *tg, const dxGeom *part) -{ - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(tg); - dMULTIPLY0_331 (part->pos,tg->R,transformGroup->relativePosition); - part->pos[0] += tg->pos[0]; - part->pos[1] += tg->pos[1]; - part->pos[2] += tg->pos[2]; - dMULTIPLY0_333 (part->R,tg->R,transformGroup->relativeRotation); -} -// ############################################################################ - -int dCollideTransformGroup (const dxGeom *o1, const dxGeom *o2, int flags, - dContactGeom *contact, int skip) -{ - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(o1); - if (transformGroup->parts.size() == 0) - { - return 0; - } - int numleft = flags & NUMC_MASK; - if (numleft == 0) numleft = 1; - flags &= ~NUMC_MASK; - int num=0, i=0; - while (i < transformGroup->parts.size() && numleft > 0) - { - dUASSERT (transformGroup->parts[i]->spaceid==0, - "GeomTransformGroup encapsulated object must not be in a space"); - dUASSERT (transformGroup->parts[i]->body==0, - "GeomTransformGroup encapsulated object must not be attached to a body"); - if (!o1->space_aabb) - { - computeFinalTransformation (o1, transformGroup->parts[i]); - } - dxBody *bodyBackup = transformGroup->parts[i]->body; - transformGroup->parts[i]->body = o1->body; - int n = dCollide (transformGroup->parts[i],const_cast(o2), - flags | numleft,contact,skip); - transformGroup->parts[i]->body = bodyBackup; - contact = CONTACT (contact,skip*n); - numleft -= n; - num += n; - i++; - } - return num; -} -// ############################################################################ - -static dColliderFn * dGeomTransformGroupColliderFn (int num) -{ - return (dColliderFn *) &dCollideTransformGroup; -} -// ############################################################################ - -static void dGeomTransformGroupAABB (dxGeom *geom, dReal aabb[6]) -{ - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(geom); - aabb[0] = dInfinity; - aabb[1] = -dInfinity; - aabb[2] = dInfinity; - aabb[3] = -dInfinity; - aabb[4] = dInfinity; - aabb[5] = -dInfinity; - int i,j; - for (i=0; i < transformGroup->parts.size(); i++) - { - computeFinalTransformation (geom, transformGroup->parts[i]); - dReal aabb2[6]; - transformGroup->parts[i]->_class->aabb (transformGroup->parts[i],aabb2); - for (j=0; j<6; j += 2) if (aabb2[j] < aabb[j]) aabb[j] = aabb2[j]; - for (j=1; j<6; j += 2) if (aabb2[j] > aabb[j]) aabb[j] = aabb2[j]; - } -} -// ############################################################################ - -static void dGeomTransformGroupDtor (dxGeom *geom) -{ - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(geom); - transformGroup->parts.~dArray(); -} -// ############################################################################ - -dxGeom *dCreateGeomTransformGroup (dSpaceID space) -{ - if (dGeomTransformGroupClass == -1) { - dGeomClass c; - c.bytes = sizeof (dxGeomTransformGroup); - c.collider = &dGeomTransformGroupColliderFn; - c.aabb = &dGeomTransformGroupAABB; - c.aabb_test = 0; - c.dtor = dGeomTransformGroupDtor; - dGeomTransformGroupClass = dCreateGeomClass (&c); - } - dxGeom *g = dCreateGeom (dGeomTransformGroupClass); - if (space) - { - dSpaceAdd (space,g); - } - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - transformGroup->parts.constructor(); - dSetZero (transformGroup->relativePosition,4); - dRSetIdentity (transformGroup->relativeRotation); - return g; -} -// ############################################################################ - -void dGeomTransformGroupAddGeom (dxGeom *g, dxGeom *obj) -{ - dUASSERT (g && g->_class->num == dGeomTransformGroupClass, - "argument not a geom TransformGroup"); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - transformGroup->parts.push (obj); -} -// ############################################################################ - -void dGeomTransformGroupRemoveGeom (dxGeom *g, dxGeom *obj) -{ - dUASSERT (g && g->_class->num == dGeomTransformGroupClass, - "argument not a geom TransformGroup"); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - for (int i=0; i < transformGroup->parts.size(); i++) { - if (transformGroup->parts[i] == obj) { - transformGroup->parts.remove (i); - return; - } - } -} -// ############################################################################ - -dxGeom * dGeomTransformGroupGetGeom (dxGeom *g, int i) -{ - dUASSERT (g && g->_class->num == dGeomTransformGroupClass, - "argument not a geom TransformGroup"); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - dAASSERT (i >= 0 && i < transformGroup->parts.size()); - return transformGroup->parts[i]; -} -// ############################################################################ - -int dGeomTransformGroupGetNumGeoms (dxGeom *g) -{ - dUASSERT (g && g->_class->num == dGeomTransformGroupClass, - "argument not a geom TransformGroup"); - dxGeomTransformGroup *transformGroup = (dxGeomTransformGroup*) CLASSDATA(g); - return transformGroup->parts.size(); -} diff --git a/libraries/ode-0.9/contrib/GeomTransformGroup/GeomTransformGroup.h b/libraries/ode-0.9/contrib/GeomTransformGroup/GeomTransformGroup.h deleted file mode 100644 index 705fdb9218..0000000000 --- a/libraries/ode-0.9/contrib/GeomTransformGroup/GeomTransformGroup.h +++ /dev/null @@ -1,29 +0,0 @@ - -/* ************************************************************************ */ -/* - grouped and transformed geometry functions - author: Tim Schmidt tisch@uni-paderborn.de -*/ - - -#ifdef __cplusplus -extern "C" { -#endif - - -extern int dGeomTransformGroupClass; - -void dGeomTransformGroupSetRelativePosition (dGeomID g, dReal x, dReal y, dReal z); -void dGeomTransformGroupSetRelativeRotation (dGeomID g, const dMatrix3 R); -const dReal * dGeomTransformGroupGetRelativePosition (dxGeom *g); -const dReal * dGeomTransformGroupGetRelativeRotation (dxGeom *g); -dGeomID dCreateGeomTransformGroup (dSpaceID space); -void dGeomTransformGroupAddGeom (dGeomID tg, dGeomID obj); -void dGeomTransformGroupRemoveGeom (dGeomID tg, dGeomID obj); -dGeomID dGeomTransformGroupGetGeom (dGeomID tg, int i); -int dGeomTransformGroupGetNumGeoms (dGeomID tg); - - -#ifdef __cplusplus -} -#endif diff --git a/libraries/ode-0.9/contrib/GeomTransformGroup/README.txt b/libraries/ode-0.9/contrib/GeomTransformGroup/README.txt deleted file mode 100644 index bca0e6652b..0000000000 --- a/libraries/ode-0.9/contrib/GeomTransformGroup/README.txt +++ /dev/null @@ -1,148 +0,0 @@ -README for GeomTransformGroup by Tim Schmidt. ---------------------------------------------- - -This is a patch to add the dGeomTransformGroup object to the list of geometry -objects. - -It should work with the cvs version of the ode library from 07/24/2002. - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -comment by russ smith: this code is easy to use with the rest of ODE. -simply copy GeomTransformGroup.cpp to ode/src and copy GeomTransformGroup.h -to include/ode. then add GeomTransformGroup.cpp to the ODE_SRC variable -in the makefile. rebuild, and you're done! of course i could have done all -this for you, but i prefer to keep GeomTransformGroup separated from the -rest of ODE for now while other issues with the collision system are -resolved. - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - -Description: - -The dGeomTransformGroup is an adaption of the TransformGroup known from -Java3D (and maybe other libraries with a similar scene graph representation). -It can be used to build an arbitrarily structured tree of objects that are -each positioned relative to the particular parent node. - -If you have a plane for example, there is one root node associated with the -plane's body and another three transformgroups placed 'under' this node. One -with the fuselage (cappedcylinder) under it and two with the underlying wings -(flat boxes). And if you want to add engines, simply put them 'next to' the -wings under another two transformgroups. - -bodyTG ---> associated with dBody - | - +--fuselageTG - | | - | +--fuselageCylinder - | - +--leftwingTG - | | - | +--wingBox - | | - | +--leftengineTG - | | - | +--leftengineCylinder - | - +--rightwingTG - | - +--wingBox - | - +--rightengineTG - | - +--rightengineCylinder - -This is a method to easily compose objects without the necessity of always -calculating global coordinates. But apart from this there is something else -that makes dGeomTransformGroups very valuable. - -Maybe you remember that some users reported the problem of acquiring the -correct bodies to be attached by a contactjoint in the nearCallback when -using dGeomGroups and dGeomTransforms at the same time. This results from the -fact that dGeomGroups are not associated with bodies while all other -geometries are. - -So, as you can see in the nearCallback of the the test_buggy demo you have to -attach the contactjoint with the bodies that you get from the geometries that -are stored in the contact struct (-> dGeomGetBody(contacts[i].geom.g1)). -Normally you would do this by asking o1 and o2 directly with dGeomGetBody(o1) -and dGeomGetBody(o2) respectively. - -As a first approach you can overcome that problem by testing o1 and o2 if -they are groups or not to find out how to get the corresponding bodies. - -However this will fail if you want grouped transforms that are constructed -out of dGeomTransforms encapsulated in a dGeomGroup. According to the test -you use contacts[i].geom.g1 to get the right body. Unfortunately g1 is -encapsulated in a transform and therefore not attached to any body. In this -case the dGeomTransform 'in the middle' would have been the right object to -be asked for the body. - -You may now conclude that it is a good idea to unwrap the group encapsulated -geoms at the beginning of the nearcallback and use dGeomGetBody(o1) -consistently. But keep in mind that this also means not to invoke -dCollide(..) on groups at all and therefore not to expoit the capability of -dGeomGroups to speed up collision detection by the creation of bounding boxes -around the encapsulated geometry. - -Everything becomes even worse if you create a dGeomTransform that contains a -dGeomGroup of geoms. The function that cares about the collision of -transforms with other objects uses the position and rotation of the -respective encapsulated object to compute its final position and orientation. -Unfortunately dGeomGroups do not have a position and rotation, so the result -will not be what you have expected. - -Here the dGeomTransformGroups comes into operation, because it combines the -advantages and capabilities of the dGeomGroup and the dGeomTransform. -And as an effect of synergy it is now even possible to set the position of a -group of geoms with one single command. -Even nested encapsulations of dGeomTransformGroups in dGeomTransformGroups -should be possible (to be honest, I have not tried that so far ;-) ). - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -API: - -dGeomID dCreateGeomTransformGroup (dSpaceID space); - - create a GeomTransformGroup - -void dGeomTransformGroupAddGeom (dGeomID tg, dGeomID obj); - - Comparable to dGeomTransformSetGeom or dGeomGroupAdd - - add objects to this group - -void dGeomTransformGroupRemoveGeom (dGeomID tg, dGeomID obj); - - remove objects from this group - -void dGeomTransformGroupSetRelativePosition - (dGeomID g, dReal x, dReal y, dReal z); -void dGeomTransformGroupSetRelativeRotation - (dGeomID g, const dMatrix3 R); - - Comparable to setting the position and rotation of all the - dGeomTransform encapsulated geometry. The difference - is that it is global with respect to this group and therefore - affects all geoms in this group. - - The relative position and rotation are attributes of the - transformgroup, so the position and rotation of the individual - geoms are not changed - -const dReal * dGeomTransformGroupGetRelativePosition (dGeomID g); -const dReal * dGeomTransformGroupGetRelativeRotation (dGeomID g); - - get the relative position and rotation - -dGeomID dGeomTransformGroupGetGeom (dGeomID tg, int i); - - Comparable to dGeomGroupGetGeom - - get a specific geom of the group - -int dGeomTransformGroupGetNumGeoms (dGeomID tg); - - Comparable to dGeomGroupGetNumGeoms - - get the number of geoms in the group - - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Tim Schmidt -student of computer science -University of Paderborn, Germany -tisch@uni-paderborn.de diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/CW7_projects.sit.bin b/libraries/ode-0.9/contrib/Mac_CFMCarbon/CW7_projects.sit.bin deleted file mode 100644 index c06768c899..0000000000 Binary files a/libraries/ode-0.9/contrib/Mac_CFMCarbon/CW7_projects.sit.bin and /dev/null differ diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/README.txt b/libraries/ode-0.9/contrib/Mac_CFMCarbon/README.txt deleted file mode 100644 index 7c1f8a4489..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/README.txt +++ /dev/null @@ -1,95 +0,0 @@ ------------------------------ -ODE - Mac CFM Carbon Port -(contact Frank Condello with questions regarding this port) - -Although ODE contains a MacOSX makefile, and some individuals have implemented ODE in -Cocoa, I opted to use (and prefer) CodeWarrior. This also opens up ODE to MacOS8 & 9 -users, without scarfing functionality in MacOSX (same binaries run on both platforms). - -The 'ode_CW7.mcp' project contains release and debug targets to create static ODE and -DrawStuff libraries. - -'examples_CW7.mcp' contains targets for the entire ODE test suite, plus a couple other -test programs which were posted to the ODE mailing list. - - ------------------------------ -Compiling Notes: - -You'll need to extract the CodeWarrior projects from the 'CW7_projects.sit.bin' archive -(They're nearly a meg uncompressed so this was done to be bandwith friendly on the CVS). - -Projects require CodeWarrior 7 or above (recreating them with earlier versions shouldn't -be too difficult). The projects use relative paths and are meant to be compiled from -'contrib/Mac_CFMCarbon/'. Don't move them! - -All the libraries build into the 'lib/' directory, all test applications build into -'contrib/Mac_CFMCarbon/mac_testbin/' (and must be run from that directory since the -texture path is hard-coded). - -You'll need to compile the release ODE library, and the DrawStuff library before -compiling the examples. - -The ODE 'configurator' has not been ported, but a Mac-friendly 'config.h' header has been -manually hacked together (all PPC Macs should be fine with this header). Single or double -precision can be defined in the 'CommonPrefix.h' header found in -'contrib/Mac_CFMCarbon/mac_source/'. - -'contrib/Mac_CFMCarbon/mac_source/' also contains any mac specific additions to the main source. -The directory structure here matches the main source tree, and I would recommend that this -format is maintained when making additions, since the access paths are touchy (more below...) - -Some issues were encountered with duplicate header names. CodeWarrior tends to be -unforgiving about this sort of thing but fudging with the access paths eventually -cleared up the problem. If ODE fails to compile, make sure the and -"objects.h" or and are actually pointing to the correct header. - -You'll need Apple's OpenGL SDK (with GLUT) in your compiler path to build DrawStuff. I've -added redirection headers in 'contrib/Mac_CFMCarbon/mac_source/include/GL/' to properly -link with the Apple headers (since the projects are set to follow DOS paths). - -The examples link against a crapload of static libraries, but my initial builds using -ODE, MSL, GLUT, and DrawStuff shared/merged DLL's proved unstable (mostly problems with -SIOUX spawning multiple sessions, and crashes in Classic). Static libs just worked better -in the end, but the test apps are a little bloated as a result, and need to be re-linked -whenever a change to a library is made. - -IMPORTANT: You must use the same 'CommonPrefix.h' settings for libraries, and test apps -(i.e. double or single precision). - - ------------------------------ -Running the test apps: - -The test apps will show the SIOUX CLI prompt when run. Just hit OK to ignore it, or add any -DrawStuff arguments. You'll want to log output to a file for 'test_ode'. - -There are two extra test programs in the 'mac_source' directory. Both were posted to the ODE -mailing list by OSX users. 'test_stability1' visualizes some internal issues with ODE, and -'test_stacktest' is a standalone GLUT program (doesn't use DrawStuff) that can be useful -to stress test the library, and give you an idea of just how much stack memory you're -going to need for large systems. - -ISSUES: - -The carbon DrawStuff lib uses GLUT to make life easy, but GLUT isn't exactly bug-free -or stable on the Mac... Try moving the mouse around if a simulation is running slowly -on OS9 (it's not ODE's fault, but rather a poor carbon GLUT implementation - seems GLUT stalls -when it's not getting system events - I haven't seen this problem on OSX). - -The 3D view may not update if typing in the SIOUX console window. - -You cannot pass startup args to GLUT due to the way the DrawStuff library initializes. - -'Write Frames' doesn't actually do anything at the moment. - -The 'test_joints' app seems broken (though I don't know what the intended effect should be) - - ------------------------------ -TODO: - -- Re-add shared library targets (if stability issues are resolved). -- Implement 'Write Frames' in DrawStuff. -- Write a Carbon compatible configurator -- Create CodeWarrior 8 projects (once I scrounge up enough dough for the update). \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/CommonPrefix.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/CommonPrefix.h deleted file mode 100644 index 5948b3e324..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/CommonPrefix.h +++ /dev/null @@ -1,6 +0,0 @@ -#define TARGET_API_MAC_CARBON 1 -#define finite isfinite -#define dNODEBUG 1 - -// Comment out for single precision -#define PRECISION_DOUBLE 1 \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/DSPrefix.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/DSPrefix.h deleted file mode 100644 index 612252839f..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/DSPrefix.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef prefix_h -#define prefix_h - -#include "CommonPrefix.h" - -#endif // prefix_h \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/DebugPrefix.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/DebugPrefix.h deleted file mode 100644 index 0e328a9f79..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/DebugPrefix.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef prefix_h -#define prefix_h - -#include "CommonPrefix.h" - -#ifdef dNODEBUG -#undef dNODEBUG -#endif - -#endif // prefix_h \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ExamplesPrefix.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ExamplesPrefix.h deleted file mode 100644 index 1dedfc93ac..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ExamplesPrefix.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef prefix_h -#define prefix_h - -#include "CommonPrefix.h" - -// Hack to automatically call SIOUX's CLI interface for the test apps -#include -#include -int fmain (int argc, char **argv); -int main (int argc, char **argv) { argc = ccommand(&argv); return fmain(argc, argv); } -#define main(argc, argv) fmain(argc, argv) - -#endif // prefix_h \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ODETestPrefix.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ODETestPrefix.h deleted file mode 100644 index f8f5022223..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ODETestPrefix.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef prefix_h -#define prefix_h - -#include "CommonPrefix.h" - -// Hack to automatically call SIOUX's CLI interface for the test apps -#include -#include -int fmain (); -int main (int argc, char **argv) { argc = ccommand(&argv); return fmain(); } -#define main() fmain() - -#endif // prefix_h \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ReleasePrefix.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ReleasePrefix.h deleted file mode 100644 index 612252839f..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ReleasePrefix.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef prefix_h -#define prefix_h - -#include "CommonPrefix.h" - -#endif // prefix_h \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/drawstuff/src/mac_glut_carbon.cpp b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/drawstuff/src/mac_glut_carbon.cpp deleted file mode 100644 index eb0b144f89..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/drawstuff/src/mac_glut_carbon.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/************************************************************************* - * * - * DrawStuff Library, Copyright (C) 2001 Russell L. Smith. * - * Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public * - * License as published by the Free Software Foundation; either * - * version 2.1 of the License, or (at your option) any later version. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library (see the file LICENSE.TXT); if not, * - * write to the Free Software Foundation, Inc., 59 Temple Place, * - * Suite 330, Boston, MA 02111-1307 USA. * - * * - *************************************************************************/ - -// main window and event handling for Mac CFM Carbon - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include "internal.h" - - -//*************************************************************************** -// error handling for unix (works just fine with SIOUX) - -static void printMessage (char *msg1, char *msg2, va_list ap) -{ - fflush (stderr); - fflush (stdout); - fprintf (stderr,"\n%s: ",msg1); - vfprintf (stderr,msg2,ap); - fprintf (stderr,"\n"); - fflush (stderr); -} - -extern "C" void dsError (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - printMessage ("Error",msg,ap); - exit (1); -} - - -extern "C" void dsDebug (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - printMessage ("INTERNAL ERROR",msg,ap); - // *((char *)0) = 0; ... commit SEGVicide ? - abort(); -} - -extern "C" void dsPrint (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - vprintf (msg,ap); -} - -//*************************************************************************** -// openGL window - -// window and openGL -static int width=0,height=0; // window size -static int last_key_pressed=0; // last key pressed in the window -static int pause=0; // 1 if in `pause' mode -static int singlestep=0; // 1 if single step key pressed -static int writeframes=0; // 1 if frame files to be written -static dsFunctions *gfn; -static int frame = 1; - -float getTime (void) -{ - UnsignedWide ms; - - Microseconds(&ms); - return ms.lo / 1000000.0; -} - - -static void captureFrame (int num) -{ -// TODO -} - -static void reshape(int w, int h) -{ - width = w; - height = h; -} - -static void draw(void) -{ - dsDrawFrame (width,height,gfn,pause && !singlestep); - singlestep = 0; - glutSwapBuffers(); - - if (pause==0 && writeframes) { - captureFrame (frame); - frame++; - } -} - -static void idle(void) -{ - static float lasttime=0; - float t; - - // Try to maintain a reasonable rate (good enough for testing anyway) - t = getTime(); - if (lasttime < t) { - lasttime = t+0.005; - draw(); - } -} - -static void key(unsigned char key, int x, int y) -{ - if (!glutGetModifiers()) { - - if (key >= ' ' && key <= 126 && gfn->command) gfn->command (key); - - // GLUT_ACTIVE_CTRL doesn't seem to be working, so we use Alt - } else if (glutGetModifiers()&GLUT_ACTIVE_ALT) { - - switch (key) { - case 't': case 'T': - dsSetTextures (dsGetTextures() ^ 1); - break; - case 's': case 'S': - dsSetShadows (dsGetShadows() ^ 1); - break; - case 'p': case 'P': - pause ^= 1; - singlestep = 0; - break; - case 'o': case 'O': - if (pause) singlestep = 1; - break; - case 'v': case 'V': { - float xyz[3],hpr[3]; - dsGetViewpoint (xyz,hpr); - printf ("Viewpoint = (%.4f,%.4f,%.4f,%.4f,%.4f,%.4f)\n", - xyz[0],xyz[1],xyz[2],hpr[0],hpr[1],hpr[2]); - break; - } - // No case 'X' - Quit works through the Mac system menu, or cmd-q - case 'w': case 'W': - writeframes ^= 1; - if (writeframes) printf ("Write frames not done yet!\n");// TODO - break; - } - } - - last_key_pressed = key; -} - -static int mx=0,my=0; // mouse position -static int mode = 0; // mouse button bits - -static void MouseDown(int button, int state, int x, int y) -{ - if(button == GLUT_LEFT_BUTTON) - { - if(state == GLUT_DOWN) - mode |= 1; - else if(state == GLUT_UP) - mode &= (~1); - } - else if (button == GLUT_MIDDLE_BUTTON) - { - if(state == GLUT_DOWN) - mode |= 3; - else if(state == GLUT_UP) - mode &= (~3); - } - else if (button == GLUT_RIGHT_BUTTON) - { - if(state == GLUT_DOWN) - mode |= 2; - else if(state == GLUT_UP) - mode &= (~2); - } - - mx = x; - my = y; -} - -static void MouseMove(int x, int y) -{ - dsMotion (mode, x - mx, y - my); - mx = x; - my = y; -} - -static void createMainWindow (int _width, int _height) -{ - // So GLUT doesn't complain - int argc = 0; - char **argv = NULL; - - // initialize variables - width = _width; - height = _height; - last_key_pressed = 0; - - if (width < 1 || height < 1) dsDebug (0,"bad window width or height"); - - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); - glutInitWindowSize(_width, _height); - glutInitWindowPosition(100, 100); - glutCreateWindow("ODE Simulation"); - - glutKeyboardFunc(key); - glutMotionFunc(MouseMove); - glutMouseFunc(MouseDown); - glutReshapeFunc(reshape); - glutDisplayFunc(idle); - glutIdleFunc(idle); -} - -void dsPlatformSimLoop (int window_width, int window_height, dsFunctions *fn, - int initial_pause) -{ - SIOUXSettings.initializeTB = false; - SIOUXSettings.standalone = false; - SIOUXSettings.setupmenus = false; - SIOUXSettings.autocloseonquit = true; - SIOUXSettings.asktosaveonclose = false; - - gfn = fn; - pause = initial_pause; - - printf ( - "\n" - "Simulation test environment v%d.%02d\n" - " Option-P : pause / unpause (or say `-pause' on command line).\n" - " Option-O : single step when paused.\n" - " Option-T : toggle textures (or say `-notex' on command line).\n" - " Option-S : toggle shadows (or say `-noshadow' on command line).\n" - " Option-V : print current viewpoint coordinates (x,y,z,h,p,r).\n" - " Option-W : write frames to ppm files: frame/frameNNN.ppm\n" - "\n" - "Change the camera position by clicking + dragging in the window.\n" - " Left button - pan and tilt.\n" - " Right button - forward and sideways.\n" - " Left + Right button (or middle button) - sideways and up.\n" - "\n",DS_VERSION >> 8,DS_VERSION & 0xff); - - createMainWindow (window_width, window_height); - dsStartGraphics (window_width,window_height,fn); - - if (fn->start) fn->start(); - - glutMainLoop(); - - if (fn->stop) fn->stop(); - dsStopGraphics(); -} - -extern "C" void dsStop(){ }// GLUT/MSL hooks into the system to exit diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/GL/gl.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/GL/gl.h deleted file mode 100644 index 4acaeed7d8..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/GL/gl.h +++ /dev/null @@ -1,2 +0,0 @@ -// A little hackaround (Apple use / in the FILENAME, which doesn't work when following DOS paths) -#include \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/GL/glu.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/GL/glu.h deleted file mode 100644 index 5b4a791d41..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/GL/glu.h +++ /dev/null @@ -1,2 +0,0 @@ -// A little hackaround (Apple use / in the FILENAME, which doesn't work when following DOS paths) -#include \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/ode/config.h b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/ode/config.h deleted file mode 100644 index bb889f9d4c..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/include/ode/config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* This file has been manually hacked together for the Mac CFM Carbon build - Frank. */ - -#ifndef _ODE_CONFIG_H_ -#define _ODE_CONFIG_H_ - -/* standard system headers */ -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* #define PENTIUM 1 -- not a pentium */ - -/* integer types (we assume int >= 32 bits) */ -typedef char int8; -typedef unsigned char uint8; -typedef int int32; -typedef unsigned int uint32; - -/* an integer type that we can safely cast a pointer to and from without loss of bits. */ -typedef unsigned int intP; - -#ifdef PRECISION_DOUBLE - - /*select the base floating point type*/ - #define dDOUBLE 1 - - /* the floating point infinity */ - #define dInfinity DBL_MAX - -#else - - /* select the base floating point type */ - #define dSINGLE 1 - - /* the floating point infinity */ - #define dInfinity FLT_MAX - -#endif - -#ifdef __cplusplus -} -#endif -#endif \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ode/test/test_stability1.cpp b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ode/test/test_stability1.cpp deleted file mode 100644 index 79c066a5dc..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ode/test/test_stability1.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCappedCylinder dsDrawCappedCylinderD -#endif - - -// some constants - -#define DENSITY (5.0) // density of all objects - -// dynamics and collision objects - -struct MyObject { - dBodyID body; // the body - dGeomID geom; // geometry representing this body -}; - -static dWorldID world; -static dSpaceID space; -static MyObject fallingObject; -static dGeomID box1, box2; -static dJointGroupID contactgroup; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - // if (o1->body && o2->body) return; - - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnected (b1,b2)) return; - - dContact contact[4]; // up to 3 contacts per box - for (i=0; i<4; i++) { - contact[i].surface.mode = dContactBounce; //dContactMu2; - contact[i].surface.mu = dInfinity; - contact[i].surface.mu2 = 0; - contact[i].surface.bounce = 0.5; - contact[i].surface.bounce_vel = 0.1; - } - if (int numc = dCollide (o1,o2,4,&contact[0].geom,sizeof(dContact))) { - // dMatrix3 RI; - // dRSetIdentity (RI); - // const dReal ss[3] = {0.02,0.02,0.02}; - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - else return c; -} - - -// called when a key pressed - -static void command (int cmd) -{ - int i,k; - dReal sides[3]; - dMass m; - - cmd = locase (cmd); - if (cmd == 'b' || cmd == 's' || cmd == 'c') { - // Destroy the currently falling object and replace it by an instance of the requested type - if (fallingObject.body) { - dBodyDestroy (fallingObject.body); - dGeomDestroy (fallingObject.geom); - memset (&fallingObject, 0, sizeof(fallingObject)); - } - - fallingObject.body = dBodyCreate (world); - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - // Start out centered above the V-gap - dBodySetPosition (fallingObject.body, 0,0,5); - -#if 0 - dMatrix3 R; - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - dBodySetRotation (fallingObject.body,R); - dBodySetData (fallingObject.body,(void*) i); -#endif - - if (cmd == 'b') { - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - fallingObject.geom = dCreateBox (space,sides[0],sides[1],sides[2]); - } - else if (cmd == 'c') { - sides[0] *= 0.5; - dMassSetCappedCylinder (&m,DENSITY,3,sides[0],sides[1]); - fallingObject.geom = dCreateCCylinder (space,sides[0],sides[1]); - } - else if (cmd == 's') { - sides[0] *= 0.5; - dMassSetSphere (&m,DENSITY,sides[0]); - fallingObject.geom = dCreateSphere (space,sides[0]); - } - - dGeomSetBody (fallingObject.geom,fallingObject.body); - - dBodySetMass (fallingObject.body,&m); - } -} - - -// draw a geom - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R) -{ - if (!g) return; - if (!pos) pos = dGeomGetPosition (g); - if (!R) R = dGeomGetRotation (g); - - int type = dGeomGetClass (g); - if (type == dBoxClass) { - dVector3 sides; - dGeomBoxGetLengths (g,sides); - dsDrawBox (pos,R,sides); - } - else if (type == dSphereClass) { - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - } - else if (type == dCCylinderClass) { - dReal radius,length; - dGeomCCylinderGetParams (g,&radius,&length); - dsDrawCappedCylinder (pos,R,length,radius); - } - /* - else if (type == dGeomTransformClass) { - dGeomID g2 = dGeomTransformGetGeom (g); - const dReal *pos2 = dGeomGetPosition (g2); - const dReal *R2 = dGeomGetRotation (g2); - dVector3 actual_pos; - dMatrix3 actual_R; - dMULTIPLY0_331 (actual_pos,R,pos2); - actual_pos[0] += pos[0]; - actual_pos[1] += pos[1]; - actual_pos[2] += pos[2]; - dMULTIPLY0_333 (actual_R,R,R2); - drawGeom (g2,actual_pos,actual_R); - } - */ -} - - -// simulation loop - -static void simLoop (int pause) -{ - dsSetColor (0,0,2); - dSpaceCollide (space,0,&nearCallback); - if (!pause) dWorldStep (world,0.0005); - - // remove all contact joints - dJointGroupEmpty (contactgroup); - - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - - // draw the falling object - dsSetColor (1,0,0); - drawGeom (fallingObject.geom,0,0); - - // draw the constraining boxes - dsSetColor(0.8, 1, 0.8); - drawGeom (box1,0,0); - drawGeom (box2,0,0); -} - - -int main (int argc, char **argv) -{ - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - // create world - - world = dWorldCreate(); - space = dHashSpaceCreate(); - contactgroup = dJointGroupCreate (0); - dWorldSetGravity (world,0,0,-0.5); - dWorldSetCFM (world,1e-5); - dCreatePlane (space,0,0,1,0); - memset (&fallingObject,0,sizeof(fallingObject)); - - // Create two flat boxes, just slightly off vertical and a bit apart for stuff to fall in between. - // Don't create bodies for these boxes -- they'll be immovable instead. - { - dReal sides[3]; - dMatrix3 R; - - sides[0] = 4; - sides[1] = 0.2; - sides[2] = 3; - - box1 = dCreateBox (space,sides[0],sides[1],sides[2]); - dGeomSetPosition (box1, 0, sides[1], sides[2]/2); - dRFromAxisAndAngle (R, 1, 0, 0, -0.1); - dGeomSetRotation (box1, R); - - box2 = dCreateBox (space,sides[0],sides[1],sides[2]); - dGeomSetPosition (box2, 0, -sides[1], sides[2]/2); - dRFromAxisAndAngle (R, 1, 0, 0, 0.1); - dGeomSetRotation (box2, R); - } - - // Pretend to drop a box to start - command('b'); - - // run simulation - dsSimulationLoop (argc,argv,640,480,&fn); - - dJointGroupDestroy (contactgroup); - dSpaceDestroy (space); - dWorldDestroy (world); - - return 0; -} diff --git a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ode/test/test_stacktest.c b/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ode/test/test_stacktest.c deleted file mode 100644 index e49fd73c39..0000000000 --- a/libraries/ode-0.9/contrib/Mac_CFMCarbon/mac_source/ode/test/test_stacktest.c +++ /dev/null @@ -1,197 +0,0 @@ -#include -#include -#include "ode.h" - -#define NUMBODIES 80 - -#define USE_SPHERE 0 -#define USE_HELIX 1 -#define USE_TORQUE 1 -#define USE_WEIRD_MATRIX_OPS 0 - -#define CONTACTS 1 - -dWorldID aWorld; -dSpaceID aSpace; -float cycle = 0, fade; -dJointGroupID aContactGroup; -dBodyID bodies[NUMBODIES]; -dGeomID geoms[NUMBODIES]; -GLfloat colors[NUMBODIES][4]; -unsigned int contactsThisFrame; - -void kglTransformByODEGeom(dGeomID geom) { - const dReal *p = dGeomGetPosition(geom); - const dReal *R = dGeomGetRotation(geom); - GLdouble glm[16]; - - glm[0] = R[0]; glm[1] = R[4]; glm[2] = R[8]; glm[3] = 0; - glm[4] = R[1]; glm[5] = R[5]; glm[6] = R[9]; glm[7] = 0; - glm[8] = R[2]; glm[9] = R[6]; glm[10] = R[10];glm[11] = 0; - glm[12] = p[0]; glm[13] = p[1]; glm[14] = p[2]; glm[15] = 1; - - glMultMatrixd(glm); -} - -static void odeNearCallback(void *data, dGeomID g1, dGeomID g2) { - dBodyID b1 = dGeomGetBody(g1), - b2 = dGeomGetBody(g2); - dContact contact[CONTACTS]; - int contactsUsed, i; - - if (b1 && b2 && dAreConnected(b1, b2)) return; - - contactsUsed = dCollide(g1, g2, CONTACTS, &contact[0].geom, - sizeof(dContact)); - if (contactsUsed > CONTACTS) contactsUsed = CONTACTS; - - for (i = 0; i < contactsUsed; i++) { - contact[i].surface.mode = 0; - contact[i].surface.mu = 20.0; - - dJointAttach(dJointCreateContact(aWorld, aContactGroup, - &(contact[i])), b1, b2); - contactsThisFrame++; - } -} - -void myGlutResize(int w, int h) { - glViewport(0, 0, w, h); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(45.0, (GLfloat)w / h, 1.0, 120.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, -6, -20); -} - -void myGlutIdle(void) { - const float step = 1.0/120; - int i; - - cycle = fmod(cycle + step / 4, 1); - fade = fabs(cycle * 2 - 1); - - contactsThisFrame = 0; - dSpaceCollide(aSpace, NULL, &odeNearCallback); - //printf("%u\n", contactsThisFrame); - dWorldStep(aWorld, step); - dJointGroupEmpty(aContactGroup); - - for (i = 0; i < NUMBODIES; i++) { - const dReal *cvel = dBodyGetLinearVel(bodies[i]); - dBodyAddForce(bodies[i], - -cvel[0] * 0.5, - -cvel[1] * 0.5, - -cvel[2] * 0.5 - ); - } - - glutPostRedisplay(); -} - -void myGlutDisplay(void) { - int i; - - glClearColor(fade * 0.15, 0, 0, 1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if (USE_WEIRD_MATRIX_OPS) glPushMatrix(); - for (i = 0; i < NUMBODIES; i++) { - if (!USE_WEIRD_MATRIX_OPS) glPushMatrix(); - kglTransformByODEGeom(geoms[i]); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colors[i]); - glColor3f(fade * 1.5, 0, 0); -#if USE_SPHERE - glRotatef(90, 1, 0, 0); - glutSolidSphere(0.5, 9, 6); - glDisable(GL_LIGHTING); - glutWireSphere(0.5, 9, 6); -#else - glutSolidCube(1); - glDisable(GL_LIGHTING); - glutWireCube(1); -#endif - glEnable(GL_LIGHTING); - if (!USE_WEIRD_MATRIX_OPS) glPopMatrix(); - } - if (USE_WEIRD_MATRIX_OPS) glPopMatrix(); - - glutSwapBuffers(); -} - -int main(int argc, char **argv) { - printf("Initializing GLUT\n"); - - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); - glutInitWindowSize(400, 300); - glutInitWindowPosition(100, 100); - glutCreateWindow("ODE Crash Test"); - - glutDisplayFunc(myGlutDisplay); - glutReshapeFunc(myGlutResize); - glutIdleFunc(myGlutIdle); - - glPolygonOffset(1, 1); - glDepthFunc(GL_LEQUAL); - glEnable(GL_POLYGON_OFFSET_FILL); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - myGlutResize(400, 300); - - printf("Creating ODE world\n"); - aWorld = dWorldCreate(); - aSpace = dHashSpaceCreate(); - aContactGroup = dJointGroupCreate(0); - dCreatePlane(aSpace, 0, 1, 0, 0); - dWorldSetGravity(aWorld, 0, -9.81, 0); - dWorldSetERP(aWorld, 0.4); - dWorldSetCFM(aWorld, 1e-10); - - printf("Creating objects\n"); - { - int i; - dMass mass; - - dMassSetBox(&mass, 1.0, 1, 1, 1); - - for (i = 0; i < NUMBODIES; i++) { - float fraction = (float)i / NUMBODIES; - - bodies[i] = dBodyCreate(aWorld); - dBodySetMass(bodies[i], &mass); -#if USE_SPHERE - geoms[i] = dCreateSphere(aSpace, 0.5); -#else - geoms[i] = dCreateBox(aSpace, 1, 1, 1); -#endif - dGeomSetBody(geoms[i], bodies[i]); - - if (USE_HELIX) { - float r = (i % 3 - 1) * (1.5+4*(1 - fraction)), - theta = (float)i / 4; - dBodySetPosition(bodies[i], - sin(theta) * r, - (float)i + 1, - cos(theta) * r - ); - } else { - dBodySetPosition(bodies[i], 0, (float)i * 2 + 1, 0); - } - if (USE_TORQUE) dBodyAddTorque(bodies[i], fraction*10, fraction*20, fraction*30); - - colors[i][0] = fraction; - colors[i][1] = 1 - fraction; - colors[i][2] = 1 - fabs(fraction * 2 - 1); - colors[i][3] = 1; - } - } - - printf("Starting simulation\n"); - glutMainLoop(); - - return 0; -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/AssemblyInfo.cs b/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/AssemblyInfo.cs deleted file mode 100644 index 8d2b86a0a2..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/AssemblyInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Drawstuff.NET")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Ode.NET")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: Guid("b2a39dd4-dd67-4e8a-af70-d3b412da8850")] -[assembly: AssemblyVersion("0.7.0.0")] -[assembly: AssemblyFileVersion("0.7.0.0")] -[assembly: CLSCompliantAttribute(true)] diff --git a/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/Drawstuff.cs b/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/Drawstuff.cs deleted file mode 100644 index aa84966cca..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/Drawstuff.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Ode.NET; - -namespace Drawstuff.NET -{ -#if dDOUBLE - using dReal = System.Double; -#else - using dReal = System.Single; -#endif - - public static class ds - { - public const int VERSION = 2; - - public enum Texture - { - None, - Wood - } - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void CallbackFunction(int arg); - - [StructLayout(LayoutKind.Sequential)] - public struct Functions - { - public int version; - public CallbackFunction start; - public CallbackFunction step; - public CallbackFunction command; - public CallbackFunction stop; - public string path_to_textures; - } - - [DllImport("drawstuff", EntryPoint="dsDrawBox")] - public static extern void DrawBox(ref d.Vector3 pos, ref d.Matrix3 R, ref d.Vector3 sides); - - [DllImport("drawstuff", EntryPoint = "dsDrawCapsule")] - public static extern void DrawCapsule(ref d.Vector3 pos, ref d.Matrix3 R, dReal length, dReal radius); - - [DllImport("drawstuff", EntryPoint = "dsDrawConvex")] - public static extern void DrawConvex(ref d.Vector3 pos, ref d.Matrix3 R, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons); - - [DllImport("drawstuff", EntryPoint="dsSetColor")] - public static extern void SetColor(float red, float green, float blue); - - [DllImport("drawstuff", EntryPoint="dsSetTexture")] - public static extern void SetTexture(Texture texture); - - [DllImport("drawstuff", EntryPoint="dsSetViewpoint")] - public static extern void SetViewpoint(ref d.Vector3 xyz, ref d.Vector3 hpr); - - [DllImport("drawstuff", EntryPoint="dsSimulationLoop")] - public static extern void SimulationLoop(int argc, string[] argv, int window_width, int window_height, ref Functions fn); - } -} diff --git a/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/premake.lua b/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/premake.lua deleted file mode 100644 index d777ffba35..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Drawstuff/premake.lua +++ /dev/null @@ -1,19 +0,0 @@ -package.name = "Drawstuff.NET" -package.kind = "dll" -package.language = "c#" - -if (options["with-doubles"]) then - package.defines = { "dDOUBLE" } -else - package.defines = { "dSINGLE " } -end - -package.links = { - "System", - "Ode.NET" -} - -package.files = { - "AssemblyInfo.cs", - "Drawstuff.cs" -} diff --git a/libraries/ode-0.9/contrib/Ode.NET/Ode.NET.sln b/libraries/ode-0.9/contrib/Ode.NET/Ode.NET.sln deleted file mode 100755 index ecc6d9d9d3..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Ode.NET.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ode.NET", "Ode/Ode.NET.csproj", "{637D89E7-AA43-EB43-9D2C-5210B740F36B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {637D89E7-AA43-EB43-9D2C-5210B740F36B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {637D89E7-AA43-EB43-9D2C-5210B740F36B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {637D89E7-AA43-EB43-9D2C-5210B740F36B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {637D89E7-AA43-EB43-9D2C-5210B740F36B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/libraries/ode-0.9/contrib/Ode.NET/Ode/AssemblyInfo.cs b/libraries/ode-0.9/contrib/Ode.NET/Ode/AssemblyInfo.cs deleted file mode 100644 index 6a8c2b67aa..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Ode/AssemblyInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Ode.NET")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Ode.NET")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: Guid("1347a35e-c32b-4ff6-8064-7d10b2cc113b")] -[assembly: AssemblyVersion("0.7.0.0")] -[assembly: AssemblyFileVersion("0.7.0.0")] -[assembly: CLSCompliantAttribute(true)] diff --git a/libraries/ode-0.9/contrib/Ode.NET/Ode/Ode.cs b/libraries/ode-0.9/contrib/Ode.NET/Ode/Ode.cs deleted file mode 100644 index 06038102aa..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Ode/Ode.cs +++ /dev/null @@ -1,1732 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Security; - -namespace Ode.NET -{ -#if dDOUBLE - using dReal = System.Double; -#else - using dReal = System.Single; -#endif - - public static class d - { - public static dReal Infinity = dReal.MaxValue; - - #region Flags and Enumerations - - [Flags] - public enum ContactFlags : int - { - Mu2 = 0x001, - FDir1 = 0x002, - Bounce = 0x004, - SoftERP = 0x008, - SoftCFM = 0x010, - Motion1 = 0x020, - Motion2 = 0x040, - Slip1 = 0x080, - Slip2 = 0x100, - Approx0 = 0x0000, - Approx1_1 = 0x1000, - Approx1_2 = 0x2000, - Approx1 = 0x3000 - } - - public enum GeomClassID : int - { - SphereClass, - BoxClass, - CapsuleClass, - CylinderClass, - PlaneClass, - RayClass, - ConvexClass, - GeomTransformClass, - TriMeshClass, - HeightfieldClass, - FirstSpaceClass, - SimpleSpaceClass = FirstSpaceClass, - HashSpaceClass, - QuadTreeSpaceClass, - LastSpaceClass = QuadTreeSpaceClass, - FirstUserClass, - LastUserClass = FirstUserClass + MaxUserClasses - 1, - NumClasses, - MaxUserClasses = 4 - } - - public enum JointType : int - { - None, - Ball, - Hinge, - Slider, - Contact, - Universal, - Hinge2, - Fixed, - Null, - AMotor, - LMotor, - Plane2D - } - - public enum JointParam : int - { - LoStop, - HiStop, - Vel, - FMax, - FudgeFactor, - Bounce, - CFM, - StopERP, - StopCFM, - SuspensionERP, - SuspensionCFM, - LoStop2 = 256, - HiStop2, - Vel2, - FMax2, - FudgeFactor2, - Bounce2, - CFM2, - StopERP2, - StopCFM2, - SuspensionERP2, - SuspensionCFM2, - LoStop3 = 512, - HiStop3, - Vel3, - FMax3, - FudgeFactor3, - Bounce3, - CFM3, - StopERP3, - StopCFM3, - SuspensionERP3, - SuspensionCFM3 - } - - #endregion - - #region Callbacks - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int AABBTestFn(IntPtr o1, IntPtr o2, ref AABB aabb); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int ColliderFn(IntPtr o1, IntPtr o2, int flags, out ContactGeom contact, int skip); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void GetAABBFn(IntPtr geom, out AABB aabb); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate ColliderFn GetColliderFnFn(int num); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void GeomDtorFn(IntPtr o); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate dReal HeightfieldGetHeight(IntPtr p_user_data, int x, int z); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void NearCallback(IntPtr data, IntPtr geom1, IntPtr geom2); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int TriCallback(IntPtr trimesh, IntPtr refObject, int triangleIndex); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int TriArrayCallback(IntPtr trimesh, IntPtr refObject, int[] triangleIndex, int triCount); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int TriRayCallback(IntPtr trimesh, IntPtr ray, int triangleIndex, dReal u, dReal v); - - #endregion - - #region Structs - - [StructLayout(LayoutKind.Sequential)] - public struct AABB - { - public dReal MinX, MaxX; - public dReal MinY, MaxY; - public dReal MinZ, MaxZ; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct Contact - { - public SurfaceParameters surface; - public ContactGeom geom; - public Vector3 fdir1; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct ContactGeom - { - public static readonly int SizeOf = Marshal.SizeOf(typeof(ContactGeom)); - - public Vector3 pos; - public Vector3 normal; - public dReal depth; - public IntPtr g1; - public IntPtr g2; - public int side1; - public int side2; - } - - [StructLayout(LayoutKind.Sequential)] - public struct GeomClass - { - public int bytes; - public GetColliderFnFn collider; - public GetAABBFn aabb; - public AABBTestFn aabb_test; - public GeomDtorFn dtor; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct JointFeedback - { - public Vector3 f1; - public Vector3 t1; - public Vector3 f2; - public Vector3 t2; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct Mass - { - public dReal mass; - public Vector4 c; - public Matrix3 I; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct Matrix3 - { - public Matrix3(dReal m00, dReal m10, dReal m20, dReal m01, dReal m11, dReal m21, dReal m02, dReal m12, dReal m22) - { - M00 = m00; M10 = m10; M20 = m20; _m30 = 0.0f; - M01 = m01; M11 = m11; M21 = m21; _m31 = 0.0f; - M02 = m02; M12 = m12; M22 = m22; _m32 = 0.0f; - } - public dReal M00, M10, M20; - private dReal _m30; - public dReal M01, M11, M21; - private dReal _m31; - public dReal M02, M12, M22; - private dReal _m32; - } - - [StructLayout(LayoutKind.Sequential)] - public struct Matrix4 - { - public Matrix4(dReal m00, dReal m10, dReal m20, dReal m30, - dReal m01, dReal m11, dReal m21, dReal m31, - dReal m02, dReal m12, dReal m22, dReal m32, - dReal m03, dReal m13, dReal m23, dReal m33) - { - M00 = m00; M10 = m10; M20 = m20; M30 = m30; - M01 = m01; M11 = m11; M21 = m21; M31 = m31; - M02 = m02; M12 = m12; M22 = m22; M32 = m32; - M03 = m03; M13 = m13; M23 = m23; M33 = m33; - } - public dReal M00, M10, M20, M30; - public dReal M01, M11, M21, M31; - public dReal M02, M12, M22, M32; - public dReal M03, M13, M23, M33; - } - - [StructLayout(LayoutKind.Sequential)] - public struct Quaternion - { - public dReal W, X, Y, Z; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct SurfaceParameters - { - public ContactFlags mode; - public dReal mu; - public dReal mu2; - public dReal bounce; - public dReal bounce_vel; - public dReal soft_erp; - public dReal soft_cfm; - public dReal motion1; - public dReal motion2; - public dReal slip1; - public dReal slip2; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct Vector3 - { - public Vector3(dReal x, dReal y, dReal z) - { - X = x; Y = y; Z = z; _w = 0.0f; - } - public dReal X, Y, Z; - private dReal _w; - } - - - [StructLayout(LayoutKind.Sequential)] - public struct Vector4 - { - public Vector4(dReal x, dReal y, dReal z, dReal w) - { - X = x; Y = y; Z = z; W = w; - } - public dReal X, Y, Z, W; - } - - #endregion - - [DllImport("ode", EntryPoint = "dAreConnected"), SuppressUnmanagedCodeSecurity] - public static extern bool AreConnected(IntPtr b1, IntPtr b2); - - [DllImport("ode", EntryPoint = "dAreConnectedExcluding"), SuppressUnmanagedCodeSecurity] - public static extern bool AreConnectedExcluding(IntPtr b1, IntPtr b2, JointType joint_type); - - [DllImport("ode", EntryPoint = "dBodyAddForce"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddForce(IntPtr body, dReal fx, dReal fy, dReal fz); - - [DllImport("ode", EntryPoint = "dBodyAddForceAtPos"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddForceAtPos(IntPtr body, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); - - [DllImport("ode", EntryPoint = "dBodyAddForceAtRelPos"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddForceAtRelPos(IntPtr body, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); - - [DllImport("ode", EntryPoint = "dBodyAddRelForce"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddRelForce(IntPtr body, dReal fx, dReal fy, dReal fz); - - [DllImport("ode", EntryPoint = "dBodyAddRelForceAtPos"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddRelForceAtPos(IntPtr body, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); - - [DllImport("ode", EntryPoint = "dBodyAddRelForceAtRelPos"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddRelForceAtRelPos(IntPtr body, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); - - [DllImport("ode", EntryPoint = "dBodyAddRelTorque"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddRelTorque(IntPtr body, dReal fx, dReal fy, dReal fz); - - [DllImport("ode", EntryPoint = "dBodyAddTorque"), SuppressUnmanagedCodeSecurity] - public static extern void BodyAddTorque(IntPtr body, dReal fx, dReal fy, dReal fz); - - [DllImport("ode", EntryPoint = "dBodyCopyPosition"), SuppressUnmanagedCodeSecurity] - public static extern void BodyCopyPosition(IntPtr body, out Vector3 pos); - - [DllImport("ode", EntryPoint = "dBodyCopyPosition"), SuppressUnmanagedCodeSecurity] - public static extern void BodyCopyPosition(IntPtr body, out dReal X); - - [DllImport("ode", EntryPoint = "dBodyCopyQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void BodyCopyQuaternion(IntPtr body, out Quaternion quat); - - [DllImport("ode", EntryPoint = "dBodyCopyQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void BodyCopyQuaternion(IntPtr body, out dReal X); - - [DllImport("ode", EntryPoint = "dBodyCopyRotation"), SuppressUnmanagedCodeSecurity] - public static extern void BodyCopyRotation(IntPtr body, out Matrix3 R); - - [DllImport("ode", EntryPoint = "dBodyCopyRotation"), SuppressUnmanagedCodeSecurity] - public static extern void BodyCopyRotation(IntPtr body, out dReal M00); - - [DllImport("ode", EntryPoint = "dBodyCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr BodyCreate(IntPtr world); - - [DllImport("ode", EntryPoint = "dBodyDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void BodyDestroy(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyDisable"), SuppressUnmanagedCodeSecurity] - public static extern void BodyDisable(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyEnable"), SuppressUnmanagedCodeSecurity] - public static extern void BodyEnable(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetAutoDisableAngularThreshold"), SuppressUnmanagedCodeSecurity] - public static extern dReal BodyGetAutoDisableAngularThreshold(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetAutoDisableFlag"), SuppressUnmanagedCodeSecurity] - public static extern bool BodyGetAutoDisableFlag(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetAutoDisableLinearThreshold"), SuppressUnmanagedCodeSecurity] - public static extern dReal BodyGetAutoDisableLinearThreshold(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetAutoDisableSteps"), SuppressUnmanagedCodeSecurity] - public static extern int BodyGetAutoDisableSteps(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetAutoDisableTime"), SuppressUnmanagedCodeSecurity] - public static extern dReal BodyGetAutoDisableTime(IntPtr body); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetAngularVel"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* BodyGetAngularVelUnsafe(IntPtr body); - public static Vector3 BodyGetAngularVel(IntPtr body) - { - unsafe { return *(BodyGetAngularVelUnsafe(body)); } - } -#endif - - [DllImport("ode", EntryPoint = "dBodyGetData"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr BodyGetData(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetFiniteRotationMode"), SuppressUnmanagedCodeSecurity] - public static extern int BodyGetFiniteRotationMode(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetFiniteRotationAxis"), SuppressUnmanagedCodeSecurity] - public static extern void BodyGetFiniteRotationAxis(IntPtr body, out Vector3 result); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetForce"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* BodyGetForceUnsafe(IntPtr body); - public static Vector3 BodyGetForce(IntPtr body) - { - unsafe { return *(BodyGetForceUnsafe(body)); } - } -#endif - - [DllImport("ode", EntryPoint = "dBodyGetGravityMode"), SuppressUnmanagedCodeSecurity] - public static extern bool BodyGetGravityMode(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetJoint"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr BodyGetJoint(IntPtr body, int index); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetLinearVel"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* BodyGetLinearVelUnsafe(IntPtr body); - public static Vector3 BodyGetLinearVel(IntPtr body) - { - unsafe { return *(BodyGetLinearVelUnsafe(body)); } - } -#endif - - [DllImport("ode", EntryPoint = "dBodyGetMass"), SuppressUnmanagedCodeSecurity] - public static extern void BodyGetMass(IntPtr body, out Mass mass); - - [DllImport("ode", EntryPoint = "dBodyGetNumJoints"), SuppressUnmanagedCodeSecurity] - public static extern int BodyGetNumJoints(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodyGetPointVel"), SuppressUnmanagedCodeSecurity] - public static extern void BodyGetPointVel(IntPtr body, dReal px, dReal py, dReal pz, out Vector3 result); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetPosition"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* BodyGetPositionUnsafe(IntPtr body); - public static Vector3 BodyGetPosition(IntPtr body) - { - unsafe { return *(BodyGetPositionUnsafe(body)); } - } -#endif - - [DllImport("ode", EntryPoint = "dBodyGetPosRelPoint"), SuppressUnmanagedCodeSecurity] - public static extern void BodyGetPosRelPoint(IntPtr body, dReal px, dReal py, dReal pz, out Vector3 result); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetQuaternion"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Quaternion* BodyGetQuaternionUnsafe(IntPtr body); - public static Quaternion BodyGetQuaternion(IntPtr body) - { - unsafe { return *(BodyGetQuaternionUnsafe(body)); } - } -#endif - - [DllImport("ode", EntryPoint = "dBodyGetRelPointPos"), SuppressUnmanagedCodeSecurity] - public static extern void BodyGetRelPointPos(IntPtr body, dReal px, dReal py, dReal pz, out Vector3 result); - - [DllImport("ode", EntryPoint = "dBodyGetRelPointVel"), SuppressUnmanagedCodeSecurity] - public static extern void BodyGetRelPointVel(IntPtr body, dReal px, dReal py, dReal pz, out Vector3 result); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetRotation"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Matrix3* BodyGetRotationUnsafe(IntPtr body); - public static Matrix3 BodyGetRotation(IntPtr body) - { - unsafe { return *(BodyGetRotationUnsafe(body)); } - } -#endif - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dBodyGetTorque"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* BodyGetTorqueUnsafe(IntPtr body); - public static Vector3 BodyGetTorque(IntPtr body) - { - unsafe { return *(BodyGetTorqueUnsafe(body)); } - } -#endif - - [DllImport("ode", EntryPoint = "dBodyIsEnabled"), SuppressUnmanagedCodeSecurity] - public static extern bool BodyIsEnabled(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodySetAngularVel"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAngularVel(IntPtr body, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dBodySetAutoDisableAngularThreshold"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAutoDisableAngularThreshold(IntPtr body, dReal angular_threshold); - - [DllImport("ode", EntryPoint = "dBodySetAutoDisableDefaults"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAutoDisableDefaults(IntPtr body); - - [DllImport("ode", EntryPoint = "dBodySetAutoDisableFlag"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAutoDisableFlag(IntPtr body, bool do_auto_disable); - - [DllImport("ode", EntryPoint = "dBodySetAutoDisableLinearThreshold"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAutoDisableLinearThreshold(IntPtr body, dReal linear_threshold); - - [DllImport("ode", EntryPoint = "dBodySetAutoDisableSteps"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAutoDisableSteps(IntPtr body, int steps); - - [DllImport("ode", EntryPoint = "dBodySetAutoDisableTime"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetAutoDisableTime(IntPtr body, dReal time); - - [DllImport("ode", EntryPoint = "dBodySetData"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetData(IntPtr body, IntPtr data); - - [DllImport("ode", EntryPoint = "dBodySetFiniteRotationMode"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetFiniteRotationMode(IntPtr body, int mode); - - [DllImport("ode", EntryPoint = "dBodySetFiniteRotationModeAxis"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetFiniteRotationModeAxis(IntPtr body, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dBodySetForce"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetForce(IntPtr body, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dBodySetGravityMode"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetGravityMode(IntPtr body, bool mode); - - [DllImport("ode", EntryPoint = "dBodySetLinearVel"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetLinearVel(IntPtr body, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dBodySetMass"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetMass(IntPtr body, ref Mass mass); - - [DllImport("ode", EntryPoint = "dBodySetPosition"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetPosition(IntPtr body, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dBodySetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetQuaternion(IntPtr body, ref Quaternion q); - - [DllImport("ode", EntryPoint = "dBodySetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetQuaternion(IntPtr body, ref dReal w); - - [DllImport("ode", EntryPoint = "dBodySetRotation"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetRotation(IntPtr body, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dBodySetRotation"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetRotation(IntPtr body, ref dReal M00); - - [DllImport("ode", EntryPoint = "dBodySetTorque"), SuppressUnmanagedCodeSecurity] - public static extern void BodySetTorque(IntPtr body, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dBodyVectorFromWorld"), SuppressUnmanagedCodeSecurity] - public static extern void BodyVectorFromWorld(IntPtr body, dReal px, dReal py, dReal pz, out Vector3 result); - - [DllImport("ode", EntryPoint = "dBodyVectorToWorld"), SuppressUnmanagedCodeSecurity] - public static extern void BodyVectorToWorld(IntPtr body, dReal px, dReal py, dReal pz, out Vector3 result); - - [DllImport("ode", EntryPoint = "dBoxBox"), SuppressUnmanagedCodeSecurity] - public static extern void BoxBox(ref Vector3 p1, ref Matrix3 R1, - ref Vector3 side1, ref Vector3 p2, - ref Matrix3 R2, ref Vector3 side2, - ref Vector3 normal, out dReal depth, out int return_code, - int maxc, out ContactGeom contact, int skip); - - [DllImport("ode", EntryPoint = "dBoxTouchesBox"), SuppressUnmanagedCodeSecurity] - public static extern void BoxTouchesBox(ref Vector3 _p1, ref Matrix3 R1, - ref Vector3 side1, ref Vector3 _p2, - ref Matrix3 R2, ref Vector3 side2); - - [DllImport("ode", EntryPoint = "dClosestLineSegmentPoints"), SuppressUnmanagedCodeSecurity] - public static extern void ClosestLineSegmentPoints(ref Vector3 a1, ref Vector3 a2, - ref Vector3 b1, ref Vector3 b2, - ref Vector3 cp1, ref Vector3 cp2); - - [DllImport("ode", EntryPoint = "dCloseODE"), SuppressUnmanagedCodeSecurity] - public static extern void CloseODE(); - - [DllImport("ode", EntryPoint = "dCollide"), SuppressUnmanagedCodeSecurity] - public static extern int Collide(IntPtr o1, IntPtr o2, int flags, [In, Out] ContactGeom[] contact, int skip); - - [DllImport("ode", EntryPoint = "dConnectingJoint"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr ConnectingJoint(IntPtr j1, IntPtr j2); - - [DllImport("ode", EntryPoint = "dCreateBox"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateBox(IntPtr space, dReal lx, dReal ly, dReal lz); - - [DllImport("ode", EntryPoint = "dCreateCapsule"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateCapsule(IntPtr space, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dCreateConvex"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateConvex(IntPtr space, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons); - - [DllImport("ode", EntryPoint = "dCreateCylinder"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateCylinder(IntPtr space, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dCreateHeightfield"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateHeightfield(IntPtr space, IntPtr data, int bPlaceable); - - [DllImport("ode", EntryPoint = "dCreateGeom"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateGeom(int classnum); - - [DllImport("ode", EntryPoint = "dCreateGeomClass"), SuppressUnmanagedCodeSecurity] - public static extern int CreateGeomClass(ref GeomClass classptr); - - [DllImport("ode", EntryPoint = "dCreateGeomTransform"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateGeomTransform(IntPtr space); - - [DllImport("ode", EntryPoint = "dCreatePlane"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreatePlane(IntPtr space, dReal a, dReal b, dReal c, dReal d); - - [DllImport("ode", EntryPoint = "dCreateRay"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateRay(IntPtr space, dReal length); - - [DllImport("ode", EntryPoint = "dCreateSphere"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateSphere(IntPtr space, dReal radius); - - [DllImport("ode", EntryPoint = "dCreateTriMesh"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr CreateTriMesh(IntPtr space, IntPtr data, - TriCallback callback, TriArrayCallback arrayCallback, TriRayCallback rayCallback); - - [DllImport("ode", EntryPoint = "dDot"), SuppressUnmanagedCodeSecurity] - public static extern dReal Dot(ref dReal X0, ref dReal X1, int n); - - [DllImport("ode", EntryPoint = "dDQfromW"), SuppressUnmanagedCodeSecurity] - public static extern void DQfromW(dReal[] dq, ref Vector3 w, ref Quaternion q); - - [DllImport("ode", EntryPoint = "dFactorCholesky"), SuppressUnmanagedCodeSecurity] - public static extern int FactorCholesky(ref dReal A00, int n); - - [DllImport("ode", EntryPoint = "dFactorLDLT"), SuppressUnmanagedCodeSecurity] - public static extern void FactorLDLT(ref dReal A, out dReal d, int n, int nskip); - - [DllImport("ode", EntryPoint = "dGeomBoxGetLengths"), SuppressUnmanagedCodeSecurity] - public static extern void GeomBoxGetLengths(IntPtr geom, out Vector3 len); - - [DllImport("ode", EntryPoint = "dGeomBoxGetLengths"), SuppressUnmanagedCodeSecurity] - public static extern void GeomBoxGetLengths(IntPtr geom, out dReal x); - - [DllImport("ode", EntryPoint = "dGeomBoxPointDepth"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomBoxPointDepth(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomBoxSetLengths"), SuppressUnmanagedCodeSecurity] - public static extern void GeomBoxSetLengths(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomCapsuleGetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCapsuleGetParams(IntPtr geom, out dReal radius, out dReal length); - - [DllImport("ode", EntryPoint = "dGeomCapsulePointDepth"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomCapsulePointDepth(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomCapsuleSetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCapsuleSetParams(IntPtr geom, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dGeomClearOffset"), SuppressUnmanagedCodeSecurity] - public static extern void GeomClearOffset(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomCopyOffsetPosition"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomCopyOffsetPosition(IntPtr geom, ref Vector3 pos); - - [DllImport("ode", EntryPoint = "dGeomCopyOffsetPosition"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomCopyOffsetPosition(IntPtr geom, ref dReal X); - - [DllImport("ode", EntryPoint = "dGeomGetOffsetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyOffsetQuaternion(IntPtr geom, ref Quaternion Q); - - [DllImport("ode", EntryPoint = "dGeomGetOffsetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyOffsetQuaternion(IntPtr geom, ref dReal X); - - [DllImport("ode", EntryPoint = "dGeomCopyOffsetRotation"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomCopyOffsetRotation(IntPtr geom, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dGeomCopyOffsetRotation"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomCopyOffsetRotation(IntPtr geom, ref dReal M00); - - [DllImport("ode", EntryPoint = "dGeomCopyPosition"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyPosition(IntPtr geom, out Vector3 pos); - - [DllImport("ode", EntryPoint = "dGeomCopyPosition"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyPosition(IntPtr geom, out dReal X); - - [DllImport("ode", EntryPoint = "dGeomCopyRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyRotation(IntPtr geom, out Matrix3 R); - - [DllImport("ode", EntryPoint = "dGeomCopyRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyRotation(IntPtr geom, out dReal M00); - - [DllImport("ode", EntryPoint = "dGeomCylinderGetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCylinderGetParams(IntPtr geom, out dReal radius, out dReal length); - - [DllImport("ode", EntryPoint = "dGeomCylinderSetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCylinderSetParams(IntPtr geom, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dGeomDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void GeomDestroy(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomDisable"), SuppressUnmanagedCodeSecurity] - public static extern void GeomDisable(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomEnable"), SuppressUnmanagedCodeSecurity] - public static extern void GeomEnable(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomGetAABB"), SuppressUnmanagedCodeSecurity] - public static extern void GeomGetAABB(IntPtr geom, out AABB aabb); - - [DllImport("ode", EntryPoint = "dGeomGetAABB"), SuppressUnmanagedCodeSecurity] - public static extern void GeomGetAABB(IntPtr geom, out dReal minX); - - [DllImport("ode", EntryPoint = "dGeomGetBody"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomGetBody(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomGetCategoryBits"), SuppressUnmanagedCodeSecurity] - public static extern int GeomGetCategoryBits(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomGetClassData"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomGetClassData(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomGetCollideBits"), SuppressUnmanagedCodeSecurity] - public static extern int GeomGetCollideBits(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomGetClass"), SuppressUnmanagedCodeSecurity] - public static extern GeomClassID GeomGetClass(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomGetData"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomGetData(IntPtr geom); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dGeomGetOffsetPosition"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* GeomGetOffsetPositionUnsafe(IntPtr geom); - public static Vector3 GeomGetOffsetPosition(IntPtr geom) - { - unsafe { return *(GeomGetOffsetPositionUnsafe(geom)); } - } -#endif - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dGeomGetOffsetRotation"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Matrix3* GeomGetOffsetRotationUnsafe(IntPtr geom); - public static Matrix3 GeomGetOffsetRotation(IntPtr geom) - { - unsafe { return *(GeomGetOffsetRotationUnsafe(geom)); } - } -#endif - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dGeomGetPosition"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Vector3* GeomGetPositionUnsafe(IntPtr geom); - public static Vector3 GeomGetPosition(IntPtr geom) - { - unsafe { return *(GeomGetPositionUnsafe(geom)); } - } -#endif - - [DllImport("ode", EntryPoint = "dGeomGetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyQuaternion(IntPtr geom, out Quaternion q); - - [DllImport("ode", EntryPoint = "dGeomGetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomCopyQuaternion(IntPtr geom, out dReal X); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dGeomGetRotation"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Matrix3* GeomGetRotationUnsafe(IntPtr geom); - public static Matrix3 GeomGetRotation(IntPtr geom) - { - unsafe { return *(GeomGetRotationUnsafe(geom)); } - } -#endif - - [DllImport("ode", EntryPoint = "dGeomGetSpace"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomGetSpace(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildByte"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildByte(IntPtr d, byte[] pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildByte"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildByte(IntPtr d, IntPtr pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildCallback"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildCallback(IntPtr d, IntPtr pUserData, HeightfieldGetHeight pCallback, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildShort"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildShort(IntPtr d, ushort[] pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildShort"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildShort(IntPtr d, short[] pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildShort"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildShort(IntPtr d, IntPtr pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildSingle"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildSingle(IntPtr d, float[] pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildSingle"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildSingle(IntPtr d, IntPtr pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildDouble"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildDouble(IntPtr d, double[] pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataBuildDouble"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataBuildDouble(IntPtr d, IntPtr pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomHeightfieldDataCreate(); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataDestroy(IntPtr d); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldDataSetBounds"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldDataSetBounds(IntPtr d, dReal minHeight, dReal maxHeight); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldGetHeightfieldData"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomHeightfieldGetHeightfieldData(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomHeightfieldSetHeightfieldData"), SuppressUnmanagedCodeSecurity] - public static extern void GeomHeightfieldSetHeightfieldData(IntPtr g, IntPtr d); - - [DllImport("ode", EntryPoint = "dGeomIsEnabled"), SuppressUnmanagedCodeSecurity] - public static extern bool GeomIsEnabled(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomIsOffset"), SuppressUnmanagedCodeSecurity] - public static extern bool GeomIsOffset(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomIsSpace"), SuppressUnmanagedCodeSecurity] - public static extern bool GeomIsSpace(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomPlaneGetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomPlaneGetParams(IntPtr geom, ref Vector4 result); - - [DllImport("ode", EntryPoint = "dGeomPlaneGetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomPlaneGetParams(IntPtr geom, ref dReal A); - - [DllImport("ode", EntryPoint = "dGeomPlanePointDepth"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomPlanePointDepth(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomPlaneSetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomPlaneSetParams(IntPtr plane, dReal a, dReal b, dReal c, dReal d); - - [DllImport("ode", EntryPoint = "dGeomRayGet"), SuppressUnmanagedCodeSecurity] - public static extern void GeomRayGet(IntPtr ray, ref Vector3 start, ref Vector3 dir); - - [DllImport("ode", EntryPoint = "dGeomRayGet"), SuppressUnmanagedCodeSecurity] - public static extern void GeomRayGet(IntPtr ray, ref dReal startX, ref dReal dirX); - - [DllImport("ode", EntryPoint = "dGeomRayGetClosestHit"), SuppressUnmanagedCodeSecurity] - public static extern int GeomRayGetClosestHit(IntPtr ray); - - [DllImport("ode", EntryPoint = "dGeomRayGetLength"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomRayGetLength(IntPtr ray); - - [DllImport("ode", EntryPoint = "dGeomRayGetParams"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomRayGetParams(IntPtr g, out int firstContact, out int backfaceCull); - - [DllImport("ode", EntryPoint = "dGeomRaySet"), SuppressUnmanagedCodeSecurity] - public static extern void GeomRaySet(IntPtr ray, dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz); - - [DllImport("ode", EntryPoint = "dGeomRaySetClosestHit"), SuppressUnmanagedCodeSecurity] - public static extern void GeomRaySetClosestHit(IntPtr ray, int closestHit); - - [DllImport("ode", EntryPoint = "dGeomRaySetLength"), SuppressUnmanagedCodeSecurity] - public static extern void GeomRaySetLength(IntPtr ray, dReal length); - - [DllImport("ode", EntryPoint = "dGeomRaySetParams"), SuppressUnmanagedCodeSecurity] - public static extern void GeomRaySetParams(IntPtr ray, int firstContact, int backfaceCull); - - [DllImport("ode", EntryPoint = "dGeomSetBody"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetBody(IntPtr geom, IntPtr body); - - [DllImport("ode", EntryPoint = "dGeomSetCategoryBits"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetCategoryBits(IntPtr geom, int bits); - - [DllImport("ode", EntryPoint = "dGeomSetCollideBits"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetCollideBits(IntPtr geom, int bits); - - [DllImport("ode", EntryPoint = "dGeomSetConvex"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomSetConvex(IntPtr geom, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons); - - [DllImport("ode", EntryPoint = "dGeomSetData"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetData(IntPtr geom, IntPtr data); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetPosition"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetPosition(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetQuaternion(IntPtr geom, ref Quaternion Q); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetQuaternion(IntPtr geom, ref dReal X); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetRotation(IntPtr geom, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetRotation(IntPtr geom, ref dReal M00); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetWorldPosition"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetWorldPosition(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetWorldQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetWorldQuaternion(IntPtr geom, ref Quaternion Q); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetWorldQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetWorldQuaternion(IntPtr geom, ref dReal X); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetWorldRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetWorldRotation(IntPtr geom, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dGeomSetOffsetWorldRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetOffsetWorldRotation(IntPtr geom, ref dReal M00); - - [DllImport("ode", EntryPoint = "dGeomSetPosition"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetPosition(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomSetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetQuaternion(IntPtr geom, ref Quaternion quat); - - [DllImport("ode", EntryPoint = "dGeomSetQuaternion"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetQuaternion(IntPtr geom, ref dReal w); - - [DllImport("ode", EntryPoint = "dGeomSetRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetRotation(IntPtr geom, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dGeomSetRotation"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSetRotation(IntPtr geom, ref dReal M00); - - [DllImport("ode", EntryPoint = "dGeomSphereGetRadius"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomSphereGetRadius(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomSpherePointDepth"), SuppressUnmanagedCodeSecurity] - public static extern dReal GeomSpherePointDepth(IntPtr geom, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dGeomSphereSetRadius"), SuppressUnmanagedCodeSecurity] - public static extern void GeomSphereSetRadius(IntPtr geom, dReal radius); - - [DllImport("ode", EntryPoint = "dGeomTransformGetCleanup"), SuppressUnmanagedCodeSecurity] - public static extern int GeomTransformGetCleanup(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomTransformGetGeom"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomTransformGetGeom(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomTransformGetInfo"), SuppressUnmanagedCodeSecurity] - public static extern int GeomTransformGetInfo(IntPtr geom); - - [DllImport("ode", EntryPoint = "dGeomTransformSetCleanup"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTransformSetCleanup(IntPtr geom, int mode); - - [DllImport("ode", EntryPoint = "dGeomTransformSetGeom"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTransformSetGeom(IntPtr geom, IntPtr obj); - - [DllImport("ode", EntryPoint = "dGeomTransformSetInfo"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTransformSetInfo(IntPtr geom, int info); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildDouble"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildDouble(IntPtr d, - double[] vertices, int vertexStride, int vertexCount, - int[] indices, int indexCount, int triStride); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildDouble"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildDouble(IntPtr d, - IntPtr vertices, int vertexStride, int vertexCount, - IntPtr indices, int indexCount, int triStride); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildDouble1"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildDouble1(IntPtr d, - double[] vertices, int vertexStride, int vertexCount, - int[] indices, int indexCount, int triStride, - double[] normals); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildDouble1"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildDouble(IntPtr d, - IntPtr vertices, int vertexStride, int vertexCount, - IntPtr indices, int indexCount, int triStride, - IntPtr normals); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSimple"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSingle(IntPtr d, - dReal[] vertices, int vertexStride, int vertexCount, - int[] indices, int indexCount, int triStride); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSimple"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSingle(IntPtr d, - IntPtr vertices, int vertexStride, int vertexCount, - IntPtr indices, int indexCount, int triStride); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSimple1"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSingle1(IntPtr d, - dReal[] vertices, int vertexStride, int vertexCount, - int[] indices, int indexCount, int triStride, - dReal[] normals); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSimple1"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSingle1(IntPtr d, - IntPtr vertices, int vertexStride, int vertexCount, - IntPtr indices, int indexCount, int triStride, - IntPtr normals); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSingle"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSimple(IntPtr d, - float[] vertices, int vertexStride, int vertexCount, - int[] indices, int indexCount, int triStride); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSingle"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSimple(IntPtr d, - IntPtr vertices, int vertexStride, int vertexCount, - IntPtr indices, int indexCount, int triStride); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSingle1"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSimple1(IntPtr d, - float[] vertices, int vertexStride, int vertexCount, - int[] indices, int indexCount, int triStride, - float[] normals); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataBuildSingle1"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataBuildSimple1(IntPtr d, - IntPtr vertices, int vertexStride, int vertexCount, - IntPtr indices, int indexCount, int triStride, - IntPtr normals); - - [DllImport("ode", EntryPoint = "dGeomTriMeshClearTCCache"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshClearTCCache(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomTriMeshDataCreate(); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataDestroy(IntPtr d); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataGet"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomTriMeshDataGet(IntPtr d, int data_id); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataPreprocess"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataPreprocess(IntPtr d); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataSet"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataSet(IntPtr d, int data_id, IntPtr in_data); - - [DllImport("ode", EntryPoint = "dGeomTriMeshDataUpdate"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshDataUpdate(IntPtr d); - - [DllImport("ode", EntryPoint = "dGeomTriMeshEnableTC"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshEnableTC(IntPtr g, int geomClass, bool enable); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetArrayCallback"), SuppressUnmanagedCodeSecurity] - public static extern TriArrayCallback GeomTriMeshGetArrayCallback(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetCallback"), SuppressUnmanagedCodeSecurity] - public static extern TriCallback GeomTriMeshGetCallback(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetData"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomTriMeshGetData(IntPtr g); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dGeomTriMeshGetLastTransform"), SuppressUnmanagedCodeSecurity] - public extern unsafe static Matrix4* GeomTriMeshGetLastTransformUnsafe(IntPtr geom); - public static Matrix4 GeomTriMeshGetLastTransform(IntPtr geom) - { - unsafe { return *(GeomTriMeshGetLastTransformUnsafe(geom)); } - } -#endif - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetPoint"), SuppressUnmanagedCodeSecurity] - public extern static void GeomTriMeshGetPoint(IntPtr g, int index, dReal u, dReal v, ref Vector3 outVec); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetRayCallback"), SuppressUnmanagedCodeSecurity] - public static extern TriRayCallback GeomTriMeshGetRayCallback(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetTriangle"), SuppressUnmanagedCodeSecurity] - public extern static void GeomTriMeshGetTriangle(IntPtr g, int index, ref Vector3 v0, ref Vector3 v1, ref Vector3 v2); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetTriangleCount"), SuppressUnmanagedCodeSecurity] - public extern static int GeomTriMeshGetTriangleCount(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomTriMeshGetTriMeshDataID"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr GeomTriMeshGetTriMeshDataID(IntPtr g); - - [DllImport("ode", EntryPoint = "dGeomTriMeshIsTCEnabled"), SuppressUnmanagedCodeSecurity] - public static extern bool GeomTriMeshIsTCEnabled(IntPtr g, int geomClass); - - [DllImport("ode", EntryPoint = "dGeomTriMeshSetArrayCallback"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshSetArrayCallback(IntPtr g, TriArrayCallback arrayCallback); - - [DllImport("ode", EntryPoint = "dGeomTriMeshSetCallback"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshSetCallback(IntPtr g, TriCallback callback); - - [DllImport("ode", EntryPoint = "dGeomTriMeshSetData"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshSetData(IntPtr g, IntPtr data); - - [DllImport("ode", EntryPoint = "dGeomTriMeshSetLastTransform"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshSetLastTransform(IntPtr g, ref Matrix4 last_trans); - - [DllImport("ode", EntryPoint = "dGeomTriMeshSetLastTransform"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshSetLastTransform(IntPtr g, ref dReal M00); - - [DllImport("ode", EntryPoint = "dGeomTriMeshSetRayCallback"), SuppressUnmanagedCodeSecurity] - public static extern void GeomTriMeshSetRayCallback(IntPtr g, TriRayCallback callback); - - [DllImport("ode", EntryPoint = "dHashSpaceCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr HashSpaceCreate(IntPtr space); - - [DllImport("ode", EntryPoint = "dHashSpaceGetLevels"), SuppressUnmanagedCodeSecurity] - public static extern void HashSpaceGetLevels(IntPtr space, out int minlevel, out int maxlevel); - - [DllImport("ode", EntryPoint = "dHashSpaceSetLevels"), SuppressUnmanagedCodeSecurity] - public static extern void HashSpaceSetLevels(IntPtr space, int minlevel, int maxlevel); - - [DllImport("ode", EntryPoint = "dInfiniteAABB"), SuppressUnmanagedCodeSecurity] - public static extern void InfiniteAABB(IntPtr geom, out AABB aabb); - - [DllImport("ode", EntryPoint = "dInitODE"), SuppressUnmanagedCodeSecurity] - public static extern void InitODE(); - - [DllImport("ode", EntryPoint = "dIsPositiveDefinite"), SuppressUnmanagedCodeSecurity] - public static extern int IsPositiveDefinite(ref dReal A, int n); - - [DllImport("ode", EntryPoint = "dInvertPDMatrix"), SuppressUnmanagedCodeSecurity] - public static extern int InvertPDMatrix(ref dReal A, out dReal Ainv, int n); - - [DllImport("ode", EntryPoint = "dJointAddAMotorTorques"), SuppressUnmanagedCodeSecurity] - public static extern void JointAddAMotorTorques(IntPtr joint, dReal torque1, dReal torque2, dReal torque3); - - [DllImport("ode", EntryPoint = "dJointAddHingeTorque"), SuppressUnmanagedCodeSecurity] - public static extern void JointAddHingeTorque(IntPtr joint, dReal torque); - - [DllImport("ode", EntryPoint = "dJointAddHinge2Torque"), SuppressUnmanagedCodeSecurity] - public static extern void JointAddHinge2Torques(IntPtr joint, dReal torque1, dReal torque2); - - [DllImport("ode", EntryPoint = "dJointAddPRTorque"), SuppressUnmanagedCodeSecurity] - public static extern void JointAddPRTorque(IntPtr joint, dReal torque); - - [DllImport("ode", EntryPoint = "dJointAddUniversalTorque"), SuppressUnmanagedCodeSecurity] - public static extern void JointAddUniversalTorques(IntPtr joint, dReal torque1, dReal torque2); - - [DllImport("ode", EntryPoint = "dJointAddSliderForce"), SuppressUnmanagedCodeSecurity] - public static extern void JointAddSliderForce(IntPtr joint, dReal force); - - [DllImport("ode", EntryPoint = "dJointAttach"), SuppressUnmanagedCodeSecurity] - public static extern void JointAttach(IntPtr joint, IntPtr body1, IntPtr body2); - - [DllImport("ode", EntryPoint = "dJointCreateAMotor"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateAMotor(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateBall"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateBall(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateContact"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateContact(IntPtr world, IntPtr group, ref Contact contact); - - [DllImport("ode", EntryPoint = "dJointCreateFixed"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateFixed(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateHinge"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateHinge(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateHinge2"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateHinge2(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateLMotor"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateLMotor(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateNull"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateNull(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreatePR"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreatePR(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreatePlane2D"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreatePlane2D(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateSlider"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateSlider(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointCreateUniversal"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointCreateUniversal(IntPtr world, IntPtr group); - - [DllImport("ode", EntryPoint = "dJointDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void JointDestroy(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetAMotorAngle"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetAMotorAngle(IntPtr j, int anum); - - [DllImport("ode", EntryPoint = "dJointGetAMotorAngleRate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetAMotorAngleRate(IntPtr j, int anum); - - [DllImport("ode", EntryPoint = "dJointGetAMotorAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetAMotorAxis(IntPtr j, int anum, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetAMotorAxisRel"), SuppressUnmanagedCodeSecurity] - public static extern int JointGetAMotorAxisRel(IntPtr j, int anum); - - [DllImport("ode", EntryPoint = "dJointGetAMotorMode"), SuppressUnmanagedCodeSecurity] - public static extern int JointGetAMotorMode(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetAMotorNumAxes"), SuppressUnmanagedCodeSecurity] - public static extern int JointGetAMotorNumAxes(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetAMotorParam"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetAMotorParam(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGetBallAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetBallAnchor(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetBallAnchor2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetBallAnchor2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetBody"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointGetBody(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetData"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointGetData(IntPtr j); - -#if !dNO_UNSAFE_CODE - [CLSCompliant(false)] - [DllImport("ode", EntryPoint = "dJointGetFeedback"), SuppressUnmanagedCodeSecurity] - public extern unsafe static JointFeedback* JointGetFeedbackUnsafe(IntPtr j); - public static JointFeedback JointGetFeedback(IntPtr j) - { - unsafe { return *(JointGetFeedbackUnsafe(j)); } - } -#endif - - [DllImport("ode", EntryPoint = "dJointGetHingeAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHingeAnchor(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHingeAngle"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHingeAngle(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetHingeAngleRate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHingeAngleRate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetHingeAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHingeAxis(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHingeParam"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHingeParam(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Angle1"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHinge2Angle1(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Angle1Rate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHinge2Angle1Rate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Angle2Rate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHinge2Angle2Rate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetHingeAnchor2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHingeAnchor2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Anchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHinge2Anchor(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Anchor2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHinge2Anchor2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Axis1"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHinge2Axis1(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Axis2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetHinge2Axis2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetHinge2Param"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetHinge2Param(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGetLMotorAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetLMotorAxis(IntPtr j, int anum, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetLMotorNumAxes"), SuppressUnmanagedCodeSecurity] - public static extern int JointGetLMotorNumAxes(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetLMotorParam"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetLMotorParam(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGetPRAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetPRAnchor(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetPRAxis1"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetPRAxis1(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetPRAxis2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetPRAxis2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetPRParam"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetPRParam(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGetPRPosition"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetPRPosition(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetPRPositionRate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetPRPositionRate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetSliderAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetSliderAxis(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetSliderParam"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetSliderParam(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGetSliderPosition"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetSliderPosition(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetSliderPositionRate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetSliderPositionRate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetType"), SuppressUnmanagedCodeSecurity] - public static extern JointType JointGetType(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetUniversalAnchor(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAnchor2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetUniversalAnchor2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAngle1"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetUniversalAngle1(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAngle1Rate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetUniversalAngle1Rate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAngle2"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetUniversalAngle2(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAngle2Rate"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetUniversalAngle2Rate(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAngles"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetUniversalAngles(IntPtr j, out dReal angle1, out dReal angle2); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAxis1"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetUniversalAxis1(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetUniversalAxis2"), SuppressUnmanagedCodeSecurity] - public static extern void JointGetUniversalAxis2(IntPtr j, out Vector3 result); - - [DllImport("ode", EntryPoint = "dJointGetUniversalParam"), SuppressUnmanagedCodeSecurity] - public static extern dReal JointGetUniversalParam(IntPtr j, int parameter); - - [DllImport("ode", EntryPoint = "dJointGroupCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr JointGroupCreate(int max_size); - - [DllImport("ode", EntryPoint = "dJointGroupDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void JointGroupDestroy(IntPtr group); - - [DllImport("ode", EntryPoint = "dJointGroupEmpty"), SuppressUnmanagedCodeSecurity] - public static extern void JointGroupEmpty(IntPtr group); - - [DllImport("ode", EntryPoint = "dJointSetAMotorAngle"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetAMotorAngle(IntPtr j, int anum, dReal angle); - - [DllImport("ode", EntryPoint = "dJointSetAMotorAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetAMotorAxis(IntPtr j, int anum, int rel, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetAMotorMode"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetAMotorMode(IntPtr j, int mode); - - [DllImport("ode", EntryPoint = "dJointSetAMotorNumAxes"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetAMotorNumAxes(IntPtr group, int num); - - [DllImport("ode", EntryPoint = "dJointSetAMotorParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetAMotorParam(IntPtr group, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetBallAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetBallAnchor(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetBallAnchor2"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetBallAnchor2(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetData"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetData(IntPtr j, IntPtr data); - - [DllImport("ode", EntryPoint = "dJointSetFeedback"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetFeedback(IntPtr j, out JointFeedback feedback); - - [DllImport("ode", EntryPoint = "dJointSetFixed"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetFixed(IntPtr j); - - [DllImport("ode", EntryPoint = "dJointSetHingeAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHingeAnchor(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetHingeAnchorDelta"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHingeAnchorDelta(IntPtr j, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - - [DllImport("ode", EntryPoint = "dJointSetHingeAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHingeAxis(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetHingeParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHingeParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetHinge2Anchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHinge2Anchor(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetHinge2Axis1"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHinge2Axis1(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetHinge2Axis2"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHinge2Axis2(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetHinge2Param"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetHinge2Param(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetLMotorAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetLMotorAxis(IntPtr j, int anum, int rel, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetLMotorNumAxes"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetLMotorNumAxes(IntPtr j, int num); - - [DllImport("ode", EntryPoint = "dJointSetLMotorParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetLMotorParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetPlane2DAngleParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPlane2DAngleParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetPlane2DXParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPlane2DXParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetPlane2DYParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPlane2DYParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetPRAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPRAnchor(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetPRAxis1"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPRAxis1(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetPRAxis2"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPRAxis2(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetPRParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetPRParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetSliderAxis"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetSliderAxis(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetSliderAxisDelta"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetSliderAxisDelta(IntPtr j, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - - [DllImport("ode", EntryPoint = "dJointSetSliderParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetSliderParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dJointSetUniversalAnchor"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetUniversalAnchor(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetUniversalAxis1"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetUniversalAxis1(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetUniversalAxis2"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetUniversalAxis2(IntPtr j, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dJointSetUniversalParam"), SuppressUnmanagedCodeSecurity] - public static extern void JointSetUniversalParam(IntPtr j, int parameter, dReal value); - - [DllImport("ode", EntryPoint = "dLDLTAddTL"), SuppressUnmanagedCodeSecurity] - public static extern void LDLTAddTL(ref dReal L, ref dReal d, ref dReal a, int n, int nskip); - - [DllImport("ode", EntryPoint = "dMassAdd"), SuppressUnmanagedCodeSecurity] - public static extern void MassAdd(ref Mass a, ref Mass b); - - [DllImport("ode", EntryPoint = "dMassAdjust"), SuppressUnmanagedCodeSecurity] - public static extern void MassAdjust(ref Mass m, dReal newmass); - - [DllImport("ode", EntryPoint = "dMassCheck"), SuppressUnmanagedCodeSecurity] - public static extern bool MassCheck(ref Mass m); - - [DllImport("ode", EntryPoint = "dMassRotate"), SuppressUnmanagedCodeSecurity] - public static extern void MassRotate(out Mass mass, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dMassRotate"), SuppressUnmanagedCodeSecurity] - public static extern void MassRotate(out Mass mass, ref dReal M00); - - [DllImport("ode", EntryPoint = "dMassSetBox"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetBox(out Mass mass, dReal density, dReal lx, dReal ly, dReal lz); - - [DllImport("ode", EntryPoint = "dMassSetBoxTotal"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetBoxTotal(out Mass mass, dReal total_mass, dReal lx, dReal ly, dReal lz); - - [DllImport("ode", EntryPoint = "dMassSetCapsule"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetCapsule(out Mass mass, dReal density, int direction, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dMassSetCapsuleTotal"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetCapsuleTotal(out Mass mass, dReal total_mass, int direction, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dMassSetCylinder"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetCylinder(out Mass mass, dReal density, int direction, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dMassSetCylinderTotal"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetCylinderTotal(out Mass mass, dReal total_mass, int direction, dReal radius, dReal length); - - [DllImport("ode", EntryPoint = "dMassSetParameters"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetParameters(out Mass mass, dReal themass, - dReal cgx, dReal cgy, dReal cgz, - dReal i11, dReal i22, dReal i33, - dReal i12, dReal i13, dReal i23); - - [DllImport("ode", EntryPoint = "dMassSetSphere"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetSphere(out Mass mass, dReal density, dReal radius); - - [DllImport("ode", EntryPoint = "dMassSetSphereTotal"), SuppressUnmanagedCodeSecurity] - public static extern void dMassSetSphereTotal(out Mass mass, dReal total_mass, dReal radius); - - [DllImport("ode", EntryPoint = "dMassSetTrimesh"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetTrimesh(out Mass mass, dReal density, IntPtr g); - - [DllImport("ode", EntryPoint = "dMassSetZero"), SuppressUnmanagedCodeSecurity] - public static extern void MassSetZero(out Mass mass); - - [DllImport("ode", EntryPoint = "dMassTranslate"), SuppressUnmanagedCodeSecurity] - public static extern void MassTranslate(out Mass mass, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dMultiply0"), SuppressUnmanagedCodeSecurity] - public static extern void Multiply0(out dReal A00, ref dReal B00, ref dReal C00, int p, int q, int r); - - [DllImport("ode", EntryPoint = "dMultiply1"), SuppressUnmanagedCodeSecurity] - public static extern void Multiply1(out dReal A00, ref dReal B00, ref dReal C00, int p, int q, int r); - - [DllImport("ode", EntryPoint = "dMultiply2"), SuppressUnmanagedCodeSecurity] - public static extern void Multiply2(out dReal A00, ref dReal B00, ref dReal C00, int p, int q, int r); - - [DllImport("ode", EntryPoint = "dQFromAxisAndAngle"), SuppressUnmanagedCodeSecurity] - public static extern void QFromAxisAndAngle(out Quaternion q, dReal ax, dReal ay, dReal az, dReal angle); - - [DllImport("ode", EntryPoint = "dQfromR"), SuppressUnmanagedCodeSecurity] - public static extern void QfromR(out Quaternion q, ref Matrix3 R); - - [DllImport("ode", EntryPoint = "dQMultiply0"), SuppressUnmanagedCodeSecurity] - public static extern void QMultiply0(out Quaternion qa, ref Quaternion qb, ref Quaternion qc); - - [DllImport("ode", EntryPoint = "dQMultiply1"), SuppressUnmanagedCodeSecurity] - public static extern void QMultiply1(out Quaternion qa, ref Quaternion qb, ref Quaternion qc); - - [DllImport("ode", EntryPoint = "dQMultiply2"), SuppressUnmanagedCodeSecurity] - public static extern void QMultiply2(out Quaternion qa, ref Quaternion qb, ref Quaternion qc); - - [DllImport("ode", EntryPoint = "dQMultiply3"), SuppressUnmanagedCodeSecurity] - public static extern void QMultiply3(out Quaternion qa, ref Quaternion qb, ref Quaternion qc); - - [DllImport("ode", EntryPoint = "dQSetIdentity"), SuppressUnmanagedCodeSecurity] - public static extern void QSetIdentity(out Quaternion q); - - [DllImport("ode", EntryPoint = "dQuadTreeSpaceCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr QuadTreeSpaceCreate(IntPtr space, ref Vector3 center, ref Vector3 extents, int depth); - - [DllImport("ode", EntryPoint = "dQuadTreeSpaceCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr QuadTreeSpaceCreate(IntPtr space, ref dReal centerX, ref dReal extentsX, int depth); - - [DllImport("ode", EntryPoint = "dRandReal"), SuppressUnmanagedCodeSecurity] - public static extern dReal RandReal(); - - [DllImport("ode", EntryPoint = "dRFrom2Axes"), SuppressUnmanagedCodeSecurity] - public static extern void RFrom2Axes(out Matrix3 R, dReal ax, dReal ay, dReal az, dReal bx, dReal by, dReal bz); - - [DllImport("ode", EntryPoint = "dRFromAxisAndAngle"), SuppressUnmanagedCodeSecurity] - public static extern void RFromAxisAndAngle(out Matrix3 R, dReal x, dReal y, dReal z, dReal angle); - - [DllImport("ode", EntryPoint = "dRFromEulerAngles"), SuppressUnmanagedCodeSecurity] - public static extern void RFromEulerAngles(out Matrix3 R, dReal phi, dReal theta, dReal psi); - - [DllImport("ode", EntryPoint = "dRfromQ"), SuppressUnmanagedCodeSecurity] - public static extern void RfromQ(out Matrix3 R, ref Quaternion q); - - [DllImport("ode", EntryPoint = "dRFromZAxis"), SuppressUnmanagedCodeSecurity] - public static extern void RFromZAxis(out Matrix3 R, dReal ax, dReal ay, dReal az); - - [DllImport("ode", EntryPoint = "dRSetIdentity"), SuppressUnmanagedCodeSecurity] - public static extern void RSetIdentity(out Matrix3 R); - - [DllImport("ode", EntryPoint = "dSetValue"), SuppressUnmanagedCodeSecurity] - public static extern void SetValue(out dReal a, int n); - - [DllImport("ode", EntryPoint = "dSetZero"), SuppressUnmanagedCodeSecurity] - public static extern void SetZero(out dReal a, int n); - - [DllImport("ode", EntryPoint = "dSimpleSpaceCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr SimpleSpaceCreate(IntPtr space); - - [DllImport("ode", EntryPoint = "dSolveCholesky"), SuppressUnmanagedCodeSecurity] - public static extern void SolveCholesky(ref dReal L, out dReal b, int n); - - [DllImport("ode", EntryPoint = "dSolveL1"), SuppressUnmanagedCodeSecurity] - public static extern void SolveL1(ref dReal L, out dReal b, int n, int nskip); - - [DllImport("ode", EntryPoint = "dSolveL1T"), SuppressUnmanagedCodeSecurity] - public static extern void SolveL1T(ref dReal L, out dReal b, int n, int nskip); - - [DllImport("ode", EntryPoint = "dSolveLDLT"), SuppressUnmanagedCodeSecurity] - public static extern void SolveLDLT(ref dReal L, ref dReal d, out dReal b, int n, int nskip); - - [DllImport("ode", EntryPoint = "dSpaceAdd"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceAdd(IntPtr space, IntPtr geom); - - [DllImport("ode", EntryPoint = "dSpaceClean"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceClean(IntPtr space); - - [DllImport("ode", EntryPoint = "dSpaceCollide"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceCollide(IntPtr space, IntPtr data, NearCallback callback); - - [DllImport("ode", EntryPoint = "dSpaceCollide2"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceCollide2(IntPtr space1, IntPtr space2, IntPtr data, NearCallback callback); - - [DllImport("ode", EntryPoint = "dSpaceDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceDestroy(IntPtr space); - - [DllImport("ode", EntryPoint = "dSpaceGetCleanup"), SuppressUnmanagedCodeSecurity] - public static extern bool SpaceGetCleanup(IntPtr space); - - [DllImport("ode", EntryPoint = "dSpaceGetNumGeoms"), SuppressUnmanagedCodeSecurity] - public static extern int SpaceGetNumGeoms(IntPtr space); - - [DllImport("ode", EntryPoint = "dSpaceGetGeom"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr SpaceGetGeom(IntPtr space, int i); - - [DllImport("ode", EntryPoint = "dSpaceQuery"), SuppressUnmanagedCodeSecurity] - public static extern bool SpaceQuery(IntPtr space, IntPtr geom); - - [DllImport("ode", EntryPoint = "dSpaceRemove"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceRemove(IntPtr space, IntPtr geom); - - [DllImport("ode", EntryPoint = "dSpaceSetCleanup"), SuppressUnmanagedCodeSecurity] - public static extern void SpaceSetCleanup(IntPtr space, bool mode); - - [DllImport("ode", EntryPoint = "dVectorScale"), SuppressUnmanagedCodeSecurity] - public static extern void VectorScale(out dReal a, ref dReal d, int n); - - [DllImport("ode", EntryPoint = "dWorldCreate"), SuppressUnmanagedCodeSecurity] - public static extern IntPtr WorldCreate(); - - [DllImport("ode", EntryPoint = "dWorldDestroy"), SuppressUnmanagedCodeSecurity] - public static extern void WorldDestroy(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetAutoDisableAngularThreshold"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetAutoDisableAngularThreshold(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetAutoDisableFlag"), SuppressUnmanagedCodeSecurity] - public static extern bool WorldGetAutoDisableFlag(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetAutoDisableLinearThreshold"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetAutoDisableLinearThreshold(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetAutoDisableSteps"), SuppressUnmanagedCodeSecurity] - public static extern int WorldGetAutoDisableSteps(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetAutoDisableTime"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetAutoDisableTime(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetAutoEnableDepthSF1"), SuppressUnmanagedCodeSecurity] - public static extern int WorldGetAutoEnableDepthSF1(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetCFM"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetCFM(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetERP"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetERP(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetGravity"), SuppressUnmanagedCodeSecurity] - public static extern void WorldGetGravity(IntPtr world, out Vector3 gravity); - - [DllImport("ode", EntryPoint = "dWorldGetGravity"), SuppressUnmanagedCodeSecurity] - public static extern void WorldGetGravity(IntPtr world, out dReal X); - - [DllImport("ode", EntryPoint = "dWorldGetContactMaxCorrectingVel"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetContactMaxCorrectingVel(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetContactSurfaceLayer"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetContactSurfaceLayer(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetQuickStepNumIterations"), SuppressUnmanagedCodeSecurity] - public static extern int WorldGetQuickStepNumIterations(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldGetQuickStepW"), SuppressUnmanagedCodeSecurity] - public static extern dReal WorldGetQuickStepW(IntPtr world); - - [DllImport("ode", EntryPoint = "dWorldImpulseToForce"), SuppressUnmanagedCodeSecurity] - public static extern void WorldImpulseToForce(IntPtr world, dReal stepsize, dReal ix, dReal iy, dReal iz, out Vector3 force); - - [DllImport("ode", EntryPoint = "dWorldImpulseToForce"), SuppressUnmanagedCodeSecurity] - public static extern void WorldImpulseToForce(IntPtr world, dReal stepsize, dReal ix, dReal iy, dReal iz, out dReal forceX); - - [DllImport("ode", EntryPoint = "dWorldQuickStep"), SuppressUnmanagedCodeSecurity] - public static extern void WorldQuickStep(IntPtr world, dReal stepsize); - - [DllImport("ode", EntryPoint = "dWorldSetAutoDisableAngularThreshold"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetAutoDisableAngularThreshold(IntPtr world, dReal angular_threshold); - - [DllImport("ode", EntryPoint = "dWorldSetAutoDisableFlag"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetAutoDisableFlag(IntPtr world, bool do_auto_disable); - - [DllImport("ode", EntryPoint = "dWorldSetAutoDisableLinearThreshold"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetAutoDisableLinearThreshold(IntPtr world, dReal linear_threshold); - - [DllImport("ode", EntryPoint = "dWorldSetAutoDisableSteps"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetAutoDisableSteps(IntPtr world, int steps); - - [DllImport("ode", EntryPoint = "dWorldSetAutoDisableTime"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetAutoDisableTime(IntPtr world, dReal time); - - [DllImport("ode", EntryPoint = "dWorldSetAutoEnableDepthSF1"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetAutoEnableDepthSF1(IntPtr world, int autoEnableDepth); - - [DllImport("ode", EntryPoint = "dWorldSetCFM"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetCFM(IntPtr world, dReal cfm); - - [DllImport("ode", EntryPoint = "dWorldSetContactMaxCorrectingVel"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetContactMaxCorrectingVel(IntPtr world, dReal vel); - - [DllImport("ode", EntryPoint = "dWorldSetContactSurfaceLayer"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetContactSurfaceLayer(IntPtr world, dReal depth); - - [DllImport("ode", EntryPoint = "dWorldSetERP"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetERP(IntPtr world, dReal erp); - - [DllImport("ode", EntryPoint = "dWorldSetGravity"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetGravity(IntPtr world, dReal x, dReal y, dReal z); - - [DllImport("ode", EntryPoint = "dWorldSetQuickStepNumIterations"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetQuickStepNumIterations(IntPtr world, int num); - - [DllImport("ode", EntryPoint = "dWorldSetQuickStepW"), SuppressUnmanagedCodeSecurity] - public static extern void WorldSetQuickStepW(IntPtr world, dReal over_relaxation); - - [DllImport("ode", EntryPoint = "dWorldStep"), SuppressUnmanagedCodeSecurity] - public static extern void WorldStep(IntPtr world, dReal stepsize); - - [DllImport("ode", EntryPoint = "dWorldStepFast1"), SuppressUnmanagedCodeSecurity] - public static extern void WorldStepFast1(IntPtr world, dReal stepsize, int maxiterations); - } -} diff --git a/libraries/ode-0.9/contrib/Ode.NET/Ode/premake.lua b/libraries/ode-0.9/contrib/Ode.NET/Ode/premake.lua deleted file mode 100644 index b53d54cfa8..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Ode/premake.lua +++ /dev/null @@ -1,31 +0,0 @@ -package.name = "Ode.NET" -package.kind = "dll" -package.language = "c#" - --- Build options - - package.defines = { } - - if (options["with-doubles"]) then - table.insert(package.defines, "dDOUBLE") - else - table.insert(package.defines, "dSINGLE") - end - - if (options["no-unsafe"]) then - table.insert(package.defines, "dNO_UNSAFE_CODE") - else - package.buildflags = { "unsafe" } - end - - --- Files & Libraries - - package.files = { - "AssemblyInfo.cs", - "Ode.cs" - } - - package.links = { - "System" - } diff --git a/libraries/ode-0.9/contrib/Ode.NET/README.TXT b/libraries/ode-0.9/contrib/Ode.NET/README.TXT deleted file mode 100644 index e6f1262829..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/README.TXT +++ /dev/null @@ -1,73 +0,0 @@ -Ode.NET - .NET bindings for ODE -Jason Perkins (starkos@gmail.com) - - THIS IS A WORK IN PROGRESS! I'm not done yet! - - ---------------------------------------------------------------------- - INSTALLATION ---------------------------------------------------------------------- - - Note that this binding uses a C# 2.0 feature (the - UnmanagedFunctionPointer attribute). You will need to use - Visual Studio 2005 (C# Express is fine) or Mono's gmcs - compiler. - - Start by getting or building ODE as a shared library (DLL). - - The simplest way to build the bindings is probably to create a - new library assembly in your tool of choice and drop in the files - Ode/Ode.cs and Ode/AssemblyInfo.cs. Define the symbol`dDOUBLE` if - you used double-precision math in your ode.dll. Build, done. - - For testing purposes, I have also created bindings for the - Drawstuff library and a C# version of the BoxStack demo. You can - throw all of these files into a console executable and run it to - see the demo. - - If you happen to have Premake installed (http://premake.sf.net/), - you can generate build scripts for the library with: - - premake --target (toolset) # for single precision - premake --with-doubles --target (toolset) # for double precision - - To build the test application too, use: - - premake --with-tests --target (toolset) - - To build with Mono, you must add the --dotnet parameter to enable - support .NET 2.0: - - premake --dotnet mono2 --target gnu - - ---------------------------------------------------------------------- - USAGE ---------------------------------------------------------------------- - - I have tried to keep things as close to the original C API as I can, - rather than forcing a class structure on everyone. Everything is - contained within the `Ode.NET` namespace inside a static class - named `d`. All ODE IDs are replaced with IntPtrs. A quick example: - - using Ode.NET; - - IntPtr world = d.WorldCreate(); - IntPtr body = d.BodyCreate(world); - - Take a look at Tests/BoxStack.cs for a more complete example. - - ---------------------------------------------------------------------- - KNOWN ISSUES ---------------------------------------------------------------------- - - I'm not done yet, so many functions are still missing. - - It is not possible to implement dBodyGetPosition(), dBodyGetRotation(), - etc. without resorting to unsafe code, which I was trying to avoid. - This binding uses the .NET friendly dBodyCopyPosition(), - dBodyCopyRotation(), etc. instead. - - Collision response (contact joints) do not work when built under - Mono as double-precision. I have not tried to track down why. diff --git a/libraries/ode-0.9/contrib/Ode.NET/Tests/BoxStack.cs b/libraries/ode-0.9/contrib/Ode.NET/Tests/BoxStack.cs deleted file mode 100644 index 10771246e7..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Tests/BoxStack.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System; -using System.Collections.Generic; -using Drawstuff.NET; - -namespace Ode.NET -{ -#if dDOUBLE - using dReal = System.Double; -#else - using dReal = System.Single; -#endif - - public class TestBoxStack - { - #region Description of convex shape - - static dReal[] planes = - { - 1.0f, 0.0f, 0.0f, 0.25f, - 0.0f, 1.0f, 0.0f, 0.25f, - 0.0f, 0.0f, 1.0f, 0.25f, - 0.0f, 0.0f, -1.0f, 0.25f, - 0.0f, -1.0f, 0.0f, 0.25f, - -1.0f, 0.0f , 0.0f, 0.25f - }; - - static dReal[] points = - { - 0.25f, 0.25f, 0.25f, - -0.25f, 0.25f, 0.25f, - 0.25f, -0.25f, 0.25f, - -0.25f, -0.25f, 0.25f, - 0.25f, 0.25f, -0.25f, - -0.25f,0.25f,-0.25f, - 0.25f,-0.25f,-0.25f, - -0.25f,-0.25f,-0.25f, - }; - - static int[] polygons = - { - 4, 0, 2, 6, 4, - 4, 1, 0, 4, 5, - 4, 0, 1, 3, 2, - 4, 3, 1, 5, 7, - 4, 2, 3, 7, 6, - 4, 5, 4, 6, 7, - }; - - #endregion - - const int NUM = 100; - const float DENSITY = 5.0f; - const int MAX_CONTACTS = 8; - - static IntPtr world; - static IntPtr space; - static IntPtr contactgroup; - - static Queue obj = new Queue(); - - static d.Vector3 xyz = new d.Vector3(2.1640f, -1.3079f, 1.7600f); - static d.Vector3 hpr = new d.Vector3(125.5000f, -17.0000f, 0.0000f); - - static d.NearCallback nearCallback = near; - static d.ContactGeom[] contacts = new d.ContactGeom[MAX_CONTACTS]; - static d.Contact contact; - - - // Called when window is opened - sets up viewpoint and prints usage - static void start(int unused) - { - ds.SetViewpoint(ref xyz, ref hpr); - Console.WriteLine("To drop another object, press:"); - Console.WriteLine(" b for box."); - Console.WriteLine(" s for sphere."); - Console.WriteLine(" c for capsule."); - Console.WriteLine(" y for cylinder."); - Console.WriteLine(" v for a convex object."); - Console.WriteLine(" x for a composite object."); - Console.WriteLine("To select an object, press space."); - Console.WriteLine("To disable the selected object, press d."); - Console.WriteLine("To enable the selected object, press e."); - Console.WriteLine("To toggle showing the geom AABBs, press a."); - Console.WriteLine("To toggle showing the contact points, press t."); - Console.WriteLine("To toggle dropping from random position/orientation, press r."); - Console.WriteLine("To save the current state to 'state.dif', press 1."); - } - - - // Near callback - creates contact joints - static void near(IntPtr space, IntPtr g1, IntPtr g2) - { - IntPtr b1 = d.GeomGetBody(g1); - IntPtr b2 = d.GeomGetBody(g2); - if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) - return; - - int count = d.Collide(g1, g2, MAX_CONTACTS, contacts, d.ContactGeom.SizeOf); - for (int i = 0; i < count; ++i) - { - contact.geom = contacts[i]; - IntPtr joint = d.JointCreateContact(world, contactgroup, ref contact); - d.JointAttach(joint, b1, b2); - } - } - - - // Adds a new object to the scene - attaches a body to the geom and - // sets the initial position and orientation - static void addObject(IntPtr geom, d.Mass mass) - { - // Create a body for this object - IntPtr body = d.BodyCreate(world); - d.GeomSetBody(geom, body); - d.BodySetMass(body, ref mass); - obj.Enqueue(geom); - - // Set the position of the new object - d.Matrix3 R; - d.BodySetPosition(body, d.RandReal() * 2 - 1, d.RandReal() * 2 - 1, d.RandReal() + 2); - d.RFromAxisAndAngle(out R, d.RandReal() * 2 - 1, d.RandReal() * 2 - 1, d.RandReal() * 2 - 1, d.RandReal() * 10 - 5); - d.BodySetRotation(body, ref R); - - // Cap the total number of objects - if (obj.Count > NUM) - { - geom = obj.Dequeue(); - body = d.GeomGetBody(geom); - d.BodyDestroy(body); - d.GeomDestroy(geom); - } - } - - - // Keyboard callback - static void command(int cmd) - { - IntPtr geom; - d.Mass mass; - d.Vector3 sides = new d.Vector3(d.RandReal() * 0.5f + 0.1f, d.RandReal() * 0.5f + 0.1f, d.RandReal() * 0.5f + 0.1f); - - Char ch = Char.ToLower((Char)cmd); - switch ((Char)ch) - { - case 'b': - d.MassSetBox(out mass, DENSITY, sides.X, sides.Y, sides.Z); - geom = d.CreateBox(space, sides.X, sides.Y, sides.Z); - addObject(geom, mass); - break; - - case 'c': - sides.X *= 0.5f; - d.MassSetCapsule(out mass, DENSITY, 3, sides.X, sides.Y); - geom = d.CreateCapsule(space, sides.X, sides.Y); - addObject(geom, mass); - break; - - case 'v': - d.MassSetBox(out mass, DENSITY, 0.25f, 0.25f, 0.25f); - geom = d.CreateConvex(space, planes, planes.Length / 4, points, points.Length / 3, polygons); - addObject(geom, mass); - break; - } - } - - - // Draw an object in the scene - static void drawGeom(IntPtr geom) - { - IntPtr body = d.GeomGetBody(geom); - - d.Vector3 pos; - d.BodyCopyPosition(body, out pos); - - d.Matrix3 R; - d.BodyCopyRotation(body, out R); - - d.GeomClassID type = d.GeomGetClass(geom); - switch (type) - { - case d.GeomClassID.BoxClass: - d.Vector3 sides; - d.GeomBoxGetLengths(geom, out sides); - ds.DrawBox(ref pos, ref R, ref sides); - break; - case d.GeomClassID.CapsuleClass: - dReal radius, length; - d.GeomCapsuleGetParams(geom, out radius, out length); - ds.DrawCapsule(ref pos, ref R, length, radius); - break; - case d.GeomClassID.ConvexClass: - ds.DrawConvex(ref pos, ref R, planes, planes.Length / 4, points, points.Length / 3, polygons); - break; - } - } - - - // Called once per frame; updates the scene - static void step(int pause) - { - d.SpaceCollide(space, IntPtr.Zero, nearCallback); - if (pause == 0) - d.WorldQuickStep(world, 0.02f); - d.JointGroupEmpty(contactgroup); - - ds.SetColor(1.0f, 1.0f, 0.0f); - ds.SetTexture(ds.Texture.Wood); - - foreach (IntPtr geom in obj) - { - drawGeom(geom); - } - } - - - static void Main(string[] args) - { - // Setup pointers to drawstuff callback functions - ds.Functions fn; - fn.version = ds.VERSION; - fn.start = new ds.CallbackFunction(start); - fn.step = new ds.CallbackFunction(step); - fn.command = new ds.CallbackFunction(command); - fn.stop = null; - fn.path_to_textures = "../../../../drawstuff/textures"; - if (args.Length > 0) - { - fn.path_to_textures = args[0]; - } - - // Set up contact response parameters - contact.surface.mode = d.ContactFlags.Bounce | d.ContactFlags.SoftCFM; - contact.surface.mu = d.Infinity; - contact.surface.mu2 = 0.0f; - contact.surface.bounce = 0.1f; - contact.surface.bounce_vel = 0.1f; - contact.surface.soft_cfm = 0.01f; - - // Initialize the scene - world = d.WorldCreate(); - space = d.HashSpaceCreate(IntPtr.Zero); - contactgroup = d.JointGroupCreate(0); - d.WorldSetGravity(world, 0.0f, 0.0f, -0.5f); - d.WorldSetCFM(world, 1e-5f); - d.WorldSetAutoDisableFlag(world, true); - d.WorldSetContactMaxCorrectingVel(world, 0.1f); - d.WorldSetContactSurfaceLayer(world, 0.001f); - d.CreatePlane(space, 0, 0, 1, 0); - - // Run the scene - ds.SimulationLoop(args.Length, args, 352, 288, ref fn); - - // Clean up - d.JointGroupDestroy(contactgroup); - d.SpaceDestroy(space); - d.WorldDestroy(world); - d.CloseODE(); - } - } -} diff --git a/libraries/ode-0.9/contrib/Ode.NET/Tests/premake.lua b/libraries/ode-0.9/contrib/Ode.NET/Tests/premake.lua deleted file mode 100644 index 5253ae1759..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/Tests/premake.lua +++ /dev/null @@ -1,27 +0,0 @@ --- This function creates the test packages -function maketest(name) - - package = newpackage() - package.name = name - package.kind = "exe" - package.language = "c#" - - if (options["with-doubles"]) then - package.defines = { "dDOUBLE" } - else - package.defines = { "dSINGLE " } - end - - package.links = { - "System", - "Ode.NET", - "Drawstuff.NET" - } - - package.files = { - name .. ".cs" - } - -end - -maketest("BoxStack") diff --git a/libraries/ode-0.9/contrib/Ode.NET/premake.lua b/libraries/ode-0.9/contrib/Ode.NET/premake.lua deleted file mode 100644 index c25a017ab7..0000000000 --- a/libraries/ode-0.9/contrib/Ode.NET/premake.lua +++ /dev/null @@ -1,29 +0,0 @@ -project.name = "Ode.NET" - --- Target checking - - if (target and target ~= "vs2005" and target ~= "gnu") then - error("Ode.NET requires a .NET 2.0 compiler") - end - - --- Project options - - addoption("with-doubles", "Use double instead of float as base numeric type") - addoption("with-tests", "Builds the test applications and DrawStuff library") - addoption("no-unsafe", "Exclude functions using unsafe code (dBodyGetPosition, etc.)") - - --- Build settings - - project.config["Debug"].bindir = "bin/Debug" - project.config["Release"].bindir = "bin/Release" - - --- Packages - - if (options["with-tests"]) then - dopackage("Tests") - dopackage("Drawstuff") - end - dopackage("Ode") diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/LICENSE-BSD.TXT b/libraries/ode-0.9/contrib/OdeModelProcessor/LICENSE-BSD.TXT deleted file mode 100644 index b2b19952b7..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/LICENSE-BSD.TXT +++ /dev/null @@ -1,37 +0,0 @@ - -This is the BSD-style license for The ODE Model Processor ----------------------------------------------------------- - -The ODE Model Processor -Copyright (c) 2007, Department Of Information Science, -University of Otago, Dunedin, New Zealand. -All rights reserved. - -Author: Richard Barrington - -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 names of the copyright owner 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. diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/LICENSE.TXT b/libraries/ode-0.9/contrib/OdeModelProcessor/LICENSE.TXT deleted file mode 100644 index cfe59bcadb..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/LICENSE.TXT +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor.sln b/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor.sln deleted file mode 100644 index 6a3f5214f8..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C# Express 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OdeModelProcessor", "OdeModelProcessor\OdeModelProcessor.csproj", "{246F3075-FEE3-45F9-8CB6-47DADBFFD1F2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {246F3075-FEE3-45F9-8CB6-47DADBFFD1F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {246F3075-FEE3-45F9-8CB6-47DADBFFD1F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {246F3075-FEE3-45F9-8CB6-47DADBFFD1F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {246F3075-FEE3-45F9-8CB6-47DADBFFD1F2}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/OdeModelProcessor.cs b/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/OdeModelProcessor.cs deleted file mode 100644 index 9c974eb425..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/OdeModelProcessor.cs +++ /dev/null @@ -1,354 +0,0 @@ -/* - * The ODE Model Processor - * ----------------------- - * - * Copyright 2007, Department of Information Science, - * University of Otago, Dunedin, New Zealand. - * - * Author: Richard Barrington - * - * This is a Content Processor and Tag library written for use with - * Microsoft Visual C# 2005 Express Edition and Microsoft XNA Game - * Studio Express 1.0. - * - * It can be used to read .x model vertex and index data before - * insertion into the content pipeline. This is used to build ODE - * Triangle Meshes which are then used for collision detection that - * is more accurate than the default XNA bounding boxes or spheres. - * - * Usage is simple: - * Build the library and reference the DLL in your project. - * Add the DLL to the Content Pipeline - * Set the content processor for you .x models to OdeModelProcessor. - * - * Create triangle meshes as follows: - * 1) Create a space, but only one for all of models. - * 2) Create a triangle data. - * 3) Load the model. - * 4) Retreive the tag from the model. - * 6) Build the triangle mesh by calling d.GeomTriMeshDataBuildSimple. - * - * Eg: - * IntPtr space = d.SimpleSpaceCreate(IntPtr.Zero); - * IntPtr triangleData = d.GeomTriMeshDataCreate(); - * Model obj = content.Load("Content\\mycube"); - * OdeTag tag = (OdeTag)obj.Tag; - * IntPtr vertexArray = tag.getVertices(); - * IntPtr indexArray = tag.getIndices(); - * d.GeomTriMeshDataBuildSimple - * ( - * triangleData, - * vertexArray, tag.getVertexStride(), tag.getVertexCount(), - * indexArray, tag.getIndexCount(), tag.getIndexStride() - * ); - * IntPtr triangleMesh = d.CreateTriMesh(space, triangleData, null, null, null); - * - * You can load multiple models and test for collisions with something - * like this in the update method: - * - * d.GeomSetPosition(odeTri1, obj1Position.X, obj1Position.Y, obj1Position.Z); - * d.GeomSetPosition(odeTri2, obj2Position.X, obj2Position.Y, obj2Position.Z); - * int numberOfContacts = d.Collide(odeTri1, odeTri2, ODE_CONTACTS, - * contactGeom, d.ContactGeom.SizeOf); - * - * Where odeTri1 and odeTri2 are triangle meshes you've created, obj1Position - * and obj2Position are the positions of your rendered models in the scene, - * ODE_CONTACTS is a constant defining the maximum number of contacts - * to test for, contactGeom is a d.ContactGeom[] of length ODE_CONTACTS. - * - * If numberOfContacts is greater than 0, you have a collision. - * - * Other ODE functions such as d.SpaceCollide() also work; see ODE.NET BoxTest.cs. - * - * This library is free software; you can redistribute it and/or - * modify it under the same terms as the ODE and ODE.Net libraries. - * Specifically, the terms are one of EITHER: - * - * (1) The GNU Lesser General Public License as published by the Free - * Software Foundation; either version 2.1 of the License, or (at - * your option) any later version. The text of the GNU Lesser - * General Public License is included with this library in the - * file LICENSE.TXT. - * - * (2) The BSD-style license that is included with this library in - * the file LICENSE-BSD.TXT. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files - * LICENSE.TXT and LICENSE-BSD.TXT for more details. - * - */ - -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Content; -using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Design; -using Microsoft.Xna.Framework.Content.Pipeline; -using Microsoft.Xna.Framework.Content.Pipeline.Graphics; -using Microsoft.Xna.Framework.Content.Pipeline.Processors; -using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler; -using Ode.NET; -using System.Runtime.InteropServices; - -namespace OdeModelProcessor -{ - /* - * Container for vertex and index data in a format - * that ODE.Net can use - */ - public class OdeTag - { - - private float[] vertexData; - private int[] indexData; - private const int indexStride = (sizeof(int)); - private const int vertexStride = (3 * sizeof(float)); - - /* Constructors */ - public OdeTag() - { - vertexData = new float[0]; - indexData = new int[0]; - } - - public OdeTag(float[] vertexData, int[] indexData) - { - this.vertexData = vertexData; - this.indexData = indexData; - } - - /* Data setter */ - public void setData(float[] vertexData, int[] indexData) - { - this.vertexData = vertexData; - this.indexData = indexData; - } - - /* Data appenders */ - public void appendVertexData(float[] vertexData) - { - int newVertexDataLength = vertexData.Length; - float[] tempVertexArray = new float[newVertexDataLength + this.vertexData.Length]; - this.vertexData.CopyTo(tempVertexArray, 0); - vertexData.CopyTo(tempVertexArray, this.vertexData.Length); - this.vertexData = tempVertexArray; - } - - public void appendIndexData(int[] indexData) - { - int newIndexDataLength = indexData.Length; - int[] tempIndexArray = new int[newIndexDataLength + this.indexData.Length]; - this.indexData.CopyTo(tempIndexArray, 0); - indexData.CopyTo(tempIndexArray, this.indexData.Length); - this.indexData = tempIndexArray; - } - - /* Data getters */ - public float[] getVertexData() - { - return this.vertexData; - } - - public int[] getIndexData() - { - return this.indexData; - } - - /* Native data getters */ - public IntPtr getVertices() - { - int count = getVertexData().Length; - int memsize = count * Marshal.SizeOf(getVertexData()[0].GetType()); - IntPtr pointer = Marshal.AllocCoTaskMem(memsize); - Marshal.Copy(getVertexData(), 0, pointer, count); - return pointer; - } - - public IntPtr getIndices() - { - int count = getIndexData().Length; - int memsize = count * Marshal.SizeOf(getIndexData()[0].GetType()); - IntPtr pointer = Marshal.AllocCoTaskMem(memsize); - Marshal.Copy(getIndexData(), 0, pointer, count); - return pointer; - } - - /* Count getters */ - public int getVertexCount() - { - return vertexData.Length/3; - } - - public int getIndexCount() - { - return indexData.Length; - } - - /* Stride getters */ - public int getVertexStride() - { - return vertexStride; - } - - public int getIndexStride() - { - return indexStride; - } - - /* - * Convienience method to build the mesh and return it. The triangleData - * is passed in to allow the calling application to delete it afterwards. - * - * Be sure to destroy the returned TriangleMesh in the client application. - * - * Can't destroy the index and vertex arrays here though, so best to handle - * this manually - only use this method if nothing else makes sense. - */ - public IntPtr getTriangleMesh(IntPtr space, IntPtr triangleData) - { - d.GeomTriMeshDataBuildSimple( - triangleData, - getVertices(), getVertexStride(), getVertexCount(), - getIndices(), getIndexCount(), getIndexStride() - ); - return d.CreateTriMesh(space, triangleData, null, null, null); - } - - } - - /* - * Subclass of the XNA .x model processor, which creates and appends a tag - * containing vertex and index data for ODE.Net to use. - */ - [ContentProcessor] - public class OdeModelProcessor : ModelProcessor - { - private OdeTag tag; - private int indexOffset = 0; - - public override ModelContent Process(NodeContent input, ContentProcessorContext context) - { - tag = new OdeTag(); - GenerateVerticesRecursive( input ); - ModelContent model = base.Process(input, context); - model.Tag = tag; - indexOffset = 0; - return model; - } - - public void GenerateVerticesRecursive(NodeContent input) - { - - MeshContent mesh = input as MeshContent; - - if (mesh != null) - { - GeometryContentCollection gc = mesh.Geometry; - foreach (GeometryContent g in gc) - { - VertexContent vc = g.Vertices; - IndirectPositionCollection ipc = vc.Positions; - IndexCollection ic = g.Indices; - - float[] vertexData = new float[ipc.Count * 3]; - for (int i = 0; i < ipc.Count; i++) - { - - Vector3 v0 = ipc[i]; - vertexData[(i * 3) + 0] = v0.X; - vertexData[(i * 3) + 1] = v0.Y; - vertexData[(i * 3) + 2] = v0.Z; - - } - - int[] indexData = new int[ic.Count]; - for (int j = 0; j < ic.Count; j ++) - { - - indexData[j] = ic[j] + indexOffset; - - } - - tag.appendVertexData(vertexData); - tag.appendIndexData(indexData); - indexOffset += ipc.Count; - } - - } - - foreach (NodeContent child in input.Children) - { - GenerateVerticesRecursive(child); - } - - } - - } - - /* Writer for the OdeTag class */ - [ContentTypeWriter] - public class OdeTagWriter : ContentTypeWriter - { - - protected override void Write(ContentWriter output, OdeTag value) - { - float[] vertexData = value.getVertexData(); - int[] indexData = value.getIndexData(); - output.Write(vertexData.Length); - output.Write(indexData.Length); - for (int j = 0; j < vertexData.Length; j++) - { - output.Write(vertexData[j]); - } - for (int i = 0; i < indexData.Length; i++) - { - output.Write(indexData[i]); - } - } - - public override string GetRuntimeType(TargetPlatform targetPlatform) - { - return typeof(OdeTag).AssemblyQualifiedName; - } - - public override string GetRuntimeReader(TargetPlatform targetPlatform) - { - return "OdeModelProcessor.OdeTagReader, OdeModelProcessor, Version=1.0.0.0, Culture=neutral"; - } - - } - - /* Reader for the OdeTag class */ - public class OdeTagReader : ContentTypeReader - { - protected override OdeTag Read(ContentReader input, OdeTag existingInstance) - { - float[] vertexData = new float[input.ReadInt32()]; - int[] indexData = new int[input.ReadInt32()]; - for (int j = 0; j < vertexData.Length; j++) - { - vertexData[j] = input.ReadSingle(); - } - for (int i = 0; i < indexData.Length; i++) - { - indexData[i] = input.ReadInt32(); - } - - OdeTag tag = null; - if (existingInstance == null) - { - tag = new OdeTag(vertexData, indexData); - } - else - { - tag = existingInstance; - tag.setData(vertexData, indexData); - } - return tag; - } - } -} diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/OdeModelProcessor.csproj b/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/OdeModelProcessor.csproj deleted file mode 100644 index 3a36a1251c..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/OdeModelProcessor.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {246F3075-FEE3-45F9-8CB6-47DADBFFD1F2} - Library - Properties - OdeModelProcessor - OdeModelProcessor - - - true - full - false - bin\Debug\ - DEBUG - prompt - 4 - false - false - - - pdbonly - true - bin\Release\ - - - prompt - 4 - false - false - - - - - - False - ..\..\ODE\Ode.NET-0.8\bin\Release\Ode.NET.dll - - - - - - - - - - True - True - Settings.settings - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/AssemblyInfo.cs b/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/AssemblyInfo.cs deleted file mode 100644 index 1ecad3ecc2..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OdeModelProcessor")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("OdeModelProcessor")] -[assembly: AssemblyCopyright("Copyright © 2007")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("29c5609a-cd5f-480b-b4ef-5c11de022268")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/Settings.Designer.cs b/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/Settings.Designer.cs deleted file mode 100755 index 6ab60a8ee4..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.832 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace OdeModelProcessor.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/Settings.settings b/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/Settings.settings deleted file mode 100755 index 15034e76c4..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/OdeModelProcessor/Properties/Settings.settings +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/libraries/ode-0.9/contrib/OdeModelProcessor/README.TXT b/libraries/ode-0.9/contrib/OdeModelProcessor/README.TXT deleted file mode 100644 index 97683f95bb..0000000000 --- a/libraries/ode-0.9/contrib/OdeModelProcessor/README.TXT +++ /dev/null @@ -1,78 +0,0 @@ -The ODE Model Processor ------------------------ - -Copyright 2007, Department of Information Science, -University of Otago, Dunedin, New Zealand. - -Author: Richard Barrington - -This is a Content Processor and Tag library written for use with -Microsoft Visual C# 2005 Express Edition and Microsoft XNA Game -Studio Express 1.0. - -It can be used to read .x model vertex and index data before -insertion into the content pipeline. This is used to build ODE -Triangle Meshes which are then used for collision detection that -is more accurate than the default XNA bounding boxes or spheres. - -Usage is fairly simple: -Build the library and reference the DLL in your project. -Add the DLL to the Content Pipeline -Set the content processor for you .x models to OdeModelProcessor. - -Create triangle meshes as follows: -1) Create a space, but only one for all of models. -2) Create a triangle data. -3) Load the model. -4) Retreive the tag from the model. -6) Build the triangle mesh by calling d.GeomTriMeshDataBuildSimple. - -Eg: -IntPtr space = d.SimpleSpaceCreate(IntPtr.Zero); -IntPtr triangleData = d.GeomTriMeshDataCreate(); -Model obj = content.Load("Content\\mycube"); -OdeTag tag = (OdeTag)obj.Tag; -IntPtr vertexArray = tag.getVertices(); -IntPtr indexArray = tag.getIndices(); -d.GeomTriMeshDataBuildSimple -( - triangleData, - vertexArray, tag.getVertexStride(), tag.getVertexCount(), - indexArray, tag.getIndexCount(), tag.getIndexStride() -); -IntPtr triangleMesh = d.CreateTriMesh(space, triangleData, null, null, null); - -You can load multiple models and test for collisions with something -like this in the update method: - -d.GeomSetPosition(odeTri1, obj1Position.X, obj1Position.Y, obj1Position.Z); -d.GeomSetPosition(odeTri2, obj2Position.X, obj2Position.Y, obj2Position.Z); -int numberOfContacts = d.Collide(odeTri1, odeTri2, ODE_CONTACTS, - contactGeom, d.ContactGeom.SizeOf); - -Where odeTri1 and odeTri2 are triangle meshes you've created, obj1Position -and obj2Position are the positions of your rendered models in the scene, -ODE_CONTACTS is a constant defining the maximum number of contacts -to test for, contactGeom is a d.ContactGeom[] of length ODE_CONTACTS. - -If numberOfContacts is greater than 0, you have a collision. - -Other ODE functions such as d.SpaceCollide() also work; see ODE.NET BoxTest.cs. - -This library is free software; you can redistribute it and/or -modify it under the same terms as the ODE and ODE.Net libraries. -Specifically, the terms are one of EITHER: - - (1) The GNU Lesser General Public License as published by the Free - Software Foundation; either version 2.1 of the License, or (at - your option) any later version. The text of the GNU Lesser - General Public License is included with this library in the - file LICENSE.TXT. - - (2) The BSD-style license that is included with this library in - the file LICENSE-BSD.TXT. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files -LICENSE.TXT and LICENSE-BSD.TXT for more details. diff --git a/libraries/ode-0.9/contrib/README b/libraries/ode-0.9/contrib/README deleted file mode 100644 index dbfaf7f365..0000000000 --- a/libraries/ode-0.9/contrib/README +++ /dev/null @@ -1,19 +0,0 @@ -This directory contains ODE-related things that have been generously -contributed by ODE's users. Why is this stuff here and not integrated -into the main ODE source tree? There may be several reasons: - - * The author(s) and ODE maintainers(s) may not have had time to do - the job. - - * It may not be finished. - - * It may contribute functionality that is useful but not considered - to be part of ODE's core. - -No guarantees are made about the code in this directory - it may not -be documented, it may not have been tested, and it may not even -compile for you. - -Each package has its own subdirectory, with a README file in that -directory explaining what the package is. - diff --git a/libraries/ode-0.9/contrib/TerrainAndCone/collision_std_internal.h b/libraries/ode-0.9/contrib/TerrainAndCone/collision_std_internal.h deleted file mode 100644 index b445353533..0000000000 --- a/libraries/ode-0.9/contrib/TerrainAndCone/collision_std_internal.h +++ /dev/null @@ -1,100 +0,0 @@ -//Benoit CHAPEROT 2003-2004 www.jstarlab.com -#ifndef _ODE_COLLISION_STD_INTERNAL_H_ -#define _ODE_COLLISION_STD_INTERNAL_H_ - -#include -#include "collision_kernel.h" - -struct dxSphere : public dxGeom { - dReal radius; // sphere radius - dxSphere (dSpaceID space, dReal _radius); - void computeAABB(); -}; - - -struct dxBox : public dxGeom { - dVector3 side; // side lengths (x,y,z) - dxBox (dSpaceID space, dReal lx, dReal ly, dReal lz); - void computeAABB(); -}; - - -struct dxCCylinder : public dxGeom { - dReal radius,lz; // radius, length along z axis - dxCCylinder (dSpaceID space, dReal _radius, dReal _length); - void computeAABB(); -}; - - -struct dxPlane : public dxGeom { - dReal p[4]; - dxPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d); - void computeAABB(); -}; - -struct dxCylinder : public dxGeom { - dReal radius,lz; // radius, length along z axis - dxCylinder (dSpaceID space, dReal _radius, dReal _length); - void computeAABB(); -}; - -struct dxCone : public dxGeom { - dReal radius,lz; - dxCone(dSpaceID space, dReal _radius,dReal _length); - ~dxCone(); - void computeAABB(); -}; - -struct dxRay : public dxGeom { - dReal length; - dxRay (dSpaceID space, dReal _length); - void computeAABB(); -}; - -struct dxTerrainY : public dxGeom { - dReal m_vLength; - dReal *m_pHeights; - dReal m_vMinHeight; - dReal m_vMaxHeight; - dReal m_vNodeLength; - int m_nNumNodesPerSide; - int m_nNumNodesPerSideShift; - int m_nNumNodesPerSideMask; - int m_bFinite; - dxTerrainY(dSpaceID space, dReal *pHeights,dReal vLength,int nNumNodesPerSide, int bFinite, int bPlaceable); - ~dxTerrainY(); - void computeAABB(); - dReal GetHeight(dReal x,dReal z); - dReal GetHeight(int x,int z); - int dCollideTerrainUnit(int x,int z,dxGeom *o2,int numMaxContacts,int flags,dContactGeom *contact, int skip); - bool IsOnTerrain(int nx,int nz,int w,dReal *pos); -}; - -struct dxTerrainZ : public dxGeom { - dReal m_vLength; - dReal *m_pHeights; - dReal m_vMinHeight; - dReal m_vMaxHeight; - dReal m_vNodeLength; - int m_nNumNodesPerSide; - int m_nNumNodesPerSideShift; - int m_nNumNodesPerSideMask; - int m_bFinite; - dxTerrainZ(dSpaceID space, dReal *pHeights,dReal vLength,int nNumNodesPerSide, int bFinite, int bPlaceable); - ~dxTerrainZ(); - void computeAABB(); - dReal GetHeight(dReal x,dReal y); - dReal GetHeight(int x,int y); - int dCollideTerrainUnit(int x,int y,dxGeom *o2,int numMaxContacts,int flags,dContactGeom *contact, int skip); - bool IsOnTerrain(int nx,int ny,int w,dReal *pos); -}; - -#ifndef MIN -#define MIN(a,b) ((ab)?a:b) -#endif - -#endif //_ODE_COLLISION_STD_INTERNAL_H_ \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/TerrainAndCone/dCone.cpp b/libraries/ode-0.9/contrib/TerrainAndCone/dCone.cpp deleted file mode 100644 index 8c5c3be99f..0000000000 --- a/libraries/ode-0.9/contrib/TerrainAndCone/dCone.cpp +++ /dev/null @@ -1,504 +0,0 @@ -//Benoit CHAPEROT 2003-2004 www.jstarlab.com -//some code inspired by Magic Software -#include -#include -#include -#include -#include -#include "collision_kernel.h" -#include "collision_std.h" -#include "collision_std_internal.h" -#include "collision_util.h" -#include -#include "windows.h" -#include "ode\ode.h" - -#define CONTACT(p,skip) ((dContactGeom*) (((char*)p) + (skip))) -const dReal fEPSILON = 1e-9f; - -dxCone::dxCone (dSpaceID space, dReal _radius,dReal _length) : -dxGeom (space,1) -{ - dAASSERT(_radius > 0.f); - dAASSERT(_length > 0.f); - type = dConeClass; - radius = _radius; - lz = _length; -} - -dxCone::~dxCone() -{ -} - -void dxCone::computeAABB() -{ - const dMatrix3& R = final_posr->R; - const dVector3& pos = final_posr->pos; - - dReal xrange = dFabs(R[2] * lz) + radius; - dReal yrange = dFabs(R[6] * lz) + radius; - dReal zrange = dFabs(R[10] * lz) + radius; - aabb[0] = pos[0] - xrange; - aabb[1] = pos[0] + xrange; - aabb[2] = pos[1] - yrange; - aabb[3] = pos[1] + yrange; - aabb[4] = pos[2] - zrange; - aabb[5] = pos[2] + zrange; -} - -dGeomID dCreateCone(dSpaceID space, dReal _radius,dReal _length) -{ - return new dxCone(space,_radius,_length); -} - -void dGeomConeSetParams (dGeomID g, dReal _radius, dReal _length) -{ - dUASSERT (g && g->type == dConeClass,"argument not a cone"); - dAASSERT (_radius > 0.f); - dAASSERT (_length > 0.f); - g->recomputePosr(); - dxCone *c = (dxCone*) g; - c->radius = _radius; - c->lz = _length; - dGeomMoved (g); -} - - -void dGeomConeGetParams (dGeomID g, dReal *_radius, dReal *_length) -{ - dUASSERT (g && g->type == dConeClass,"argument not a cone"); - g->recomputePosr(); - dxCone *c = (dxCone*) g; - *_radius = c->radius; - *_length = c->lz; -} - -//positive inside -dReal dGeomConePointDepth(dGeomID g, dReal x, dReal y, dReal z) -{ - dUASSERT (g && g->type == dConeClass,"argument not a cone"); - - g->recomputePosr(); - dxCone *cone = (dxCone*) g; - - dVector3 tmp,q; - tmp[0] = x - cone->final_posr->pos[0]; - tmp[1] = y - cone->final_posr->pos[1]; - tmp[2] = z - cone->final_posr->pos[2]; - dMULTIPLY1_331 (q,cone->final_posr->R,tmp); - - dReal r = cone->radius; - dReal h = cone->lz; - - dReal d0 = (r - r*q[2]/h) - dSqrt(q[0]*q[0]+q[1]*q[1]); - dReal d1 = q[2]; - dReal d2 = h-q[2]; - - if (d0 < d1) { - if (d0 < d2) return d0; else return d2; - } - else { - if (d1 < d2) return d1; else return d2; - } -} - -//plane plane -bool FindIntersectionPlanePlane(const dReal Plane0[4], const dReal Plane1[4], - dVector3 LinePos,dVector3 LineDir) -{ - // If Cross(N0,N1) is zero, then either planes are parallel and separated - // or the same plane. In both cases, 'false' is returned. Otherwise, - // the intersection line is - // - // L(t) = t*Cross(N0,N1) + c0*N0 + c1*N1 - // - // for some coefficients c0 and c1 and for t any real number (the line - // parameter). Taking dot products with the normals, - // - // d0 = Dot(N0,L) = c0*Dot(N0,N0) + c1*Dot(N0,N1) - // d1 = Dot(N1,L) = c0*Dot(N0,N1) + c1*Dot(N1,N1) - // - // which are two equations in two unknowns. The solution is - // - // c0 = (Dot(N1,N1)*d0 - Dot(N0,N1)*d1)/det - // c1 = (Dot(N0,N0)*d1 - Dot(N0,N1)*d0)/det - // - // where det = Dot(N0,N0)*Dot(N1,N1)-Dot(N0,N1)^2. -/* - Real fN00 = rkPlane0.Normal().SquaredLength(); - Real fN01 = rkPlane0.Normal().Dot(rkPlane1.Normal()); - Real fN11 = rkPlane1.Normal().SquaredLength(); - Real fDet = fN00*fN11 - fN01*fN01; - - if ( Math::FAbs(fDet) < gs_fEpsilon ) - return false; - - Real fInvDet = 1.0f/fDet; - Real fC0 = (fN11*rkPlane0.Constant() - fN01*rkPlane1.Constant())*fInvDet; - Real fC1 = (fN00*rkPlane1.Constant() - fN01*rkPlane0.Constant())*fInvDet; - - rkLine.Direction() = rkPlane0.Normal().Cross(rkPlane1.Normal()); - rkLine.Origin() = fC0*rkPlane0.Normal() + fC1*rkPlane1.Normal(); - return true; -*/ - dReal fN00 = dLENGTHSQUARED(Plane0); - dReal fN01 = dDOT(Plane0,Plane1); - dReal fN11 = dLENGTHSQUARED(Plane1); - dReal fDet = fN00*fN11 - fN01*fN01; - - if ( fabs(fDet) < fEPSILON) - return false; - - dReal fInvDet = 1.0f/fDet; - dReal fC0 = (fN11*Plane0[3] - fN01*Plane1[3])*fInvDet; - dReal fC1 = (fN00*Plane1[3] - fN01*Plane0[3])*fInvDet; - - dCROSS(LineDir,=,Plane0,Plane1); - dNormalize3(LineDir); - - dVector3 Temp0,Temp1; - dOPC(Temp0,*,Plane0,fC0); - dOPC(Temp1,*,Plane1,fC1); - dOP(LinePos,+,Temp0,Temp1); - - return true; -} - -//plane ray -bool FindIntersectionPlaneRay(const dReal Plane[4], - const dVector3 &LinePos,const dVector3 &LineDir, - dReal &u,dVector3 &Pos) -{ -/* - u = (A*X1 + B*Y1 + C*Z1 + D) / (A*(X1-X2) + B*(Y1-Y2)+C*(Z1-Z2)) -*/ - dReal fDet = -dDot(Plane,LineDir,3); - - if ( fabs(fDet) < fEPSILON) - return false; - - u = (dDot(Plane,LinePos,3) - Plane[3]) / fDet; - dOPC(Pos,*,LineDir,u); - dOPE(Pos,+=,LinePos); - - return true; -} - -int SolveQuadraticPolynomial(dReal a,dReal b,dReal c,dReal &x0,dReal &x1) -{ - dReal d = b*b - 4*a*c; - int NumRoots = 0; - dReal dr; - - if (d < 0.f) - return NumRoots; - - if (d == 0.f) - { - NumRoots = 1; - dr = 0.f; - } - else - { - NumRoots = 2; - dr = sqrtf(d); - } - - x0 = (-b -dr) / (2.f * a); - x1 = (-b +dr) / (2.f * a); - - return NumRoots; -} -/* -const int VALID_INTERSECTION = 1<<0; -const int POS_TEST_FAILEDT0 = 1<<0; -const int POS_TEST_FAILEDT1 = 1<<1; -*/ -int ProcessConeRayIntersectionPoint( dReal r,dReal h, - const dVector3 &q,const dVector3 &v,dReal t, - dVector3 &p, - dVector3 &n, - int &f) -{ - dOPC(p,*,v,t); - dOPE(p,+=,q); - n[0] = 2*p[0]; - n[1] = 2*p[1]; - n[2] = -2*p[2]*r*r/(h*h); - - f = 0; - if (p[2] > h) return 0; - if (p[2] < 0) return 0; - if (t > 1) return 0; - if (t < 0) return 0; - - return 1; -} - -//cone ray -//line in cone space (position,direction) -//distance from line position (direction normalized)(if any) -//return the number of intersection -int FindIntersectionConeRay(dReal r,dReal h, - const dVector3 &q,const dVector3 &v,dContactGeom *pContact) -{ - dVector3 qp,vp; - dOPE(qp,=,q); - dOPE(vp,=,v); - qp[2] = h-q[2]; - vp[2] = -v[2]; - dReal ts = (r/h); - ts *= ts; - dReal a = vp[0]*vp[0] + vp[1]*vp[1] - ts*vp[2]*vp[2]; - dReal b = 2.f*qp[0]*vp[0] + 2.f*qp[1]*vp[1] - 2.f*ts*qp[2]*vp[2]; - dReal c = qp[0]*qp[0] + qp[1]*qp[1] - ts*qp[2]*qp[2]; - -/* - dReal a = v[0]*v[0] + v[1]*v[1] - (v[2]*v[2]*r*r) / (h*h); - dReal b = 2.f*q[0]*v[0] + 2.f*q[1]*v[1] + 2.f*r*r*v[2]/h - 2*r*r*q[0]*v[0]/(h*h); - dReal c = q[0]*q[0] + q[1]*q[1] + 2*r*r*q[2]/h - r*r*q[2]/(h*h) - r*r; -*/ - int nNumRoots=SolveQuadraticPolynomial(a,b,c,pContact[0].depth,pContact[1].depth); - int flag = 0; - - dContactGeom ValidContact[2]; - - int nNumValidContacts = 0; - for (int i=0;i=0) && (d<=1)) - { - dOPC(vp,*,v,d); - dOP(qp,+,q,vp); - - if (qp[0]*qp[0]+qp[1]*qp[1] < r*r) - { - dOPE(ValidContact[nNumValidContacts].pos,=,qp); - ValidContact[nNumValidContacts].normal[0] = 0.f; - ValidContact[nNumValidContacts].normal[1] = 0.f; - ValidContact[nNumValidContacts].normal[2] = -1.f; - ValidContact[nNumValidContacts].depth = d; - nNumValidContacts++; - } - } - } - - if (nNumValidContacts == 2) - { - if (ValidContact[0].depth > ValidContact[1].depth) - { - pContact[0] = ValidContact[1]; - pContact[1] = ValidContact[0]; - } - else - { - pContact[0] = ValidContact[0]; - pContact[1] = ValidContact[1]; - } - } - else if (nNumValidContacts == 1) - { - pContact[0] = ValidContact[0]; - } - - return nNumValidContacts; -} - -int dCollideConePlane (dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dConeClass); - dIASSERT (o2->type == dPlaneClass); - dxCone *cone = (dxCone*) o1; - dxPlane *plane = (dxPlane*) o2; - - contact->g1 = o1; - contact->g2 = o2; - - dVector3 p0,p1,pp0,pp1; - dOPE(p0,=,cone->final_posr->pos); - p1[0] = cone->final_posr->R[0*4+2] * cone->lz + p0[0]; - p1[1] = cone->final_posr->R[1*4+2] * cone->lz + p0[1]; - p1[2] = cone->final_posr->R[2*4+2] * cone->lz + p0[2]; - - dReal u; - FindIntersectionPlaneRay(plane->p,p0,plane->p,u,pp0); - FindIntersectionPlaneRay(plane->p,p1,plane->p,u,pp1); - - if (dDISTANCE(pp0,pp1) < fEPSILON) - { - p1[0] = cone->final_posr->R[0*4+0] * cone->lz + p0[0]; - p1[1] = cone->final_posr->R[1*4+0] * cone->lz + p0[1]; - p1[2] = cone->final_posr->R[2*4+0] * cone->lz + p0[2]; - FindIntersectionPlaneRay(plane->p,p1,plane->p,u,pp1); - dIASSERT(dDISTANCE(pp0,pp1) >= fEPSILON); - } - dVector3 h,r0,r1; - h[0] = cone->final_posr->R[0*4+2]; - h[1] = cone->final_posr->R[1*4+2]; - h[2] = cone->final_posr->R[2*4+2]; - - dOP(r0,-,pp0,pp1); - dCROSS(r1,=,h,r0); - dCROSS(r0,=,r1,h); - dNormalize3(r0); - dOPEC(h,*=,cone->lz); - dOPEC(r0,*=,cone->radius); - - dVector3 p[3]; - dOP(p[0],+,cone->final_posr->pos,h); - dOP(p[1],+,cone->final_posr->pos,r0); - dOP(p[2],-,cone->final_posr->pos,r0); - - int numMaxContacts = flags & 0xffff; - if (numMaxContacts == 0) - numMaxContacts = 1; - - int n=0; - for (int i=0;i<3;i++) - { - dReal d = dGeomPlanePointDepth(o2, p[i][0], p[i][1], p[i][2]); - - if (d>0.f) - { - CONTACT(contact,n*skip)->g1 = o1; - CONTACT(contact,n*skip)->g2 = o2; - dOPE(CONTACT(contact,n*skip)->normal,=,plane->p); - dOPE(CONTACT(contact,n*skip)->pos,=,p[i]); - CONTACT(contact,n*skip)->depth = d; - n++; - - if (n == numMaxContacts) - return n; - } - } - - return n; -} - -int dCollideRayCone (dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dRayClass); - dIASSERT (o2->type == dConeClass); - dxRay *ray = (dxRay*) o1; - dxCone *cone = (dxCone*) o2; - - contact->g1 = o1; - contact->g2 = o2; - - dVector3 tmp,q,v; - tmp[0] = ray->final_posr->pos[0] - cone->final_posr->pos[0]; - tmp[1] = ray->final_posr->pos[1] - cone->final_posr->pos[1]; - tmp[2] = ray->final_posr->pos[2] - cone->final_posr->pos[2]; - dMULTIPLY1_331 (q,cone->final_posr->R,tmp); - tmp[0] = ray->final_posr->R[0*4+2] * ray->length; - tmp[1] = ray->final_posr->R[1*4+2] * ray->length; - tmp[2] = ray->final_posr->R[2*4+2] * ray->length; - dMULTIPLY1_331 (v,cone->final_posr->R,tmp); - - dReal r = cone->radius; - dReal h = cone->lz; - - dContactGeom Contact[2]; - - if (FindIntersectionConeRay(r,h,q,v,Contact)) - { - dMULTIPLY0_331(contact->normal,cone->final_posr->R,Contact[0].normal); - dMULTIPLY0_331(contact->pos,cone->final_posr->R,Contact[0].pos); - dOPE(contact->pos,+=,cone->final_posr->pos); - contact->depth = Contact[0].depth * dLENGTH(v); -/* - dMatrix3 RI; - dRSetIdentity (RI); - dVector3 ss; - ss[0] = 0.01f; - ss[1] = 0.01f; - ss[2] = 0.01f; - - dsSetColorAlpha (1,0,0,0.8f); - dsDrawBox(contact->pos,RI,ss); -*/ - return 1; - } - - return 0; -} - -int dCollideConeSphere(dxGeom *o1, dxGeom *o2, int flags, dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dConeClass); - dIASSERT (o2->type == dSphereClass); - dxCone *cone = (dxCone*) o1; - - dxSphere ASphere(0,cone->radius); - dGeomSetRotation(&ASphere,cone->final_posr->R); - dGeomSetPosition(&ASphere,cone->final_posr->pos[0],cone->final_posr->pos[1],cone->final_posr->pos[2]); - - return dCollideSphereSphere(&ASphere, o2, flags, contact, skip); -} - -int dCollideConeBox(dxGeom *o1, dxGeom *o2, int flags, dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dConeClass); - dIASSERT (o2->type == dBoxClass); - dxCone *cone = (dxCone*) o1; - - dxSphere ASphere(0,cone->radius); - dGeomSetRotation(&ASphere,cone->final_posr->R); - dGeomSetPosition(&ASphere,cone->final_posr->pos[0],cone->final_posr->pos[1],cone->final_posr->pos[2]); - - return dCollideSphereBox(&ASphere, o2, flags, contact, skip); -} - -int dCollideCCylinderCone(dxGeom *o1, dxGeom *o2, int flags, dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dCCylinderClass); - dIASSERT (o2->type == dConeClass); - dxCone *cone = (dxCone*) o2; - - dxSphere ASphere(0,cone->radius); - dGeomSetRotation(&ASphere,cone->final_posr->R); - dGeomSetPosition(&ASphere,cone->final_posr->pos[0],cone->final_posr->pos[1],cone->final_posr->pos[2]); - - return dCollideCCylinderSphere(o1, &ASphere, flags, contact, skip); -} - -extern int dCollideSTL(dxGeom *o1, dxGeom *o2, int flags, dContactGeom *contact, int skip); - -int dCollideTriMeshCone(dxGeom *o1, dxGeom *o2, int flags, dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dTriMeshClass); - dIASSERT (o2->type == dConeClass); - dxCone *cone = (dxCone*) o2; - - dxSphere ASphere(0,cone->radius); - dGeomSetRotation(&ASphere,cone->final_posr->R); - dGeomSetPosition(&ASphere,cone->final_posr->pos[0],cone->final_posr->pos[1],cone->final_posr->pos[2]); - - return dCollideSTL(o1, &ASphere, flags, contact, skip); -} - - - - - diff --git a/libraries/ode-0.9/contrib/TerrainAndCone/dTerrainY.cpp b/libraries/ode-0.9/contrib/TerrainAndCone/dTerrainY.cpp deleted file mode 100644 index ff779ace4e..0000000000 --- a/libraries/ode-0.9/contrib/TerrainAndCone/dTerrainY.cpp +++ /dev/null @@ -1,662 +0,0 @@ -//Benoit CHAPEROT 2003-2004 www.jstarlab.com -//some code inspired by Magic Software -#include -#include -#include -#include -#include -#include "collision_kernel.h" -#include "collision_std.h" -#include "collision_std_internal.h" -#include "collision_util.h" -//#include -#include "windows.h" -#include "ode\ode.h" - -#define CONTACT(p,skip) ((dContactGeom*) (((char*)p) + (skip))) -#define MAXCONTACT 10 -#define TERRAINTOL 0.0f - -static bool IsAPowerOfTwo(int f) -{ - dAASSERT(f!=0); - while ((f&1) != 1) - f >>= 1; - - return (f == 1); -} - -static int GetPowerOfTwo(int f) -{ - dAASSERT(f!=0); - int n = 0; - while ((f&1) != 1) - { - n++; - f >>= 1; - } - - return n; -} - -dxTerrainY::dxTerrainY (dSpaceID space, dReal *pHeights,dReal vLength,int nNumNodesPerSide, int bFinite, int bPlaceable) : -dxGeom (space,bPlaceable) -{ - dIASSERT(IsAPowerOfTwo(nNumNodesPerSide)); - dIASSERT(pHeights); - dIASSERT(vLength > 0.f); - dIASSERT(nNumNodesPerSide > 0); - type = dTerrainYClass; - m_vLength = vLength; - m_pHeights = new dReal[nNumNodesPerSide * nNumNodesPerSide]; - dIASSERT(m_pHeights); - m_nNumNodesPerSide = nNumNodesPerSide; - m_vNodeLength = m_vLength / m_nNumNodesPerSide; - m_nNumNodesPerSideShift = GetPowerOfTwo(m_nNumNodesPerSide); - m_nNumNodesPerSideMask = m_nNumNodesPerSide - 1; - m_vMinHeight = dInfinity; - m_vMaxHeight = -dInfinity; - m_bFinite = bFinite; - - for (int i=0;i m_vMaxHeight) m_vMaxHeight = m_pHeights[i]; - } -} - -dxTerrainY::~dxTerrainY() -{ - dIASSERT(m_pHeights); - delete [] m_pHeights; -} - -void dxTerrainY::computeAABB() -{ - if (m_bFinite) - { - if (gflags & GEOM_PLACEABLE) - { - dReal dx[6],dy[6],dz[6]; - dx[0] = 0; - dx[1] = final_posr->R[0] * m_vLength; - dx[2] = final_posr->R[1] * m_vMinHeight; - dx[3] = final_posr->R[1] * m_vMaxHeight; - dx[4] = 0; - dx[5] = final_posr->R[2] * m_vLength; - - dy[0] = 0; - dy[1] = final_posr->R[4] * m_vLength; - dy[2] = final_posr->R[5] * m_vMinHeight; - dy[3] = final_posr->R[5] * m_vMaxHeight; - dy[4] = 0; - dy[5] = final_posr->R[6] * m_vLength; - - dz[0] = 0; - dz[1] = final_posr->R[8] * m_vLength; - dz[2] = final_posr->R[9] * m_vMinHeight; - dz[3] = final_posr->R[9] * m_vMaxHeight; - dz[4] = 0; - dz[5] = final_posr->R[10] * m_vLength; - - aabb[0] = final_posr->pos[0] + MIN(dx[0],dx[1]) + MIN(dx[2],dx[3]) + MIN(dx[4],dx[5]); - aabb[1] = final_posr->pos[0] + MAX(dx[0],dx[1]) + MAX(dx[2],dx[3]) + MAX(dx[4],dx[5]); - aabb[2] = final_posr->pos[1] + MIN(dy[0],dy[1]) + MIN(dy[2],dy[3]) + MIN(dy[4],dy[5]); - aabb[3] = final_posr->pos[1] + MAX(dy[0],dy[1]) + MAX(dy[2],dy[3]) + MAX(dy[4],dy[5]); - aabb[4] = final_posr->pos[2] + MIN(dz[0],dz[1]) + MIN(dz[2],dz[3]) + MIN(dz[4],dz[5]); - aabb[5] = final_posr->pos[2] + MAX(dz[0],dz[1]) + MAX(dz[2],dz[3]) + MAX(dz[4],dz[5]); - } - else - { - aabb[0] = 0; - aabb[1] = m_vLength; - aabb[2] = m_vMinHeight; - aabb[3] = m_vMaxHeight; - aabb[4] = 0; - aabb[5] = m_vLength; - } - } - else - { - if (gflags & GEOM_PLACEABLE) - { - aabb[0] = -dInfinity; - aabb[1] = dInfinity; - aabb[2] = -dInfinity; - aabb[3] = dInfinity; - aabb[4] = -dInfinity; - aabb[5] = dInfinity; - } - else - { - aabb[0] = -dInfinity; - aabb[1] = dInfinity; - aabb[2] = m_vMinHeight; - aabb[3] = m_vMaxHeight; - aabb[4] = -dInfinity; - aabb[5] = dInfinity; - } - } -} - -dReal dxTerrainY::GetHeight(int x,int z) -{ - return m_pHeights[ (((unsigned int)(z) & m_nNumNodesPerSideMask) << m_nNumNodesPerSideShift) - + ((unsigned int)(x) & m_nNumNodesPerSideMask)]; -} - -dReal dxTerrainY::GetHeight(dReal x,dReal z) -{ - int nX = int(floor(x / m_vNodeLength)); - int nZ = int(floor(z / m_vNodeLength)); - dReal dx = (x - (dReal(nX) * m_vNodeLength)) / m_vNodeLength; - dReal dz = (z - (dReal(nZ) * m_vNodeLength)) / m_vNodeLength; - dIASSERT((dx >= 0.f) && (dx <= 1.f)); - dIASSERT((dz >= 0.f) && (dz <= 1.f)); - - dReal y,y0; - - if (dx + dz < 1.f) - { - y0 = GetHeight(nX,nZ); - y = y0 - + (GetHeight(nX+1,nZ) - y0) * dx - + (GetHeight(nX,nZ+1) - y0) * dz; - } - else - { - y0 = GetHeight(nX+1,nZ+1); - y = y0 - + (GetHeight(nX+1,nZ) - y0) * (1.f - dz) - + (GetHeight(nX,nZ+1) - y0) * (1.f - dx); - } - - return y; -} - -bool dxTerrainY::IsOnTerrain(int nx,int nz,int w,dReal *pos) -{ - dVector3 Min,Max; - Min[0] = nx * m_vNodeLength; - Min[2] = nz * m_vNodeLength; - Max[0] = (nx+1) * m_vNodeLength; - Max[2] = (nz+1) * m_vNodeLength; - dReal Tol = m_vNodeLength * TERRAINTOL; - - if ((pos[0]Max[0]+Tol)) - return false; - - if ((pos[2]Max[2]+Tol)) - return false; - - dReal dx = (pos[0] - (dReal(nx) * m_vNodeLength)) / m_vNodeLength; - dReal dz = (pos[2] - (dReal(nz) * m_vNodeLength)) / m_vNodeLength; - - if ((w == 0) && (dx + dz > 1.f+TERRAINTOL)) - return false; - - if ((w == 1) && (dx + dz < 1.f-TERRAINTOL)) - return false; - - return true; -} - -dGeomID dCreateTerrainY(dSpaceID space, dReal *pHeights,dReal vLength,int nNumNodesPerSide, int bFinite, int bPlaceable) -{ - return new dxTerrainY(space, pHeights,vLength,nNumNodesPerSide,bFinite,bPlaceable); -} - -dReal dGeomTerrainYPointDepth (dGeomID g, dReal x, dReal y, dReal z) -{ - dUASSERT (g && g->type == dTerrainYClass,"argument not a terrain"); - g->recomputePosr(); - dxTerrainY *t = (dxTerrainY*) g; - return t->GetHeight(x,z) - y; -} - -typedef dReal dGetDepthFn(dGeomID g, dReal x, dReal y, dReal z); -#define RECOMPUTE_RAYNORMAL -//#define DO_RAYDEPTH - -#define DMESS(A) \ - dMessage(0,"Contact Plane (%d %d %d) %.5e %.5e (%.5e %.5e %.5e)(%.5e %.5e %.5e)).", \ - x,z,A, \ - pContact->depth, \ - dGeomSphereGetRadius(o2), \ - pContact->pos[0], \ - pContact->pos[1], \ - pContact->pos[2], \ - pContact->normal[0], \ - pContact->normal[1], \ - pContact->normal[2]); -/* -(y is up) - -A-B-E.x -|/| -C-D -| -F -. -z -*/ -int dxTerrainY::dCollideTerrainUnit( - int x,int z,dxGeom *o2,int numMaxContacts, - int flags,dContactGeom *contact, int skip) -{ - dColliderFn *CollideRayN; - dColliderFn *CollideNPlane; - dGetDepthFn *GetDepth; - int numContacts = 0; - int numPlaneContacts = 0; - int i; - - if (numContacts == numMaxContacts) - return numContacts; - - dContactGeom PlaneContact[MAXCONTACT]; - flags = (flags & 0xffff0000) | MAXCONTACT; - - switch (o2->type) - { - case dSphereClass: - CollideRayN = dCollideRaySphere; - CollideNPlane = dCollideSpherePlane; - GetDepth = dGeomSpherePointDepth; - break; - case dBoxClass: - CollideRayN = dCollideRayBox; - CollideNPlane = dCollideBoxPlane; - GetDepth = dGeomBoxPointDepth; - break; - case dCCylinderClass: - CollideRayN = dCollideRayCCylinder; - CollideNPlane = dCollideCCylinderPlane; - GetDepth = dGeomCCylinderPointDepth; - break; - case dRayClass: - CollideRayN = NULL; - CollideNPlane = dCollideRayPlane; - GetDepth = NULL; - break; - case dConeClass: - CollideRayN = dCollideRayCone; - CollideNPlane = dCollideConePlane; - GetDepth = dGeomConePointDepth; - break; - default: - dIASSERT(0); - } - - dReal Plane[4],lBD,lCD,lBC; - dVector3 A,B,C,D,BD,CD,BC,AB,AC; - A[0] = x * m_vNodeLength; - A[2] = z* m_vNodeLength; - A[1] = GetHeight(x,z); - B[0] = (x+1) * m_vNodeLength; - B[2] = z * m_vNodeLength; - B[1] = GetHeight(x+1,z); - C[0] = x * m_vNodeLength; - C[2] = (z+1) * m_vNodeLength; - C[1] = GetHeight(x,z+1); - D[0] = (x+1) * m_vNodeLength; - D[2] = (z+1) * m_vNodeLength; - D[1] = GetHeight(x+1,z+1); - - dOP(BC,-,C,B); - lBC = dLENGTH(BC); - dOPEC(BC,/=,lBC); - - dOP(BD,-,D,B); - lBD = dLENGTH(BD); - dOPEC(BD,/=,lBD); - - dOP(CD,-,D,C); - lCD = dLENGTH(CD); - dOPEC(CD,/=,lCD); - - dOP(AB,-,B,A); - dNormalize3(AB); - - dOP(AC,-,C,A); - dNormalize3(AC); - - if (CollideRayN) - { -#ifdef RECOMPUTE_RAYNORMAL - dVector3 E,F; - dVector3 CE,FB,AD; - dVector3 Normal[3]; - E[0] = (x+2) * m_vNodeLength; - E[2] = z * m_vNodeLength; - E[1] = GetHeight(x+2,z); - F[0] = x * m_vNodeLength; - F[2] = (z+2) * m_vNodeLength; - F[1] = GetHeight(x,z+2); - dOP(AD,-,D,A); - dNormalize3(AD); - dOP(CE,-,E,C); - dNormalize3(CE); - dOP(FB,-,B,F); - dNormalize3(FB); - - //BC - dCROSS(Normal[0],=,BC,AD); - dNormalize3(Normal[0]); - - //BD - dCROSS(Normal[1],=,BD,CE); - dNormalize3(Normal[1]); - - //CD - dCROSS(Normal[2],=,CD,FB); - dNormalize3(Normal[2]); -#endif - int nA[3],nB[3]; - dContactGeom ContactA[3],ContactB[3]; - dxRay rayBC(0,lBC); - dGeomRaySet(&rayBC, B[0], B[1], B[2], BC[0], BC[1], BC[2]); - nA[0] = CollideRayN(&rayBC,o2,flags,&ContactA[0],sizeof(dContactGeom)); - dGeomRaySet(&rayBC, C[0], C[1], C[2], -BC[0], -BC[1], -BC[2]); - nB[0] = CollideRayN(&rayBC,o2,flags,&ContactB[0],sizeof(dContactGeom)); - - dxRay rayBD(0,lBD); - dGeomRaySet(&rayBD, B[0], B[1], B[2], BD[0], BD[1], BD[2]); - nA[1] = CollideRayN(&rayBD,o2,flags,&ContactA[1],sizeof(dContactGeom)); - dGeomRaySet(&rayBD, D[0], D[1], D[2], -BD[0], -BD[1], -BD[2]); - nB[1] = CollideRayN(&rayBD,o2,flags,&ContactB[1],sizeof(dContactGeom)); - - dxRay rayCD(0,lCD); - dGeomRaySet(&rayCD, C[0], C[1], C[2], CD[0], CD[1], CD[2]); - nA[2] = CollideRayN(&rayCD,o2,flags,&ContactA[2],sizeof(dContactGeom)); - dGeomRaySet(&rayCD, D[0], D[1], D[2], -CD[0], -CD[1], -CD[2]); - nB[2] = CollideRayN(&rayCD,o2,flags,&ContactB[2],sizeof(dContactGeom)); - - for (i=0;i<3;i++) - { - if (nA[i] & nB[i]) - { - dContactGeom *pContact = CONTACT(contact,numContacts*skip); - pContact->pos[0] = (ContactA[i].pos[0] + ContactB[i].pos[0])/2; - pContact->pos[1] = (ContactA[i].pos[1] + ContactB[i].pos[1])/2; - pContact->pos[2] = (ContactA[i].pos[2] + ContactB[i].pos[2])/2; -#ifdef RECOMPUTE_RAYNORMAL - pContact->normal[0] = -Normal[i][0]; - pContact->normal[1] = -Normal[i][1]; - pContact->normal[2] = -Normal[i][2]; -#else - pContact->normal[0] = (ContactA[i].normal[0] + ContactB[i].normal[0])/2; //0.f; - pContact->normal[1] = (ContactA[i].normal[1] + ContactB[i].normal[1])/2; //0.f; - pContact->normal[2] = (ContactA[i].normal[2] + ContactB[i].normal[2])/2; //-1.f; - dNormalize3(pContact->normal); -#endif -#ifdef DO_RAYDEPTH - dxRay rayV(0,1000.f); - dGeomRaySet(&rayV, pContact->pos[0], - pContact->pos[1], - pContact->pos[2], - -pContact->normal[0], - -pContact->normal[1], - -pContact->normal[2]); - - dContactGeom ContactV; - if (CollideRayN(&rayV,o2,flags,&ContactV,sizeof(dContactGeom))) - { - pContact->depth = ContactV.depth; - numContacts++; - } -#else - - if (GetDepth == NULL) - { - dxRay rayV(0,1000.f); - dGeomRaySet(&rayV, pContact->pos[0], - pContact->pos[1], - pContact->pos[2], - -pContact->normal[0], - -pContact->normal[1], - -pContact->normal[2]); - - dContactGeom ContactV; - - if (CollideRayN(&rayV,o2,flags,&ContactV,sizeof(dContactGeom))) - { - pContact->depth = ContactV.depth; - numContacts++; - } - } - else - { - pContact->depth = GetDepth(o2, - pContact->pos[0], - pContact->pos[1], - pContact->pos[2]); - numContacts++; - } - -#endif - if (numContacts == numMaxContacts) - return numContacts; - - } - } - } - - dCROSS(Plane,=,AC,AB); - dNormalize3(Plane); - Plane[3] = Plane[0] * A[0] + Plane[1] * A[1] + Plane[2] * A[2]; - dxPlane planeABC(0,Plane[0],Plane[1],Plane[2],Plane[3]); - numPlaneContacts = CollideNPlane(o2,&planeABC,flags,PlaneContact,sizeof(dContactGeom)); - - for (i=0;ipos[0] = PlaneContact[i].pos[0]; - pContact->pos[1] = PlaneContact[i].pos[1]; - pContact->pos[2] = PlaneContact[i].pos[2]; - pContact->normal[0] = -PlaneContact[i].normal[0]; - pContact->normal[1] = -PlaneContact[i].normal[1]; - pContact->normal[2] = -PlaneContact[i].normal[2]; - pContact->depth = PlaneContact[i].depth; - - //DMESS(0); - numContacts++; - - if (numContacts == numMaxContacts) - return numContacts; - } - } - - dCROSS(Plane,=,BD,CD); - dNormalize3(Plane); - Plane[3] = Plane[0] * D[0] + Plane[1] * D[1] + Plane[2] * D[2]; - dxPlane planeDCB(0,Plane[0],Plane[1],Plane[2],Plane[3]); - numPlaneContacts = CollideNPlane(o2,&planeDCB,flags,PlaneContact,sizeof(dContactGeom)); - - for (i=0;ipos[0] = PlaneContact[i].pos[0]; - pContact->pos[1] = PlaneContact[i].pos[1]; - pContact->pos[2] = PlaneContact[i].pos[2]; - pContact->normal[0] = -PlaneContact[i].normal[0]; - pContact->normal[1] = -PlaneContact[i].normal[1]; - pContact->normal[2] = -PlaneContact[i].normal[2]; - pContact->depth = PlaneContact[i].depth; - //DMESS(1); - numContacts++; - - if (numContacts == numMaxContacts) - return numContacts; - } - } - - return numContacts; -} - -int dCollideTerrainY(dxGeom *o1, dxGeom *o2, int flags,dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dTerrainYClass); - int i,j; - - if ((flags & 0xffff) == 0) - flags = (flags & 0xffff0000) | 1; - - int numMaxTerrainContacts = (flags & 0xffff); - dxTerrainY *terrain = (dxTerrainY*) o1; - - dReal aabbbak[6]; - int gflagsbak; - - dVector3 pos0; - int numTerrainContacts = 0; - - dxPosR *bak; - dxPosR X1; - - if (terrain->gflags & GEOM_PLACEABLE) - { - dOP(pos0,-,o2->final_posr->pos,terrain->final_posr->pos); - dMULTIPLY1_331(X1.pos,terrain->final_posr->R,pos0); - dMULTIPLY1_333(X1.R,terrain->final_posr->R,o2->final_posr->R); - bak = o2->final_posr; - o2->final_posr = &X1; - memcpy(aabbbak,o2->aabb,sizeof(dReal)*6); - gflagsbak = o2->gflags; - o2->computeAABB(); - } - - int nMinX = int(floor(o2->aabb[0] / terrain->m_vNodeLength)); - int nMaxX = int(floor(o2->aabb[1] / terrain->m_vNodeLength)) + 1; - int nMinZ = int(floor(o2->aabb[4] / terrain->m_vNodeLength)); - int nMaxZ = int(floor(o2->aabb[5] / terrain->m_vNodeLength)) + 1; - - if (terrain->m_bFinite) - { - nMinX = MAX(nMinX,0); - nMaxX = MIN(nMaxX,terrain->m_nNumNodesPerSide); - nMinZ = MAX(nMinZ,0); - nMaxZ = MIN(nMaxZ,terrain->m_nNumNodesPerSide); - - if ((nMinX >= nMaxX) || (nMinZ >= nMaxZ)) - goto dCollideTerrainYExit; - } - - dVector3 AabbTop; - AabbTop[0] = (o2->aabb[0]+o2->aabb[1]) / 2; - AabbTop[2] = (o2->aabb[4]+o2->aabb[5]) / 2; - AabbTop[1] = o2->aabb[3]; - if (o2->type != dRayClass) - { - dReal AabbTopDepth = terrain->GetHeight(AabbTop[0],AabbTop[2]) - AabbTop[1]; - if (AabbTopDepth > 0.f) - { - contact->depth = AabbTopDepth; - dReal MaxDepth = (o2->aabb[3]-o2->aabb[2]) / 2; - if (contact->depth > MaxDepth) - contact->depth = MaxDepth; - contact->g1 = o1; - contact->g2 = o2; - dOPE(contact->pos,=,AabbTop); - contact->normal[0] = 0.f; - contact->normal[1] = -1.f; - contact->normal[2] = 0.f; - - numTerrainContacts = 1; - goto dCollideTerrainYExit; - } - } - - for (i=nMinX;idCollideTerrainUnit( - i,j,o2,numMaxTerrainContacts - numTerrainContacts, - flags,CONTACT(contact,numTerrainContacts*skip),skip ); - } - } - - dIASSERT(numTerrainContacts <= numMaxTerrainContacts); - - for (i=0; ig1 = o1; - CONTACT(contact,i*skip)->g2 = o2; - } - -dCollideTerrainYExit: - - if (terrain->gflags & GEOM_PLACEABLE) - { - o2->final_posr = bak; - memcpy(o2->aabb,aabbbak,sizeof(dReal)*6); - o2->gflags = gflagsbak; - - for (i=0; ipos); - dMULTIPLY0_331(CONTACT(contact,i*skip)->pos,terrain->final_posr->R,pos0); - dOP(CONTACT(contact,i*skip)->pos,+,CONTACT(contact,i*skip)->pos,terrain->final_posr->pos); - - dOPE(pos0,=,CONTACT(contact,i*skip)->normal); - dMULTIPLY0_331(CONTACT(contact,i*skip)->normal,terrain->final_posr->R,pos0); - } - } - - return numTerrainContacts; -} -/* -void dsDrawTerrainY(int x,int z,float vLength,float vNodeLength,int nNumNodesPerSide,float *pHeights,const float *pR,const float *ppos) -{ - float A[3],B[3],C[3],D[3]; - float R[12]; - float pos[3]; - if (pR) - memcpy(R,pR,sizeof(R)); - else - { - memset(R,0,sizeof(R)); - R[0] = 1.f; - R[5] = 1.f; - R[10] = 1.f; - } - - if (ppos) - memcpy(pos,ppos,sizeof(pos)); - else - memset(pos,0,sizeof(pos)); - - float vx,vz; - vx = vLength * x; - vz = vLength * z; - - int i; - for (i=0;i -#include -#include -#include -#include -#include "collision_kernel.h" -#include "collision_std.h" -#include "collision_std_internal.h" -#include "collision_util.h" -//#include -#include "windows.h" -#include "ode\ode.h" - -#define CONTACT(p,skip) ((dContactGeom*) (((char*)p) + (skip))) -#define MAXCONTACT 10 -#define TERRAINTOL 0.0f - -static bool IsAPowerOfTwo(int f) -{ - dAASSERT(f!=0); - while ((f&1) != 1) - f >>= 1; - - return (f == 1); -} - -static int GetPowerOfTwo(int f) -{ - dAASSERT(f!=0); - int n = 0; - while ((f&1) != 1) - { - n++; - f >>= 1; - } - - return n; -} - -dxTerrainZ::dxTerrainZ (dSpaceID space, dReal *pHeights,dReal vLength,int nNumNodesPerSide, int bFinite, int bPlaceable) : -dxGeom (space,bPlaceable) -{ - dIASSERT(IsAPowerOfTwo(nNumNodesPerSide)); - dIASSERT(pHeights); - dIASSERT(vLength > 0.f); - dIASSERT(nNumNodesPerSide > 0); - type = dTerrainZClass; - m_vLength = vLength; - m_pHeights = new dReal[nNumNodesPerSide * nNumNodesPerSide]; - dIASSERT(m_pHeights); - m_nNumNodesPerSide = nNumNodesPerSide; - m_vNodeLength = m_vLength / m_nNumNodesPerSide; - m_nNumNodesPerSideShift = GetPowerOfTwo(m_nNumNodesPerSide); - m_nNumNodesPerSideMask = m_nNumNodesPerSide - 1; - m_vMinHeight = dInfinity; - m_vMaxHeight = -dInfinity; - m_bFinite = bFinite; - - for (int i=0;i m_vMaxHeight) m_vMaxHeight = m_pHeights[i]; - } -} - -dxTerrainZ::~dxTerrainZ() -{ - dIASSERT(m_pHeights); - delete [] m_pHeights; -} - -void dxTerrainZ::computeAABB() -{ - if (m_bFinite) - { - if (gflags & GEOM_PLACEABLE) - { - dReal dx[6],dy[6],dz[6]; - dx[0] = 0; - dx[1] = final_posr->R[0] * m_vLength; - dx[2] = 0; - dx[3] = final_posr->R[1] * m_vLength; - dx[4] = final_posr->R[2] * m_vMinHeight; - dx[5] = final_posr->R[2] * m_vMaxHeight; - - dy[0] = 0; - dy[1] = final_posr->R[4] * m_vLength; - dy[2] = 0; - dy[3] = final_posr->R[5] * m_vLength; - dy[4] = final_posr->R[6] * m_vMinHeight; - dy[5] = final_posr->R[6] * m_vMaxHeight; - - dz[0] = 0; - dz[1] = final_posr->R[8] * m_vLength; - dz[2] = 0; - dz[3] = final_posr->R[9] * m_vLength; - dz[4] = final_posr->R[10] * m_vMinHeight; - dz[5] = final_posr->R[10] * m_vMaxHeight; - - aabb[0] = final_posr->pos[0] + MIN(dx[0],dx[1]) + MIN(dx[2],dx[3]) + MIN(dx[4],dx[5]); - aabb[1] = final_posr->pos[0] + MAX(dx[0],dx[1]) + MAX(dx[2],dx[3]) + MAX(dx[4],dx[5]); - aabb[2] = final_posr->pos[1] + MIN(dy[0],dy[1]) + MIN(dy[2],dy[3]) + MIN(dy[4],dy[5]); - aabb[3] = final_posr->pos[1] + MAX(dy[0],dy[1]) + MAX(dy[2],dy[3]) + MAX(dy[4],dy[5]); - aabb[4] = final_posr->pos[2] + MIN(dz[0],dz[1]) + MIN(dz[2],dz[3]) + MIN(dz[4],dz[5]); - aabb[5] = final_posr->pos[2] + MAX(dz[0],dz[1]) + MAX(dz[2],dz[3]) + MAX(dz[4],dz[5]); - } - else - { - aabb[0] = 0; - aabb[1] = m_vLength; - aabb[2] = 0; - aabb[3] = m_vLength; - aabb[4] = m_vMinHeight; - aabb[5] = m_vMaxHeight; - } - } - else - { - if (gflags & GEOM_PLACEABLE) - { - aabb[0] = -dInfinity; - aabb[1] = dInfinity; - aabb[2] = -dInfinity; - aabb[3] = dInfinity; - aabb[4] = -dInfinity; - aabb[5] = dInfinity; - } - else - { - aabb[0] = -dInfinity; - aabb[1] = dInfinity; - aabb[2] = -dInfinity; - aabb[3] = dInfinity; - aabb[4] = m_vMinHeight; - aabb[5] = m_vMaxHeight; - } - } -} - -dReal dxTerrainZ::GetHeight(int x,int y) -{ - return m_pHeights[ (((unsigned int)(y) & m_nNumNodesPerSideMask) << m_nNumNodesPerSideShift) - + ((unsigned int)(x) & m_nNumNodesPerSideMask)]; -} - -dReal dxTerrainZ::GetHeight(dReal x,dReal y) -{ - int nX = int(floor(x / m_vNodeLength)); - int nY = int(floor(y / m_vNodeLength)); - dReal dx = (x - (dReal(nX) * m_vNodeLength)) / m_vNodeLength; - dReal dy = (y - (dReal(nY) * m_vNodeLength)) / m_vNodeLength; - dIASSERT((dx >= 0.f) && (dx <= 1.f)); - dIASSERT((dy >= 0.f) && (dy <= 1.f)); - - dReal z,z0; - - if (dx + dy < 1.f) - { - z0 = GetHeight(nX,nY); - z = z0 - + (GetHeight(nX+1,nY) - z0) * dx - + (GetHeight(nX,nY+1) - z0) * dy; - } - else - { - z0 = GetHeight(nX+1,nY+1); - z = z0 - + (GetHeight(nX+1,nY) - z0) * (1.f - dy) - + (GetHeight(nX,nY+1) - z0) * (1.f - dx); - } - - return z; -} - -bool dxTerrainZ::IsOnTerrain(int nx,int ny,int w,dReal *pos) -{ - dVector3 Min,Max; - Min[0] = nx * m_vNodeLength; - Min[1] = ny * m_vNodeLength; - Max[0] = (nx+1) * m_vNodeLength; - Max[1] = (ny+1) * m_vNodeLength; - dReal Tol = m_vNodeLength * TERRAINTOL; - - if ((pos[0]Max[0]+Tol)) - return false; - - if ((pos[1]Max[1]+Tol)) - return false; - - dReal dx = (pos[0] - (dReal(nx) * m_vNodeLength)) / m_vNodeLength; - dReal dy = (pos[1] - (dReal(ny) * m_vNodeLength)) / m_vNodeLength; - - if ((w == 0) && (dx + dy > 1.f+TERRAINTOL)) - return false; - - if ((w == 1) && (dx + dy < 1.f-TERRAINTOL)) - return false; - - return true; -} - -dGeomID dCreateTerrainZ(dSpaceID space, dReal *pHeights,dReal vLength,int nNumNodesPerSide, int bFinite, int bPlaceable) -{ - return new dxTerrainZ(space, pHeights,vLength,nNumNodesPerSide, bFinite, bPlaceable); -} - -dReal dGeomTerrainZPointDepth (dGeomID g, dReal x, dReal y, dReal z) -{ - dUASSERT (g && g->type == dTerrainZClass,"argument not a terrain"); - g->recomputePosr(); - dxTerrainZ *t = (dxTerrainZ*) g; - return t->GetHeight(x,y) - z; -} - -typedef dReal dGetDepthFn(dGeomID g, dReal x, dReal y, dReal z); -#define RECOMPUTE_RAYNORMAL -//#define DO_RAYDEPTH - -#define DMESS(A) \ - dMessage(0,"Contact Plane (%d %d %d) %.5e %.5e (%.5e %.5e %.5e)(%.5e %.5e %.5e)).", \ - x,y,A, \ - pContact->depth, \ - dGeomSphereGetRadius(o2), \ - pContact->pos[0], \ - pContact->pos[1], \ - pContact->pos[2], \ - pContact->normal[0], \ - pContact->normal[1], \ - pContact->normal[2]); -/* -(z is up) - -y -. -F -| -C-D -|\| -A-B-E.x -*/ -int dxTerrainZ::dCollideTerrainUnit( - int x,int y,dxGeom *o2,int numMaxContacts, - int flags,dContactGeom *contact, int skip) -{ - dColliderFn *CollideRayN; - dColliderFn *CollideNPlane; - dGetDepthFn *GetDepth; - int numContacts = 0; - int numPlaneContacts = 0; - int i; - - if (numContacts == numMaxContacts) - return numContacts; - - dContactGeom PlaneContact[MAXCONTACT]; - flags = (flags & 0xffff0000) | MAXCONTACT; - - switch (o2->type) - { - case dSphereClass: - CollideRayN = dCollideRaySphere; - CollideNPlane = dCollideSpherePlane; - GetDepth = dGeomSpherePointDepth; - break; - case dBoxClass: - CollideRayN = dCollideRayBox; - CollideNPlane = dCollideBoxPlane; - GetDepth = dGeomBoxPointDepth; - break; - case dCCylinderClass: - CollideRayN = dCollideRayCCylinder; - CollideNPlane = dCollideCCylinderPlane; - GetDepth = dGeomCCylinderPointDepth; - break; - case dRayClass: - CollideRayN = NULL; - CollideNPlane = dCollideRayPlane; - GetDepth = NULL; - break; - case dConeClass: - CollideRayN = dCollideRayCone; - CollideNPlane = dCollideConePlane; - GetDepth = dGeomConePointDepth; - break; - default: - dIASSERT(0); - } - - dReal Plane[4],lBD,lCD,lBC; - dVector3 A,B,C,D,BD,CD,BC,AB,AC; - A[0] = x * m_vNodeLength; - A[1] = y * m_vNodeLength; - A[2] = GetHeight(x,y); - B[0] = (x+1) * m_vNodeLength; - B[1] = y * m_vNodeLength; - B[2] = GetHeight(x+1,y); - C[0] = x * m_vNodeLength; - C[1] = (y+1) * m_vNodeLength; - C[2] = GetHeight(x,y+1); - D[0] = (x+1) * m_vNodeLength; - D[1] = (y+1) * m_vNodeLength; - D[2] = GetHeight(x+1,y+1); - - dOP(BC,-,C,B); - lBC = dLENGTH(BC); - dOPEC(BC,/=,lBC); - - dOP(BD,-,D,B); - lBD = dLENGTH(BD); - dOPEC(BD,/=,lBD); - - dOP(CD,-,D,C); - lCD = dLENGTH(CD); - dOPEC(CD,/=,lCD); - - dOP(AB,-,B,A); - dNormalize3(AB); - - dOP(AC,-,C,A); - dNormalize3(AC); - - if (CollideRayN) - { -#ifdef RECOMPUTE_RAYNORMAL - dVector3 E,F; - dVector3 CE,FB,AD; - dVector3 Normal[3]; - E[0] = (x+2) * m_vNodeLength; - E[1] = y * m_vNodeLength; - E[2] = GetHeight(x+2,y); - F[0] = x * m_vNodeLength; - F[1] = (y+2) * m_vNodeLength; - F[2] = GetHeight(x,y+2); - dOP(AD,-,D,A); - dNormalize3(AD); - dOP(CE,-,E,C); - dNormalize3(CE); - dOP(FB,-,B,F); - dNormalize3(FB); - - //BC - dCROSS(Normal[0],=,AD,BC); - dNormalize3(Normal[0]); - - //BD - dCROSS(Normal[1],=,CE,BD); - dNormalize3(Normal[1]); - - //CD - dCROSS(Normal[2],=,FB,CD); - dNormalize3(Normal[2]); -#endif - int nA[3],nB[3]; - dContactGeom ContactA[3],ContactB[3]; - dxRay rayBC(0,lBC); - dGeomRaySet(&rayBC, B[0], B[1], B[2], BC[0], BC[1], BC[2]); - nA[0] = CollideRayN(&rayBC,o2,flags,&ContactA[0],sizeof(dContactGeom)); - dGeomRaySet(&rayBC, C[0], C[1], C[2], -BC[0], -BC[1], -BC[2]); - nB[0] = CollideRayN(&rayBC,o2,flags,&ContactB[0],sizeof(dContactGeom)); - - dxRay rayBD(0,lBD); - dGeomRaySet(&rayBD, B[0], B[1], B[2], BD[0], BD[1], BD[2]); - nA[1] = CollideRayN(&rayBD,o2,flags,&ContactA[1],sizeof(dContactGeom)); - dGeomRaySet(&rayBD, D[0], D[1], D[2], -BD[0], -BD[1], -BD[2]); - nB[1] = CollideRayN(&rayBD,o2,flags,&ContactB[1],sizeof(dContactGeom)); - - dxRay rayCD(0,lCD); - dGeomRaySet(&rayCD, C[0], C[1], C[2], CD[0], CD[1], CD[2]); - nA[2] = CollideRayN(&rayCD,o2,flags,&ContactA[2],sizeof(dContactGeom)); - dGeomRaySet(&rayCD, D[0], D[1], D[2], -CD[0], -CD[1], -CD[2]); - nB[2] = CollideRayN(&rayCD,o2,flags,&ContactB[2],sizeof(dContactGeom)); - - for (i=0;i<3;i++) - { - if (nA[i] & nB[i]) - { - dContactGeom *pContact = CONTACT(contact,numContacts*skip); - pContact->pos[0] = (ContactA[i].pos[0] + ContactB[i].pos[0])/2; - pContact->pos[1] = (ContactA[i].pos[1] + ContactB[i].pos[1])/2; - pContact->pos[2] = (ContactA[i].pos[2] + ContactB[i].pos[2])/2; -#ifdef RECOMPUTE_RAYNORMAL - pContact->normal[0] = -Normal[i][0]; - pContact->normal[1] = -Normal[i][1]; - pContact->normal[2] = -Normal[i][2]; -#else - pContact->normal[0] = (ContactA[i].normal[0] + ContactB[i].normal[0])/2; //0.f; - pContact->normal[1] = (ContactA[i].normal[1] + ContactB[i].normal[1])/2; //0.f; - pContact->normal[2] = (ContactA[i].normal[2] + ContactB[i].normal[2])/2; //-1.f; - dNormalize3(pContact->normal); -#endif -#ifdef DO_RAYDEPTH - dxRay rayV(0,1000.f); - dGeomRaySet(&rayV, pContact->pos[0], - pContact->pos[1], - pContact->pos[2], - -pContact->normal[0], - -pContact->normal[1], - -pContact->normal[2]); - - dContactGeom ContactV; - if (CollideRayN(&rayV,o2,flags,&ContactV,sizeof(dContactGeom))) - { - pContact->depth = ContactV.depth; - numContacts++; - } -#else - if (GetDepth == NULL) - { - dxRay rayV(0,1000.f); - dGeomRaySet(&rayV, pContact->pos[0], - pContact->pos[1], - pContact->pos[2], - -pContact->normal[0], - -pContact->normal[1], - -pContact->normal[2]); - - dContactGeom ContactV; - if (CollideRayN(&rayV,o2,flags,&ContactV,sizeof(dContactGeom))) - { - pContact->depth = ContactV.depth; - numContacts++; - } - } - else - { - pContact->depth = GetDepth(o2, - pContact->pos[0], - pContact->pos[1], - pContact->pos[2]); - numContacts++; - } -#endif - if (numContacts == numMaxContacts) - return numContacts; - - } - } - } - - dCROSS(Plane,=,AB,AC); - dNormalize3(Plane); - Plane[3] = Plane[0] * A[0] + Plane[1] * A[1] + Plane[2] * A[2]; - dxPlane planeABC(0,Plane[0],Plane[1],Plane[2],Plane[3]); - numPlaneContacts = CollideNPlane(o2,&planeABC,flags,PlaneContact,sizeof(dContactGeom)); - - for (i=0;ipos[0] = PlaneContact[i].pos[0]; - pContact->pos[1] = PlaneContact[i].pos[1]; - pContact->pos[2] = PlaneContact[i].pos[2]; - pContact->normal[0] = -PlaneContact[i].normal[0]; - pContact->normal[1] = -PlaneContact[i].normal[1]; - pContact->normal[2] = -PlaneContact[i].normal[2]; - pContact->depth = PlaneContact[i].depth; - - //DMESS(0); - numContacts++; - - if (numContacts == numMaxContacts) - return numContacts; - } - } - - dCROSS(Plane,=,CD,BD); - dNormalize3(Plane); - Plane[3] = Plane[0] * D[0] + Plane[1] * D[1] + Plane[2] * D[2]; - dxPlane planeDCB(0,Plane[0],Plane[1],Plane[2],Plane[3]); - numPlaneContacts = CollideNPlane(o2,&planeDCB,flags,PlaneContact,sizeof(dContactGeom)); - - for (i=0;ipos[0] = PlaneContact[i].pos[0]; - pContact->pos[1] = PlaneContact[i].pos[1]; - pContact->pos[2] = PlaneContact[i].pos[2]; - pContact->normal[0] = -PlaneContact[i].normal[0]; - pContact->normal[1] = -PlaneContact[i].normal[1]; - pContact->normal[2] = -PlaneContact[i].normal[2]; - pContact->depth = PlaneContact[i].depth; - //DMESS(1); - numContacts++; - - if (numContacts == numMaxContacts) - return numContacts; - } - } - - return numContacts; -} - -int dCollideTerrainZ(dxGeom *o1, dxGeom *o2, int flags,dContactGeom *contact, int skip) -{ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (o1->type == dTerrainZClass); - int i,j; - - if ((flags & 0xffff) == 0) - flags = (flags & 0xffff0000) | 1; - - int numMaxTerrainContacts = (flags & 0xffff); - dxTerrainZ *terrain = (dxTerrainZ*) o1; - - dReal aabbbak[6]; - int gflagsbak; - - dVector3 pos0; - int numTerrainContacts = 0; - - dxPosR *bak; - dxPosR X1; - - if (terrain->gflags & GEOM_PLACEABLE) - { - dOP(pos0,-,o2->final_posr->pos,terrain->final_posr->pos); - dMULTIPLY1_331(X1.pos,terrain->final_posr->R,pos0); - dMULTIPLY1_333(X1.R,terrain->final_posr->R,o2->final_posr->R); - bak = o2->final_posr; - o2->final_posr = &X1; - memcpy(aabbbak,o2->aabb,sizeof(dReal)*6); - gflagsbak = o2->gflags; - o2->computeAABB(); - } - - int nMinX = int(floor(o2->aabb[0] / terrain->m_vNodeLength)); - int nMaxX = int(floor(o2->aabb[1] / terrain->m_vNodeLength)) + 1; - int nMinY = int(floor(o2->aabb[2] / terrain->m_vNodeLength)); - int nMaxY = int(floor(o2->aabb[3] / terrain->m_vNodeLength)) + 1; - - if (terrain->m_bFinite) - { - nMinX = MAX(nMinX,0); - nMaxX = MIN(nMaxX,terrain->m_nNumNodesPerSide); - nMinY = MAX(nMinY,0); - nMaxY = MIN(nMaxY,terrain->m_nNumNodesPerSide); - - if ((nMinX >= nMaxX) || (nMinY >= nMaxY)) - goto dCollideTerrainZExit; - } - - dVector3 AabbTop; - AabbTop[0] = (o2->aabb[0]+o2->aabb[1]) / 2; - AabbTop[1] = (o2->aabb[2]+o2->aabb[3]) / 2; - AabbTop[2] = o2->aabb[5]; - if (o2->type != dRayClass) - { - dReal AabbTopDepth = terrain->GetHeight(AabbTop[0],AabbTop[1]) - AabbTop[2]; - if (AabbTopDepth > 0.f) - { - contact->depth = AabbTopDepth; - dReal MaxDepth = (o2->aabb[5]-o2->aabb[4]) / 2; - if (contact->depth > MaxDepth) - contact->depth = MaxDepth; - contact->g1 = o1; - contact->g2 = o2; - dOPE(contact->pos,=,AabbTop); - contact->normal[0] = 0.f; - contact->normal[1] = 0.f; - contact->normal[2] = -1.f; - - numTerrainContacts = 1; - goto dCollideTerrainZExit; - } - } - - for (i=nMinX;idCollideTerrainUnit( - i,j,o2,numMaxTerrainContacts - numTerrainContacts, - flags,CONTACT(contact,numTerrainContacts*skip),skip ); - } - } - - dIASSERT(numTerrainContacts <= numMaxTerrainContacts); - - for (i=0; ig1 = o1; - CONTACT(contact,i*skip)->g2 = o2; - } - -dCollideTerrainZExit: - - if (terrain->gflags & GEOM_PLACEABLE) - { - o2->final_posr = bak; - memcpy(o2->aabb,aabbbak,sizeof(dReal)*6); - o2->gflags = gflagsbak; - - for (i=0; ipos); - dMULTIPLY0_331(CONTACT(contact,i*skip)->pos,terrain->final_posr->R,pos0); - dOP(CONTACT(contact,i*skip)->pos,+,CONTACT(contact,i*skip)->pos,terrain->final_posr->pos); - - dOPE(pos0,=,CONTACT(contact,i*skip)->normal); - dMULTIPLY0_331(CONTACT(contact,i*skip)->normal,terrain->final_posr->R,pos0); - } - } - - return numTerrainContacts; -} -/* -void dsDrawTerrainZ(int x,int z,float vLength,float vNodeLength,int nNumNodesPerSide,float *pHeights,const float *pR,const float *ppos) -{ - float A[3],B[3],C[3],D[3]; - float R[12]; - float pos[3]; - if (pR) - memcpy(R,pR,sizeof(R)); - else - { - memset(R,0,sizeof(R)); - R[0] = 1.f; - R[5] = 1.f; - R[10] = 1.f; - } - - if (ppos) - memcpy(pos,ppos,sizeof(pos)); - else - memset(pos,0,sizeof(pos)); - - float vx,vz; - vx = vLength * x; - vz = vLength * z; - - int i; - for (i=0;i edit each .cpp file and comment out #include "windows.h" & #include "ode\ode.h" - - -*** add to drawstuff\src\drawstuff.cpp: - -static void drawCone(float l, float r) -{ - int i; - float tmp,ny,nz,a,ca,sa; - const int n = 24; // number of sides to the cone (divisible by 4) - - a = float(M_PI*2.0)/float(n); - sa = (float) sin(a); - ca = (float) cos(a); - - // draw top - glShadeModel (GL_FLAT); - ny=1; nz=0; // normal vector = (0,ny,nz) - glBegin (GL_TRIANGLE_FAN); - glNormal3d (0,0,1); - glVertex3d (0,0,l); - for (i=0; i<=n; i++) { - if (i==1 || i==n/2+1) - setColor (color[0]*0.75f,color[1]*0.75f,color[2]*0.75f,color[3]); - glNormal3d (ny*r,nz*r,0); - glVertex3d (ny*r,nz*r,0); - if (i==1 || i==n/2+1) - setColor (color[0],color[1],color[2],color[3]); - - // rotate ny,nz - tmp = ca*ny - sa*nz; - nz = sa*ny + ca*nz; - ny = tmp; - } - glEnd(); - - // draw bottom - ny=1; nz=0; // normal vector = (0,ny,nz) - glBegin (GL_TRIANGLE_FAN); - glNormal3d (0,0,-1); - glVertex3d (0,0,0); - for (i=0; i<=n; i++) { - if (i==1 || i==n/2+1) - setColor (color[0]*0.75f,color[1]*0.75f,color[2]*0.75f,color[3]); - glNormal3d (0,0,-1); - glVertex3d (ny*r,nz*r,0); - if (i==1 || i==n/2+1) - setColor (color[0],color[1],color[2],color[3]); - - // rotate ny,nz - tmp = ca*ny + sa*nz; - nz = -sa*ny + ca*nz; - ny = tmp; - } - glEnd(); -} - -void dsDrawCone (const float pos[3], const float R[12], float length, float radius) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_SMOOTH); - setTransform (pos,R); - drawCone (length,radius); - glPopMatrix(); - - if (use_shadows) { - setShadowDrawingMode(); - setShadowTransform(); - setTransform (pos,R); - drawCone (length,radius); - glPopMatrix(); - glPopMatrix(); - glDepthRange (0,1); - } -} - -void dsDrawConeD (const double pos[3], const double R[12], float length, float radius) -{ - int i; - float pos2[3],R2[12]; - for (i=0; i<3; i++) pos2[i]=(float)pos[i]; - for (i=0; i<12; i++) R2[i]=(float)R[i]; - dsDrawCone(pos2,R2,length,radius); -} - -static float GetHeight(int x,int y,int nNumNodesPerSide,float *pHeights) -{ - int nNumNodesPerSideMask = nNumNodesPerSide - 1; - return pHeights[ (((unsigned int)(y) & nNumNodesPerSideMask) * nNumNodesPerSide) - + ((unsigned int)(x) & nNumNodesPerSideMask)]; -} - -void dsDrawTerrainY(int x,int z,float vLength,float vNodeLength,int nNumNodesPerSide,float *pHeights,const float *pR,const float *ppos) -{ - float A[3],B[3],C[3],D[3]; - float R[12]; - float pos[3]; - if (pR) - memcpy(R,pR,sizeof(R)); - else - { - memset(R,0,sizeof(R)); - R[0] = 1.f; - R[5] = 1.f; - R[10] = 1.f; - } - - if (ppos) - memcpy(pos,ppos,sizeof(pos)); - else - memset(pos,0,sizeof(pos)); - - float vx,vz; - vx = vLength * x; - vz = vLength * z; - - int i; - for (i=0;i add dCone.cpp, dTerrainY.cpp and dTerrainZ.cpp to the the libode_a_SOURCES variable in the ode/src/Makefile.am file. - -*** now you can now test using file test_boxstackb.cpp (to add in folder ode\test). - diff --git a/libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp b/libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp deleted file mode 100644 index f1fa592988..0000000000 --- a/libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp +++ /dev/null @@ -1,1375 +0,0 @@ -/************************************************************************* - - -* * - - -* Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - - -* All rights reserved. Email: russ@q12.org Web: www.q12.org * - - -* * - - -* This library is free software; you can redistribute it and/or * - - -* modify it under the terms of EITHER: * - - -* (1) The GNU Lesser General Public License as published by the Free * - - -* Software Foundation; either version 2.1 of the License, or (at * - - -* your option) any later version. The text of the GNU Lesser * - - -* General Public License is included with this library in the * - - -* file LICENSE.TXT. * - - -* (2) The BSD-style license that is included with this library in * - - -* the file LICENSE-BSD.TXT. * - - -* * - - -* This library is distributed in the hope that it will be useful, * - - -* but WITHOUT ANY WARRANTY; without even the implied warranty of * - - -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - - -* LICENSE.TXT and LICENSE-BSD.TXT for more details. * - - -* * - - -*************************************************************************/ - - - - - -#include - - -#include - - - - - -#ifdef _MSC_VER - - -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints - - -#endif - - - - - -// select correct drawing functions - - - - - -#ifdef dDOUBLE - - -#define dsDrawBox dsDrawBoxD - - -#define dsDrawSphere dsDrawSphereD - - -#define dsDrawCylinder dsDrawCylinderD - - -#define dsDrawCappedCylinder dsDrawCappedCylinderD - - -#endif - - - - - - - - -// some constants - - - - - -const dReal vTerrainLength = 4.f; - - -const dReal vTerrainHeight = 0.5f; - - -const int TERRAINNODES = 4; - - -dReal pTerrainHeights[TERRAINNODES*TERRAINNODES]; - - - - - -dGeomID terrainZ = NULL; - - -dGeomID terrainY = NULL; - - - - - -#define NUM 20 // max number of objects - - -#define DENSITY (5.0) // density of all objects - - -#define GPB 3 // maximum number of geometries per body - - -#define MAX_CONTACTS 4 // maximum number of contact points per body - - - - - - - - -// dynamics and collision objects - - - - - -struct MyObject { - - - dBodyID body; // the body - - - dGeomID geom[GPB]; // geometries representing this body - - -}; - - - - - -static int num=0; // number of objects in simulation - - -static int nextobj=0; // next object to recycle if num==NUM - - -static dWorldID world; - - -static dSpaceID space; - - -static MyObject obj[NUM]; - - -static dJointGroupID contactgroup; - - -static int selected = -1; // selected object - - -static int show_aabb = 0; // show geom AABBs? - - -static int show_contacts = 0; // show contact points? - - -static int random_pos = 1; // drop objects from random position? - - - - - - - - -// this is called by dSpaceCollide when two objects in space are - - -// potentially colliding. - - - - - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) - - -{ - - - int i; - - - // if (o1->body && o2->body) return; - - - - - - // exit without doing anything if the two bodies are connected by a joint - - - dBodyID b1 = dGeomGetBody(o1); - - - dBodyID b2 = dGeomGetBody(o2); - - - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - - - - - - dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box - - - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - - - else return c; - - -} - - - - - - - - -// called when a key pressed - - - - - -static void command (int cmd) - - -{ - - - int i,j,k; - - - dReal sides[3]; - - - dMass m; - - - - - - cmd = locase (cmd); - - - if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' - - - /* || cmd == 'l' */) { - - - if (num < NUM) { - - - i = num; - - - num++; - - - } - - - else { - - - i = nextobj; - - - nextobj++; - - - if (nextobj >= num) nextobj = 0; - - - - - - // destroy the body and geoms for slot i - - - dBodyDestroy (obj[i].body); - - - for (k=0; k < GPB; k++) { - - - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - - - } - - - memset (&obj[i],0,sizeof(obj[i])); - - - } - - - - - - obj[i].body = dBodyCreate (world); - - - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - - - - - dMatrix3 R; - - - if (random_pos) { - - - dBodySetPosition (obj[i].body, - - - dRandReal()*2-1,dRandReal()*2+1,dRandReal()+3); - - - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - - - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - - - } - - - else { - - - dReal maxheight = 0; - - - for (k=0; k maxheight) maxheight = pos[2]; - - - } - - - dBodySetPosition (obj[i].body, 0,maxheight+1,maxheight+3); - - - dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0); - - - } - - - dBodySetRotation (obj[i].body,R); - - - dBodySetData (obj[i].body,(void*) i); - - - - - - if (cmd == 'b') { - - - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - - - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - - - } - - - else if (cmd == 'c') { - - - sides[0] *= 0.5; - - - dMassSetCappedCylinder (&m,DENSITY,3,sides[0],sides[1]); - - - obj[i].geom[0] = dCreateCCylinder (space,sides[0],sides[1]); - - - } - - - /* - - - // cylinder option not yet implemented - - - else if (cmd == 'l') { - - - sides[1] *= 0.5; - - - dMassSetCappedCylinder (&m,DENSITY,3,sides[0],sides[1]); - - - obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); - - - } - - - */ - - - else if (cmd == 's') { - - - sides[0] *= 0.5; - - - dMassSetSphere (&m,DENSITY,sides[0]); - - - obj[i].geom[0] = dCreateSphere (space,sides[0]); - - - } - - - else if (cmd == 'x') { - - - dGeomID g2[GPB]; // encapsulated geometries - - - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - - - - - - // start accumulating masses for the encapsulated geometries - - - dMass m2; - - - dMassSetZero (&m); - - - - - - // set random delta positions - - - for (j=0; j= num) selected = 0; - - - if (selected < 0) selected = 0; - - - } - - - else if (cmd == 'd' && selected >= 0 && selected < num) { - - - dBodyDisable (obj[selected].body); - - - } - - - else if (cmd == 'e' && selected >= 0 && selected < num) { - - - dBodyEnable (obj[selected].body); - - - } - - - else if (cmd == 'a') { - - - show_aabb ^= 1; - - - } - - - else if (cmd == 't') { - - - show_contacts ^= 1; - - - } - - - else if (cmd == 'r') { - - - random_pos ^= 1; - - - } - - -} - - - - - - - - -// draw a geom - - - - - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) - - -{ - - - int i; - - - - - - if (!g) return; - - - if (!pos) pos = dGeomGetPosition (g); - - - if (!R) R = dGeomGetRotation (g); - - - - - - int type = dGeomGetClass (g); - - - if (type == dBoxClass) { - - - dVector3 sides; - - - dGeomBoxGetLengths (g,sides); - - - dsDrawBox (pos,R,sides); - - - } - - - else if (type == dSphereClass) { - - - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - - - } - - - else if (type == dCCylinderClass) { - - - dReal radius,length; - - - dGeomCCylinderGetParams (g,&radius,&length); - - - dsDrawCappedCylinder (pos,R,length,radius); - - - } - - - /* - - - // cylinder option not yet implemented - - - else if (type == dCylinderClass) { - - - dReal radius,length; - - - dGeomCylinderGetParams (g,&radius,&length); - - - dsDrawCylinder (pos,R,length,radius); - - - } - - - */ - - - else if (type == dGeomTransformClass) { - - - dGeomID g2 = dGeomTransformGetGeom (g); - - - const dReal *pos2 = dGeomGetPosition (g2); - - - const dReal *R2 = dGeomGetRotation (g2); - - - dVector3 actual_pos; - - - dMatrix3 actual_R; - - - dMULTIPLY0_331 (actual_pos,R,pos2); - - - actual_pos[0] += pos[0]; - - - actual_pos[1] += pos[1]; - - - actual_pos[2] += pos[2]; - - - dMULTIPLY0_333 (actual_R,R,R2); - - - drawGeom (g2,actual_pos,actual_R,0); - - - } - - - - - - if (show_aabb) { - - - // draw the bounding box for this geom - - - dReal aabb[6]; - - - dGeomGetAABB (g,aabb); - - - dVector3 bbpos; - - - for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - - - dVector3 bbsides; - - - for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; - - - dMatrix3 RI; - - - dRSetIdentity (RI); - - - dsSetColorAlpha (1,0,0,0.5); - - - dsDrawBox (bbpos,RI,bbsides); - - - } - - -} - - - - - - - - -// simulation loop - - - - - -static void simLoop (int pause) - - -{ - - - dsSetColor (0,0,2); - - - dSpaceCollide (space,0,&nearCallback); - - - if (!pause) dWorldStep (world,0.05); - - - - - - dAASSERT(terrainY); - - - dAASSERT(terrainZ); - - - dsSetColor (0,1,0); - - - dsDrawTerrainY(0,0,vTerrainLength,vTerrainLength/TERRAINNODES,TERRAINNODES,pTerrainHeights,dGeomGetRotation(terrainY),dGeomGetPosition(terrainY)); - - - dsDrawTerrainZ(0,0,vTerrainLength,vTerrainLength/TERRAINNODES,TERRAINNODES,pTerrainHeights,dGeomGetRotation(terrainZ),dGeomGetPosition(terrainZ)); - - - - - - if (show_aabb) - - - { - - - dReal aabb[6]; - - - dGeomGetAABB (terrainY,aabb); - - - dVector3 bbpos; - - - int i; - - - for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - - - dVector3 bbsides; - - - for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; - - - dMatrix3 RI; - - - dRSetIdentity (RI); - - - dsSetColorAlpha (1,0,0,0.5); - - - dsDrawBox (bbpos,RI,bbsides); - - - - - - dGeomGetAABB (terrainZ,aabb); - - - for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - - - for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; - - - dsDrawBox (bbpos,RI,bbsides); - - - } - - - - - - dsSetColor (1,1,0); - - - - - - // remove all contact joints - - - dJointGroupEmpty (contactgroup); - - - - - - dsSetColor (1,1,0); - - - dsSetTexture (DS_WOOD); - - - for (int i=0; i -#include "dCylinder.h" -// given a pointer `p' to a dContactGeom, return the dContactGeom at -// p + skip bytes. - -struct dxCylinder { // cylinder - dReal radius,lz; // radius, length along y axis // -}; - -int dCylinderClassUser = -1; - -#define NUMC_MASK (0xffff) - -#define CONTACT(p,skip) ((dContactGeom*) (((char*)p) + (skip))) - -///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////circleIntersection////////////////////////////////////////////////// -//this does following: -//takes two circles as normals to planes n1,n2, center points cp1,cp2,and radiuses r1,r2 -//finds line on which circles' planes intersect -//finds four points O1,O2 - intersection between the line and sphere with center cp1 radius r1 -// O3,O4 - intersection between the line and sphere with center cp2 radius r2 -//returns false if there is no intersection -//computes distances O1-O3, O1-O4, O2-O3, O2-O4 -//in "point" returns mean point between intersection points with smallest distance -///////////////////////////////////////////////////////////////////////////////////////////////// -inline bool circleIntersection(const dReal* n1,const dReal* cp1,dReal r1,const dReal* n2,const dReal* cp2,dReal r2,dVector3 point){ -dReal c1=dDOT14(cp1,n1); -dReal c2=dDOT14(cp2,n2); -dReal cos=dDOT44(n1,n2); -dReal cos_2=cos*cos; -dReal sin_2=1-cos_2; -dReal p1=(c1-c2*cos)/sin_2; -dReal p2=(c2-c1*cos)/sin_2; -dVector3 lp={p1*n1[0]+p2*n2[0],p1*n1[4]+p2*n2[4],p1*n1[8]+p2*n2[8]}; -dVector3 n; -dCROSS144(n,=,n1,n2); -dVector3 LC1={lp[0]-cp1[0],lp[1]-cp1[1],lp[2]-cp1[2]}; -dVector3 LC2={lp[0]-cp2[0],lp[1]-cp2[1],lp[2]-cp2[2]}; -dReal A,B,C,B_A,B_A_2,D; -dReal t1,t2,t3,t4; -A=dDOT(n,n); -B=dDOT(LC1,n); -C=dDOT(LC1,LC1)-r1*r1; -B_A=B/A; -B_A_2=B_A*B_A; -D=B_A_2-C; -if(D<0.f){ //somewhat strange solution - //- it is needed to set some - //axis to sepparate cylinders - //when their edges approach - t1=-B_A+sqrtf(-D); - t2=-B_A-sqrtf(-D); -// return false; - } -else{ -t1=-B_A-sqrtf(D); -t2=-B_A+sqrtf(D); -} -B=dDOT(LC2,n); -C=dDOT(LC2,LC2)-r2*r2; -B_A=B/A; -B_A_2=B_A*B_A; -D=B_A_2-C; - -if(D<0.f) { - t3=-B_A+sqrtf(-D); - t4=-B_A-sqrtf(-D); -// return false; - } -else{ -t3=-B_A-sqrtf(D); -t4=-B_A+sqrtf(D); -} -dVector3 O1={lp[0]+n[0]*t1,lp[1]+n[1]*t1,lp[2]+n[2]*t1}; -dVector3 O2={lp[0]+n[0]*t2,lp[1]+n[1]*t2,lp[2]+n[2]*t2}; - -dVector3 O3={lp[0]+n[0]*t3,lp[1]+n[1]*t3,lp[2]+n[2]*t3}; -dVector3 O4={lp[0]+n[0]*t4,lp[1]+n[1]*t4,lp[2]+n[2]*t4}; - -dVector3 L1_3={O3[0]-O1[0],O3[1]-O1[1],O3[2]-O1[2]}; -dVector3 L1_4={O4[0]-O1[0],O4[1]-O1[1],O4[2]-O1[2]}; - -dVector3 L2_3={O3[0]-O2[0],O3[1]-O2[1],O3[2]-O2[2]}; -dVector3 L2_4={O4[0]-O2[0],O4[1]-O2[1],O4[2]-O2[2]}; - - -dReal l1_3=dDOT(L1_3,L1_3); -dReal l1_4=dDOT(L1_4,L1_4); - -dReal l2_3=dDOT(L2_3,L2_3); -dReal l2_4=dDOT(L2_4,L2_4); - - -if (l1_3 0) return 0; \ - if (s2 > s) { \ - s = s2; \ - normalR = norm; \ - invert_normal = ((expr1) < 0); \ - *code = (cc); \ - } - - s = -dInfinity; - invert_normal = 0; - *code = 0; - - // separating axis = cylinder ax u2 - //used when a box vertex touches a flat face of the cylinder - TEST (pp[1],(hlz + B1*Q21 + B2*Q22 + B3*Q23),R1+1,0); - - - // separating axis = box axis v1,v2,v3 - //used when cylinder edge touches box face - //there is two ways to compute sQ: sQ21=sqrtf(1.f-Q21*Q21); or sQ21=sqrtf(Q23*Q23+Q22*Q22); - //if we did not need Q23 and Q22 the first way might be used to quiken the routine but then it need to - //check if Q21<=1.f, becouse it may slightly exeed 1.f. - - - sQ21=sqrtf(Q23*Q23+Q22*Q22); - TEST (dDOT41(R2+0,p),(radius*sQ21 + hlz*Q21 + B1),R2+0,1); - - sQ22=sqrtf(Q23*Q23+Q21*Q21); - TEST (dDOT41(R2+1,p),(radius*sQ22 + hlz*Q22 + B2),R2+1,2); - - sQ23=sqrtf(Q22*Q22+Q21*Q21); - TEST (dDOT41(R2+2,p),(radius*sQ23 + hlz*Q23 + B3),R2+2,3); - - -#undef TEST -#define TEST(expr1,expr2,n1,n2,n3,cc) \ - s2 = dFabs(expr1) - (expr2); \ - if (s2 > 0) return 0; \ - if (s2 > s) { \ - s = s2; \ - normalR = 0; \ - normalC[0] = (n1); normalC[1] = (n2); normalC[2] = (n3); \ - invert_normal = ((expr1) < 0); \ - *code = (cc); \ - } - - - -// separating axis is a normal to the cylinder axis passing across the nearest box vertex -//used when a box vertex touches the lateral surface of the cylinder - -dReal proj,boxProj,cos,sin,cos1,cos3; -dVector3 tAx,Ax,pb; -{ -//making Ax which is perpendicular to cyl ax to box position// -proj=dDOT14(p2,R1+1)-dDOT14(p1,R1+1); - -Ax[0]=p2[0]-p1[0]-R1[1]*proj; -Ax[1]=p2[1]-p1[1]-R1[5]*proj; -Ax[2]=p2[2]-p1[2]-R1[9]*proj; -dNormalize3(Ax); -//using Ax find box vertex which is nearest to the cylinder axis - dReal sign; - - for (i=0; i<3; i++) pb[i] = p2[i]; - sign = (dDOT14(Ax,R2+0) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) pb[i] += sign * B1 * R2[i*4]; - sign = (dDOT14(Ax,R2+1) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) pb[i] += sign * B2 * R2[i*4+1]; - sign = (dDOT14(Ax,R2+2) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) pb[i] += sign * B3 * R2[i*4+2]; - -//building axis which is normal to cylinder ax to the nearest box vertex -proj=dDOT14(pb,R1+1)-dDOT14(p1,R1+1); - -Ax[0]=pb[0]-p1[0]-R1[1]*proj; -Ax[1]=pb[1]-p1[1]-R1[5]*proj; -Ax[2]=pb[2]-p1[2]-R1[9]*proj; -dNormalize3(Ax); -} - -boxProj=dFabs(dDOT14(Ax,R2+0)*B1)+ - dFabs(dDOT14(Ax,R2+1)*B2)+ - dFabs(dDOT14(Ax,R2+2)*B3); - -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],(radius+boxProj),Ax[0],Ax[1],Ax[2],4); - - -//next three test used to handle collisions between cylinder circles and box ages -proj=dDOT14(p1,R2+0)-dDOT14(p2,R2+0); - -tAx[0]=-p1[0]+p2[0]+R2[0]*proj; -tAx[1]=-p1[1]+p2[1]+R2[4]*proj; -tAx[2]=-p1[2]+p2[2]+R2[8]*proj; -dNormalize3(tAx); - -//now tAx is normal to first ax of the box to cylinder center -//making perpendicular to tAx lying in the plane which is normal to the cylinder axis -//it is tangent in the point where projection of tAx on cylinder's ring intersect edge circle - -cos=dDOT14(tAx,R1+0); -sin=dDOT14(tAx,R1+2); -tAx[0]=R1[2]*cos-R1[0]*sin; -tAx[1]=R1[6]*cos-R1[4]*sin; -tAx[2]=R1[10]*cos-R1[8]*sin; - - -//use cross between tAx and first ax of the box as separating axix - -dCROSS114(Ax,=,tAx,R2+0); -dNormalize3(Ax); - -boxProj=dFabs(dDOT14(Ax,R2+1)*B2)+ - dFabs(dDOT14(Ax,R2+0)*B1)+ - dFabs(dDOT14(Ax,R2+2)*B3); - - cos=dFabs(dDOT14(Ax,R1+1)); - cos1=dDOT14(Ax,R1+0); - cos3=dDOT14(Ax,R1+2); - sin=sqrtf(cos1*cos1+cos3*cos3); - -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],(sin*radius+cos*hlz+boxProj),Ax[0],Ax[1],Ax[2],5); - - -//same thing with the second axis of the box -proj=dDOT14(p1,R2+1)-dDOT14(p2,R2+1); - -tAx[0]=-p1[0]+p2[0]+R2[1]*proj; -tAx[1]=-p1[1]+p2[1]+R2[5]*proj; -tAx[2]=-p1[2]+p2[2]+R2[9]*proj; -dNormalize3(tAx); - - -cos=dDOT14(tAx,R1+0); -sin=dDOT14(tAx,R1+2); -tAx[0]=R1[2]*cos-R1[0]*sin; -tAx[1]=R1[6]*cos-R1[4]*sin; -tAx[2]=R1[10]*cos-R1[8]*sin; - -dCROSS114(Ax,=,tAx,R2+1); -dNormalize3(Ax); - -boxProj=dFabs(dDOT14(Ax,R2+0)*B1)+ - dFabs(dDOT14(Ax,R2+1)*B2)+ - dFabs(dDOT14(Ax,R2+2)*B3); - - cos=dFabs(dDOT14(Ax,R1+1)); - cos1=dDOT14(Ax,R1+0); - cos3=dDOT14(Ax,R1+2); - sin=sqrtf(cos1*cos1+cos3*cos3); -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],(sin*radius+cos*hlz+boxProj),Ax[0],Ax[1],Ax[2],6); - -//same thing with the third axis of the box -proj=dDOT14(p1,R2+2)-dDOT14(p2,R2+2); - -Ax[0]=-p1[0]+p2[0]+R2[2]*proj; -Ax[1]=-p1[1]+p2[1]+R2[6]*proj; -Ax[2]=-p1[2]+p2[2]+R2[10]*proj; -dNormalize3(tAx); - -cos=dDOT14(tAx,R1+0); -sin=dDOT14(tAx,R1+2); -tAx[0]=R1[2]*cos-R1[0]*sin; -tAx[1]=R1[6]*cos-R1[4]*sin; -tAx[2]=R1[10]*cos-R1[8]*sin; - -dCROSS114(Ax,=,tAx,R2+2); -dNormalize3(Ax); -boxProj=dFabs(dDOT14(Ax,R2+1)*B2)+ - dFabs(dDOT14(Ax,R2+2)*B3)+ - dFabs(dDOT14(Ax,R2+0)*B1); - - cos=dFabs(dDOT14(Ax,R1+1)); - cos1=dDOT14(Ax,R1+0); - cos3=dDOT14(Ax,R1+2); - sin=sqrtf(cos1*cos1+cos3*cos3); -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],(sin*radius+cos*hlz+boxProj),Ax[0],Ax[1],Ax[2],7); - - -#undef TEST - -// note: cross product axes need to be scaled when s is computed. -// normal (n1,n2,n3) is relative to box 1. - -#define TEST(expr1,expr2,n1,n2,n3,cc) \ - s2 = dFabs(expr1) - (expr2); \ - if (s2 > 0) return 0; \ - l = dSqrt ((n1)*(n1) + (n2)*(n2) + (n3)*(n3)); \ - if (l > 0) { \ - s2 /= l; \ - if (s2 > s) { \ - s = s2; \ - normalR = 0; \ - normalC[0] = (n1)/l; normalC[1] = (n2)/l; normalC[2] = (n3)/l; \ - invert_normal = ((expr1) < 0); \ - *code = (cc); \ - } \ - } - -//crosses between cylinder axis and box axes - // separating axis = u2 x (v1,v2,v3) - TEST(pp[0]*R31-pp[2]*R11,(radius+B2*Q23+B3*Q22),R31,0,-R11,8); - TEST(pp[0]*R32-pp[2]*R12,(radius+B1*Q23+B3*Q21),R32,0,-R12,9); - TEST(pp[0]*R33-pp[2]*R13,(radius+B1*Q22+B2*Q21),R33,0,-R13,10); - - -#undef TEST - - // if we get to this point, the boxes interpenetrate. compute the normal - // in global coordinates. - if (normalR) { - normal[0] = normalR[0]; - normal[1] = normalR[4]; - normal[2] = normalR[8]; - } - else { - if(*code>7) dMULTIPLY0_331 (normal,R1,normalC); - else {normal[0] =normalC[0];normal[1] = normalC[1];normal[2] = normalC[2];} - } - if (invert_normal) { - normal[0] = -normal[0]; - normal[1] = -normal[1]; - normal[2] = -normal[2]; - } - *depth = -s; - - // compute contact point(s) - - if (*code > 7) { - //find point on the cylinder pa deepest along normal - dVector3 pa; - dReal sign, cos1,cos3,factor; - - - for (i=0; i<3; i++) pa[i] = p1[i]; - - cos1 = dDOT14(normal,R1+0); - cos3 = dDOT14(normal,R1+2) ; - factor=sqrtf(cos1*cos1+cos3*cos3); - - cos1/=factor; - cos3/=factor; - - for (i=0; i<3; i++) pa[i] += cos1 * radius * R1[i*4]; - - sign = (dDOT14(normal,R1+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) pa[i] += sign * hlz * R1[i*4+1]; - - - for (i=0; i<3; i++) pa[i] += cos3 * radius * R1[i*4+2]; - - // find vertex of the box deepest along normal - dVector3 pb; - for (i=0; i<3; i++) pb[i] = p2[i]; - sign = (dDOT14(normal,R2+0) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) pb[i] += sign * B1 * R2[i*4]; - sign = (dDOT14(normal,R2+1) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) pb[i] += sign * B2 * R2[i*4+1]; - sign = (dDOT14(normal,R2+2) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) pb[i] += sign * B3 * R2[i*4+2]; - - - dReal alpha,beta; - dVector3 ua,ub; - for (i=0; i<3; i++) ua[i] = R1[1 + i*4]; - for (i=0; i<3; i++) ub[i] = R2[*code-8 + i*4]; - - lineClosestApproach (pa,ua,pb,ub,&alpha,&beta); - for (i=0; i<3; i++) pa[i] += ua[i]*alpha; - for (i=0; i<3; i++) pb[i] += ub[i]*beta; - - for (i=0; i<3; i++) contact[0].pos[i] = REAL(0.5)*(pa[i]+pb[i]); - contact[0].depth = *depth; - return 1; - } - - - if(*code==4){ - for (i=0; i<3; i++) contact[0].pos[i] = pb[i]; - contact[0].depth = *depth; - return 1; - } - - - dVector3 vertex; - if (*code == 0) { - - dReal sign; - for (i=0; i<3; i++) vertex[i] = p2[i]; - sign = (dDOT14(normal,R2+0) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) vertex[i] += sign * B1 * R2[i*4]; - sign = (dDOT14(normal,R2+1) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) vertex[i] += sign * B2 * R2[i*4+1]; - sign = (dDOT14(normal,R2+2) > 0) ? REAL(-1.0) : REAL(1.0); - for (i=0; i<3; i++) vertex[i] += sign * B3 * R2[i*4+2]; - } - else { - - dReal sign,cos1,cos3,factor; - for (i=0; i<3; i++) vertex[i] = p1[i]; - cos1 = dDOT14(normal,R1+0) ; - cos3 = dDOT14(normal,R1+2); - factor=sqrtf(cos1*cos1+cos3*cos3); - factor= factor ? factor : 1.f; - cos1/=factor; - cos3/=factor; - for (i=0; i<3; i++) vertex[i] += cos1 * radius * R1[i*4]; - - sign = (dDOT14(normal,R1+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) vertex[i] += sign * hlz * R1[i*4+1]; - - for (i=0; i<3; i++) vertex[i] += cos3 * radius * R1[i*4+2]; - } - for (i=0; i<3; i++) contact[0].pos[i] = vertex[i]; - contact[0].depth = *depth; - return 1; -} - -//**************************************************************************** - -extern "C" int dCylCyl (const dVector3 p1, const dMatrix3 R1, - const dReal radius1,const dReal lz1, const dVector3 p2, - const dMatrix3 R2, const dReal radius2,const dReal lz2, - dVector3 normal, dReal *depth, int *code, - int maxc, dContactGeom *contact, int skip) -{ - dVector3 p,pp1,pp2,normalC; - const dReal *normalR = 0; - dReal hlz1,hlz2,s,s2; - int i,invert_normal; - - // get vector from centers of box 1 to box 2, relative to box 1 - p[0] = p2[0] - p1[0]; - p[1] = p2[1] - p1[1]; - p[2] = p2[2] - p1[2]; - dMULTIPLY1_331 (pp1,R1,p); // get pp1 = p relative to body 1 - dMULTIPLY1_331 (pp2,R2,p); - // get side lengths / 2 - hlz1 = lz1*REAL(0.5); - hlz2 = lz2*REAL(0.5); - - dReal proj,cos,sin,cos1,cos3; - - - -#define TEST(expr1,expr2,norm,cc) \ - s2 = dFabs(expr1) - (expr2); \ - if (s2 > 0) return 0; \ - if (s2 > s) { \ - s = s2; \ - normalR = norm; \ - invert_normal = ((expr1) < 0); \ - *code = (cc); \ - } - - s = -dInfinity; - invert_normal = 0; - *code = 0; - - cos=dFabs(dDOT44(R1+1,R2+1)); - sin=sqrtf(1.f-(cos>1.f ? 1.f : cos)); - - TEST (pp1[1],(hlz1 + radius2*sin + hlz2*cos ),R1+1,0);//pp - - TEST (pp2[1],(radius1*sin + hlz1*cos + hlz2),R2+1,1); - - - - // note: cross product axes need to be scaled when s is computed. - -#undef TEST -#define TEST(expr1,expr2,n1,n2,n3,cc) \ - s2 = dFabs(expr1) - (expr2); \ - if (s2 > 0) return 0; \ - if (s2 > s) { \ - s = s2; \ - normalR = 0; \ - normalC[0] = (n1); normalC[1] = (n2); normalC[2] = (n3); \ - invert_normal = ((expr1) < 0); \ - *code = (cc); \ - } - - -dVector3 tAx,Ax,pa,pb; - -//cross between cylinders' axes -dCROSS144(Ax,=,R1+1,R2+1); -dNormalize3(Ax); -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],radius1+radius2,Ax[0],Ax[1],Ax[2],6); - - -{ - - dReal sign, factor; - - //making ax which is perpendicular to cyl1 ax passing across cyl2 position// - //(project p on cyl1 flat surface ) - for (i=0; i<3; i++) pb[i] = p2[i]; - //cos1 = dDOT14(p,R1+0); - //cos3 = dDOT14(p,R1+2) ; - tAx[0]=pp1[0]*R1[0]+pp1[2]*R1[2]; - tAx[1]=pp1[0]*R1[4]+pp1[2]*R1[6]; - tAx[2]=pp1[0]*R1[8]+pp1[2]*R1[10]; - dNormalize3(tAx); - -//find deepest point pb of cyl2 on opposite direction of tAx - cos1 = dDOT14(tAx,R2+0); - cos3 = dDOT14(tAx,R2+2) ; - factor=sqrtf(cos1*cos1+cos3*cos3); - cos1/=factor; - cos3/=factor; - for (i=0; i<3; i++) pb[i] -= cos1 * radius2 * R2[i*4]; - - sign = (dDOT14(tAx,R2+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) pb[i] -= sign * hlz2 * R2[i*4+1]; - - for (i=0; i<3; i++) pb[i] -= cos3 * radius2 * R2[i*4+2]; - -//making perpendicular to cyl1 ax passing across pb - proj=dDOT14(pb,R1+1)-dDOT14(p1,R1+1); - - Ax[0]=pb[0]-p1[0]-R1[1]*proj; - Ax[1]=pb[1]-p1[1]-R1[5]*proj; - Ax[2]=pb[2]-p1[2]-R1[9]*proj; - -} - -dNormalize3(Ax); - - - cos=dFabs(dDOT14(Ax,R2+1)); - cos1=dDOT14(Ax,R2+0); - cos3=dDOT14(Ax,R2+2); - sin=sqrtf(cos1*cos1+cos3*cos3); - -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],radius1+cos*hlz2+sin*radius2,Ax[0],Ax[1],Ax[2],3); - - - -{ - - dReal sign, factor; - - for (i=0; i<3; i++) pa[i] = p1[i]; - - //making ax which is perpendicular to cyl2 ax passing across cyl1 position// - //(project p on cyl2 flat surface ) - //cos1 = dDOT14(p,R2+0); - //cos3 = dDOT14(p,R2+2) ; - tAx[0]=pp2[0]*R2[0]+pp2[2]*R2[2]; - tAx[1]=pp2[0]*R2[4]+pp2[2]*R2[6]; - tAx[2]=pp2[0]*R2[8]+pp2[2]*R2[10]; - dNormalize3(tAx); - - cos1 = dDOT14(tAx,R1+0); - cos3 = dDOT14(tAx,R1+2) ; - factor=sqrtf(cos1*cos1+cos3*cos3); - cos1/=factor; - cos3/=factor; - -//find deepest point pa of cyl2 on direction of tAx - for (i=0; i<3; i++) pa[i] += cos1 * radius1 * R1[i*4]; - - sign = (dDOT14(tAx,R1+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) pa[i] += sign * hlz1 * R1[i*4+1]; - - - for (i=0; i<3; i++) pa[i] += cos3 * radius1 * R1[i*4+2]; - - proj=dDOT14(pa,R2+1)-dDOT14(p2,R2+1); - - Ax[0]=pa[0]-p2[0]-R2[1]*proj; - Ax[1]=pa[1]-p2[1]-R2[5]*proj; - Ax[2]=pa[2]-p2[2]-R2[9]*proj; - -} -dNormalize3(Ax); - - - - cos=dFabs(dDOT14(Ax,R1+1)); - cos1=dDOT14(Ax,R1+0); - cos3=dDOT14(Ax,R1+2); - sin=sqrtf(cos1*cos1+cos3*cos3); - -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],radius2+cos*hlz1+sin*radius1,Ax[0],Ax[1],Ax[2],4); - - -////test circl - -//@ this needed to set right normal when cylinders edges intersect -//@ the most precise axis for this test may be found as a line between nearest points of two -//@ circles. But it needs comparatively a lot of computation. -//@ I use a trick which lets not to solve quadric equation. -//@ In the case when cylinder eidges touches the test below rather accurate. -//@ I still not sure about problems with sepparation but they have not been revealed during testing. -dVector3 point; -{ - dVector3 ca,cb; - dReal sign; - for (i=0; i<3; i++) ca[i] = p1[i]; - for (i=0; i<3; i++) cb[i] = p2[i]; -//find two nearest flat rings - sign = (pp1[1] > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) ca[i] += sign * hlz1 * R1[i*4+1]; - - sign = (pp2[1] > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) cb[i] -= sign * hlz2 * R2[i*4+1]; - - dVector3 tAx,tAx1; - circleIntersection(R1+1,ca,radius1,R2+1,cb,radius2,point); - - Ax[0]=point[0]-ca[0]; - Ax[1]=point[1]-ca[1]; - Ax[2]=point[2]-ca[2]; - - cos1 = dDOT14(Ax,R1+0); - cos3 = dDOT14(Ax,R1+2) ; - - tAx[0]=cos3*R1[0]-cos1*R1[2]; - tAx[1]=cos3*R1[4]-cos1*R1[6]; - tAx[2]=cos3*R1[8]-cos1*R1[10]; - - Ax[0]=point[0]-cb[0]; - Ax[1]=point[1]-cb[1]; - Ax[2]=point[2]-cb[2]; - - - cos1 = dDOT14(Ax,R2+0); - cos3 = dDOT14(Ax,R2+2) ; - - tAx1[0]=cos3*R2[0]-cos1*R2[2]; - tAx1[1]=cos3*R2[4]-cos1*R2[6]; - tAx1[2]=cos3*R2[8]-cos1*R2[10]; - dCROSS(Ax,=,tAx,tAx1); - - - - -dNormalize3(Ax); -dReal cyl1Pr,cyl2Pr; - - cos=dFabs(dDOT14(Ax,R1+1)); - cos1=dDOT14(Ax,R1+0); - cos3=dDOT14(Ax,R1+2); - sin=sqrtf(cos1*cos1+cos3*cos3); - cyl1Pr=cos*hlz1+sin*radius1; - - cos=dFabs(dDOT14(Ax,R2+1)); - cos1=dDOT14(Ax,R2+0); - cos3=dDOT14(Ax,R2+2); - sin=sqrtf(cos1*cos1+cos3*cos3); - cyl2Pr=cos*hlz2+sin*radius2; -TEST(p[0]*Ax[0]+p[1]*Ax[1]+p[2]*Ax[2],cyl1Pr+cyl2Pr,Ax[0],Ax[1],Ax[2],5); - - -} - - -#undef TEST - - - - // if we get to this point, the cylinders interpenetrate. compute the normal - // in global coordinates. - if (normalR) { - normal[0] = normalR[0]; - normal[1] = normalR[4]; - normal[2] = normalR[8]; - } - else { - normal[0] =normalC[0];normal[1] = normalC[1];normal[2] = normalC[2]; - } - if (invert_normal) { - normal[0] = -normal[0]; - normal[1] = -normal[1]; - normal[2] = -normal[2]; - } - - *depth = -s; - - // compute contact point(s) - - if(*code==3){ - for (i=0; i<3; i++) contact[0].pos[i] = pb[i]; - contact[0].depth = *depth; - return 1; - } - - if(*code==4){ - for (i=0; i<3; i++) contact[0].pos[i] = pa[i]; - contact[0].depth = *depth; - return 1; - } - - if(*code==5){ - for (i=0; i<3; i++) contact[0].pos[i] = point[i]; - contact[0].depth = *depth; - return 1; - } - -if (*code == 6) { - dVector3 pa; - dReal sign, cos1,cos3,factor; - - - for (i=0; i<3; i++) pa[i] = p1[i]; - - cos1 = dDOT14(normal,R1+0); - cos3 = dDOT14(normal,R1+2) ; - factor=sqrtf(cos1*cos1+cos3*cos3); - - cos1/=factor; - cos3/=factor; - - for (i=0; i<3; i++) pa[i] += cos1 * radius1 * R1[i*4]; - - sign = (dDOT14(normal,R1+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) pa[i] += sign * hlz1 * R1[i*4+1]; - - - for (i=0; i<3; i++) pa[i] += cos3 * radius1 * R1[i*4+2]; - - // find a point pb on the intersecting edge of cylinder 2 - dVector3 pb; - for (i=0; i<3; i++) pb[i] = p2[i]; - cos1 = dDOT14(normal,R2+0); - cos3 = dDOT14(normal,R2+2) ; - factor=sqrtf(cos1*cos1+cos3*cos3); - - cos1/=factor; - cos3/=factor; - - for (i=0; i<3; i++) pb[i] -= cos1 * radius2 * R2[i*4]; - - sign = (dDOT14(normal,R2+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) pb[i] -= sign * hlz2 * R2[i*4+1]; - - - for (i=0; i<3; i++) pb[i] -= cos3 * radius2 * R2[i*4+2]; - - - dReal alpha,beta; - dVector3 ua,ub; - for (i=0; i<3; i++) ua[i] = R1[1 + i*4]; - for (i=0; i<3; i++) ub[i] = R2[1 + i*4]; - lineClosestApproach (pa,ua,pb,ub,&alpha,&beta); - for (i=0; i<3; i++) pa[i] += ua[i]*alpha; - for (i=0; i<3; i++) pb[i] += ub[i]*beta; - - for (i=0; i<3; i++) contact[0].pos[i] = REAL(0.5)*(pa[i]+pb[i]); - contact[0].depth = *depth; - return 1; - } - - // okay, we have a face-something intersection (because the separating - // axis is perpendicular to a face). - - // @@@ temporary: make deepest point on the "other" cylinder the contact point. - // @@@ this kind of works, but we need multiple contact points for stability, - // @@@ especially for face-face contact. - - dVector3 vertex; - if (*code == 0) { - // flat face from cylinder 1 touches a edge/face from cylinder 2. - dReal sign,cos1,cos3,factor; - for (i=0; i<3; i++) vertex[i] = p2[i]; - cos1 = dDOT14(normal,R2+0) ; - cos3 = dDOT14(normal,R2+2); - factor=sqrtf(cos1*cos1+cos3*cos3); - - cos1/=factor; - cos3/=factor; - for (i=0; i<3; i++) vertex[i] -= cos1 * radius2 * R2[i*4]; - - sign = (dDOT14(normal,R1+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) vertex[i] -= sign * hlz2 * R2[i*4+1]; - - for (i=0; i<3; i++) vertex[i] -= cos3 * radius2 * R2[i*4+2]; - } - else { - // flat face from cylinder 2 touches a edge/face from cylinder 1. - dReal sign,cos1,cos3,factor; - for (i=0; i<3; i++) vertex[i] = p1[i]; - cos1 = dDOT14(normal,R1+0) ; - cos3 = dDOT14(normal,R1+2); - factor=sqrtf(cos1*cos1+cos3*cos3); - - cos1/=factor; - cos3/=factor; - for (i=0; i<3; i++) vertex[i] += cos1 * radius1 * R1[i*4]; - - sign = (dDOT14(normal,R1+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) vertex[i] += sign * hlz1 * R1[i*4+1]; - - for (i=0; i<3; i++) vertex[i] += cos3 * radius1 * R1[i*4+2]; - } - for (i=0; i<3; i++) contact[0].pos[i] = vertex[i]; - contact[0].depth = *depth; - return 1; -} - -//**************************************************************************** - - -int dCollideCylS (dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip) -{ - - - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (dGeomGetClass(o2) == dSphereClass); - dIASSERT (dGeomGetClass(o1) == dCylinderClassUser); - const dReal* p1=dGeomGetPosition(o1); - const dReal* p2=dGeomGetPosition(o2); - const dReal* R=dGeomGetRotation(o1); - dVector3 p,normalC,normal; - const dReal *normalR = 0; - dReal cylRadius; - dReal hl; - dGeomCylinderGetParams(o1,&cylRadius,&hl); - dReal sphereRadius; - sphereRadius=dGeomSphereGetRadius(o2); - - int i,invert_normal; - - // get vector from centers of cyl to shere - p[0] = p2[0] - p1[0]; - p[1] = p2[1] - p1[1]; - p[2] = p2[2] - p1[2]; - -dReal s,s2; -unsigned char code; -#define TEST(expr1,expr2,norm,cc) \ - s2 = dFabs(expr1) - (expr2); \ - if (s2 > 0) return 0; \ - if (s2 > s) { \ - s = s2; \ - normalR = norm; \ - invert_normal = ((expr1) < 0); \ - code = (cc); \ - } - - s = -dInfinity; - invert_normal = 0; - code = 0; - - // separating axis cyl ax - - TEST (dDOT14(p,R+1),sphereRadius+hl,R+1,2); - // note: cross product axes need to be scaled when s is computed. - // normal (n1,n2,n3) is relative to -#undef TEST -#define TEST(expr1,expr2,n1,n2,n3,cc) \ - s2 = dFabs(expr1) - (expr2); \ - if (s2 > 0) return 0; \ - if (s2 > s) { \ - s = s2; \ - normalR = 0; \ - normalC[0] = (n1); normalC[1] = (n2); normalC[2] = (n3); \ - invert_normal = ((expr1) < 0); \ - code = (cc); \ - } - -//making ax which is perpendicular to cyl1 ax to sphere center// - -dReal proj,cos,sin,cos1,cos3; -dVector3 Ax; - proj=dDOT14(p2,R+1)-dDOT14(p1,R+1); - - Ax[0]=p2[0]-p1[0]-R[1]*proj; - Ax[1]=p2[1]-p1[1]-R[5]*proj; - Ax[2]=p2[2]-p1[2]-R[9]*proj; -dNormalize3(Ax); -TEST(dDOT(p,Ax),sphereRadius+cylRadius,Ax[0],Ax[1],Ax[2],9); - - -Ax[0]=p[0]; -Ax[1]=p[1]; -Ax[2]=p[2]; -dNormalize3(Ax); - - dVector3 pa; - dReal sign, factor; - for (i=0; i<3; i++) pa[i] = p1[i]; - - cos1 = dDOT14(Ax,R+0); - cos3 = dDOT14(Ax,R+2) ; - factor=sqrtf(cos1*cos1+cos3*cos3); - cos1/=factor; - cos3/=factor; - for (i=0; i<3; i++) pa[i] += cos1 * cylRadius * R[i*4]; - sign = (dDOT14(normal,R+1) > 0) ? REAL(1.0) : REAL(-1.0); - for (i=0; i<3; i++) pa[i] += sign * hl * R[i*4+1]; - for (i=0; i<3; i++) pa[i] += cos3 * cylRadius * R[i*4+2]; - -Ax[0]=p2[0]-pa[0]; -Ax[1]=p2[1]-pa[1]; -Ax[2]=p2[2]-pa[2]; -dNormalize3(Ax); - - cos=dFabs(dDOT14(Ax,R+1)); - cos1=dDOT14(Ax,R+0); - cos3=dDOT14(Ax,R+2); - sin=sqrtf(cos1*cos1+cos3*cos3); -TEST(dDOT(p,Ax),sphereRadius+cylRadius*sin+hl*cos,Ax[0],Ax[1],Ax[2],14); - - -#undef TEST - - if (normalR) { - normal[0] = normalR[0]; - normal[1] = normalR[4]; - normal[2] = normalR[8]; - } - else { - - normal[0] = normalC[0]; - normal[1] = normalC[1]; - normal[2] = normalC[2]; - } - if (invert_normal) { - normal[0] = -normal[0]; - normal[1] = -normal[1]; - normal[2] = -normal[2]; - } - // compute contact point(s) -contact->depth=-s; -contact->normal[0]=-normal[0]; -contact->normal[1]=-normal[1]; -contact->normal[2]=-normal[2]; -contact->g1=const_cast (o1); -contact->g2=const_cast (o2); -contact->pos[0]=p2[0]-normal[0]*sphereRadius; -contact->pos[1]=p2[1]-normal[1]*sphereRadius; -contact->pos[2]=p2[2]-normal[2]*sphereRadius; -return 1; -} - - - -int dCollideCylB (dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip) -{ - dVector3 normal; - dReal depth; - int code; - dReal cylRadius,cylLength; - dVector3 boxSides; - dGeomCylinderGetParams(o1,&cylRadius,&cylLength); - dGeomBoxGetLengths(o2,boxSides); - int num = dCylBox(dGeomGetPosition(o1),dGeomGetRotation(o1),cylRadius,cylLength, - dGeomGetPosition(o2),dGeomGetRotation(o2),boxSides, - normal,&depth,&code,flags & NUMC_MASK,contact,skip); - for (int i=0; inormal[0] = -normal[0]; - CONTACT(contact,i*skip)->normal[1] = -normal[1]; - CONTACT(contact,i*skip)->normal[2] = -normal[2]; - CONTACT(contact,i*skip)->g1 = const_cast (o1); - CONTACT(contact,i*skip)->g2 = const_cast (o2); - } - return num; -} - -int dCollideCylCyl (dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip) -{ - dVector3 normal; - dReal depth; - int code; -dReal cylRadius1,cylRadius2; -dReal cylLength1,cylLength2; -dGeomCylinderGetParams(o1,&cylRadius1,&cylLength1); -dGeomCylinderGetParams(o2,&cylRadius2,&cylLength2); -int num = dCylCyl (dGeomGetPosition(o1),dGeomGetRotation(o1),cylRadius1,cylLength1, - dGeomGetPosition(o2),dGeomGetRotation(o2),cylRadius2,cylLength2, - normal,&depth,&code,flags & NUMC_MASK,contact,skip); - - for (int i=0; inormal[0] = -normal[0]; - CONTACT(contact,i*skip)->normal[1] = -normal[1]; - CONTACT(contact,i*skip)->normal[2] = -normal[2]; - CONTACT(contact,i*skip)->g1 = const_cast (o1); - CONTACT(contact,i*skip)->g2 = const_cast (o2); - } - return num; -} - -struct dxPlane { - dReal p[4]; -}; - - -int dCollideCylPlane - ( - dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip){ - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (dGeomGetClass(o1) == dCylinderClassUser); - dIASSERT (dGeomGetClass(o2) == dPlaneClass); - contact->g1 = const_cast (o1); - contact->g2 = const_cast (o2); - - unsigned int ret = 0; - - dReal radius; - dReal hlz; - dGeomCylinderGetParams(o1,&radius,&hlz); - hlz /= 2; - - const dReal *R = dGeomGetRotation(o1);// rotation of cylinder - const dReal* p = dGeomGetPosition(o1); - dVector4 n; // normal vector - dReal pp; - dGeomPlaneGetParams (o2, n); - pp=n[3]; - dReal cos1,sin1; - cos1=dFabs(dDOT14(n,R+1)); - -cos1=cos10 ? hlz*R[1]:-hlz*R[1]; - pos[1]-= A2>0 ? hlz*R[5]:-hlz*R[5]; - pos[2]-= A2>0 ? hlz*R[9]:-hlz*R[9]; - - - - contact->pos[0] = pos[0]; - contact->pos[1] = pos[1]; - contact->pos[2] = pos[2]; - contact->depth = outDepth; - ret=1; - -if(dFabs(Q2)>M_SQRT1_2){ - - CONTACT(contact,ret*skip)->pos[0]=pos[0]+2.f*A1*R[0]; - CONTACT(contact,ret*skip)->pos[1]=pos[1]+2.f*A1*R[4]; - CONTACT(contact,ret*skip)->pos[2]=pos[2]+2.f*A1*R[8]; - CONTACT(contact,ret*skip)->depth=outDepth-dFabs(Q1*2.f*A1); - - if(CONTACT(contact,ret*skip)->depth>0.f) - ret++; - - - CONTACT(contact,ret*skip)->pos[0]=pos[0]+2.f*A3*R[2]; - CONTACT(contact,ret*skip)->pos[1]=pos[1]+2.f*A3*R[6]; - CONTACT(contact,ret*skip)->pos[2]=pos[2]+2.f*A3*R[10]; - CONTACT(contact,ret*skip)->depth=outDepth-dFabs(Q3*2.f*A3); - - if(CONTACT(contact,ret*skip)->depth>0.f) ret++; -} else { - - CONTACT(contact,ret*skip)->pos[0]=pos[0]+2.f*(A2>0 ? hlz*R[1]:-hlz*R[1]); - CONTACT(contact,ret*skip)->pos[1]=pos[1]+2.f*(A2>0 ? hlz*R[5]:-hlz*R[5]); - CONTACT(contact,ret*skip)->pos[2]=pos[2]+2.f*(A2>0 ? hlz*R[9]:-hlz*R[9]); - CONTACT(contact,ret*skip)->depth=outDepth-dFabs(Q2*2.f*A2); - - if(CONTACT(contact,ret*skip)->depth>0.f) ret++; -} - - - - for (unsigned int i=0; ig1 = const_cast (o1); - CONTACT(contact,i*skip)->g2 = const_cast (o2); - CONTACT(contact,i*skip)->normal[0] =n[0]; - CONTACT(contact,i*skip)->normal[1] =n[1]; - CONTACT(contact,i*skip)->normal[2] =n[2]; - } - return ret; -} - -int dCollideCylRay(dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip) { - dIASSERT (skip >= (int)sizeof(dContactGeom)); - dIASSERT (dGeomGetClass(o1) == dCylinderClassUser); - dIASSERT (dGeomGetClass(o2) == dRayClass); - contact->g1 = const_cast (o1); - contact->g2 = const_cast (o2); - dReal radius; - dReal lz; - dGeomCylinderGetParams(o1,&radius,&lz); - dReal lz2=lz*REAL(0.5); - const dReal *R = dGeomGetRotation(o1); // rotation of the cylinder - const dReal *p = dGeomGetPosition(o1); // position of the cylinder - dVector3 start,dir; - dGeomRayGet(o2,start,dir); // position and orientation of the ray - dReal length = dGeomRayGetLength(o2); - - // compute some useful info - dVector3 cs,q,r; - dReal C,k; - cs[0] = start[0] - p[0]; - cs[1] = start[1] - p[1]; - cs[2] = start[2] - p[2]; - k = dDOT41(R+1,cs); // position of ray start along cyl axis (Y) - q[0] = k*R[0*4+1] - cs[0]; - q[1] = k*R[1*4+1] - cs[1]; - q[2] = k*R[2*4+1] - cs[2]; - C = dDOT(q,q) - radius*radius; - // if C < 0 then ray start position within infinite extension of cylinder - // if ray start position is inside the cylinder - int inside_cyl=0; - if (C<0 && !(k<-lz2 || k>lz2)) inside_cyl=1; - // compute ray collision with infinite cylinder, except for the case where - // the ray is outside the cylinder but within the infinite cylinder - // (it that case the ray can only hit endcaps) - if (!inside_cyl && C < 0) { - // set k to cap position to check - if (k < 0) k = -lz2; else k = lz2; - } - else { - dReal uv = dDOT41(R+1,dir); - r[0] = uv*R[0*4+1] - dir[0]; - r[1] = uv*R[1*4+1] - dir[1]; - r[2] = uv*R[2*4+1] - dir[2]; - dReal A = dDOT(r,r); - dReal B = 2*dDOT(q,r); - k = B*B-4*A*C; - if (k < 0) { - // the ray does not intersect the infinite cylinder, but if the ray is - // inside and parallel to the cylinder axis it may intersect the end - // caps. set k to cap position to check. - if (!inside_cyl) return 0; - if (uv < 0) k = -lz2; else k = lz2; - } - else { - k = dSqrt(k); - A = dRecip (2*A); - dReal alpha = (-B-k)*A; - if (alpha < 0) { - alpha = (-B+k)*A; - if (alpha<0) return 0; - } - if (alpha>length) return 0; - // the ray intersects the infinite cylinder. check to see if the - // intersection point is between the caps - contact->pos[0] = start[0] + alpha*dir[0]; - contact->pos[1] = start[1] + alpha*dir[1]; - contact->pos[2] = start[2] + alpha*dir[2]; - q[0] = contact->pos[0] - p[0]; - q[1] = contact->pos[1] - p[1]; - q[2] = contact->pos[2] - p[2]; - k = dDOT14(q,R+1); - dReal nsign = inside_cyl ? -1 : 1; - if (k >= -lz2 && k <= lz2) { - contact->normal[0] = nsign * (contact->pos[0] - - (p[0] + k*R[0*4+1])); - contact->normal[1] = nsign * (contact->pos[1] - - (p[1] + k*R[1*4+1])); - contact->normal[2] = nsign * (contact->pos[2] - - (p[2] + k*R[2*4+1])); - dNormalize3 (contact->normal); - contact->depth = alpha; - return 1; - } - // the infinite cylinder intersection point is not between the caps. - // set k to cap position to check. - if (k < 0) k = -lz2; else k = lz2; - } - } - // check for ray intersection with the caps. k must indicate the cap - // position to check - // perform a ray plan interesection - // R+1 is the plan normal - q[0] = start[0] - (p[0] + k*R[0*4+1]); - q[1] = start[1] - (p[1] + k*R[1*4+1]); - q[2] = start[2] - (p[2] + k*R[2*4+1]); - dReal alpha = -dDOT14(q,R+1); - dReal k2 = dDOT14(dir,R+1); - if (k2==0) return 0; // ray parallel to the plane - alpha/=k2; - if (alpha<0 || alpha>length) return 0; // too short - contact->pos[0]=start[0]+alpha*dir[0]; - contact->pos[1]=start[1]+alpha*dir[1]; - contact->pos[2]=start[2]+alpha*dir[2]; - dReal nsign = (k<0)?-1:1; - contact->normal[0]=nsign*R[0*4+1]; - contact->normal[1]=nsign*R[1*4+1]; - contact->normal[2]=nsign*R[2*4+1]; - contact->depth=alpha; - return 1; -} - -static dColliderFn * dCylinderColliderFn (int num) -{ - if (num == dBoxClass) return (dColliderFn *) &dCollideCylB; - else if (num == dSphereClass) return (dColliderFn *) &dCollideCylS; - else if (num == dCylinderClassUser) return (dColliderFn *) &dCollideCylCyl; - else if (num == dPlaneClass) return (dColliderFn *) &dCollideCylPlane; - else if (num == dRayClass) return (dColliderFn *) &dCollideCylRay; - return 0; -} - - -static void dCylinderAABB (dxGeom *geom, dReal aabb[6]) -{ - dReal radius,lz; - dGeomCylinderGetParams(geom,&radius,&lz); -const dReal* R= dGeomGetRotation(geom); -const dReal* pos= dGeomGetPosition(geom); - dReal xrange = dFabs (R[0] *radius) + - REAL(0.5) *dFabs (R[1] * lz) + dFabs (R[2] * radius); - - dReal yrange = dFabs (R[4] *radius) + - REAL(0.5) * dFabs (R[5] * lz) + dFabs (R[6] * radius); - - dReal zrange = dFabs (R[8] * radius) + - REAL(0.5) *dFabs (R[9] * lz) + dFabs (R[10] * radius); - - aabb[0] = pos[0] - xrange; - aabb[1] = pos[0] + xrange; - aabb[2] = pos[1] - yrange; - aabb[3] = pos[1] + yrange; - aabb[4] = pos[2] - zrange; - aabb[5] = pos[2] + zrange; -} - -dxGeom *dCreateCylinder (dSpaceID space, dReal r, dReal lz) -{ - dAASSERT (r > 0 && lz > 0); - if (dCylinderClassUser == -1) - { - dGeomClass c; - c.bytes = sizeof (dxCylinder); - c.collider = &dCylinderColliderFn; - c.aabb = &dCylinderAABB; - c.aabb_test = 0; - c.dtor = 0; - dCylinderClassUser=dCreateGeomClass (&c); - - } - - dGeomID g = dCreateGeom (dCylinderClassUser); - if (space) dSpaceAdd (space,g); - dxCylinder *c = (dxCylinder*) dGeomGetClassData(g); - - c->radius = r; - c->lz = lz; - return g; -} - - - -void dGeomCylinderSetParams (dGeomID g, dReal radius, dReal length) -{ - dUASSERT (g && dGeomGetClass(g) == dCylinderClassUser,"argument not a cylinder"); - dAASSERT (radius > 0 && length > 0); - dxCylinder *c = (dxCylinder*) dGeomGetClassData(g); - c->radius = radius; - c->lz = length; -} - - - -void dGeomCylinderGetParams (dGeomID g, dReal *radius, dReal *length) -{ - dUASSERT (g && dGeomGetClass(g) == dCylinderClassUser ,"argument not a cylinder"); - dxCylinder *c = (dxCylinder*) dGeomGetClassData(g); - *radius = c->radius; - *length = c->lz; -} - -/* -void dMassSetCylinder (dMass *m, dReal density, - dReal radius, dReal length) -{ - dAASSERT (m); - dMassSetZero (m); - dReal M = length*M_PI*radius*radius*density; - m->mass = M; - m->_I(0,0) = M/REAL(4.0) * (ly*ly + lz*lz); - m->_I(1,1) = M/REAL(12.0) * (lx*lx + lz*lz); - m->_I(2,2) = M/REAL(4.0) * (lx*lx + ly*ly); - -# ifndef dNODEBUG - checkMass (m); -# endif -} -*/ diff --git a/libraries/ode-0.9/contrib/dCylinder/dCylinder.h b/libraries/ode-0.9/contrib/dCylinder/dCylinder.h deleted file mode 100644 index 06e3a0b564..0000000000 --- a/libraries/ode-0.9/contrib/dCylinder/dCylinder.h +++ /dev/null @@ -1,14 +0,0 @@ - -#ifndef dCylinder_h -#define dCylinder_h - -struct dxCylinder; -extern int dCylinderClassUser; - - -dxGeom *dCreateCylinder (dSpaceID space, dReal r, dReal lz); -void dGeomCylinderSetParams (dGeomID g, dReal radius, dReal length); - -void dGeomCylinderGetParams (dGeomID g, dReal *radius, dReal *length); -#endif //dCylinder_h - diff --git a/libraries/ode-0.9/contrib/dCylinder/readme.txt b/libraries/ode-0.9/contrib/dCylinder/readme.txt deleted file mode 100644 index facd13ed78..0000000000 --- a/libraries/ode-0.9/contrib/dCylinder/readme.txt +++ /dev/null @@ -1,62 +0,0 @@ -readme.txt - -WARNING: THIS IS NOT VERY RELIABLE CODE. IT HAS BUGS. YOUR - SUCCESS MAY VARY. CONTRIBUTIONS OF FIXES/REWRITES ARE - WELCOME. - -/////////////////////////////////////////////////////////////////////// - -Cylinder geometry class. - -New in this version: - -Cylinder class implemented as User Geometry Class so it now can be -used with old and new ODE collision detection. - -Cylinder - Ray has been contributed by Olivier Michel. - -THE IDENTIFIER dCylinderClass HAS BEEN REPLACED BY dCylinderClassUser - -to avoid conflict with dCylinderClass in the enum definite in collision.h - -/////////////////////////////////////////////////////////////////////// -The dCylinder class includes the following collisions: - -Cylinder - Box -Cylinder - Cylinder -Cylinder - Sphere -Cylinder - Plane -Cylinder - Ray (contributed by Olivier Michel) - -Cylinder aligned along axis - Y when created. (Not like Capped -Cylinder which aligned along axis - Z). - -Interface is just the same as Capped Cylinder has. - -Use functions which have one "C" instead of double "C". - -to create: -dGeomID dCreateCylinder (dSpaceID space, dReal radius, dReal length); - -to set params: -void dGeomCylinderSetParams (dGeomID cylinder, - dReal radius, dReal length); - - -to get params: -void dGeomCylinderGetParams (dGeomID cylinder, - dReal *radius, dReal *length); - -Return in radius and length the parameters of the given cylinder. - -Identification number of the class: - dCylinderClassUser - - I do not include a function that sets inertia tensor for cylinder. - One may use existing ODE functions dMassSetCappedCylinder or dMassSetBox. - To set exact tensor for cylinder use dMassSetParameters. - Remember cylinder aligned along axis - Y. - - /////////////////////////////////////////////////////////////////////////// - Konstantin Slipchenko - February 5, 2002 diff --git a/libraries/ode-0.9/contrib/dRay/Include/dRay.h b/libraries/ode-0.9/contrib/dRay/Include/dRay.h deleted file mode 100644 index f6caea8542..0000000000 --- a/libraries/ode-0.9/contrib/dRay/Include/dRay.h +++ /dev/null @@ -1,15 +0,0 @@ -#include "ode\ode.h" - -/* Class ID */ -extern int dRayClass; - -/* Creates a ray */ -dxGeom* dGeomCreateRay(dSpaceID space, dReal Length); - -/* Set/Get length */ -void dGeomRaySetLength(dxGeom* g, dReal Length); -dReal dGeomRayGetLength(dxGeom* g); - -/* Utility function to override the ray's pos + rot */ -void dGeomRaySet(dxGeom* g, dVector3 Origin, dVector3 Direction); -void dGeomRayGet(dxGeom* g, dVector3 Origin, dVector3 Direction); diff --git a/libraries/ode-0.9/contrib/dRay/README.txt b/libraries/ode-0.9/contrib/dRay/README.txt deleted file mode 100644 index 899720823e..0000000000 --- a/libraries/ode-0.9/contrib/dRay/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -From: "Erwin de Vries" -To: -Subject: [ODE] dRay class -Date: Thu, 25 Jul 2002 13:05:28 +0200 - -Yesterday and today i've written a dRay class. It interacts with dPlane, -dSphere, dBox and dCCylinder. It does not generate full contact information. -It only generates the pos member. I dont think its useful to anyone to go -through hoops and find a reasonable normal and penetration depth, as i dont -think anyone will want to use it for dynamics. Just for CD. - -It should compile in single and double precision mode, and should be -platform independant. I hope. - -The next Tri-Collider release using Opcode 1.1 will also implement a ray -collision function along with some other not too interesting improvements. diff --git a/libraries/ode-0.9/contrib/dRay/Test/test_ray.cpp b/libraries/ode-0.9/contrib/dRay/Test/test_ray.cpp deleted file mode 100644 index faa8b14b8b..0000000000 --- a/libraries/ode-0.9/contrib/dRay/Test/test_ray.cpp +++ /dev/null @@ -1,1372 +0,0 @@ -/************************************************************************* - - - * * - - - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - - - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - - - * * - - - * This library is free software; you can redistribute it and/or * - - - * modify it under the terms of EITHER: * - - - * (1) The GNU Lesser General Public License as published by the Free * - - - * Software Foundation; either version 2.1 of the License, or (at * - - - * your option) any later version. The text of the GNU Lesser * - - - * General Public License is included with this library in the * - - - * file LICENSE.TXT. * - - - * (2) The BSD-style license that is included with this library in * - - - * the file LICENSE-BSD.TXT. * - - - * * - - - * This library is distributed in the hope that it will be useful, * - - - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - - - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - - - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - - - * * - - - *************************************************************************/ - - - - - -#include - - -#include - - -#include - - - - - -#ifdef _MSC_VER - - -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints - - -#endif - - - - - -// select correct drawing functions - - - - - -#ifdef dDOUBLE - - -#define dsDrawBox dsDrawBoxD - - -#define dsDrawSphere dsDrawSphereD - - -#define dsDrawCylinder dsDrawCylinderD - - -#define dsDrawCappedCylinder dsDrawCappedCylinderD - - -#endif - - - - - - - - -// some constants - - - - - -#define NUM 20 // max number of objects - - -#define DENSITY (5.0) // density of all objects - - -#define GPB 3 // maximum number of geometries per body - - - - - - - - -// dynamics and collision objects - - - - - -struct MyObject { - - - dBodyID body; // the body - - - dGeomID geom[GPB]; // geometries representing this body - - -}; - - - - - -static int num=0; // number of objects in simulation - - -static int nextobj=0; // next object to recycle if num==NUM - - -static dWorldID world; - - -static dSpaceID space; - - -static MyObject obj[NUM]; - - -static dJointGroupID contactgroup; - - -static int selected = -1; // selected object - - - - - -static dGeomID* Rays; - - -static int RayCount; - - - - - -// this is called by dSpaceCollide when two objects in space are - - -// potentially colliding. - - - - - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) - - -{ - - - int i; - - - // if (o1->body && o2->body) return; - - - - - - // exit without doing anything if the two bodies are connected by a joint - - - dBodyID b1 = dGeomGetBody(o1); - - - dBodyID b2 = dGeomGetBody(o2); - - - if (b1 && b2 && dAreConnected (b1,b2)) return; - - - - - - dContact contact[32]; // up to 3 contacts per box - - - for (i=0; i<32; i++) { - - - contact[i].surface.mode = dContactBounce; //dContactMu2; - - - contact[i].surface.mu = dInfinity; - - - contact[i].surface.mu2 = 0; - - - contact[i].surface.bounce = 0.5; - - - contact[i].surface.bounce_vel = 0.1; - - - } - - - if (int numc = dCollide (o1,o2,3,&contact[0].geom,sizeof(dContact))) { - - - dMatrix3 RI; - - - dRSetIdentity (RI); - - - const dReal ss[3] = {0.02,0.02,0.02}; - - - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - - - else return c; - - -} - - - - - - - - -// called when a key pressed - - - - - -static void command (int cmd) - - -{ - - - int i,j,k; - - - dReal sides[3]; - - - dMass m; - - - - - - cmd = locase (cmd); - - - if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x') { - - - if (num < NUM) { - - - i = num; - - - num++; - - - } - - - else { - - - i = nextobj; - - - nextobj++; - - - if (nextobj >= num) nextobj = 0; - - - - - - // destroy the body and geoms for slot i - - - dBodyDestroy (obj[i].body); - - - for (k=0; k < GPB; k++) { - - - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - - - } - - - memset (&obj[i],0,sizeof(obj[i])); - - - } - - - - - - obj[i].body = dBodyCreate (world); - - - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - - - - - dBodySetPosition (obj[i].body, - - - dRandReal()*2-1,dRandReal()*2-1,dRandReal()+1); - - - dMatrix3 R; - - - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - - - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - - - dBodySetRotation (obj[i].body,R); - - - dBodySetData (obj[i].body,(void*) i); - - - - - - if (cmd == 'b') { - - - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - - - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - - - } - - - else if (cmd == 'c') { - - - sides[0] *= 0.5; - - - dMassSetCappedCylinder (&m,DENSITY,3,sides[0],sides[1]); - - - obj[i].geom[0] = dCreateCCylinder (space,sides[0],sides[1]); - - - } - - - else if (cmd == 's') { - - - sides[0] *= 0.5; - - - dMassSetSphere (&m,DENSITY,sides[0]); - - - obj[i].geom[0] = dCreateSphere (space,sides[0]); - - - } - - - else if (cmd == 'x') { - - - dGeomID g2[GPB]; // encapsulated geometries - - - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - - - - - - // start accumulating masses for the encapsulated geometries - - - dMass m2; - - - dMassSetZero (&m); - - - - - - // set random delta positions - - - for (j=0; j= num) selected = 0; - - - if (selected < 0) selected = 0; - - - } - - - else if (cmd == 'd' && selected >= 0 && selected < num) { - - - dBodyDisable (obj[selected].body); - - - } - - - else if (cmd == 'e' && selected >= 0 && selected < num) { - - - dBodyEnable (obj[selected].body); - - - } - - -} - - - - - - - - -// draw a geom - - - - - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R) - - -{ - - - if (!g) return; - - - if (!pos) pos = dGeomGetPosition (g); - - - if (!R) R = dGeomGetRotation (g); - - - - - - int type = dGeomGetClass (g); - - - if (type == dBoxClass) { - - - dVector3 sides; - - - dGeomBoxGetLengths (g,sides); - - - dsDrawBox (pos,R,sides); - - - } - - - else if (type == dSphereClass) { - - - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - - - } - - - else if (type == dCCylinderClass) { - - - dReal radius,length; - - - dGeomCCylinderGetParams (g,&radius,&length); - - - dsDrawCappedCylinder (pos,R,length,radius); - - - } - - - else if (type == dGeomTransformClass) { - - - dGeomID g2 = dGeomTransformGetGeom (g); - - - const dReal *pos2 = dGeomGetPosition (g2); - - - const dReal *R2 = dGeomGetRotation (g2); - - - dVector3 actual_pos; - - - dMatrix3 actual_R; - - - dMULTIPLY0_331 (actual_pos,R,pos2); - - - actual_pos[0] += pos[0]; - - - actual_pos[1] += pos[1]; - - - actual_pos[2] += pos[2]; - - - dMULTIPLY0_333 (actual_R,R,R2); - - - drawGeom (g2,actual_pos,actual_R); - - - } - - -} - - - - - - - - -// simulation loop - - - - - -static void simLoop (int pause) - - -{ - - - dsSetColor (0,0,2); - - - dSpaceCollide (space,0,&nearCallback); - - - if (!pause) dWorldStep (world,0.05); - - - - - - // remove all contact joints - - - dJointGroupEmpty (contactgroup); - - - - - - dsSetColor (1,1,0); - - - dsSetTexture (DS_WOOD); - - - for (int i=0; iLength = Length; -} - -dReal dGeomRayGetLength(dxGeom* g){ - return ((dxRay*)dGeomGetClassData(g))->Length; -} - -void dGeomRaySet(dxGeom* g, dVector3 Origin, dVector3 Direction){ - dGeomSetPosition(g, Origin[0], Origin[1], Origin[2]); - - dVector3 Up, Right; - dPlaneSpace(Direction, Up, Right); - - Origin[3] = Up[3] = Right[3] = REAL(0.0); - - dMatrix3 Rotation; - Rotation[0 * 4 + 0] = Right[0]; - Rotation[1 * 4 + 0] = Right[1]; - Rotation[2 * 4 + 0] = Right[2]; - Rotation[3 * 4 + 0] = Right[3]; - - Rotation[0 * 4 + 1] = Up[0]; - Rotation[1 * 4 + 1] = Up[1]; - Rotation[2 * 4 + 1] = Up[2]; - Rotation[3 * 4 + 1] = Up[3]; - - Rotation[0 * 4 + 2] = Direction[0]; - Rotation[1 * 4 + 2] = Direction[1]; - Rotation[2 * 4 + 2] = Direction[2]; - Rotation[3 * 4 + 2] = Direction[3]; - - dGeomSetRotation(g, Rotation); -} - -void dGeomRayGet(dxGeom* g, dVector3 Origin, dVector3 Direction){ - const dReal* Position = dGeomGetPosition(g); - Origin[0] = Position[0]; - Origin[1] = Position[1]; - Origin[2] = Position[2]; - Origin[3] = Position[3]; - - const dReal* Rotation = dGeomGetRotation(g); - Direction[0] = Rotation[0 * 4 + 2]; - Direction[1] = Rotation[1 * 4 + 2]; - Direction[2] = Rotation[2 * 4 + 2]; - Direction[3] = Rotation[3 * 4 + 2]; -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp b/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp deleted file mode 100644 index d2a0d9c580..0000000000 --- a/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// Ripped from Magic Software - -#include "Include\dRay.h" -#include "dxRay.h" - -bool Clip(dReal Denom, dReal Numer, dReal& T0, dReal& T1){ - // Return value is 'true' if line segment intersects the current test - // plane. Otherwise 'false' is returned in which case the line segment - // is entirely clipped. - - if (Denom > REAL(0.0)){ - if (Numer > Denom * T1){ - return false; - } - - if (Numer > Denom * T0){ - T0 = Numer / Denom; - } - return true; - } - else if (Denom < REAL(0.0)){ - if (Numer > Denom * T0){ - return false; - } - - if (Numer > Denom * T1){ - T1 = Numer / Denom; - } - return true; - } - else return Numer <= REAL(0.0); -} - -bool FindIntersection(const dVector3 Origin, const dVector3 Direction, const dVector3 Extents, dReal& T0, dReal& T1){ - dReal SaveT0 = T0; - dReal SaveT1 = T1; - - bool NotEntirelyClipped = - Clip(+Direction[0], -Origin[0] - Extents[0], T0, T1) && - Clip(-Direction[0], +Origin[0] - Extents[0], T0, T1) && - Clip(+Direction[1], -Origin[1] - Extents[1], T0, T1) && - Clip(-Direction[1], +Origin[1] - Extents[1], T0, T1) && - Clip(+Direction[2], -Origin[2] - Extents[2], T0, T1) && - Clip(-Direction[2], +Origin[2] - Extents[2], T0, T1); - - return NotEntirelyClipped && (T0 != SaveT0 || T1 != SaveT1); -} - -int dCollideBR(dxGeom* RayGeom, dxGeom* BoxGeom, int Flags, dContactGeom* Contacts, int Stride){ - const dVector3& Position = *(const dVector3*)dGeomGetPosition(BoxGeom); - const dMatrix3& Rotation = *(const dMatrix3*)dGeomGetRotation(BoxGeom); - dVector3 Extents; - dGeomBoxGetLengths(BoxGeom, Extents); - Extents[0] /= 2; - Extents[1] /= 2; - Extents[2] /= 2; - Extents[3] /= 2; - - dVector3 Origin, Direction; - dGeomRayGet(RayGeom, Origin, Direction); - dReal Length = dGeomRayGetLength(RayGeom); - - dVector3 Diff; - Diff[0] = Origin[0] - Position[0]; - Diff[1] = Origin[1] - Position[1]; - Diff[2] = Origin[2] - Position[2]; - Diff[3] = Origin[3] - Position[3]; - - Direction[0] *= Length; - Direction[1] *= Length; - Direction[2] *= Length; - Direction[3] *= Length; - - dVector3 Rot[3]; - Decompose(Rotation, Rot); - - dVector3 TransOrigin; - TransOrigin[0] = dDOT(Diff, Rot[0]); - TransOrigin[1] = dDOT(Diff, Rot[1]); - TransOrigin[2] = dDOT(Diff, Rot[2]); - TransOrigin[3] = REAL(0.0); - - dVector3 TransDirection; - TransDirection[0] = dDOT(Direction, Rot[0]); - TransDirection[1] = dDOT(Direction, Rot[1]); - TransDirection[2] = dDOT(Direction, Rot[2]); - TransDirection[3] = REAL(0.0); - - dReal T[2]; - T[0] = 0.0f; - T[1] = dInfinity; - - bool Intersect = FindIntersection(TransOrigin, TransDirection, Extents, T[0], T[1]); - - if (Intersect){ - if (T[0] > REAL(0.0)){ - dContactGeom* Contact0 = CONTACT(Flags, Contacts, 0, Stride); - Contact0->pos[0] = Origin[0] + T[0] * Direction[0]; - Contact0->pos[1] = Origin[1] + T[0] * Direction[1]; - Contact0->pos[2] = Origin[2] + T[0] * Direction[2]; - Contact0->pos[3] = Origin[3] + T[0] * Direction[3]; - //Contact0->normal = 0; - Contact0->depth = 0.0f; - Contact0->g1 = RayGeom; - Contact0->g2 = BoxGeom; - - dContactGeom* Contact1 = CONTACT(Flags, Contacts, 1, Stride); - Contact1->pos[0] = Origin[0] + T[1] * Direction[0]; - Contact1->pos[1] = Origin[1] + T[1] * Direction[1]; - Contact1->pos[2] = Origin[2] + T[1] * Direction[2]; - Contact1->pos[3] = Origin[3] + T[1] * Direction[3]; - //Contact1->normal = 0; - Contact1->depth = 0.0f; - Contact1->g1 = RayGeom; - Contact1->g2 = BoxGeom; - - return 2; - } - else{ - dContactGeom* Contact = CONTACT(Flags, Contacts, 0, Stride); - Contact->pos[0] = Origin[0] + T[1] * Direction[0]; - Contact->pos[1] = Origin[1] + T[1] * Direction[1]; - Contact->pos[2] = Origin[2] + T[1] * Direction[2]; - Contact->pos[3] = Origin[3] + T[1] * Direction[3]; - //Contact->normal = 0; - Contact->depth = 0.0f; - Contact->g1 = RayGeom; - Contact->g2 = BoxGeom; - - return 1; - } - } - else return 0; -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/dRay/dRay_CCylinder.cpp b/libraries/ode-0.9/contrib/dRay/dRay_CCylinder.cpp deleted file mode 100644 index b9ea0c0dd3..0000000000 --- a/libraries/ode-0.9/contrib/dRay/dRay_CCylinder.cpp +++ /dev/null @@ -1,199 +0,0 @@ -// Ripped from Magic Software - -#include "Include\dRay.h" -#include "dxRay.h" - -int Find(const dVector3 Origin, dVector3 Direction, dReal Length, const dVector3 CCPos, const dMatrix3 CCRot, dReal CCRadius, dReal CCLength, dReal T[2]){ - dVector3 U, V, W; - Decompose(CCRot, U, V, W); - - dVector3 CCOrigin; - CCOrigin[0] = CCPos[0] - (W[0] * CCLength / 2); - CCOrigin[1] = CCPos[1] - (W[1] * CCLength / 2); - CCOrigin[2] = CCPos[2] - (W[2] * CCLength / 2); - CCOrigin[3] = CCPos[3] - (W[3] * CCLength / 2); - - dVector3 D; - D[0] = dDOT(U, Direction); - D[1] = dDOT(V, Direction); - D[2] = dDOT(W, Direction); - - dReal DMag = Length; - dReal InvDMag = REAL(1.0) / DMag; - - dVector3 Diff; - Diff[0] = Origin[0] - CCOrigin[0]; - Diff[1] = Origin[1] - CCOrigin[1]; - Diff[2] = Origin[2] - CCOrigin[2]; - Diff[3] = Origin[3] - CCOrigin[3]; - - dVector3 P; - P[0] = dDOT(U, Diff); - P[1] = dDOT(V, Diff); - P[2] = dDOT(W, Diff); - - dReal CCRadiusSq = CCRadius * CCRadius; - - dReal Epsilon = 1e-12f; - - if (dFabs(D[2]) >= REAL(1.0) - Epsilon){ // line is parallel to capsule axis - dReal Discr = CCRadiusSq - P[0] * P[0] - P[1] * P[1]; - - if (Discr >= REAL(0.0)){ - dReal Root = dSqrt(Discr); - T[0] = (-P[2] + Root) * InvDMag; - T[1] = (CCLength - P[2] + Root) * InvDMag; - return 2; - } - else return 0; - } - - // test intersection with infinite cylinder - dReal A = D[0] * D[0] + D[1] * D[1]; - dReal B = P[0] * D[0] + P[1] * D[1]; - dReal C = P[0] * P[0] + P[1] * P[1] - CCRadiusSq; - dReal Discr = B * B - A * C; - if (Discr < REAL(0.0)){ // line does not intersect infinite cylinder - return 0; - } - - int Count = 0; - - if (Discr > REAL(0.0)){ // line intersects infinite cylinder in two places - dReal Root = dSqrt(Discr); - dReal Inv = REAL(1.0) / A; - - dReal TTemp = (-B - Root) * Inv; - - dReal Tmp = P[2] + TTemp * D[2]; - if (REAL(0.0) <= Tmp && Tmp <= CCLength){ - T[Count++] = TTemp * InvDMag; - } - - - TTemp = (-B + Root) * Inv; - Tmp = P[2] + TTemp * D[2]; - if (REAL(0.0) <= Tmp && Tmp <= CCLength){ - T[Count++] = TTemp * InvDMag; - } - - if (Count == 2){ // line intersects capsule wall in two places - return 2; - } - } - else{ // line is tangent to infinite cylinder - dReal TTemp = -B / A; - dReal Tmp = P[2] + TTemp * D[2]; - if (REAL(0.0) <= Tmp && Tmp <= CCLength){ - T[0] = TTemp * InvDMag; - return 1; - } - } - - // test intersection with bottom hemisphere - // fA = 1 - B += P[2] * D[2]; - C += P[2] * P[2]; - Discr = B * B - C; - if (Discr > REAL(0.0)){ - dReal Root = dSqrt(Discr); - dReal TTemp = -B - Root; - dReal Tmp = P[2] + TTemp * D[2]; - if (Tmp <= REAL(0.0)){ - T[Count++] = TTemp * InvDMag; - if (Count == 2){ - return 2; - } - } - - TTemp = -B + Root; - Tmp = P[2] + TTemp * D[2]; - if (Tmp <= REAL(0.0)){ - T[Count++] = TTemp * InvDMag; - if (Count == 2){ - return 2; - } - } - } - else if (Discr == REAL(0.0)){ - dReal TTemp = -B; - dReal Tmp = P[2] + TTemp * D[2]; - if (Tmp <= REAL(0.0)){ - T[Count++] = TTemp * InvDMag; - if (Count == 2){ - return 2; - } - } - } - - // test intersection with top hemisphere - // fA = 1 - B -= D[2] * CCLength; - C += CCLength * (CCLength - REAL(2.0) * P[2]); - - Discr = B * B - C; - if (Discr > REAL(0.0)){ - dReal Root = dSqrt(Discr); - dReal TTemp = -B - Root; - dReal Tmp = P[2] + TTemp * D[2]; - if (Tmp >= CCLength){ - - T[Count++] = TTemp * InvDMag; - if (Count == 2){ - return 2; - } - } - - TTemp = -B + Root; - Tmp = P[2] + TTemp * D[2]; - if (Tmp >= CCLength){ - T[Count++] = TTemp * InvDMag; - if (Count == 2){ - return 2; - } - } - } - else if (Discr == REAL(0.0)){ - dReal TTemp = -B; - dReal Tmp = P[2] + TTemp * D[2]; - if (Tmp >= CCLength){ - T[Count++] = TTemp * InvDMag; - if (Count == 2){ - return 2; - } - } - } - return Count; -} - -int dCollideCCR(dxGeom* RayGeom, dxGeom* CCGeom, int Flags, dContactGeom* Contacts, int Stride){ - const dVector3& CCPos = *(const dVector3*)dGeomGetPosition(CCGeom); - const dMatrix3& CCRot = *(const dMatrix3*)dGeomGetRotation(CCGeom); - - dReal CCRadius, CCLength; - dGeomCCylinderGetParams(CCGeom, &CCRadius, &CCLength); - - dVector3 Origin, Direction; - dGeomRayGet(RayGeom, Origin, Direction); - dReal Length = dGeomRayGetLength(RayGeom); - - dReal T[2]; - int Count = Find(Origin, Direction, Length, CCPos, CCRot, CCRadius, CCLength, T); - int ContactCount = 0; - for (int i = 0; i < Count; i++){ - if (T[i] >= 0.0){ - dContactGeom* Contact = CONTACT(Flags, Contacts, ContactCount, Stride); - Contact->pos[0] = Origin[0] + T[i] * Direction[0] * Length; - Contact->pos[1] = Origin[1] + T[i] * Direction[1] * Length; - Contact->pos[2] = Origin[2] + T[i] * Direction[2] * Length; - Contact->pos[3] = Origin[3] + T[i] * Direction[3] * Length; - //Contact->normal = 0; - Contact->depth = 0.0f; - Contact->g1 = RayGeom; - Contact->g2 = CCGeom; - - ContactCount++; - } - } - return ContactCount; -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/dRay/dRay_Plane.cpp b/libraries/ode-0.9/contrib/dRay/dRay_Plane.cpp deleted file mode 100644 index cf03c5b3c7..0000000000 --- a/libraries/ode-0.9/contrib/dRay/dRay_Plane.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// Ripped from Paul Bourke - -#include "Include\dRay.h" -#include "dxRay.h" - -int dCollidePR(dxGeom* RayGeom, dxGeom* PlaneGeom, int Flags, dContactGeom* Contact, int Stride){ - dVector3 Plane; - dGeomPlaneGetParams(PlaneGeom, Plane); - - dVector3 Origin, Direction; - dGeomRayGet(RayGeom, Origin, Direction); - - dReal Length = dGeomRayGetLength(RayGeom); - - dReal Denom = Plane[0] * Direction[0] + Plane[1] * Direction[1] + Plane[2] * Direction[2]; - if (dFabs(Denom) < 0.00001f){ - return 0; // Ray never hits - } - - float T = -(Plane[3] + Plane[0] * Origin[0] + Plane[1] * Origin[1] + Plane[2] * Origin[2]) / Denom; - - if (T < 0 || T > Length){ - return 0; // Ray hits but not within boundaries - } - - Contact->pos[0] = Origin[0] + T * Direction[0]; - Contact->pos[1] = Origin[1] + T * Direction[1]; - Contact->pos[2] = Origin[2] + T * Direction[2]; - Contact->pos[3] = REAL(0.0); - //Contact->normal = 0; - Contact->depth = 0.0f; - Contact->g1 = RayGeom; - Contact->g2 = PlaneGeom; - return 1; -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/dRay/dRay_Sphere.cpp b/libraries/ode-0.9/contrib/dRay/dRay_Sphere.cpp deleted file mode 100644 index 8e1ac39329..0000000000 --- a/libraries/ode-0.9/contrib/dRay/dRay_Sphere.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// Ripped from Magic Software - -#include "Include\dRay.h" -#include "dxRay.h" - -int dCollideSR(dxGeom* RayGeom, dxGeom* SphereGeom, int Flags, dContactGeom* Contacts, int Stride){ - const dVector3& Position = *(const dVector3*)dGeomGetPosition(SphereGeom); - dReal Radius = dGeomSphereGetRadius(SphereGeom); - - dVector3 Origin, Direction; - dGeomRayGet(RayGeom, Origin, Direction); - dReal Length = dGeomRayGetLength(RayGeom); - - dVector3 Diff; - Diff[0] = Origin[0] - Position[0]; - Diff[1] = Origin[1] - Position[1]; - Diff[2] = Origin[2] - Position[2]; - Diff[3] = Origin[3] - Position[3]; - - Direction[0] *= Length; - Direction[1] *= Length; - Direction[2] *= Length; - Direction[3] *= Length; - - dReal A = Length * Length; - dReal B = dDOT(Diff, Direction); - dReal C = dDOT(Diff, Diff) - (Radius * Radius); - - dReal Discr = B * B - A * C; - if (Discr < REAL(0.0)){ - return 0; - } - else if (Discr > REAL(0.0)){ - dReal T[2]; - dReal Root = dSqrt(Discr); - dReal InvA = REAL(1.0) / A; - T[0] = (-B - Root) * InvA; - T[1] = (-B + Root) * InvA; - - if (T[0] >= REAL(0.0)){ - dContactGeom* Contact0 = CONTACT(Flags, Contacts, 0, Stride); - Contact0->pos[0] = Origin[0] + T[0] * Direction[0]; - Contact0->pos[1] = Origin[1] + T[0] * Direction[1]; - Contact0->pos[2] = Origin[2] + T[0] * Direction[2]; - Contact0->pos[3] = Origin[3] + T[0] * Direction[3]; - //Contact0->normal = 0; - Contact0->depth = 0.0f; - Contact0->g1 = RayGeom; - Contact0->g2 = SphereGeom; - - dContactGeom* Contact1 = CONTACT(Flags, Contacts, 1, Stride); - Contact1->pos[0] = Origin[0] + T[1] * Direction[0]; - Contact1->pos[1] = Origin[1] + T[1] * Direction[1]; - Contact1->pos[2] = Origin[2] + T[1] * Direction[2]; - Contact1->pos[3] = Origin[3] + T[1] * Direction[3]; - //Contact1->normal = 0; - Contact1->depth = 0.0f; - Contact1->g1 = RayGeom; - Contact1->g2 = SphereGeom; - - return 2; - } - else if (T[1] >= REAL(0.0)){ - dContactGeom* Contact = CONTACT(Flags, Contacts, 1, Stride); - Contact->pos[0] = Origin[0] + T[1] * Direction[0]; - Contact->pos[1] = Origin[1] + T[1] * Direction[1]; - Contact->pos[2] = Origin[2] + T[1] * Direction[2]; - Contact->pos[3] = Origin[3] + T[1] * Direction[3]; - //Contact->normal = 0; - Contact->depth = 0.0f; - Contact->g1 = RayGeom; - Contact->g2 = SphereGeom; - - return 1; - } - else return 0; - } - else{ - dReal T; - T = -B / A; - if (T >= REAL(0.0)){ - dContactGeom* Contact = CONTACT(Flags, Contacts, 0, Stride); - Contact->pos[0] = Origin[0] + T * Direction[0]; - Contact->pos[1] = Origin[1] + T * Direction[1]; - Contact->pos[2] = Origin[2] + T * Direction[2]; - Contact->pos[3] = Origin[3] + T * Direction[3]; - //Contact->normal = 0; - Contact->depth = 0.0f; - Contact->g1 = RayGeom; - Contact->g2 = SphereGeom; - return 1; - } - else return 0; - } -} \ No newline at end of file diff --git a/libraries/ode-0.9/contrib/dRay/dxRay.h b/libraries/ode-0.9/contrib/dRay/dxRay.h deleted file mode 100644 index 0fd1d2d55c..0000000000 --- a/libraries/ode-0.9/contrib/dRay/dxRay.h +++ /dev/null @@ -1,32 +0,0 @@ -struct dxRay{ - dReal Length; -}; - -inline void Decompose(const dMatrix3 Matrix, dVector3 Right, dVector3 Up, dVector3 Direction){ - Right[0] = Matrix[0 * 4 + 0]; - Right[1] = Matrix[1 * 4 + 0]; - Right[2] = Matrix[2 * 4 + 0]; - Right[3] = Matrix[3 * 4 + 0]; - Up[0] = Matrix[0 * 4 + 1]; - Up[1] = Matrix[1 * 4 + 1]; - Up[2] = Matrix[2 * 4 + 1]; - Up[3] = Matrix[3 * 4 + 1]; - Direction[0] = Matrix[0 * 4 + 2]; - Direction[1] = Matrix[1 * 4 + 2]; - Direction[2] = Matrix[2 * 4 + 2]; - Direction[3] = Matrix[3 * 4 + 2]; -} - -inline void Decompose(const dMatrix3 Matrix, dVector3 Vectors[3]){ - Decompose(Matrix, Vectors[0], Vectors[1], Vectors[2]); -} - -inline dContactGeom* CONTACT(int Flags, dContactGeom* Contacts, int Index, int Stride){ - dIASSERT(Index >= 0 && Index < (Flags & 0x0ffff)); - return ((dContactGeom*)(((char*)Contacts) + (Index * Stride))); -} - -int dCollidePR(dxGeom* RayGeom, dxGeom* PlaneGeom, int Flags, dContactGeom* Contacts, int Stride); -int dCollideSR(dxGeom* RayGeom, dxGeom* SphereGeom, int Flags, dContactGeom* Contacts, int Stride); -int dCollideBR(dxGeom* RayGeom, dxGeom* BoxGeom, int Flags, dContactGeom* Contacts, int Stride); -int dCollideCCR(dxGeom* RayGeom, dxGeom* CCylinderGeom, int Flags, dContactGeom* Contacts, int Stride); \ No newline at end of file diff --git a/libraries/ode-0.9/depcomp b/libraries/ode-0.9/depcomp deleted file mode 100755 index ca5ea4e1ef..0000000000 --- a/libraries/ode-0.9/depcomp +++ /dev/null @@ -1,584 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2006-10-15.18 - -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software -# Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> $depfile - echo >> $depfile - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> $depfile - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` - tmpdepfile="$stripped.u" - if test "$libtool" = yes; then - "$@" -Wc,-M - else - "$@" -M - fi - stat=$? - - if test -f "$tmpdepfile"; then : - else - stripped=`echo "$stripped" | sed 's,^.*/,,'` - tmpdepfile="$stripped.u" - fi - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - - if test -f "$tmpdepfile"; then - outname="$stripped.o" - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" - sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add `dependent.h:' lines. - sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. - "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no - for arg in "$@"; do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix="`echo $object | sed 's/^.*\././'`" - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - "$@" || exit $? - IFS=" " - for arg - do - case "$arg" in - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/libraries/ode-0.9/docs/annotated.html b/libraries/ode-0.9/docs/annotated.html deleted file mode 100644 index 3b3c2f66b6..0000000000 --- a/libraries/ode-0.9/docs/annotated.html +++ /dev/null @@ -1,30 +0,0 @@ - - -Open Dynamics Engine: Data Structures - - - - - - -

    Open Dynamics Engine Data Structures

    Here are the data structures with brief descriptions: - - -
    dContactGeomDescribe the contact point between two geoms
    dsFunctionsSet of functions to be used as callbacks by the simulation loop
    -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/collision_8h-source.html b/libraries/ode-0.9/docs/collision_8h-source.html deleted file mode 100644 index b6ff3b7a3a..0000000000 --- a/libraries/ode-0.9/docs/collision_8h-source.html +++ /dev/null @@ -1,417 +0,0 @@ - - -Open Dynamics Engine: collision.h Source File - - - - - -

    collision.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_COLLISION_H_
    -00024 #define _ODE_COLLISION_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 #include <ode/collision_space.h>
    -00028 #include <ode/contact.h>
    -00029 
    -00030 #ifdef __cplusplus
    -00031 extern "C" {
    -00032 #endif
    -00033 
    -00049 /* ************************************************************************ */
    -00050 /* general functions */
    -00051 
    -00065 ODE_API void dGeomDestroy (dGeomID geom);
    -00066 
    -00067 
    -00075 ODE_API void dGeomSetData (dGeomID geom, void* data);
    -00076 
    -00077 
    -00084 ODE_API void *dGeomGetData (dGeomID geom);
    -00085 
    -00086 
    -00105 ODE_API void dGeomSetBody (dGeomID geom, dBodyID body);
    -00106 
    -00107 
    -00114 ODE_API dBodyID dGeomGetBody (dGeomID geom);
    -00115 
    -00116 
    -00131 ODE_API void dGeomSetPosition (dGeomID geom, dReal x, dReal y, dReal z);
    -00132 
    -00133 
    -00146 ODE_API void dGeomSetRotation (dGeomID geom, const dMatrix3 R);
    -00147 
    -00148 
    -00162 ODE_API void dGeomSetQuaternion (dGeomID geom, const dQuaternion Q);
    -00163 
    -00164 
    -00181 ODE_API const dReal * dGeomGetPosition (dGeomID geom);
    -00182 
    -00183 
    -00191 ODE_API void dGeomCopyPosition (dGeomID geom, dVector3 pos);
    -00192 
    -00193 
    -00210 ODE_API const dReal * dGeomGetRotation (dGeomID geom);
    -00211 
    -00212 
    -00226 ODE_API void dGeomCopyRotation(dGeomID geom, dMatrix3 R);
    -00227 
    -00228 
    -00242 ODE_API void dGeomGetQuaternion (dGeomID geom, dQuaternion result);
    -00243 
    -00244 
    -00261 ODE_API void dGeomGetAABB (dGeomID geom, dReal aabb[6]);
    -00262 
    -00263 
    -00270 ODE_API int dGeomIsSpace (dGeomID geom);
    -00271 
    -00272 
    -00280 ODE_API dSpaceID dGeomGetSpace (dGeomID);
    -00281 
    -00282 
    -00307 ODE_API int dGeomGetClass (dGeomID geom);
    -00308 
    -00309 
    -00322 ODE_API void dGeomSetCategoryBits (dGeomID geom, unsigned long bits);
    -00323 
    -00324 
    -00337 ODE_API void dGeomSetCollideBits (dGeomID geom, unsigned long bits);
    -00338 
    -00339 
    -00348 ODE_API unsigned long dGeomGetCategoryBits (dGeomID);
    -00349 
    -00350 
    -00359 ODE_API unsigned long dGeomGetCollideBits (dGeomID);
    -00360 
    -00361 
    -00374 ODE_API void dGeomEnable (dGeomID geom);
    -00375 
    -00376 
    -00389 ODE_API void dGeomDisable (dGeomID geom);
    -00390 
    -00391 
    -00405 ODE_API int dGeomIsEnabled (dGeomID geom);
    -00406 
    -00407 /* ************************************************************************ */
    -00408 /* geom offset from body */
    -00409 
    -00425 ODE_API void dGeomSetOffsetPosition (dGeomID geom, dReal x, dReal y, dReal z);
    -00426 
    -00427 
    -00441 ODE_API void dGeomSetOffsetRotation (dGeomID geom, const dMatrix3 R);
    -00442 
    -00443 
    -00457 ODE_API void dGeomSetOffsetQuaternion (dGeomID geom, const dQuaternion Q);
    -00458 
    -00459 
    -00476 ODE_API void dGeomSetOffsetWorldPosition (dGeomID geom, dReal x, dReal y, dReal z);
    -00477 
    -00478 
    -00493 ODE_API void dGeomSetOffsetWorldRotation (dGeomID geom, const dMatrix3 R);
    -00494 
    -00495 
    -00510 ODE_API void dGeomSetOffsetWorldQuaternion (dGeomID geom, const dQuaternion);
    -00511 
    -00512 
    -00526 ODE_API void dGeomClearOffset(dGeomID geom);
    -00527 
    -00528 
    -00544 ODE_API int dGeomIsOffset(dGeomID geom);
    -00545 
    -00546 
    -00560 ODE_API const dReal * dGeomGetOffsetPosition (dGeomID geom);
    -00561 
    -00562 
    -00573 ODE_API void dGeomCopyOffsetPosition (dGeomID geom, dVector3 pos);
    -00574 
    -00575 
    -00590 ODE_API const dReal * dGeomGetOffsetRotation (dGeomID geom);
    -00591 
    -00592 
    -00604 ODE_API void dGeomCopyOffsetRotation (dGeomID geom, dMatrix3 R);
    -00605 
    -00606 
    -00617 ODE_API void dGeomGetOffsetQuaternion (dGeomID geom, dQuaternion result);
    -00618 
    -00619 
    -00620 /* ************************************************************************ */
    -00621 /* collision detection */
    -00622 
    -00623 /*
    -00624  * Just generate any contacts (disables any contact refining).
    -00625  */
    -00626 #define CONTACTS_UNIMPORTANT        0x80000000
    -00627 
    -00675 ODE_API int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact,
    -00676          int skip);
    -00677 
    -00705 ODE_API void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback);
    -00706 
    -00707 
    -00742 ODE_API void dSpaceCollide2 (dGeomID space1, dGeomID space2, void *data, dNearCallback *callback);
    -00743 
    -00744 
    -00745 /* ************************************************************************ */
    -00746 /* standard classes */
    -00747 
    -00748 /* the maximum number of user classes that are supported */
    -00749 enum {
    -00750   dMaxUserClasses = 4
    -00751 };
    -00752 
    -00753 /* class numbers - each geometry object needs a unique number */
    -00754 enum {
    -00755   dSphereClass = 0,
    -00756   dBoxClass,
    -00757   dCapsuleClass,
    -00758   dCylinderClass,
    -00759   dPlaneClass,
    -00760   dRayClass,
    -00761   dConvexClass,
    -00762   dGeomTransformClass,
    -00763   dTriMeshClass,
    -00764   dHeightfieldClass,
    -00765 
    -00766   dFirstSpaceClass,
    -00767   dSimpleSpaceClass = dFirstSpaceClass,
    -00768   dHashSpaceClass,
    -00769   dQuadTreeSpaceClass,
    -00770   dLastSpaceClass = dQuadTreeSpaceClass,
    -00771 
    -00772   dFirstUserClass,
    -00773   dLastUserClass = dFirstUserClass + dMaxUserClasses - 1,
    -00774   dGeomNumClasses
    -00775 };
    -00776 
    -00777 
    -00797 ODE_API dGeomID dCreateSphere (dSpaceID space, dReal radius);
    -00798 
    -00799 
    -00809 ODE_API void dGeomSphereSetRadius (dGeomID sphere, dReal radius);
    -00810 
    -00811 
    -00820 ODE_API dReal dGeomSphereGetRadius (dGeomID sphere);
    -00821 
    -00822 
    -00837 ODE_API dReal dGeomSpherePointDepth (dGeomID sphere, dReal x, dReal y, dReal z);
    -00838 
    -00839 
    -00840 //--> Convex Functions
    -00841 ODE_API dGeomID dCreateConvex (dSpaceID space,
    -00842                 dReal *_planes,
    -00843                 unsigned int _planecount,
    -00844                 dReal *_points,
    -00845                 unsigned int _pointcount,unsigned int *_polygons);
    -00846 
    -00847 ODE_API void dGeomSetConvex (dGeomID g,
    -00848               dReal *_planes,
    -00849               unsigned int _count,
    -00850               dReal *_points,
    -00851               unsigned int _pointcount,unsigned int *_polygons);
    -00852 //<-- Convex Functions
    -00853 
    -00875 ODE_API dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz);
    -00876 
    -00877 
    -00889 ODE_API void dGeomBoxSetLengths (dGeomID box, dReal lx, dReal ly, dReal lz);
    -00890 
    -00891 
    -00901 ODE_API void dGeomBoxGetLengths (dGeomID box, dVector3 result);
    -00902 
    -00903 
    -00916 ODE_API dReal dGeomBoxPointDepth (dGeomID box, dReal x, dReal y, dReal z);
    -00917 
    -00918 
    -00919 ODE_API dGeomID dCreatePlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d);
    -00920 ODE_API void dGeomPlaneSetParams (dGeomID plane, dReal a, dReal b, dReal c, dReal d);
    -00921 ODE_API void dGeomPlaneGetParams (dGeomID plane, dVector4 result);
    -00922 ODE_API dReal dGeomPlanePointDepth (dGeomID plane, dReal x, dReal y, dReal z);
    -00923 
    -00924 ODE_API dGeomID dCreateCapsule (dSpaceID space, dReal radius, dReal length);
    -00925 ODE_API void dGeomCapsuleSetParams (dGeomID ccylinder, dReal radius, dReal length);
    -00926 ODE_API void dGeomCapsuleGetParams (dGeomID ccylinder, dReal *radius, dReal *length);
    -00927 ODE_API dReal dGeomCapsulePointDepth (dGeomID ccylinder, dReal x, dReal y, dReal z);
    -00928 
    -00929 // For now we want to have a backwards compatible C-API, note: C++ API is not.
    -00930 #define dCreateCCylinder dCreateCapsule
    -00931 #define dGeomCCylinderSetParams dGeomCapsuleSetParams
    -00932 #define dGeomCCylinderGetParams dGeomCapsuleGetParams
    -00933 #define dGeomCCylinderPointDepth dGeomCapsulePointDepth
    -00934 #define dCCylinderClass dCapsuleClass
    -00935 
    -00936 ODE_API dGeomID dCreateCylinder (dSpaceID space, dReal radius, dReal length);
    -00937 ODE_API void dGeomCylinderSetParams (dGeomID cylinder, dReal radius, dReal length);
    -00938 ODE_API void dGeomCylinderGetParams (dGeomID cylinder, dReal *radius, dReal *length);
    -00939 
    -00940 ODE_API dGeomID dCreateRay (dSpaceID space, dReal length);
    -00941 ODE_API void dGeomRaySetLength (dGeomID ray, dReal length);
    -00942 ODE_API dReal dGeomRayGetLength (dGeomID ray);
    -00943 ODE_API void dGeomRaySet (dGeomID ray, dReal px, dReal py, dReal pz,
    -00944         dReal dx, dReal dy, dReal dz);
    -00945 ODE_API void dGeomRayGet (dGeomID ray, dVector3 start, dVector3 dir);
    -00946 
    -00947 /*
    -00948  * Set/get ray flags that influence ray collision detection.
    -00949  * These flags are currently only noticed by the trimesh collider, because
    -00950  * they can make a major differences there.
    -00951  */
    -00952 ODE_API void dGeomRaySetParams (dGeomID g, int FirstContact, int BackfaceCull);
    -00953 ODE_API void dGeomRayGetParams (dGeomID g, int *FirstContact, int *BackfaceCull);
    -00954 ODE_API void dGeomRaySetClosestHit (dGeomID g, int closestHit);
    -00955 ODE_API int dGeomRayGetClosestHit (dGeomID g);
    -00956 
    -00957 #include "collision_trimesh.h"
    -00958 
    -00959 ODE_API dGeomID dCreateGeomTransform (dSpaceID space);
    -00960 ODE_API void dGeomTransformSetGeom (dGeomID g, dGeomID obj);
    -00961 ODE_API dGeomID dGeomTransformGetGeom (dGeomID g);
    -00962 ODE_API void dGeomTransformSetCleanup (dGeomID g, int mode);
    -00963 ODE_API int dGeomTransformGetCleanup (dGeomID g);
    -00964 ODE_API void dGeomTransformSetInfo (dGeomID g, int mode);
    -00965 ODE_API int dGeomTransformGetInfo (dGeomID g);
    -00966 
    -00967 
    -00968 /* ************************************************************************ */
    -00969 /* heightfield functions */
    -00970 
    -00971 
    -00972 // Data storage for heightfield data.
    -00973 struct dxHeightfieldData;
    -00974 typedef struct dxHeightfieldData* dHeightfieldDataID;
    -00975 
    -00976 
    -00994 typedef dReal dHeightfieldGetHeight( void* p_user_data, int x, int z );
    -00995 
    -00996 
    -00997 
    -01017 ODE_API dGeomID dCreateHeightfield( dSpaceID space,
    -01018                dHeightfieldDataID data, int bPlaceable );
    -01019 
    -01020 
    -01033 ODE_API dHeightfieldDataID dGeomHeightfieldDataCreate();
    -01034 
    -01035 
    -01044 ODE_API void dGeomHeightfieldDataDestroy( dHeightfieldDataID d );
    -01045 
    -01046 
    -01047 
    -01088 ODE_API void dGeomHeightfieldDataBuildCallback( dHeightfieldDataID d,
    -01089             void* pUserData, dHeightfieldGetHeight* pCallback,
    -01090             dReal width, dReal depth, int widthSamples, int depthSamples,
    -01091             dReal scale, dReal offset, dReal thickness, int bWrap );
    -01092 
    -01136 ODE_API void dGeomHeightfieldDataBuildByte( dHeightfieldDataID d,
    -01137             const unsigned char* pHeightData, int bCopyHeightData,
    -01138             dReal width, dReal depth, int widthSamples, int depthSamples,
    -01139             dReal scale, dReal offset, dReal thickness,  int bWrap );
    -01140 
    -01184 ODE_API void dGeomHeightfieldDataBuildShort( dHeightfieldDataID d,
    -01185             const short* pHeightData, int bCopyHeightData,
    -01186             dReal width, dReal depth, int widthSamples, int depthSamples,
    -01187             dReal scale, dReal offset, dReal thickness, int bWrap );
    -01188 
    -01234 ODE_API void dGeomHeightfieldDataBuildSingle( dHeightfieldDataID d,
    -01235             const float* pHeightData, int bCopyHeightData,
    -01236             dReal width, dReal depth, int widthSamples, int depthSamples,
    -01237             dReal scale, dReal offset, dReal thickness, int bWrap );
    -01238 
    -01284 ODE_API void dGeomHeightfieldDataBuildDouble( dHeightfieldDataID d,
    -01285             const double* pHeightData, int bCopyHeightData,
    -01286             dReal width, dReal depth, int widthSamples, int depthSamples,
    -01287             dReal scale, dReal offset, dReal thickness, int bWrap );
    -01288 
    -01306 ODE_API void dGeomHeightfieldDataSetBounds( dHeightfieldDataID d,
    -01307             dReal minHeight, dReal maxHeight );
    -01308 
    -01309 
    -01320 ODE_API void dGeomHeightfieldSetHeightfieldData( dGeomID g, dHeightfieldDataID d );
    -01321 
    -01322 
    -01332 ODE_API dHeightfieldDataID dGeomHeightfieldGetHeightfieldData( dGeomID g );
    -01333 
    -01334 
    -01335 
    -01336 /* ************************************************************************ */
    -01337 /* utility functions */
    -01338 
    -01339 ODE_API void dClosestLineSegmentPoints (const dVector3 a1, const dVector3 a2,
    -01340             const dVector3 b1, const dVector3 b2,
    -01341             dVector3 cp1, dVector3 cp2);
    -01342 
    -01343 ODE_API int dBoxTouchesBox (const dVector3 _p1, const dMatrix3 R1,
    -01344           const dVector3 side1, const dVector3 _p2,
    -01345           const dMatrix3 R2, const dVector3 side2);
    -01346 
    -01347 // The meaning of flags parameter is the same as in dCollide()
    -01348 ODE_API int dBoxBox (const dVector3 p1, const dMatrix3 R1,
    -01349         const dVector3 side1, const dVector3 p2,
    -01350         const dMatrix3 R2, const dVector3 side2,
    -01351         dVector3 normal, dReal *depth, int *return_code,
    -01352         int flags, dContactGeom *contact, int skip);
    -01353 
    -01354 ODE_API void dInfiniteAABB (dGeomID geom, dReal aabb[6]);
    -01355 ODE_API void dInitODE(void);
    -01356 ODE_API void dCloseODE(void);
    -01357 
    -01358 /* ************************************************************************ */
    -01359 /* custom classes */
    -01360 
    -01361 typedef void dGetAABBFn (dGeomID, dReal aabb[6]);
    -01362 typedef int dColliderFn (dGeomID o1, dGeomID o2,
    -01363           int flags, dContactGeom *contact, int skip);
    -01364 typedef dColliderFn * dGetColliderFnFn (int num);
    -01365 typedef void dGeomDtorFn (dGeomID o);
    -01366 typedef int dAABBTestFn (dGeomID o1, dGeomID o2, dReal aabb[6]);
    -01367 
    -01368 typedef struct dGeomClass {
    -01369   int bytes;
    -01370   dGetColliderFnFn *collider;
    -01371   dGetAABBFn *aabb;
    -01372   dAABBTestFn *aabb_test;
    -01373   dGeomDtorFn *dtor;
    -01374 } dGeomClass;
    -01375 
    -01376 ODE_API int dCreateGeomClass (const dGeomClass *classptr);
    -01377 ODE_API void * dGeomGetClassData (dGeomID);
    -01378 ODE_API dGeomID dCreateGeom (int classnum);
    -01379 
    -01380 /* ************************************************************************ */
    -01381 
    -01382 #ifdef __cplusplus
    -01383 }
    -01384 #endif
    -01385 
    -01386 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/collision__space_8h-source.html b/libraries/ode-0.9/docs/collision__space_8h-source.html deleted file mode 100644 index dbece3d226..0000000000 --- a/libraries/ode-0.9/docs/collision__space_8h-source.html +++ /dev/null @@ -1,81 +0,0 @@ - - -Open Dynamics Engine: collision_space.h Source File - - - - - -

    collision_space.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_COLLISION_SPACE_H_
    -00024 #define _ODE_COLLISION_SPACE_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 
    -00028 #ifdef __cplusplus
    -00029 extern "C" {
    -00030 #endif
    -00031 
    -00032 struct dContactGeom;
    -00033 
    -00049 typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2);
    -00050 
    -00051 
    -00052 ODE_API dSpaceID dSimpleSpaceCreate (dSpaceID space);
    -00053 ODE_API dSpaceID dHashSpaceCreate (dSpaceID space);
    -00054 ODE_API dSpaceID dQuadTreeSpaceCreate (dSpaceID space, dVector3 Center, dVector3 Extents, int Depth);
    -00055 
    -00056 ODE_API void dSpaceDestroy (dSpaceID);
    -00057 
    -00058 ODE_API void dHashSpaceSetLevels (dSpaceID space, int minlevel, int maxlevel);
    -00059 ODE_API void dHashSpaceGetLevels (dSpaceID space, int *minlevel, int *maxlevel);
    -00060 
    -00061 ODE_API void dSpaceSetCleanup (dSpaceID space, int mode);
    -00062 ODE_API int dSpaceGetCleanup (dSpaceID space);
    -00063 
    -00064 ODE_API void dSpaceAdd (dSpaceID, dGeomID);
    -00065 ODE_API void dSpaceRemove (dSpaceID, dGeomID);
    -00066 ODE_API int dSpaceQuery (dSpaceID, dGeomID);
    -00067 ODE_API void dSpaceClean (dSpaceID);
    -00068 ODE_API int dSpaceGetNumGeoms (dSpaceID);
    -00069 ODE_API dGeomID dSpaceGetGeom (dSpaceID, int i);
    -00070 
    -00071 
    -00072 #ifdef __cplusplus
    -00073 }
    -00074 #endif
    -00075 
    -00076 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/collision__trimesh_8h-source.html b/libraries/ode-0.9/docs/collision__trimesh_8h-source.html deleted file mode 100644 index 488925c823..0000000000 --- a/libraries/ode-0.9/docs/collision__trimesh_8h-source.html +++ /dev/null @@ -1,220 +0,0 @@ - - -Open Dynamics Engine: collision_trimesh.h Source File - - - - - -

    collision_trimesh.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 /*
    -00024  * TriMesh code by Erwin de Vries.
    -00025  *
    -00026  * Trimesh data.
    -00027  * This is where the actual vertexdata (pointers), and BV tree is stored.
    -00028  * Vertices should be single precision!
    -00029  * This should be more sophisticated, so that the user can easyly implement
    -00030  * another collision library, but this is a lot of work, and also costs some
    -00031  * performance because some data has to be copied.
    -00032  */
    -00033 
    -00034 #ifndef _ODE_COLLISION_TRIMESH_H_
    -00035 #define _ODE_COLLISION_TRIMESH_H_
    -00036 
    -00037 #ifdef __cplusplus
    -00038 extern "C" {
    -00039 #endif
    -00040 
    -00041 /*
    -00042  * Data storage for triangle meshes.
    -00043  */
    -00044 struct dxTriMeshData;
    -00045 typedef struct dxTriMeshData* dTriMeshDataID;
    -00046 
    -00047 /*
    -00048  * These dont make much sense now, but they will later when we add more
    -00049  * features.
    -00050  */
    -00051 ODE_API dTriMeshDataID dGeomTriMeshDataCreate(void);
    -00052 ODE_API void dGeomTriMeshDataDestroy(dTriMeshDataID g);
    -00053 
    -00054 
    -00055 
    -00056 enum { TRIMESH_FACE_NORMALS };
    -00057 ODE_API void dGeomTriMeshDataSet(dTriMeshDataID g, int data_id, void* in_data);
    -00058 ODE_API void* dGeomTriMeshDataGet(dTriMeshDataID g, int data_id);
    -00059 
    -00060 
    -00061 
    -00067 ODE_API void dGeomTriMeshSetLastTransform( dGeomID g, dMatrix4 last_trans );
    -00068 ODE_API dReal* dGeomTriMeshGetLastTransform( dGeomID g );
    -00069 
    -00070 /*
    -00071  * Build TriMesh data with single precision used in vertex data .
    -00072  */
    -00073 ODE_API void dGeomTriMeshDataBuildSingle(dTriMeshDataID g,
    -00074                                  const void* Vertices, int VertexStride, int VertexCount, 
    -00075                                  const void* Indices, int IndexCount, int TriStride);
    -00076 /* same again with a normals array (used as trimesh-trimesh optimization) */
    -00077 ODE_API void dGeomTriMeshDataBuildSingle1(dTriMeshDataID g,
    -00078                                   const void* Vertices, int VertexStride, int VertexCount, 
    -00079                                   const void* Indices, int IndexCount, int TriStride,
    -00080                                   const void* Normals);
    -00081 /*
    -00082 * Build TriMesh data with double pricision used in vertex data .
    -00083 */
    -00084 ODE_API void dGeomTriMeshDataBuildDouble(dTriMeshDataID g, 
    -00085                                  const void* Vertices,  int VertexStride, int VertexCount, 
    -00086                                  const void* Indices, int IndexCount, int TriStride);
    -00087 /* same again with a normals array (used as trimesh-trimesh optimization) */
    -00088 ODE_API void dGeomTriMeshDataBuildDouble1(dTriMeshDataID g, 
    -00089                                   const void* Vertices,  int VertexStride, int VertexCount, 
    -00090                                   const void* Indices, int IndexCount, int TriStride,
    -00091                                   const void* Normals);
    -00092 
    -00093 /*
    -00094  * Simple build. Single/double precision based on dSINGLE/dDOUBLE!
    -00095  */
    -00096 ODE_API void dGeomTriMeshDataBuildSimple(dTriMeshDataID g,
    -00097                                  const dReal* Vertices, int VertexCount,
    -00098                                  const int* Indices, int IndexCount);
    -00099 /* same again with a normals array (used as trimesh-trimesh optimization) */
    -00100 ODE_API void dGeomTriMeshDataBuildSimple1(dTriMeshDataID g,
    -00101                                   const dReal* Vertices, int VertexCount,
    -00102                                   const int* Indices, int IndexCount,
    -00103                                   const int* Normals);
    -00104 
    -00105 /* Preprocess the trimesh data to remove mark unnecessary edges and vertices */
    -00106 ODE_API void dGeomTriMeshDataPreprocess(dTriMeshDataID g);
    -00107 /* Get and set the internal preprocessed trimesh data buffer, for loading and saving */
    -00108 ODE_API void dGeomTriMeshDataGetBuffer(dTriMeshDataID g, unsigned char** buf, int* bufLen);
    -00109 ODE_API void dGeomTriMeshDataSetBuffer(dTriMeshDataID g, unsigned char* buf);
    -00110 
    -00111 
    -00112 /*
    -00113  * Per triangle callback. Allows the user to say if he wants a collision with
    -00114  * a particular triangle.
    -00115  */
    -00116 typedef int dTriCallback(dGeomID TriMesh, dGeomID RefObject, int TriangleIndex);
    -00117 ODE_API void dGeomTriMeshSetCallback(dGeomID g, dTriCallback* Callback);
    -00118 ODE_API dTriCallback* dGeomTriMeshGetCallback(dGeomID g);
    -00119 
    -00120 /*
    -00121  * Per object callback. Allows the user to get the list of triangles in 1
    -00122  * shot. Maybe we should remove this one.
    -00123  */
    -00124 typedef void dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, const int* TriIndices, int TriCount);
    -00125 ODE_API void dGeomTriMeshSetArrayCallback(dGeomID g, dTriArrayCallback* ArrayCallback);
    -00126 ODE_API dTriArrayCallback* dGeomTriMeshGetArrayCallback(dGeomID g);
    -00127 
    -00128 /*
    -00129  * Ray callback.
    -00130  * Allows the user to say if a ray collides with a triangle on barycentric
    -00131  * coords. The user can for example sample a texture with alpha transparency
    -00132  * to determine if a collision should occur.
    -00133  */
    -00134 typedef int dTriRayCallback(dGeomID TriMesh, dGeomID Ray, int TriangleIndex, dReal u, dReal v);
    -00135 ODE_API void dGeomTriMeshSetRayCallback(dGeomID g, dTriRayCallback* Callback);
    -00136 ODE_API dTriRayCallback* dGeomTriMeshGetRayCallback(dGeomID g);
    -00137 
    -00138 /*
    -00139  * Trimesh class
    -00140  * Construction. Callbacks are optional.
    -00141  */
    -00142 ODE_API dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback);
    -00143 
    -00144 ODE_API void dGeomTriMeshSetData(dGeomID g, dTriMeshDataID Data);
    -00145 ODE_API dTriMeshDataID dGeomTriMeshGetData(dGeomID g);
    -00146 
    -00147 
    -00148 // enable/disable/check temporal coherence
    -00149 ODE_API void dGeomTriMeshEnableTC(dGeomID g, int geomClass, int enable);
    -00150 ODE_API int dGeomTriMeshIsTCEnabled(dGeomID g, int geomClass);
    -00151 
    -00152 /*
    -00153  * Clears the internal temporal coherence caches. When a geom has its
    -00154  * collision checked with a trimesh once, data is stored inside the trimesh.
    -00155  * With large worlds with lots of seperate objects this list could get huge.
    -00156  * We should be able to do this automagically.
    -00157  */
    -00158 ODE_API void dGeomTriMeshClearTCCache(dGeomID g);
    -00159 
    -00160 
    -00161 /*
    -00162  * returns the TriMeshDataID
    -00163  */
    -00164 ODE_API dTriMeshDataID dGeomTriMeshGetTriMeshDataID(dGeomID g);
    -00165 
    -00166 /*
    -00167  * Gets a triangle.
    -00168  */
    -00169 ODE_API void dGeomTriMeshGetTriangle(dGeomID g, int Index, dVector3* v0, dVector3* v1, dVector3* v2);
    -00170 
    -00171 /*
    -00172  * Gets the point on the requested triangle and the given barycentric
    -00173  * coordinates.
    -00174  */
    -00175 ODE_API void dGeomTriMeshGetPoint(dGeomID g, int Index, dReal u, dReal v, dVector3 Out);
    -00176 
    -00177 /*
    -00178 
    -00179 This is how the strided data works:
    -00180 
    -00181 struct StridedVertex{
    -00182    dVector3 Vertex;
    -00183    // Userdata
    -00184 };
    -00185 int VertexStride = sizeof(StridedVertex);
    -00186 
    -00187 struct StridedTri{
    -00188    int Indices[3];
    -00189    // Userdata
    -00190 };
    -00191 int TriStride = sizeof(StridedTri);
    -00192 
    -00193 */
    -00194 
    -00195 
    -00196 ODE_API int dGeomTriMeshGetTriangleCount (dGeomID g);
    -00197 
    -00198 ODE_API void dGeomTriMeshDataUpdate(dTriMeshDataID g);
    -00199 
    -00200 #ifdef __cplusplus
    -00201 }
    -00202 #endif
    -00203 
    -00204 #endif   /* _ODE_COLLISION_TRIMESH_H_ */
    -00205 
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/common_8h-source.html b/libraries/ode-0.9/docs/common_8h-source.html deleted file mode 100644 index 8b29b64d93..0000000000 --- a/libraries/ode-0.9/docs/common_8h-source.html +++ /dev/null @@ -1,408 +0,0 @@ - - -Open Dynamics Engine: common.h Source File - - - - - -

    common.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_COMMON_H_
    -00024 #define _ODE_COMMON_H_
    -00025 #include <ode/config.h>
    -00026 #include <ode/error.h>
    -00027 #include <math.h>
    -00028 
    -00029 #ifdef __cplusplus
    -00030 extern "C" {
    -00031 #endif
    -00032 
    -00033 
    -00034 /* configuration stuff */
    -00035 
    -00036 /* the efficient alignment. most platforms align data structures to some
    -00037  * number of bytes, but this is not always the most efficient alignment.
    -00038  * for example, many x86 compilers align to 4 bytes, but on a pentium it
    -00039  * is important to align doubles to 8 byte boundaries (for speed), and
    -00040  * the 4 floats in a SIMD register to 16 byte boundaries. many other
    -00041  * platforms have similar behavior. setting a larger alignment can waste
    -00042  * a (very) small amount of memory. NOTE: this number must be a power of
    -00043  * two. this is set to 16 by default.
    -00044  */
    -00045 #define EFFICIENT_ALIGNMENT 16
    -00046 
    -00047 
    -00048 /* constants */
    -00049 
    -00050 /* pi and 1/sqrt(2) are defined here if necessary because they don't get
    -00051  * defined in <math.h> on some platforms (like MS-Windows)
    -00052  */
    -00053 
    -00054 #ifndef M_PI
    -00055 #define M_PI REAL(3.1415926535897932384626433832795029)
    -00056 #endif
    -00057 #ifndef M_SQRT1_2
    -00058 #define M_SQRT1_2 REAL(0.7071067811865475244008443621048490)
    -00059 #endif
    -00060 
    -00061 
    -00062 /* debugging:
    -00063  *   IASSERT  is an internal assertion, i.e. a consistency check. if it fails
    -00064  *            we want to know where.
    -00065  *   UASSERT  is a user assertion, i.e. if it fails a nice error message
    -00066  *            should be printed for the user.
    -00067  *   AASSERT  is an arguments assertion, i.e. if it fails "bad argument(s)"
    -00068  *            is printed.
    -00069  *   DEBUGMSG just prints out a message
    -00070  */
    -00071 
    -00072 #ifndef dNODEBUG
    -00073 #ifdef __GNUC__
    -00074 #define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \
    -00075   "assertion \"" #a "\" failed in %s() [%s]",__FUNCTION__,__FILE__);
    -00076 #define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \
    -00077   msg " in %s()", __FUNCTION__);
    -00078 #define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT,          \
    -00079 msg " in %s() File %s Line %d", __FUNCTION__, __FILE__,__LINE__);
    -00080 #else
    -00081 #define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \
    -00082   "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__);
    -00083 #define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \
    -00084   msg " (%s:%d)", __FILE__,__LINE__);
    -00085 #define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \
    -00086   msg " (%s:%d)", __FILE__,__LINE__);
    -00087 #endif
    -00088 #else
    -00089 #define dIASSERT(a) ;
    -00090 #define dUASSERT(a,msg) ;
    -00091 #define dDEBUGMSG(msg) ;
    -00092 #endif
    -00093 #define dAASSERT(a) dUASSERT(a,"Bad argument(s)")
    -00094 
    -00095 // Macro used to suppress unused variable warning
    -00096 #define dVARIABLEUSED(a) ((void)a)
    -00097 
    -00098 /* floating point data type, vector, matrix and quaternion types */
    -00099 
    -00100 #if defined(dSINGLE)
    -00101 typedef float dReal;
    -00102 #ifdef dDOUBLE
    -00103 #error You can only #define dSINGLE or dDOUBLE, not both.
    -00104 #endif // dDOUBLE
    -00105 #elif defined(dDOUBLE)
    -00106 typedef double dReal;
    -00107 #else
    -00108 #error You must #define dSINGLE or dDOUBLE
    -00109 #endif
    -00110 
    -00111 // Detect if we've got both trimesh engines enabled.
    -00112 #if dTRIMESH_ENABLED
    -00113 #if dTRIMESH_OPCODE && dTRIMESH_GIMPACT
    -00114 #error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both.
    -00115 #endif
    -00116 #endif // dTRIMESH_ENABLED
    -00117 
    -00118 /* round an integer up to a multiple of 4, except that 0 and 1 are unmodified
    -00119  * (used to compute matrix leading dimensions)
    -00120  */
    -00121 #define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a))
    -00122 
    -00123 /* these types are mainly just used in headers */
    -00124 typedef dReal dVector3[4];
    -00125 typedef dReal dVector4[4];
    -00126 typedef dReal dMatrix3[4*3];
    -00127 typedef dReal dMatrix4[4*4];
    -00128 typedef dReal dMatrix6[8*6];
    -00129 typedef dReal dQuaternion[4];
    -00130 
    -00131 
    -00132 /* precision dependent scalar math functions */
    -00133 
    -00134 #if defined(dSINGLE)
    -00135 
    -00136 #define REAL(x) (x ## f)               /* form a constant */
    -00137 #define dRecip(x) ((1.0f/(x)))            /* reciprocal */
    -00138 #define dSqrt(x) (sqrtf(x))         /* square root */
    -00139 #define dRecipSqrt(x) ((1.0f/sqrtf(x)))      /* reciprocal square root */
    -00140 #define dSin(x) (sinf(x))           /* sine */
    -00141 #define dCos(x) (cosf(x))           /* cosine */
    -00142 #define dFabs(x) (fabsf(x))         /* absolute value */
    -00143 #define dAtan2(y,x) (atan2f(y,x))      /* arc tangent with 2 args */
    -00144 #define dFMod(a,b) (fmodf(a,b))     /* modulo */
    -00145 #define dFloor(x) floorf(x)         /* floor */
    -00146 
    -00147 #ifdef HAVE___ISNANF
    -00148 #define dIsNan(x) (__isnanf(x))
    -00149 #elif defined(HAVE__ISNANF)
    -00150 #define dIsNan(x) (_isnanf(x))
    -00151 #elif defined(HAVE_ISNANF)
    -00152 #define dIsNan(x) (isnanf(x))
    -00153 #else
    -00154   /*
    -00155      fall back to _isnan which is the VC way,
    -00156      this may seem redundant since we already checked
    -00157      for _isnan before, but if isnan is detected by
    -00158      configure but is not found during compilation
    -00159      we should always make sure we check for __isnanf,
    -00160      _isnanf and isnanf in that order before falling
    -00161      back to a default
    -00162   */
    -00163 #define dIsNan(x) (_isnan(x))
    -00164 #endif
    -00165 
    -00166 #define dCopySign(a,b) ((dReal)copysignf(a,b))
    -00167 
    -00168 #elif defined(dDOUBLE)
    -00169 
    -00170 #define REAL(x) (x)
    -00171 #define dRecip(x) (1.0/(x))
    -00172 #define dSqrt(x) sqrt(x)
    -00173 #define dRecipSqrt(x) (1.0/sqrt(x))
    -00174 #define dSin(x) sin(x)
    -00175 #define dCos(x) cos(x)
    -00176 #define dFabs(x) fabs(x)
    -00177 #define dAtan2(y,x) atan2((y),(x))
    -00178 #define dFMod(a,b) (fmod((a),(b)))
    -00179 #define dFloor(x) floor(x)
    -00180 
    -00181 #ifdef HAVE___ISNAN
    -00182 #define dIsNan(x) (__isnan(x))
    -00183 #elif defined(HAVE__ISNAN)
    -00184 #define dIsNan(x) (_isnan(x))
    -00185 #elif defined(HAVE_ISNAN)
    -00186 #define dIsNan(x) (isnan(x))
    -00187 #else
    -00188 #define dIsNan(x) (_isnan(x))
    -00189 #endif
    -00190 
    -00191 #define dCopySign(a,b) (copysign((a),(b)))
    -00192 
    -00193 #else
    -00194 #error You must #define dSINGLE or dDOUBLE
    -00195 #endif
    -00196 
    -00197 
    -00198 /* utility */
    -00199 
    -00200 
    -00201 /* round something up to be a multiple of the EFFICIENT_ALIGNMENT */
    -00202 
    -00203 #define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1)
    -00204 
    -00205 
    -00206 /* alloca aligned to the EFFICIENT_ALIGNMENT. note that this can waste
    -00207  * up to 15 bytes per allocation, depending on what alloca() returns.
    -00208  */
    -00209 
    -00210 #define dALLOCA16(n) \
    -00211   ((char*)dEFFICIENT_SIZE(((size_t)(alloca((n)+(EFFICIENT_ALIGNMENT-1))))))
    -00212 
    -00213 
    -00214 // Use the error-checking memory allocation system.  Because this system uses heap
    -00215 //  (malloc) instead of stack (alloca), it is slower.  However, it allows you to
    -00216 //  simulate larger scenes, as well as handle out-of-memory errors in a somewhat
    -00217 //  graceful manner
    -00218 
    -00219 // #define dUSE_MALLOC_FOR_ALLOCA
    -00220 
    -00221 #ifdef dUSE_MALLOC_FOR_ALLOCA
    -00222 enum {
    -00223   d_MEMORY_OK = 0,      /* no memory errors */
    -00224   d_MEMORY_OUT_OF_MEMORY   /* malloc failed due to out of memory error */
    -00225 };
    -00226 
    -00227 #endif
    -00228 
    -00229 
    -00230 
    -00231 /* internal object types (all prefixed with `dx') */
    -00232 
    -00233 struct dxWorld;      /* dynamics world */
    -00234 struct dxSpace;      /* collision space */
    -00235 struct dxBody;    /* rigid body (dynamics object) */
    -00236 struct dxGeom;    /* geometry (collision object) */
    -00237 struct dxJoint;
    -00238 struct dxJointNode;
    -00239 struct dxJointGroup;
    -00240 
    -00241 typedef struct dxWorld *dWorldID;
    -00242 typedef struct dxSpace *dSpaceID;
    -00243 typedef struct dxBody *dBodyID;
    -00244 typedef struct dxGeom *dGeomID;
    -00245 typedef struct dxJoint *dJointID;
    -00246 typedef struct dxJointGroup *dJointGroupID;
    -00247 
    -00248 
    -00249 /* error numbers */
    -00250 
    -00251 enum {
    -00252   d_ERR_UNKNOWN = 0,    /* unknown error */
    -00253   d_ERR_IASSERT,     /* internal assertion failed */
    -00254   d_ERR_UASSERT,     /* user assertion failed */
    -00255   d_ERR_LCP       /* user assertion failed */
    -00256 };
    -00257 
    -00258 
    -00259 /* joint type numbers */
    -00260 
    -00261 enum {
    -00262   dJointTypeNone = 0,      /* or "unknown" */
    -00263   dJointTypeBall,
    -00264   dJointTypeHinge,
    -00265   dJointTypeSlider,
    -00266   dJointTypeContact,
    -00267   dJointTypeUniversal,
    -00268   dJointTypeHinge2,
    -00269   dJointTypeFixed,
    -00270   dJointTypeNull,
    -00271   dJointTypeAMotor,
    -00272   dJointTypeLMotor,
    -00273   dJointTypePlane2D,
    -00274   dJointTypePR
    -00275 };
    -00276 
    -00277 
    -00278 /* an alternative way of setting joint parameters, using joint parameter
    -00279  * structures and member constants. we don't actually do this yet.
    -00280  */
    -00281 
    -00282 /*
    -00283 typedef struct dLimot {
    -00284   int mode;
    -00285   dReal lostop, histop;
    -00286   dReal vel, fmax;
    -00287   dReal fudge_factor;
    -00288   dReal bounce, soft;
    -00289   dReal suspension_erp, suspension_cfm;
    -00290 } dLimot;
    -00291 
    -00292 enum {
    -00293   dLimotLoStop    = 0x0001,
    -00294   dLimotHiStop    = 0x0002,
    -00295   dLimotVel    = 0x0004,
    -00296   dLimotFMax      = 0x0008,
    -00297   dLimotFudgeFactor  = 0x0010,
    -00298   dLimotBounce    = 0x0020,
    -00299   dLimotSoft      = 0x0040
    -00300 };
    -00301 */
    -00302 
    -00303 
    -00304 /* standard joint parameter names. why are these here? - because we don't want
    -00305  * to include all the joint function definitions in joint.cpp. hmmmm.
    -00306  * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument,
    -00307  * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and
    -00308  * paste between these two.
    -00309  */
    -00310 
    -00311 #define D_ALL_PARAM_NAMES(start) \
    -00312   /* parameters for limits and motors */ \
    -00313   dParamLoStop = start, \
    -00314   dParamHiStop, \
    -00315   dParamVel, \
    -00316   dParamFMax, \
    -00317   dParamFudgeFactor, \
    -00318   dParamBounce, \
    -00319   dParamCFM, \
    -00320   dParamStopERP, \
    -00321   dParamStopCFM, \
    -00322   /* parameters for suspension */ \
    -00323   dParamSuspensionERP, \
    -00324   dParamSuspensionCFM, \
    -00325   dParamERP, \
    -00326 
    -00327 #define D_ALL_PARAM_NAMES_X(start,x) \
    -00328   /* parameters for limits and motors */ \
    -00329   dParamLoStop ## x = start, \
    -00330   dParamHiStop ## x, \
    -00331   dParamVel ## x, \
    -00332   dParamFMax ## x, \
    -00333   dParamFudgeFactor ## x, \
    -00334   dParamBounce ## x, \
    -00335   dParamCFM ## x, \
    -00336   dParamStopERP ## x, \
    -00337   dParamStopCFM ## x, \
    -00338   /* parameters for suspension */ \
    -00339   dParamSuspensionERP ## x, \
    -00340   dParamSuspensionCFM ## x, \
    -00341   dParamERP ## x,
    -00342 
    -00343 enum {
    -00344   D_ALL_PARAM_NAMES(0)
    -00345   D_ALL_PARAM_NAMES_X(0x100,2)
    -00346   D_ALL_PARAM_NAMES_X(0x200,3)
    -00347 
    -00348   /* add a multiple of this constant to the basic parameter numbers to get
    -00349    * the parameters for the second, third etc axes.
    -00350    */
    -00351   dParamGroup=0x100
    -00352 };
    -00353 
    -00354 
    -00355 /* angular motor mode numbers */
    -00356 
    -00357 enum{
    -00358   dAMotorUser = 0,
    -00359   dAMotorEuler = 1
    -00360 };
    -00361 
    -00362 
    -00363 /* joint force feedback information */
    -00364 
    -00365 typedef struct dJointFeedback {
    -00366   dVector3 f1;    /* force applied to body 1 */
    -00367   dVector3 t1;    /* torque applied to body 1 */
    -00368   dVector3 f2;    /* force applied to body 2 */
    -00369   dVector3 t2;    /* torque applied to body 2 */
    -00370 } dJointFeedback;
    -00371 
    -00372 
    -00373 /* private functions that must be implemented by the collision library:
    -00374  * (1) indicate that a geom has moved, (2) get the next geom in a body list.
    -00375  * these functions are called whenever the position of geoms connected to a
    -00376  * body have changed, e.g. with dBodySetPosition(), dBodySetRotation(), or
    -00377  * when the ODE step function updates the body state.
    -00378  */
    -00379 
    -00380 void dGeomMoved (dGeomID);
    -00381 dGeomID dGeomGetBodyNext (dGeomID);
    -00382 
    -00383 
    -00384 #ifdef __cplusplus
    -00385 }
    -00386 #endif
    -00387 
    -00388 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/compatibility_8h-source.html b/libraries/ode-0.9/docs/compatibility_8h-source.html deleted file mode 100644 index 859554b7fd..0000000000 --- a/libraries/ode-0.9/docs/compatibility_8h-source.html +++ /dev/null @@ -1,60 +0,0 @@ - - -Open Dynamics Engine: compatibility.h Source File - - - - - -

    compatibility.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_COMPATIBILITY_H_
    -00024 #define _ODE_COMPATIBILITY_H_
    -00025 
    -00026 /*
    -00027  * ODE's backward compatibility system ensures that as ODE's API
    -00028  * evolves, user code will not break.
    -00029  */
    -00030 
    -00031 /*
    -00032  * These new rotation function names are more consistent with the
    -00033  * rest of the API.
    -00034  */
    -00035 #define dQtoR(q,R) dRfromQ((R),(q))
    -00036 #define dRtoQ(R,q) dQfromR((q),(R))
    -00037 #define dWtoDQ(w,q,dq) dDQfromW((dq),(w),(q))
    -00038 
    -00039 
    -00040 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/config_8h-source.html b/libraries/ode-0.9/docs/config_8h-source.html deleted file mode 100644 index 28440634cb..0000000000 --- a/libraries/ode-0.9/docs/config_8h-source.html +++ /dev/null @@ -1,196 +0,0 @@ - - -Open Dynamics Engine: config.h Source File - - - - - -

    config.h

    00001 /* This file was autogenerated by Premake */
    -00002 #ifndef _ODE_CONFIG_H_
    -00003 #define _ODE_CONFIG_H_
    -00004 
    -00005 
    -00006 /******************************************************************
    -00007  * CONFIGURATON SETTINGS - you can change these, and then rebuild
    -00008  *   ODE to modify the behavior of the library.
    -00009  *
    -00010  *   dSINGLE/dDOUBLE   - force ODE to use single-precision (float)
    -00011  *                       or double-precision (double) for numbers.
    -00012  *                       Only one should be defined.
    -00013  *
    -00014  *   dTRIMESH_ENABLED  - enable/disable trimesh support
    -00015  *   dTRIMESH_OPCODE   - use the OPCODE trimesh engine
    -00016  *   dTRIMESH_GIMPACT  - use the GIMPACT trimesh engine
    -00017  *                       Only one trimesh engine should be enabled.
    -00018  *
    -00019  *   dUSE_MALLOC_FOR_ALLOCA (experimental)-
    -00020  *                       Use malloc() instead of alloca(). Slower,
    -00021  *                       but allows for larger systems and more
    -00022  *                       graceful out-of-memory handling.
    -00023  *
    -00024  *   dTRIMESH_OPCODE_USE_NEW_TRIMESH_TRIMESH_COLLIDER (experimental)-
    -00025  *                       Use an alternative trimesh-trimesh collider
    -00026  *                       which should yield better results.
    -00027  *
    -00028  ******************************************************************/
    -00029 
    -00030 #define dSINGLE
    -00031 /* #define dDOUBLE */
    -00032 
    -00033 #define dTRIMESH_ENABLED 1
    -00034 #define dTRIMESH_OPCODE 1
    -00035 
    -00036 #define dTRIMESH_OPCODE_USE_NEW_TRIMESH_TRIMESH_COLLIDER 0
    -00037 
    -00038 /* #define dUSE_MALLOC_FOR_ALLOCA */
    -00039 
    -00040 
    -00041 /******************************************************************
    -00042  * SYSTEM SETTINGS - you shouldn't need to change these. If you
    -00043  *   run into an issue with these settings, please report it to
    -00044  *   the ODE bug tracker at:
    -00045  *      http://sf.net/tracker/?group_id=24884&atid=382799
    -00046  ******************************************************************/
    -00047 
    -00048 /* Try to identify the platform */
    -00049 #if defined(_XENON)
    -00050   #define ODE_PLATFORM_XBOX360
    -00051 #elif defined(SN_TARGET_PSP_HW)
    -00052   #define ODE_PLATFORM_PSP
    -00053 #elif defined(SN_TARGET_PS3)
    -00054   #define ODE_PLATFORM_PS3
    -00055 #elif defined(_MSC_VER) || defined(__CYGWIN32__) || defined(__MINGW32__)
    -00056   #define ODE_PLATFORM_WINDOWS
    -00057 #elif defined(__linux__)
    -00058   #define ODE_PLATFORM_LINUX
    -00059 #elif defined(__APPLE__) && defined(__MACH__)
    -00060   #define ODE_PLATFORM_OSX
    -00061 #else
    -00062   #error "Need some help identifying the platform!"
    -00063 #endif
    -00064 
    -00065 /* Additional platform defines used in the code */
    -00066 #if defined(ODE_PLATFORM_WINDOWS) && !defined(WIN32)
    -00067   #define WIN32
    -00068 #endif
    -00069 
    -00070 #if defined(__CYGWIN32__) || defined(__MINGW32__)
    -00071   #define CYGWIN
    -00072 #endif
    -00073 
    -00074 #if defined(ODE_PLATFORM_OSX)
    -00075   #define macintosh
    -00076 #endif
    -00077 
    -00078 
    -00079 /* Define a DLL export symbol for those platforms that need it */
    -00080 #if defined(ODE_PLATFORM_WINDOWS)
    -00081   #if defined(ODE_DLL)
    -00082     #define ODE_API __declspec(dllexport)
    -00083   #elif !defined(ODE_LIB)
    -00084     #define ODE_DLL_API __declspec(dllimport)
    -00085   #endif
    -00086 #endif
    -00087 
    -00088 #if !defined(ODE_API)
    -00089   #define ODE_API
    -00090 #endif
    -00091 
    -00092 
    -00093 /* Pull in the standard headers */
    -00094 #include <stdio.h>
    -00095 #include <stdlib.h>
    -00096 #include <stdarg.h>
    -00097 #include <math.h>
    -00098 #include <string.h>
    -00099 #include <float.h>
    -00100 
    -00101 #if !defined(ODE_PLATFORM_PS3)
    -00102   #include <malloc.h>
    -00103 #endif
    -00104 
    -00105 #if !defined(ODE_PLATFORM_WINDOWS)
    -00106   #include <alloca.h>
    -00107 #endif
    -00108 
    -00109 
    -00110 /* Visual C does not define these functions */
    -00111 #if defined(_MSC_VER)
    -00112   #define copysignf _copysign
    -00113   #define copysign _copysign
    -00114 #endif
    -00115 
    -00116 
    -00117 /* Define a value for infinity */
    -00118 #if defined(HUGE_VALF)
    -00119    #define ODE_INFINITY4 HUGE_VALF
    -00120    #define ODE_INFINITY8 HUGE_VAL
    -00121 #elif defined(FLT_MAX)
    -00122    #define ODE_INFINITY4 FLT_MAX
    -00123    #define ODE_INFINITY8 DBL_MAX
    -00124 #else
    -00125    static union { unsigned char __c[4]; float  __f; }  __ode_huge_valf = {{0,0,0x80,0x7f}};
    -00126    static union { unsigned char __c[8]; double __d; }  __ode_huge_val  = {{0,0,0,0,0,0,0xf0,0x7f}};
    -00127    #define ODE_INFINITY4 (__ode_huge_valf.__f)
    -00128    #define ODE_INFINITY8 (__ode_huge_val.__d)
    -00129 #endif
    -00130 
    -00131 #ifdef dSINGLE
    -00132    #define dInfinity ODE_INFINITY4
    -00133    #define dEpsilon  FLT_EPSILON
    -00134 #else
    -00135    #define dInfinity ODE_INFINITY8
    -00136    #define dEpsilon  DBL_EPSILON
    -00137 #endif
    -00138 
    -00139 
    -00140 /* Well-defined common data types...need to define for 64 bit systems */
    -00141 #if defined(_M_IA64) || defined(__ia64__) || defined(_M_AMD64) || defined(__x86_64__)
    -00142   #define X86_64_SYSTEM   1
    -00143   typedef int             int32;
    -00144   typedef unsigned int    uint32;
    -00145   typedef short           int16;
    -00146   typedef unsigned short  uint16;
    -00147   typedef char            int8;
    -00148   typedef unsigned char   uint8;
    -00149 #else
    -00150   typedef int             int32;
    -00151   typedef unsigned int    uint32;
    -00152   typedef short           int16;
    -00153   typedef unsigned short  uint16;
    -00154   typedef char            int8;
    -00155   typedef unsigned char   uint8;
    -00156 #endif
    -00157 
    -00158 /* An integer type that can be safely cast to a pointer. This definition
    -00159  * should be safe even on 64-bit systems */
    -00160 typedef size_t intP;
    -00161 
    -00162 
    -00163 /* The efficient alignment. most platforms align data structures to some
    -00164  * number of bytes, but this is not always the most efficient alignment.
    -00165  * for example, many x86 compilers align to 4 bytes, but on a pentium it is
    -00166  * important to align doubles to 8 byte boundaries (for speed), and the 4
    -00167  * floats in a SIMD register to 16 byte boundaries. many other platforms have
    -00168  * similar behavior. setting a larger alignment can waste a (very) small
    -00169  * amount of memory. NOTE: this number must be a power of two. */
    -00170 #define EFFICIENT_ALIGNMENT 16
    -00171 
    -00172 
    -00173 /* Define this if your system supports anonymous memory maps (linux does) */
    -00174 #define MMAP_ANONYMOUS
    -00175 
    -00176 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/contact_8h-source.html b/libraries/ode-0.9/docs/contact_8h-source.html deleted file mode 100644 index 0339e51b8a..0000000000 --- a/libraries/ode-0.9/docs/contact_8h-source.html +++ /dev/null @@ -1,109 +0,0 @@ - - -Open Dynamics Engine: contact.h Source File - - - - - -

    contact.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_CONTACT_H_
    -00024 #define _ODE_CONTACT_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 
    -00028 #ifdef __cplusplus
    -00029 extern "C" {
    -00030 #endif
    -00031 
    -00032 
    -00033 enum {
    -00034   dContactMu2     = 0x001,
    -00035   dContactFDir1      = 0x002,
    -00036   dContactBounce  = 0x004,
    -00037   dContactSoftERP = 0x008,
    -00038   dContactSoftCFM = 0x010,
    -00039   dContactMotion1 = 0x020,
    -00040   dContactMotion2 = 0x040,
    -00041   dContactSlip1      = 0x080,
    -00042   dContactSlip2      = 0x100,
    -00043 
    -00044   dContactApprox0 = 0x0000,
    -00045   dContactApprox1_1  = 0x1000,
    -00046   dContactApprox1_2  = 0x2000,
    -00047   dContactApprox1 = 0x3000
    -00048 };
    -00049 
    -00050 
    -00051 typedef struct dSurfaceParameters {
    -00052   /* must always be defined */
    -00053   int mode;
    -00054   dReal mu;
    -00055 
    -00056   /* only defined if the corresponding flag is set in mode */
    -00057   dReal mu2;
    -00058   dReal bounce;
    -00059   dReal bounce_vel;
    -00060   dReal soft_erp;
    -00061   dReal soft_cfm;
    -00062   dReal motion1,motion2;
    -00063   dReal slip1,slip2;
    -00064 } dSurfaceParameters;
    -00065 
    -00066 
    -00081 typedef struct dContactGeom {
    -00082   dVector3 pos;          
    -00083   dVector3 normal;       
    -00084   dReal depth;           
    -00085   dGeomID g1,g2;         
    -00086   int side1,side2;       
    -00087 } dContactGeom;
    -00088 
    -00089 
    -00090 /* contact info used by contact joint */
    -00091 
    -00092 typedef struct dContact {
    -00093   dSurfaceParameters surface;
    -00094   dContactGeom geom;
    -00095   dVector3 fdir1;
    -00096 } dContact;
    -00097 
    -00098 
    -00099 #ifdef __cplusplus
    -00100 }
    -00101 #endif
    -00102 
    -00103 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/doxygen.css b/libraries/ode-0.9/docs/doxygen.css deleted file mode 100644 index c7db1a8a04..0000000000 --- a/libraries/ode-0.9/docs/doxygen.css +++ /dev/null @@ -1,358 +0,0 @@ -BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { - font-family: Geneva, Arial, Helvetica, sans-serif; -} -BODY,TD { - font-size: 90%; -} -H1 { - text-align: center; - font-size: 160%; -} -H2 { - font-size: 120%; -} -H3 { - font-size: 100%; -} -CAPTION { font-weight: bold } -DIV.qindex { - width: 100%; - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; - line-height: 140%; -} -DIV.nav { - width: 100%; - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; - line-height: 140%; -} -DIV.navtab { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} -TD.navtab { - font-size: 70%; -} -A.qindex { - text-decoration: none; - font-weight: bold; - color: #1A419D; -} -A.qindex:visited { - text-decoration: none; - font-weight: bold; - color: #1A419D -} -A.qindex:hover { - text-decoration: none; - background-color: #ddddff; -} -A.qindexHL { - text-decoration: none; - font-weight: bold; - background-color: #6666cc; - color: #ffffff; - border: 1px double #9295C2; -} -A.qindexHL:hover { - text-decoration: none; - background-color: #6666cc; - color: #ffffff; -} -A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } -A.el { text-decoration: none; font-weight: bold } -A.elRef { font-weight: bold } -A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} -A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} -A.codeRef:link { font-weight: normal; color: #0000FF} -A.codeRef:visited { font-weight: normal; color: #0000FF} -A:hover { text-decoration: none; background-color: #f2f2ff } -DL.el { margin-left: -1cm } -.fragment { - font-family: monospace, fixed; - font-size: 95%; -} -PRE.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - margin-top: 4px; - margin-bottom: 4px; - margin-left: 2px; - margin-right: 8px; - padding-left: 6px; - padding-right: 6px; - padding-top: 4px; - padding-bottom: 4px; -} -DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } - -DIV.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; -} -DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } -BODY { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} -TD.indexkey { - background-color: #e8eef2; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; - border: 1px solid #CCCCCC; -} -TD.indexvalue { - background-color: #e8eef2; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; - border: 1px solid #CCCCCC; -} -TR.memlist { - background-color: #f0f0f0; -} -P.formulaDsp { text-align: center; } -IMG.formulaDsp { } -IMG.formulaInl { vertical-align: middle; } -SPAN.keyword { color: #008000 } -SPAN.keywordtype { color: #604020 } -SPAN.keywordflow { color: #e08000 } -SPAN.comment { color: #800000 } -SPAN.preprocessor { color: #806020 } -SPAN.stringliteral { color: #002080 } -SPAN.charliteral { color: #008080 } -.mdescLeft { - padding: 0px 8px 4px 8px; - font-size: 80%; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} -.mdescRight { - padding: 0px 8px 4px 8px; - font-size: 80%; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} -.memItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memTemplItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: none; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memTemplItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: none; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-size: 80%; -} -.memTemplParams { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - color: #606060; - background-color: #FAFAFA; - font-size: 80%; -} -.search { color: #003399; - font-weight: bold; -} -FORM.search { - margin-bottom: 0px; - margin-top: 0px; -} -INPUT.search { font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -TD.tiny { font-size: 75%; -} -a { - color: #1A41A8; -} -a:visited { - color: #2A3798; -} -.dirtab { padding: 4px; - border-collapse: collapse; - border: 1px solid #84b0c7; -} -TH.dirtab { background: #e8eef2; - font-weight: bold; -} -HR { height: 1px; - border: none; - border-top: 1px solid black; -} - -/* Style for detailed member documentation */ -.memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; -} -.memnav { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} -.memitem { - padding: 4px; - background-color: #eef3f5; - border-width: 1px; - border-style: solid; - border-color: #dedeee; - -moz-border-radius: 8px 8px 8px 8px; -} -.memname { - white-space: nowrap; - font-weight: bold; -} -.memdoc{ - padding-left: 10px; -} -.memproto { - background-color: #d5e1e8; - width: 100%; - border-width: 1px; - border-style: solid; - border-color: #84b0c7; - font-weight: bold; - -moz-border-radius: 8px 8px 8px 8px; -} -.paramkey { - text-align: right; -} -.paramtype { - white-space: nowrap; -} -.paramname { - color: #602020; - font-style: italic; - white-space: nowrap; -} -/* End Styling for detailed member documentation */ - -/* for the tree view */ -.ftvtree { - font-family: sans-serif; - margin:0.5em; -} -.directory { font-size: 9pt; font-weight: bold; } -.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } -.directory > h3 { margin-top: 0; } -.directory p { margin: 0px; white-space: nowrap; } -.directory div { display: none; margin: 0px; } -.directory img { vertical-align: -30%; } diff --git a/libraries/ode-0.9/docs/doxygen.png b/libraries/ode-0.9/docs/doxygen.png deleted file mode 100644 index f0a274bbaf..0000000000 Binary files a/libraries/ode-0.9/docs/doxygen.png and /dev/null differ diff --git a/libraries/ode-0.9/docs/drawstuff_8h-source.html b/libraries/ode-0.9/docs/drawstuff_8h-source.html deleted file mode 100644 index e08e6c279f..0000000000 --- a/libraries/ode-0.9/docs/drawstuff_8h-source.html +++ /dev/null @@ -1,166 +0,0 @@ - - -Open Dynamics Engine: drawstuff.h Source File - - - - - -

    drawstuff.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00041 #ifndef __DRAWSTUFF_H__
    -00042 #define __DRAWSTUFF_H__
    -00043 
    -00044 /* Define a DLL export symbol for those platforms that need it */
    -00045 #if defined(ODE_PLATFORM_WINDOWS)
    -00046   #if defined(DS_DLL)
    -00047     #define DS_API __declspec(dllexport)
    -00048   #elif !defined(DS_LIB)
    -00049     #define DS_DLL_API __declspec(dllimport)
    -00050   #endif
    -00051 #endif
    -00052     
    -00053 #if !defined(DS_API)
    -00054   #define DS_API
    -00055 #endif
    -00056 
    -00057 #ifdef __cplusplus
    -00058 extern "C" {
    -00059 #endif
    -00060 
    -00061 
    -00062 #include <drawstuff/version.h>
    -00063 
    -00064 
    -00065 /* texture numbers */
    -00066 #define DS_NONE   0  /* uses the current color instead of a texture */
    -00067 #define DS_WOOD   1
    -00068 
    -00069 
    -00075 typedef struct dsFunctions {
    -00076   int version;       /* put DS_VERSION here */
    -00077   /* version 1 data */
    -00078   void (*start)();      /* called before sim loop starts */
    -00079   void (*step) (int pause);   /* called before every frame */
    -00080   void (*command) (int cmd);  /* called if a command key is pressed */
    -00081   void (*stop)();    /* called after sim loop exits */
    -00082   /* version 2 data */
    -00083   char *path_to_textures;  /* if nonzero, path to texture files */
    -00084 } dsFunctions;
    -00085 
    -00086 
    -00095 DS_API void dsSimulationLoop (int argc, char **argv,
    -00096              int window_width, int window_height,
    -00097              struct dsFunctions *fn);
    -00098 
    -00105 DS_API void dsError (char *msg, ...);
    -00106 
    -00113 DS_API void dsDebug (char *msg, ...);
    -00114 
    -00120 DS_API void dsPrint (char *msg, ...);
    -00121 
    -00130 DS_API void dsSetViewpoint (float xyz[3], float hpr[3]);
    -00131 
    -00132 
    -00139 DS_API void dsGetViewpoint (float xyz[3], float hpr[3]);
    -00140 
    -00149 DS_API void dsStop();
    -00150 
    -00156 DS_API double dsElapsedTime();
    -00157 
    -00168 DS_API void dsSetTexture (int texture_number);
    -00169 
    -00177 DS_API void dsSetColor (float red, float green, float blue);
    -00178 
    -00185 DS_API void dsSetColorAlpha (float red, float green, float blue, float alpha);
    -00186 
    -00197 DS_API void dsDrawBox (const float pos[3], const float R[12], const float sides[3]);
    -00198 
    -00206 DS_API void dsDrawSphere (const float pos[3], const float R[12], float radius);
    -00207 
    -00218 DS_API void dsDrawTriangle (const float pos[3], const float R[12],
    -00219            const float *v0, const float *v1, const float *v2, int solid);
    -00220 
    -00225 DS_API void dsDrawCylinder (const float pos[3], const float R[12],
    -00226            float length, float radius);
    -00227 
    -00232 DS_API void dsDrawCapsule (const float pos[3], const float R[12],
    -00233           float length, float radius);
    -00234 
    -00239 DS_API void dsDrawLine (const float pos1[3], const float pos2[3]);
    -00240 
    -00245 DS_API void dsDrawConvex(const float pos[3], const float R[12],
    -00246         float *_planes,
    -00247         unsigned int _planecount,
    -00248         float *_points,
    -00249         unsigned int _pointcount,
    -00250         unsigned int *_polygons);
    -00251 
    -00252  /* these drawing functions are identical to the ones above, except they take
    -00253  * double arrays for `pos' and `R'.
    -00254  */
    -00255 DS_API void dsDrawBoxD (const double pos[3], const double R[12],
    -00256        const double sides[3]);
    -00257 DS_API void dsDrawSphereD (const double pos[3], const double R[12],
    -00258           const float radius);
    -00259 DS_API void dsDrawTriangleD (const double pos[3], const double R[12],
    -00260             const double *v0, const double *v1, const double *v2, int solid);
    -00261 DS_API void dsDrawCylinderD (const double pos[3], const double R[12],
    -00262             float length, float radius);
    -00263 DS_API void dsDrawCapsuleD (const double pos[3], const double R[12],
    -00264            float length, float radius);
    -00265 DS_API void dsDrawLineD (const double pos1[3], const double pos2[3]);
    -00266 DS_API void dsDrawConvexD(const double pos[3], const double R[12],
    -00267         double *_planes,
    -00268         unsigned int _planecount,
    -00269         double *_points,
    -00270         unsigned int _pointcount,
    -00271         unsigned int *_polygons);
    -00272 
    -00280 DS_API void dsSetSphereQuality (int n);      /* default = 1 */
    -00281 DS_API void dsSetCapsuleQuality (int n);     /* default = 3 */
    -00282 
    -00283 // Backwards compatible API
    -00284 #define dsDrawCappedCylinder dsDrawCapsule
    -00285 #define dsDrawCappedCylinderD dsDrawCapsuleD
    -00286 #define dsSetCappedCylinderQuality dsSetCapsuleQuality
    -00287 
    -00288 /* closing bracket for extern "C" */
    -00289 #ifdef __cplusplus
    -00290 }
    -00291 #endif
    -00292 
    -00293 #endif
    -00294 
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/error_8h-source.html b/libraries/ode-0.9/docs/error_8h-source.html deleted file mode 100644 index bb8e44a23c..0000000000 --- a/libraries/ode-0.9/docs/error_8h-source.html +++ /dev/null @@ -1,83 +0,0 @@ - - -Open Dynamics Engine: error.h Source File - - - - - -

    error.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 /* this comes from the `reuse' library. copy any changes back to the source */
    -00024 
    -00025 #ifndef _ODE_ERROR_H_
    -00026 #define _ODE_ERROR_H_
    -00027 
    -00028 #include <ode/config.h>
    -00029 
    -00030 #ifdef __cplusplus
    -00031 extern "C" {
    -00032 #endif
    -00033 
    -00034 /* all user defined error functions have this type. error and debug functions
    -00035  * should not return.
    -00036  */
    -00037 typedef void dMessageFunction (int errnum, const char *msg, va_list ap);
    -00038 
    -00039 /* set a new error, debug or warning handler. if fn is 0, the default handlers
    -00040  * are used.
    -00041  */
    -00042 ODE_API void dSetErrorHandler (dMessageFunction *fn);
    -00043 ODE_API void dSetDebugHandler (dMessageFunction *fn);
    -00044 ODE_API void dSetMessageHandler (dMessageFunction *fn);
    -00045 
    -00046 /* return the current error, debug or warning handler. if the return value is
    -00047  * 0, the default handlers are in place.
    -00048  */
    -00049 ODE_API dMessageFunction *dGetErrorHandler(void);
    -00050 ODE_API dMessageFunction *dGetDebugHandler(void);
    -00051 ODE_API dMessageFunction *dGetMessageHandler(void);
    -00052 
    -00053 /* generate a fatal error, debug trap or a message. */
    -00054 ODE_API void dError (int num, const char *msg, ...);
    -00055 ODE_API void dDebug (int num, const char *msg, ...);
    -00056 ODE_API void dMessage (int num, const char *msg, ...);
    -00057 
    -00058 
    -00059 #ifdef __cplusplus
    -00060 }
    -00061 #endif
    -00062 
    -00063 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/export-dif_8h-source.html b/libraries/ode-0.9/docs/export-dif_8h-source.html deleted file mode 100644 index 9a5084eb1d..0000000000 --- a/libraries/ode-0.9/docs/export-dif_8h-source.html +++ /dev/null @@ -1,52 +0,0 @@ - - -Open Dynamics Engine: export-dif.h Source File - - - - - -

    export-dif.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_EXPORT_DIF_
    -00024 #define _ODE_EXPORT_DIF_
    -00025 
    -00026 #include <ode/common.h>
    -00027 
    -00028 
    -00029 ODE_API void dWorldExportDIF (dWorldID w, FILE *file, const char *world_name);
    -00030 
    -00031 
    -00032 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/files.html b/libraries/ode-0.9/docs/files.html deleted file mode 100644 index 29d3e776a5..0000000000 --- a/libraries/ode-0.9/docs/files.html +++ /dev/null @@ -1,44 +0,0 @@ - - -Open Dynamics Engine: File Index - - - - - -

    Open Dynamics Engine File List

    Here is a list of all documented files with brief descriptions: - - - - - - - - - - - - - - - - - - - - - - -
    collision.h [code]
    collision_space.h [code]
    collision_trimesh.h [code]
    common.h [code]
    compatibility.h [code]
    config.h [code]
    contact.h [code]
    drawstuff.h [code]
    error.h [code]
    export-dif.h [code]
    mass.h [code]
    matrix.h [code]
    memory.h [code]
    misc.h [code]
    objects.h [code]
    ode.h [code]
    odecpp.h [code]
    odecpp_collision.h [code]
    odemath.h [code]
    rotation.h [code]
    timer.h [code]
    version.h [code]
    -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/functions.html b/libraries/ode-0.9/docs/functions.html deleted file mode 100644 index 0d321d4e86..0000000000 --- a/libraries/ode-0.9/docs/functions.html +++ /dev/null @@ -1,46 +0,0 @@ - - -Open Dynamics Engine: Data Fields - - - - - - -
    - -
    -Here is a list of all documented struct and union fields with links to the struct/union documentation for each field: -

    -

    -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/functions_vars.html b/libraries/ode-0.9/docs/functions_vars.html deleted file mode 100644 index 2b5702bba3..0000000000 --- a/libraries/ode-0.9/docs/functions_vars.html +++ /dev/null @@ -1,46 +0,0 @@ - - -Open Dynamics Engine: Data Fields - Variables - - - - - - -
    - -
    -  -

    -

    -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__bodies.html b/libraries/ode-0.9/docs/group__bodies.html deleted file mode 100644 index 951ff2bd92..0000000000 --- a/libraries/ode-0.9/docs/group__bodies.html +++ /dev/null @@ -1,1827 +0,0 @@ - - -Open Dynamics Engine: Rigid Bodies - - - - - -

    Rigid Bodies

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Functions

    ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID)
     Get auto disable linear average threshold.
    ODE_API void dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_average_threshold)
     Set auto disable linear average threshold.
    ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID)
     Get auto disable angular average threshold.
    ODE_API void dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_average_threshold)
     Set auto disable angular average threshold.
    ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID)
     Get auto disable average size (samples count).
    ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID, unsigned int average_samples_count)
     Set auto disable average buffer size (average steps).
    ODE_API int dBodyGetAutoDisableSteps (dBodyID)
     Get auto steps a body must be thought of as idle to disable.
    ODE_API void dBodySetAutoDisableSteps (dBodyID, int steps)
     Set auto disable steps.
    ODE_API dReal dBodyGetAutoDisableTime (dBodyID)
     Get auto disable time.
    ODE_API void dBodySetAutoDisableTime (dBodyID, dReal time)
     Set auto disable time.
    ODE_API int dBodyGetAutoDisableFlag (dBodyID)
     Get auto disable flag.
    ODE_API void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable)
     Set auto disable flag.
    ODE_API void dBodySetAutoDisableDefaults (dBodyID)
     Set auto disable defaults.
    ODE_API dWorldID dBodyGetWorld (dBodyID)
     Retrives the world attached to te given body.
    ODE_API dBodyID dBodyCreate (dWorldID)
     Create a body in given world.
    ODE_API void dBodyDestroy (dBodyID)
     Destroy a body.
    ODE_API void dBodySetData (dBodyID, void *data)
     Set the body's user-data pointer.
    ODE_API void * dBodyGetData (dBodyID)
     Get the body's user-data pointer.
    ODE_API void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z)
     Set position of a body.
    ODE_API void dBodySetRotation (dBodyID, const dMatrix3 R)
     Set the orientation of a body.
    ODE_API void dBodySetQuaternion (dBodyID, const dQuaternion q)
     Set the orientation of a body.
    -ODE_API void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z)
     Set the linear velocity of a body.
    -ODE_API void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z)
     Set the angular velocity of a body.
    ODE_API const dReal * dBodyGetPosition (dBodyID)
     Get the position of a body.
    ODE_API void dBodyCopyPosition (dBodyID body, dVector3 pos)
     Copy the position of a body into a vector.
    ODE_API const dReal * dBodyGetRotation (dBodyID)
     Get the rotation of a body.
    ODE_API void dBodyCopyRotation (dBodyID, dMatrix3 R)
     Copy the rotation of a body.
    ODE_API const dReal * dBodyGetQuaternion (dBodyID)
     Get the rotation of a body.
    ODE_API void dBodyCopyQuaternion (dBodyID body, dQuaternion quat)
     Copy the orientation of a body into a quaternion.
    -ODE_API const dReal * dBodyGetLinearVel (dBodyID)
     Get the linear velocity of a body.
    -ODE_API const dReal * dBodyGetAngularVel (dBodyID)
     Get the angular velocity of a body.
    -ODE_API void dBodySetMass (dBodyID, const dMass *mass)
     Set the mass of a body.
    -ODE_API void dBodyGetMass (dBodyID, dMass *mass)
     Get the mass of a body.
    -ODE_API void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz)
     Add force at centre of mass of body in absolute coordinates.
    -ODE_API void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz)
     Add torque at centre of mass of body in absolute coordinates.
    -ODE_API void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz)
     Add force at centre of mass of body in coordinates relative to body.
    -ODE_API void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz)
     Add torque at centre of mass of body in coordinates relative to body.
    -ODE_API void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz)
     Add force at specified point in body in global coordinates.
    -ODE_API void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz)
     Add force at specified point in body in local coordinates.
    -ODE_API void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz)
     Add force at specified point in body in global coordinates.
    -ODE_API void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz)
     Add force at specified point in body in local coordinates.
    ODE_API const dReal * dBodyGetForce (dBodyID)
     Return the current accumulated force vector.
    ODE_API const dReal * dBodyGetTorque (dBodyID)
     Return the current accumulated torque vector.
    ODE_API void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z)
     Set the body force accumulation vector.
    ODE_API void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z)
     Set the body torque accumulation vector.
    ODE_API void dBodyGetRelPointPos (dBodyID, dReal px, dReal py, dReal pz, dVector3 result)
     Get world position of a relative point on body.
    ODE_API void dBodyGetRelPointVel (dBodyID, dReal px, dReal py, dReal pz, dVector3 result)
     Get velocity vector in global coords of a relative point on body.
    ODE_API void dBodyGetPointVel (dBodyID, dReal px, dReal py, dReal pz, dVector3 result)
     Get velocity vector in global coords of a globally specified point on a body.
    ODE_API void dBodyGetPosRelPoint (dBodyID, dReal px, dReal py, dReal pz, dVector3 result)
     takes a point in global coordinates and returns the point's position in body-relative coordinates.
    ODE_API void dBodyVectorToWorld (dBodyID, dReal px, dReal py, dReal pz, dVector3 result)
     Convert from local to world coordinates.
    ODE_API void dBodyVectorFromWorld (dBodyID, dReal px, dReal py, dReal pz, dVector3 result)
     Convert from world to local coordinates.
    ODE_API void dBodySetFiniteRotationMode (dBodyID, int mode)
     controls the way a body's orientation is updated at each timestep.
    ODE_API void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z)
     sets the finite rotation axis for a body.
    ODE_API int dBodyGetFiniteRotationMode (dBodyID)
     Get the way a body's orientation is updated each timestep.
    ODE_API void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result)
     Get the finite rotation axis.
    ODE_API int dBodyGetNumJoints (dBodyID b)
     Get the number of joints that are attached to this body.
    ODE_API dJointID dBodyGetJoint (dBodyID, int index)
     Return a joint attached to this body, given by index.
    ODE_API void dBodyEnable (dBodyID)
     Manually enable a body.
    ODE_API void dBodyDisable (dBodyID)
     Manually disable a body.
    ODE_API int dBodyIsEnabled (dBodyID)
     Check wether a body is enabled.
    ODE_API void dBodySetGravityMode (dBodyID b, int mode)
     Set whether the body is influenced by the world's gravity or not.
    ODE_API int dBodyGetGravityMode (dBodyID b)
     Get whether the body is influenced by the world's gravity or not.
    -

    Detailed Description

    -A rigid body has various properties from the point of view of the simulation. Some properties change over time:

    -

      -
    • Position vector (x,y,z) of the body's point of reference. Currently the point of reference must correspond to the body's center of mass.
    • -
    • Linear velocity of the point of reference, a vector (vx,vy,vz).
    • -
    • Orientation of a body, represented by a quaternion (qs,qx,qy,qz) or a 3x3 rotation matrix.
    • -
    • Angular velocity vector (wx,wy,wz) which describes how the orientation changes over time.
    • -
    -Other body properties are usually constant over time:

    -

      -
    • Mass of the body.
    • -
    • Position of the center of mass with respect to the point of reference. In the current implementation the center of mass and the point of reference must coincide.
    • -
    • Inertia matrix. This is a 3x3 matrix that describes how the body's mass is distributed around the center of mass. Conceptually each body has an x-y-z coordinate frame embedded in it that moves and rotates with the body.
    • -
    -The origin of this coordinate frame is the body's point of reference. Some values in ODE (vectors, matrices etc) are relative to the body coordinate frame, and others are relative to the global coordinate frame.

    -Note that the shape of a rigid body is not a dynamical property (except insofar as it influences the various mass properties). It is only collision detection that cares about the detailed shape of the body.


    Function Documentation

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyCopyPosition (dBodyID  body,
    dVector3  pos 
    )
    -
    -
    - -

    -Copy the position of a body into a vector. -

    -

    Parameters:
    - - - -
    body the body to query
    pos a copy of the body position
    -
    -
    See also:
    dBodyGetPosition
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyCopyQuaternion (dBodyID  body,
    dQuaternion  quat 
    )
    -
    -
    - -

    -Copy the orientation of a body into a quaternion. -

    -

    Parameters:
    - - - -
    body the body to query
    quat a copy of the orientation quaternion
    -
    -
    See also:
    dBodyGetQuaternion
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyCopyRotation (dBodyID ,
    dMatrix3  R 
    )
    -
    -
    - -

    -Copy the rotation of a body. -

    -

    Parameters:
    - - - -
    body the body to query
    R a copy of the rotation matrix
    -
    -
    See also:
    dBodyGetRotation
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dBodyID dBodyCreate (dWorldID   ) 
    -
    -
    - -

    -Create a body in given world. -

    -

    Remarks:
    Default mass parameters are at position (0,0,0).
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dBodyDestroy (dBodyID   ) 
    -
    -
    - -

    -Destroy a body. -

    -

    Remarks:
    All joints that are attached to this body will be put into limbo: i.e. unattached and not affecting the simulation, but they will NOT be deleted.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dBodyDisable (dBodyID   ) 
    -
    -
    - -

    -Manually disable a body. -

    -

    Remarks:
    A disabled body that is connected through a joint to an enabled body will be automatically re-enabled at the next simulation step.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dBodyEnable (dBodyID   ) 
    -
    -
    - -

    -Manually enable a body. -

    -

    Parameters:
    - - -
    dBodyID identification of body.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID   ) 
    -
    -
    - -

    -Get auto disable angular average threshold. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID   ) 
    -
    -
    - -

    -Get auto disable average size (samples count). -

    -

    Returns:
    the nr of steps/size.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyGetAutoDisableFlag (dBodyID   ) 
    -
    -
    - -

    -Get auto disable flag. -

    -

    Returns:
    0 or 1
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID   ) 
    -
    -
    - -

    -Get auto disable linear average threshold. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyGetAutoDisableSteps (dBodyID   ) 
    -
    -
    - -

    -Get auto steps a body must be thought of as idle to disable. -

    -

    Returns:
    the nr of steps
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dBodyGetAutoDisableTime (dBodyID   ) 
    -
    -
    - -

    -Get auto disable time. -

    -

    Returns:
    nr of seconds
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void* dBodyGetData (dBodyID   ) 
    -
    -
    - -

    -Get the body's user-data pointer. -

    -

    Returns:
    a pointer to the user's data.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyGetFiniteRotationAxis (dBodyID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the finite rotation axis. -

    -

    Parameters:
    - - -
    result will contain the axis.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyGetFiniteRotationMode (dBodyID   ) 
    -
    -
    - -

    -Get the way a body's orientation is updated each timestep. -

    -

    Returns:
    the mode 0 (infitesimal) or 1 (finite).
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dBodyGetForce (dBodyID   ) 
    -
    -
    - -

    -Return the current accumulated force vector. -

    -

    Returns:
    points to an array of 3 reals.
    -
    Remarks:
    The returned values are pointers to internal data structures, so the vectors are only valid until any changes are made to the rigid body system.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyGetGravityMode (dBodyID  b  ) 
    -
    -
    - -

    -Get whether the body is influenced by the world's gravity or not. -

    -

    Returns:
    nonzero means gravity affects this body.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dBodyGetJoint (dBodyID ,
    int  index 
    )
    -
    -
    - -

    -Return a joint attached to this body, given by index. -

    -

    Parameters:
    - - -
    index valid range is 0 to n-1 where n is the value returned by dBodyGetNumJoints().
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyGetNumJoints (dBodyID  b  ) 
    -
    -
    - -

    -Get the number of joints that are attached to this body. -

    -

    Returns:
    nr of joints
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyGetPointVel (dBodyID ,
    dReal  px,
    dReal  py,
    dReal  pz,
    dVector3  result 
    )
    -
    -
    - -

    -Get velocity vector in global coords of a globally specified point on a body. -

    -

    Parameters:
    - - -
    result will contain the result.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dBodyGetPosition (dBodyID   ) 
    -
    -
    - -

    -Get the position of a body. -

    -

    Remarks:
    When getting, the returned values are pointers to internal data structures, so the vectors are valid until any changes are made to the rigid body system structure.
    -
    See also:
    dBodyCopyPosition
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyGetPosRelPoint (dBodyID ,
    dReal  px,
    dReal  py,
    dReal  pz,
    dVector3  result 
    )
    -
    -
    - -

    -takes a point in global coordinates and returns the point's position in body-relative coordinates. -

    -

    Remarks:
    This is the inverse of dBodyGetRelPointPos()
    -
    Parameters:
    - - -
    result will contain the result.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dBodyGetQuaternion (dBodyID   ) 
    -
    -
    - -

    -Get the rotation of a body. -

    -

    Returns:
    pointer to 4 scalars that represent the quaternion.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyGetRelPointPos (dBodyID ,
    dReal  px,
    dReal  py,
    dReal  pz,
    dVector3  result 
    )
    -
    -
    - -

    -Get world position of a relative point on body. -

    -

    Parameters:
    - - -
    result will contain the result.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyGetRelPointVel (dBodyID ,
    dReal  px,
    dReal  py,
    dReal  pz,
    dVector3  result 
    )
    -
    -
    - -

    -Get velocity vector in global coords of a relative point on body. -

    -

    Parameters:
    - - -
    result will contain the result.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dBodyGetRotation (dBodyID   ) 
    -
    -
    - -

    -Get the rotation of a body. -

    -

    Returns:
    pointer to a 4x3 rotation matrix.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dBodyGetTorque (dBodyID   ) 
    -
    -
    - -

    -Return the current accumulated torque vector. -

    -

    Returns:
    points to an array of 3 reals.
    -
    Remarks:
    The returned values are pointers to internal data structures, so the vectors are only valid until any changes are made to the rigid body system.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dWorldID dBodyGetWorld (dBodyID   ) 
    -
    -
    - -

    -Retrives the world attached to te given body. -

    -

    Remarks:
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dBodyIsEnabled (dBodyID   ) 
    -
    -
    - -

    -Check wether a body is enabled. -

    -

    Returns:
    1 if a body is currently enabled or 0 if it is disabled.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetAutoDisableAngularThreshold (dBodyID ,
    dReal  angular_average_threshold 
    )
    -
    -
    - -

    -Set auto disable angular average threshold. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID ,
    unsigned int  average_samples_count 
    )
    -
    -
    - -

    -Set auto disable average buffer size (average steps). -

    -

    Parameters:
    - - -
    average_samples_count the nr of samples to review.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dBodySetAutoDisableDefaults (dBodyID   ) 
    -
    -
    - -

    -Set auto disable defaults. -

    -

    Remarks:
    Set the values for the body to those set as default for the world.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetAutoDisableFlag (dBodyID ,
    int  do_auto_disable 
    )
    -
    -
    - -

    -Set auto disable flag. -

    -

    Parameters:
    - - -
    do_auto_disable 0 or 1
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetAutoDisableLinearThreshold (dBodyID ,
    dReal  linear_average_threshold 
    )
    -
    -
    - -

    -Set auto disable linear average threshold. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetAutoDisableSteps (dBodyID ,
    int  steps 
    )
    -
    -
    - -

    -Set auto disable steps. -

    -

    Parameters:
    - - -
    steps the nr of steps.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetAutoDisableTime (dBodyID ,
    dReal  time 
    )
    -
    -
    - -

    -Set auto disable time. -

    -

    Parameters:
    - - -
    time nr of seconds.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetData (dBodyID ,
    void *  data 
    )
    -
    -
    - -

    -Set the body's user-data pointer. -

    -

    Parameters:
    - - -
    data arbitraty pointer
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetFiniteRotationAxis (dBodyID ,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -sets the finite rotation axis for a body. -

    -

    Remarks:
    This is axis only has meaning when the finite rotation mode is set If this axis is zero (0,0,0), full finite rotations are performed on the body. If this axis is nonzero, the body is rotated by performing a partial finite rotation along the axis direction followed by an infinitesimal rotation along an orthogonal direction.

    -This can be useful to alleviate certain sources of error caused by quickly spinning bodies. For example, if a car wheel is rotating at high speed you can call this function with the wheel's hinge axis as the argument to try and improve its behavior.

    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetFiniteRotationMode (dBodyID ,
    int  mode 
    )
    -
    -
    - -

    -controls the way a body's orientation is updated at each timestep. -

    -

    Parameters:
    - - -
    mode can be 0 or 1:
      -
    • 0: An ``infinitesimal'' orientation update is used. This is fast to compute, but it can occasionally cause inaccuracies for bodies that are rotating at high speed, especially when those bodies are joined to other bodies. This is the default for every new body that is created.
    • -
    • 1: A ``finite'' orientation update is used. This is more costly to compute, but will be more accurate for high speed rotations.
    • -
    -
    -
    -
    Remarks:
    Note however that high speed rotations can result in many types of error in a simulation, and the finite mode will only fix one of those sources of error.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetForce (dBodyID  b,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the body force accumulation vector. -

    -

    Remarks:
    This is mostly useful to zero the force and torque for deactivated bodies before they are reactivated, in the case where the force-adding functions were called on them while they were deactivated.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetGravityMode (dBodyID  b,
    int  mode 
    )
    -
    -
    - -

    -Set whether the body is influenced by the world's gravity or not. -

    -

    Parameters:
    - - -
    mode when nonzero gravity affects this body.
    -
    -
    Remarks:
    Newly created bodies are always influenced by the world's gravity.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetPosition (dBodyID ,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set position of a body. -

    -

    Remarks:
    After setting, the outcome of the simulation is undefined if the new configuration is inconsistent with the joints/constraints that are present.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetQuaternion (dBodyID ,
    const dQuaternion  q 
    )
    -
    -
    - -

    -Set the orientation of a body. -

    -

    Remarks:
    After setting, the outcome of the simulation is undefined if the new configuration is inconsistent with the joints/constraints that are present.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetRotation (dBodyID ,
    const dMatrix3  R 
    )
    -
    -
    - -

    -Set the orientation of a body. -

    -

    Remarks:
    After setting, the outcome of the simulation is undefined if the new configuration is inconsistent with the joints/constraints that are present.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodySetTorque (dBodyID  b,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the body torque accumulation vector. -

    -

    Remarks:
    This is mostly useful to zero the force and torque for deactivated bodies before they are reactivated, in the case where the force-adding functions were called on them while they were deactivated.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyVectorFromWorld (dBodyID ,
    dReal  px,
    dReal  py,
    dReal  pz,
    dVector3  result 
    )
    -
    -
    - -

    -Convert from world to local coordinates. -

    -

    Parameters:
    - - -
    result will contain the result.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dBodyVectorToWorld (dBodyID ,
    dReal  px,
    dReal  py,
    dReal  pz,
    dVector3  result 
    )
    -
    -
    - -

    -Convert from local to world coordinates. -

    -

    Parameters:
    - - -
    result will contain the result.
    -
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__collide.html b/libraries/ode-0.9/docs/group__collide.html deleted file mode 100644 index c56e7596a1..0000000000 --- a/libraries/ode-0.9/docs/group__collide.html +++ /dev/null @@ -1,2452 +0,0 @@ - - -Open Dynamics Engine: Collision Detection - - - - - -

    Collision Detection

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Modules

     Sphere Class
     Box Class

    Data Structures

    struct  dContactGeom
     Describe the contact point between two geoms. More...

    Typedefs

    typedef dReal dHeightfieldGetHeight (void *p_user_data, int x, int z)
     Callback prototype.
    typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2)
     User callback for geom-geom collision testing.

    Functions

    ODE_API void dGeomDestroy (dGeomID geom)
     Destroy a geom, removing it from any space.
    ODE_API void dGeomSetData (dGeomID geom, void *data)
     Set the user-defined data pointer stored in the geom.
    ODE_API void * dGeomGetData (dGeomID geom)
     Get the user-defined data pointer stored in the geom.
    ODE_API void dGeomSetBody (dGeomID geom, dBodyID body)
     Set the body associated with a placeable geom.
    ODE_API dBodyID dGeomGetBody (dGeomID geom)
     Get the body associated with a placeable geom.
    ODE_API void dGeomSetPosition (dGeomID geom, dReal x, dReal y, dReal z)
     Set the position vector of a placeable geom.
    ODE_API void dGeomSetRotation (dGeomID geom, const dMatrix3 R)
     Set the rotation matrix of a placeable geom.
    ODE_API void dGeomSetQuaternion (dGeomID geom, const dQuaternion Q)
     Set the rotation of a placeable geom.
    ODE_API const dReal * dGeomGetPosition (dGeomID geom)
     Get the position vector of a placeable geom.
    ODE_API void dGeomCopyPosition (dGeomID geom, dVector3 pos)
     Copy the position of a geom into a vector.
    ODE_API const dReal * dGeomGetRotation (dGeomID geom)
     Get the rotation matrix of a placeable geom.
    ODE_API void dGeomCopyRotation (dGeomID geom, dMatrix3 R)
     Get the rotation matrix of a placeable geom.
    ODE_API void dGeomGetQuaternion (dGeomID geom, dQuaternion result)
     Get the rotation quaternion of a placeable geom.
    ODE_API void dGeomGetAABB (dGeomID geom, dReal aabb[6])
     Return the axis-aligned bounding box.
    ODE_API int dGeomIsSpace (dGeomID geom)
     Determing if a geom is a space.
    ODE_API dSpaceID dGeomGetSpace (dGeomID)
     Query for the space containing a particular geom.
    ODE_API int dGeomGetClass (dGeomID geom)
     Given a geom, this returns its class.
    ODE_API void dGeomSetCategoryBits (dGeomID geom, unsigned long bits)
     Set the "category" bitfield for the given geom.
    ODE_API void dGeomSetCollideBits (dGeomID geom, unsigned long bits)
     Set the "collide" bitfield for the given geom.
    ODE_API unsigned long dGeomGetCategoryBits (dGeomID)
     Get the "category" bitfield for the given geom.
    ODE_API unsigned long dGeomGetCollideBits (dGeomID)
     Get the "collide" bitfield for the given geom.
    ODE_API void dGeomEnable (dGeomID geom)
     Enable a geom.
    ODE_API void dGeomDisable (dGeomID geom)
     Disable a geom.
    ODE_API int dGeomIsEnabled (dGeomID geom)
     Check to see if a geom is enabled.
    ODE_API void dGeomSetOffsetPosition (dGeomID geom, dReal x, dReal y, dReal z)
     Set the local offset position of a geom from its body.
    ODE_API void dGeomSetOffsetRotation (dGeomID geom, const dMatrix3 R)
     Set the local offset rotation matrix of a geom from its body.
    ODE_API void dGeomSetOffsetQuaternion (dGeomID geom, const dQuaternion Q)
     Set the local offset rotation of a geom from its body.
    ODE_API void dGeomSetOffsetWorldPosition (dGeomID geom, dReal x, dReal y, dReal z)
     Set the offset position of a geom from its body.
    ODE_API void dGeomSetOffsetWorldRotation (dGeomID geom, const dMatrix3 R)
     Set the offset rotation of a geom from its body.
    ODE_API void dGeomSetOffsetWorldQuaternion (dGeomID geom, const dQuaternion)
     Set the offset rotation of a geom from its body.
    ODE_API void dGeomClearOffset (dGeomID geom)
     Clear any offset from the geom.
    ODE_API int dGeomIsOffset (dGeomID geom)
     Check to see whether the geom has an offset.
    ODE_API const dReal * dGeomGetOffsetPosition (dGeomID geom)
     Get the offset position vector of a geom.
    ODE_API void dGeomCopyOffsetPosition (dGeomID geom, dVector3 pos)
     Copy the offset position vector of a geom.
    ODE_API const dReal * dGeomGetOffsetRotation (dGeomID geom)
     Get the offset rotation matrix of a geom.
    ODE_API void dGeomCopyOffsetRotation (dGeomID geom, dMatrix3 R)
     Copy the offset rotation matrix of a geom.
    ODE_API void dGeomGetOffsetQuaternion (dGeomID geom, dQuaternion result)
     Get the offset rotation quaternion of a geom.
    ODE_API int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, int skip)
     Given two geoms o1 and o2 that potentially intersect, generate contact information for them.
    ODE_API void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback)
     Determines which pairs of geoms in a space may potentially intersect, and calls the callback function for each candidate pair.
    ODE_API void dSpaceCollide2 (dGeomID space1, dGeomID space2, void *data, dNearCallback *callback)
     Determines which geoms from one space may potentially intersect with geoms from another space, and calls the callback function for each candidate pair.
    ODE_API dGeomID dCreateHeightfield (dSpaceID space, dHeightfieldDataID data, int bPlaceable)
     Creates a heightfield geom.
    ODE_API
    -dHeightfieldDataID 
    dGeomHeightfieldDataCreate ()
     Creates a new empty dHeightfieldDataID.
    ODE_API void dGeomHeightfieldDataDestroy (dHeightfieldDataID d)
     Destroys a dHeightfieldDataID.
    ODE_API void dGeomHeightfieldDataBuildCallback (dHeightfieldDataID d, void *pUserData, dHeightfieldGetHeight *pCallback, dReal width, dReal depth, int widthSamples, int depthSamples, dReal scale, dReal offset, dReal thickness, int bWrap)
     Configures a dHeightfieldDataID to use a callback to retrieve height data.
    ODE_API void dGeomHeightfieldDataBuildByte (dHeightfieldDataID d, const unsigned char *pHeightData, int bCopyHeightData, dReal width, dReal depth, int widthSamples, int depthSamples, dReal scale, dReal offset, dReal thickness, int bWrap)
     Configures a dHeightfieldDataID to use height data in byte format.
    ODE_API void dGeomHeightfieldDataBuildShort (dHeightfieldDataID d, const short *pHeightData, int bCopyHeightData, dReal width, dReal depth, int widthSamples, int depthSamples, dReal scale, dReal offset, dReal thickness, int bWrap)
     Configures a dHeightfieldDataID to use height data in short format.
    ODE_API void dGeomHeightfieldDataBuildSingle (dHeightfieldDataID d, const float *pHeightData, int bCopyHeightData, dReal width, dReal depth, int widthSamples, int depthSamples, dReal scale, dReal offset, dReal thickness, int bWrap)
     Configures a dHeightfieldDataID to use height data in single precision floating point format.
    ODE_API void dGeomHeightfieldDataBuildDouble (dHeightfieldDataID d, const double *pHeightData, int bCopyHeightData, dReal width, dReal depth, int widthSamples, int depthSamples, dReal scale, dReal offset, dReal thickness, int bWrap)
     Configures a dHeightfieldDataID to use height data in double precision floating point format.
    ODE_API void dGeomHeightfieldDataSetBounds (dHeightfieldDataID d, dReal minHeight, dReal maxHeight)
     Manually set the minimum and maximum height bounds.
    ODE_API void dGeomHeightfieldSetHeightfieldData (dGeomID g, dHeightfieldDataID d)
     Assigns a dHeightfieldDataID to a heightfield geom.
    ODE_API
    -dHeightfieldDataID 
    dGeomHeightfieldGetHeightfieldData (dGeomID g)
     Gets the dHeightfieldDataID bound to a heightfield geom.
    -

    Detailed Description

    -ODE has two main components: a dynamics simulation engine and a collision detection engine. The collision engine is given information about the shape of each body. At each time step it figures out which bodies touch each other and passes the resulting contact point information to the user. The user in turn creates contact joints between bodies.

    -Using ODE's collision detection is optional - an alternative collision detection system can be used as long as it can supply the right kinds of contact information.


    Typedef Documentation

    - -
    -
    - - - - -
    typedef dReal dHeightfieldGetHeight(void *p_user_data, int x, int z)
    -
    -
    - -

    -Callback prototype. -

    -Used by the callback heightfield data type to sample a height for a given cell position.

    -

    Parameters:
    - - - - -
    p_user_data User data specified when creating the dHeightfieldDataID
    x The index of a sample in the local x axis. It is a value in the range zero to ( nWidthSamples - 1 ).
    x The index of a sample in the local z axis. It is a value in the range zero to ( nDepthSamples - 1 ).
    -
    -
    Returns:
    The sample height which is then scaled and offset using the values specified when the heightfield data was created.
    - -
    -

    - -

    -
    - - - - -
    typedef void dNearCallback(void *data, dGeomID o1, dGeomID o2)
    -
    -
    - -

    -User callback for geom-geom collision testing. -

    -

    Parameters:
    - - - - -
    data The user data object, as passed to dSpaceCollide.
    o1 The first geom being tested.
    o2 The second geom being test.
    -
    -
    Remarks:
    The callback function can call dCollide on o1 and o2 to generate contact points between each pair. Then these contact points may be added to the simulation as contact joints. The user's callback function can of course chose not to call dCollide for any pair, e.g. if the user decides that those pairs should not interact.
    - -
    -

    -


    Function Documentation

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API int dCollide (dGeomID  o1,
    dGeomID  o2,
    int  flags,
    dContactGeom contact,
    int  skip 
    )
    -
    -
    - -

    -Given two geoms o1 and o2 that potentially intersect, generate contact information for them. -

    -Internally, this just calls the correct class-specific collision functions for o1 and o2.

    -

    Parameters:
    - - - - - -
    o1 The first geom to test.
    o2 The second geom to test.
    flags The flags specify how contacts should be generated if the geoms touch. The lower 16 bits of flags is an integer that specifies the maximum number of contact points to generate. You must ask for at least one contact. Additionally, following bits may be set: CONTACTS_UNIMPORTANT -- just generate any contacts (skip contact refining). All other bits in flags must be set to zero. In the future the other bits may be used to select from different contact generation strategies.
    contact Points to an array of dContactGeom structures. The array must be able to hold at least the maximum number of contacts. These dContactGeom structures may be embedded within larger structures in the array -- the skip parameter is the byte offset from one dContactGeom to the next in the array. If skip is sizeof(dContactGeom) then contact points to a normal (C-style) array. It is an error for skip to be smaller than sizeof(dContactGeom).
    -
    -
    Returns:
    If the geoms intersect, this function returns the number of contact points generated (and updates the contact array), otherwise it returns 0 (and the contact array is not touched).
    -
    Remarks:
    If a space is passed as o1 or o2 then this function will collide all objects contained in o1 with all objects contained in o2, and return the resulting contact points. This method for colliding spaces with geoms (or spaces with spaces) provides no user control over the individual collisions. To get that control, use dSpaceCollide or dSpaceCollide2 instead.

    -If o1 and o2 are the same geom then this function will do nothing and return 0. Technically speaking an object intersects with itself, but it is not useful to find contact points in this case.

    -This function does not care if o1 and o2 are in the same space or not (or indeed if they are in any space at all).

    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API dGeomID dCreateHeightfield (dSpaceID  space,
    dHeightfieldDataID  data,
    int  bPlaceable 
    )
    -
    -
    - -

    -Creates a heightfield geom. -

    -Uses the information in the given dHeightfieldDataID to construct a geom representing a heightfield in a collision space.

    -

    Parameters:
    - - - - -
    space The space to add the geom to.
    data The dHeightfieldDataID created by dGeomHeightfieldDataCreate and setup by dGeomHeightfieldDataBuildCallback, dGeomHeightfieldDataBuildByte, dGeomHeightfieldDataBuildShort or dGeomHeightfieldDataBuildFloat.
    bPlaceable If non-zero this geom can be transformed in the world using the usual functions such as dGeomSetPosition and dGeomSetRotation. If the geom is not set as placeable, then it uses a fixed orientation where the global y axis represents the dynamic 'height' of the heightfield.
    -
    -
    Returns:
    A geom id to reference this geom in other calls.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dGeomClearOffset (dGeomID  geom  ) 
    -
    -
    - -

    -Clear any offset from the geom. -

    -If the geom has an offset, it is eliminated and the geom is repositioned at the body's position. If the geom has no offset, this function does nothing. This is more efficient than calling dGeomSetOffsetPosition(zero) and dGeomSetOffsetRotation(identiy), because this function actually eliminates the offset, rather than leaving it as the identity transform.

    -

    Parameters:
    - - -
    geom the geom to have its offset destroyed.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomCopyOffsetPosition (dGeomID  geom,
    dVector3  pos 
    )
    -
    -
    - -

    -Copy the offset position vector of a geom. -

    -Returns the positional offset of the geom in local coordinates. If the geom has no offset, this function returns the zero vector.

    -

    Parameters:
    - - - -
    geom the geom to query.
    pos returns the offset position
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomCopyOffsetRotation (dGeomID  geom,
    dMatrix3  R 
    )
    -
    -
    - -

    -Copy the offset rotation matrix of a geom. -

    -Returns the rotational offset of the geom in local coordinates. If the geom has no offset, this function returns the identity matrix.

    -

    Parameters:
    - - - -
    geom the geom to query.
    R returns the rotation matrix.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomCopyPosition (dGeomID  geom,
    dVector3  pos 
    )
    -
    -
    - -

    -Copy the position of a geom into a vector. -

    -

    Parameters:
    - - - -
    geom the geom to query
    pos a copy of the geom position
    -
    -
    See also:
    dGeomGetPosition
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomCopyRotation (dGeomID  geom,
    dMatrix3  R 
    )
    -
    -
    - -

    -Get the rotation matrix of a placeable geom. -

    -If the geom is attached to a body, the body's rotation will be returned.

    -Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - - -
    geom the geom to query.
    R a copy of the geom rotation
    -
    -
    See also:
    dGeomGetRotation
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dGeomDestroy (dGeomID  geom  ) 
    -
    -
    - -

    -Destroy a geom, removing it from any space. -

    -Destroy a geom, removing it from any space it is in first. This one function destroys a geom of any type, but to create a geom you must call a creation function for that type.

    -When a space is destroyed, if its cleanup mode is 1 (the default) then all the geoms in that space are automatically destroyed as well.

    -

    Parameters:
    - - -
    geom the geom to be destroyed.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dGeomDisable (dGeomID  geom  ) 
    -
    -
    - -

    -Disable a geom. -

    -Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, although they can still be members of a space. New geoms are created in the enabled state.

    -

    Parameters:
    - - -
    geom the geom to disable
    -
    -
    See also:
    dGeomDisable

    -dGeomIsEnabled

    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dGeomEnable (dGeomID  geom  ) 
    -
    -
    - -

    -Enable a geom. -

    -Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, although they can still be members of a space. New geoms are created in the enabled state.

    -

    Parameters:
    - - -
    geom the geom to enable
    -
    -
    See also:
    dGeomDisable

    -dGeomIsEnabled

    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomGetAABB (dGeomID  geom,
    dReal  aabb[6] 
    )
    -
    -
    - -

    -Return the axis-aligned bounding box. -

    -Return in aabb an axis aligned bounding box that surrounds the given geom. The aabb array has elements (minx, maxx, miny, maxy, minz, maxz). If the geom is a space, a bounding box that surrounds all contained geoms is returned.

    -This function may return a pre-computed cached bounding box, if it can determine that the geom has not moved since the last time the bounding box was computed.

    -

    Parameters:
    - - - -
    geom the geom to query
    aabb the returned bounding box
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dBodyID dGeomGetBody (dGeomID  geom  ) 
    -
    -
    - -

    -Get the body associated with a placeable geom. -

    -

    Parameters:
    - - -
    geom the geom to query.
    -
    -
    See also:
    dGeomSetBody
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API unsigned long dGeomGetCategoryBits (dGeomID   ) 
    -
    -
    - -

    -Get the "category" bitfield for the given geom. -

    -

    Parameters:
    - - - -
    geom the geom to set
    bits the new bitfield value
    -
    -
    See also:
    dGeomSetCategoryBits
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dGeomGetClass (dGeomID  geom  ) 
    -
    -
    - -

    -Given a geom, this returns its class. -

    -The ODE classes are:

      -
    • dSphereClass
    • -
    • dBoxClass
    • -
    • dCylinderClass
    • -
    • dPlaneClass
    • -
    • dRayClass
    • -
    • dConvexClass
    • -
    • dGeomTransformClass
    • -
    • dTriMeshClass
    • -
    • dSimpleSpaceClass
    • -
    • dHashSpaceClass
    • -
    • dQuadTreeSpaceClass
    • -
    • dFirstUserClass
    • -
    • dLastUserClass
    • -
    -User-defined class will return their own number.

    -

    Parameters:
    - - -
    geom the geom to query
    -
    -
    Returns:
    The geom class ID.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API unsigned long dGeomGetCollideBits (dGeomID   ) 
    -
    -
    - -

    -Get the "collide" bitfield for the given geom. -

    -

    Parameters:
    - - - -
    geom the geom to set
    bits the new bitfield value
    -
    -
    See also:
    dGeomSetCollideBits
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void* dGeomGetData (dGeomID  geom  ) 
    -
    -
    - -

    -Get the user-defined data pointer stored in the geom. -

    -

    Parameters:
    - - -
    geom the geom containing the data
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dGeomGetOffsetPosition (dGeomID  geom  ) 
    -
    -
    - -

    -Get the offset position vector of a geom. -

    -Returns the positional offset of the geom in local coordinates. If the geom has no offset, this function returns the zero vector.

    -

    Parameters:
    - - -
    geom the geom to query.
    -
    -
    Returns:
    A pointer to the geom's offset vector.
    -
    Remarks:
    The returned value is a pointer to the geom's internal data structure. It is valid until any changes are made to the geom.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomGetOffsetQuaternion (dGeomID  geom,
    dQuaternion  result 
    )
    -
    -
    - -

    -Get the offset rotation quaternion of a geom. -

    -Returns the rotation offset of the geom as a quaternion. If the geom has no offset, the identity quaternion is returned.

    -

    Parameters:
    - - - -
    geom the geom to query.
    result a copy of the rotation quaternion.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dGeomGetOffsetRotation (dGeomID  geom  ) 
    -
    -
    - -

    -Get the offset rotation matrix of a geom. -

    -Returns the rotational offset of the geom in local coordinates. If the geom has no offset, this function returns the identity matrix.

    -

    Parameters:
    - - -
    geom the geom to query.
    -
    -
    Returns:
    A pointer to the geom's offset rotation matrix.
    -
    Remarks:
    The returned value is a pointer to the geom's internal data structure. It is valid until any changes are made to the geom.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dGeomGetPosition (dGeomID  geom  ) 
    -
    -
    - -

    -Get the position vector of a placeable geom. -

    -If the geom is attached to a body, the body's position will be returned.

    -Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - -
    geom the geom to query.
    -
    -
    Returns:
    A pointer to the geom's position vector.
    -
    Remarks:
    The returned value is a pointer to the geom's internal data structure. It is valid until any changes are made to the geom.
    -
    See also:
    dBodyGetPosition
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomGetQuaternion (dGeomID  geom,
    dQuaternion  result 
    )
    -
    -
    - -

    -Get the rotation quaternion of a placeable geom. -

    -If the geom is attached to a body, the body's quaternion will be returned.

    -Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - - -
    geom the geom to query.
    result a copy of the rotation quaternion.
    -
    -
    See also:
    dBodyGetQuaternion
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API const dReal* dGeomGetRotation (dGeomID  geom  ) 
    -
    -
    - -

    -Get the rotation matrix of a placeable geom. -

    -If the geom is attached to a body, the body's rotation will be returned.

    -Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - -
    geom the geom to query.
    -
    -
    Returns:
    A pointer to the geom's rotation matrix.
    -
    Remarks:
    The returned value is a pointer to the geom's internal data structure. It is valid until any changes are made to the geom.
    -
    See also:
    dBodyGetRotation
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dSpaceID dGeomGetSpace (dGeomID   ) 
    -
    -
    - -

    -Query for the space containing a particular geom. -

    -

    Parameters:
    - - -
    geom the geom to query
    -
    -
    Returns:
    The space that contains the geom, or NULL if the geom is not contained by a space.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataBuildByte (dHeightfieldDataID  d,
    const unsigned char *  pHeightData,
    int  bCopyHeightData,
    dReal  width,
    dReal  depth,
    int  widthSamples,
    int  depthSamples,
    dReal  scale,
    dReal  offset,
    dReal  thickness,
    int  bWrap 
    )
    -
    -
    - -

    -Configures a dHeightfieldDataID to use height data in byte format. -

    -Before a dHeightfieldDataID can be used by a geom it must be configured to specify the format of the height data. This call specifies that the heightfield data is stored as a rectangular array of bytes (8 bit unsigned) representing the height at each sample point.

    -

    Parameters:
    - - - - - - - - - - - - -
    d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate
    pHeightData A pointer to the height data.
    bCopyHeightData When non-zero the height data is copied to an internal store. When zero the height data is accessed by reference and so must persist throughout the lifetime of the heightfield.
    width Specifies the total 'width' of the heightfield along the geom's local x axis.
    depth Specifies the total 'depth' of the heightfield along the geom's local z axis.
    widthSamples Specifies the number of vertices to sample along the width of the heightfield. Each vertex has a corresponding height value which forms the overall shape. Naturally this value must be at least two or more.
    depthSamples Specifies the number of vertices to sample along the depth of the heightfield.
    scale A uniform scale applied to all raw height data.
    offset An offset applied to the scaled height data.
    thickness A value subtracted from the lowest height value which in effect adds an additional cuboid to the base of the heightfield. This is used to prevent geoms from looping under the desired terrain and not registering as a collision. Note that the thickness is not affected by the scale or offset parameters.
    bWrap If non-zero the heightfield will infinitely tile in both directions along the local x and z axes. If zero the heightfield is bounded from zero to width in the local x axis, and zero to depth in the local z axis.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataBuildCallback (dHeightfieldDataID  d,
    void *  pUserData,
    dHeightfieldGetHeight pCallback,
    dReal  width,
    dReal  depth,
    int  widthSamples,
    int  depthSamples,
    dReal  scale,
    dReal  offset,
    dReal  thickness,
    int  bWrap 
    )
    -
    -
    - -

    -Configures a dHeightfieldDataID to use a callback to retrieve height data. -

    -Before a dHeightfieldDataID can be used by a geom it must be configured to specify the format of the height data. This call specifies that the heightfield data is computed by the user and it should use the given callback when determining the height of a given element of it's shape.

    -

    Parameters:
    - - - - - - - - - - -
    d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate
    width Specifies the total 'width' of the heightfield along the geom's local x axis.
    depth Specifies the total 'depth' of the heightfield along the geom's local z axis.
    widthSamples Specifies the number of vertices to sample along the width of the heightfield. Each vertex has a corresponding height value which forms the overall shape. Naturally this value must be at least two or more.
    depthSamples Specifies the number of vertices to sample along the depth of the heightfield.
    scale A uniform scale applied to all raw height data.
    offset An offset applied to the scaled height data.
    thickness A value subtracted from the lowest height value which in effect adds an additional cuboid to the base of the heightfield. This is used to prevent geoms from looping under the desired terrain and not registering as a collision. Note that the thickness is not affected by the scale or offset parameters.
    bWrap If non-zero the heightfield will infinitely tile in both directions along the local x and z axes. If zero the heightfield is bounded from zero to width in the local x axis, and zero to depth in the local z axis.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataBuildDouble (dHeightfieldDataID  d,
    const double *  pHeightData,
    int  bCopyHeightData,
    dReal  width,
    dReal  depth,
    int  widthSamples,
    int  depthSamples,
    dReal  scale,
    dReal  offset,
    dReal  thickness,
    int  bWrap 
    )
    -
    -
    - -

    -Configures a dHeightfieldDataID to use height data in double precision floating point format. -

    -Before a dHeightfieldDataID can be used by a geom it must be configured to specify the format of the height data. This call specifies that the heightfield data is stored as a rectangular array of double precision floats representing the height at each sample point.

    -

    Parameters:
    - - - - - - - - - - - - -
    d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate
    pHeightData A pointer to the height data.
    bCopyHeightData When non-zero the height data is copied to an internal store. When zero the height data is accessed by reference and so must persist throughout the lifetime of the heightfield.
    width Specifies the total 'width' of the heightfield along the geom's local x axis.
    depth Specifies the total 'depth' of the heightfield along the geom's local z axis.
    widthSamples Specifies the number of vertices to sample along the width of the heightfield. Each vertex has a corresponding height value which forms the overall shape. Naturally this value must be at least two or more.
    depthSamples Specifies the number of vertices to sample along the depth of the heightfield.
    scale A uniform scale applied to all raw height data.
    offset An offset applied to the scaled height data.
    thickness A value subtracted from the lowest height value which in effect adds an additional cuboid to the base of the heightfield. This is used to prevent geoms from looping under the desired terrain and not registering as a collision. Note that the thickness is not affected by the scale or offset parameters.
    bWrap If non-zero the heightfield will infinitely tile in both directions along the local x and z axes. If zero the heightfield is bounded from zero to width in the local x axis, and zero to depth in the local z axis.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataBuildShort (dHeightfieldDataID  d,
    const short *  pHeightData,
    int  bCopyHeightData,
    dReal  width,
    dReal  depth,
    int  widthSamples,
    int  depthSamples,
    dReal  scale,
    dReal  offset,
    dReal  thickness,
    int  bWrap 
    )
    -
    -
    - -

    -Configures a dHeightfieldDataID to use height data in short format. -

    -Before a dHeightfieldDataID can be used by a geom it must be configured to specify the format of the height data. This call specifies that the heightfield data is stored as a rectangular array of shorts (16 bit signed) representing the height at each sample point.

    -

    Parameters:
    - - - - - - - - - - - - -
    d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate
    pHeightData A pointer to the height data.
    bCopyHeightData When non-zero the height data is copied to an internal store. When zero the height data is accessed by reference and so must persist throughout the lifetime of the heightfield.
    width Specifies the total 'width' of the heightfield along the geom's local x axis.
    depth Specifies the total 'depth' of the heightfield along the geom's local z axis.
    widthSamples Specifies the number of vertices to sample along the width of the heightfield. Each vertex has a corresponding height value which forms the overall shape. Naturally this value must be at least two or more.
    depthSamples Specifies the number of vertices to sample along the depth of the heightfield.
    scale A uniform scale applied to all raw height data.
    offset An offset applied to the scaled height data.
    thickness A value subtracted from the lowest height value which in effect adds an additional cuboid to the base of the heightfield. This is used to prevent geoms from looping under the desired terrain and not registering as a collision. Note that the thickness is not affected by the scale or offset parameters.
    bWrap If non-zero the heightfield will infinitely tile in both directions along the local x and z axes. If zero the heightfield is bounded from zero to width in the local x axis, and zero to depth in the local z axis.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataBuildSingle (dHeightfieldDataID  d,
    const float *  pHeightData,
    int  bCopyHeightData,
    dReal  width,
    dReal  depth,
    int  widthSamples,
    int  depthSamples,
    dReal  scale,
    dReal  offset,
    dReal  thickness,
    int  bWrap 
    )
    -
    -
    - -

    -Configures a dHeightfieldDataID to use height data in single precision floating point format. -

    -Before a dHeightfieldDataID can be used by a geom it must be configured to specify the format of the height data. This call specifies that the heightfield data is stored as a rectangular array of single precision floats representing the height at each sample point.

    -

    Parameters:
    - - - - - - - - - - - - -
    d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate
    pHeightData A pointer to the height data.
    bCopyHeightData When non-zero the height data is copied to an internal store. When zero the height data is accessed by reference and so must persist throughout the lifetime of the heightfield.
    width Specifies the total 'width' of the heightfield along the geom's local x axis.
    depth Specifies the total 'depth' of the heightfield along the geom's local z axis.
    widthSamples Specifies the number of vertices to sample along the width of the heightfield. Each vertex has a corresponding height value which forms the overall shape. Naturally this value must be at least two or more.
    depthSamples Specifies the number of vertices to sample along the depth of the heightfield.
    scale A uniform scale applied to all raw height data.
    offset An offset applied to the scaled height data.
    thickness A value subtracted from the lowest height value which in effect adds an additional cuboid to the base of the heightfield. This is used to prevent geoms from looping under the desired terrain and not registering as a collision. Note that the thickness is not affected by the scale or offset parameters.
    bWrap If non-zero the heightfield will infinitely tile in both directions along the local x and z axes. If zero the heightfield is bounded from zero to width in the local x axis, and zero to depth in the local z axis.
    -
    - -
    -

    - -

    -
    - - - - - - - - -
    ODE_API dHeightfieldDataID dGeomHeightfieldDataCreate (  ) 
    -
    -
    - -

    -Creates a new empty dHeightfieldDataID. -

    -Allocates a new dHeightfieldDataID and returns it. You must call dGeomHeightfieldDataDestroy to destroy it after the geom has been removed. The dHeightfieldDataID value is used when specifying a data format type.

    -

    Returns:
    A dHeightfieldDataID for use with dGeomHeightfieldDataBuildCallback, dGeomHeightfieldDataBuildByte, dGeomHeightfieldDataBuildShort or dGeomHeightfieldDataBuildFloat.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataDestroy (dHeightfieldDataID  d  ) 
    -
    -
    - -

    -Destroys a dHeightfieldDataID. -

    -Deallocates a given dHeightfieldDataID and all managed resources.

    -

    Parameters:
    - - -
    d A dHeightfieldDataID created by dGeomHeightfieldDataCreate
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldDataSetBounds (dHeightfieldDataID  d,
    dReal  minHeight,
    dReal  maxHeight 
    )
    -
    -
    - -

    -Manually set the minimum and maximum height bounds. -

    -This call allows you to set explicit min / max values after initial creation typically for callback heightfields which default to +/- infinity, or those whose data has changed. This must be set prior to binding with a geom, as the the AABB is not recomputed after it's first generation.

    -

    Remarks:
    The minimum and maximum values are used to compute the AABB for the heightfield which is used for early rejection of collisions. A close fit will yield a more efficient collision check.
    -
    Parameters:
    - - - - -
    d A dHeightfieldDataID created by dGeomHeightfieldDataCreate
    min_height The new minimum height value. Scale, offset and thickness is then applied.
    max_height The new maximum height value. Scale and offset is then applied.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dHeightfieldDataID dGeomHeightfieldGetHeightfieldData (dGeomID  g  ) 
    -
    -
    - -

    -Gets the dHeightfieldDataID bound to a heightfield geom. -

    -Returns the dHeightfieldDataID associated with a heightfield geom.

    -

    Parameters:
    - - -
    g A geom created by dCreateHeightfield
    -
    -
    Returns:
    The dHeightfieldDataID which may be NULL if none was assigned.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomHeightfieldSetHeightfieldData (dGeomID  g,
    dHeightfieldDataID  d 
    )
    -
    -
    - -

    -Assigns a dHeightfieldDataID to a heightfield geom. -

    -Associates the given dHeightfieldDataID with a heightfield geom. This is done without affecting the GEOM_PLACEABLE flag.

    -

    Parameters:
    - - - -
    g A geom created by dCreateHeightfield
    d A dHeightfieldDataID created by dGeomHeightfieldDataCreate
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dGeomIsEnabled (dGeomID  geom  ) 
    -
    -
    - -

    -Check to see if a geom is enabled. -

    -Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, although they can still be members of a space. New geoms are created in the enabled state.

    -

    Parameters:
    - - -
    geom the geom to query
    -
    -
    Returns:
    Non-zero if the geom is enabled, zero otherwise.
    -
    See also:
    dGeomDisable

    -dGeomIsEnabled

    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dGeomIsOffset (dGeomID  geom  ) 
    -
    -
    - -

    -Check to see whether the geom has an offset. -

    -This function will return non-zero if the offset has been created. Note that there is a difference between a geom with no offset, and a geom with an offset that is the identity transform. In the latter case, although the observed behaviour is identical, there is a unnecessary computation involved because the geom will be applying the transform whenever it needs to recalculate its world position.

    -

    Parameters:
    - - -
    geom the geom to query.
    -
    -
    Returns:
    Non-zero if the geom has an offset, zero otherwise.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dGeomIsSpace (dGeomID  geom  ) 
    -
    -
    - -

    -Determing if a geom is a space. -

    -

    Parameters:
    - - -
    geom the geom to query
    -
    -
    Returns:
    Non-zero if the geom is a space, zero otherwise.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetBody (dGeomID  geom,
    dBodyID  body 
    )
    -
    -
    - -

    -Set the body associated with a placeable geom. -

    -Setting a body on a geom automatically combines the position vector and rotation matrix of the body and geom, so that setting the position or orientation of one will set the value for both objects. Setting a body ID of zero gives the geom its own position and rotation, independent from any body. If the geom was previously connected to a body then its new independent position/rotation is set to the current position/rotation of the body.

    -Calling these functions on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - - -
    geom the geom to connect
    body the body to attach to the geom
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetCategoryBits (dGeomID  geom,
    unsigned long  bits 
    )
    -
    -
    - -

    -Set the "category" bitfield for the given geom. -

    -The category bitfield is used by spaces to govern which geoms will interact with each other. The bitfield is guaranteed to be at least 32 bits wide. The default category values for newly created geoms have all bits set.

    -

    Parameters:
    - - - -
    geom the geom to set
    bits the new bitfield value
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetCollideBits (dGeomID  geom,
    unsigned long  bits 
    )
    -
    -
    - -

    -Set the "collide" bitfield for the given geom. -

    -The collide bitfield is used by spaces to govern which geoms will interact with each other. The bitfield is guaranteed to be at least 32 bits wide. The default category values for newly created geoms have all bits set.

    -

    Parameters:
    - - - -
    geom the geom to set
    bits the new bitfield value
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetData (dGeomID  geom,
    void *  data 
    )
    -
    -
    - -

    -Set the user-defined data pointer stored in the geom. -

    -

    Parameters:
    - - - -
    geom the geom to hold the data
    data the data pointer to be stored
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetOffsetPosition (dGeomID  geom,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the local offset position of a geom from its body. -

    -Sets the geom's positional offset in local coordinates. After this call, the geom will be at a new position determined from the body's position and the offset. The geom must be attached to a body. If the geom did not have an offset, it is automatically created.

    -

    Parameters:
    - - - - - -
    geom the geom to set.
    x the new X coordinate.
    y the new Y coordinate.
    z the new Z coordinate.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetOffsetQuaternion (dGeomID  geom,
    const dQuaternion  Q 
    )
    -
    -
    - -

    -Set the local offset rotation of a geom from its body. -

    -Sets the geom's rotational offset in local coordinates. After this call, the geom will be at a new position determined from the body's position and the offset. The geom must be attached to a body. If the geom did not have an offset, it is automatically created.

    -

    Parameters:
    - - - -
    geom the geom to set.
    Q the new rotation.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetOffsetRotation (dGeomID  geom,
    const dMatrix3  R 
    )
    -
    -
    - -

    -Set the local offset rotation matrix of a geom from its body. -

    -Sets the geom's rotational offset in local coordinates. After this call, the geom will be at a new position determined from the body's position and the offset. The geom must be attached to a body. If the geom did not have an offset, it is automatically created.

    -

    Parameters:
    - - - -
    geom the geom to set.
    R the new rotation matrix.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetOffsetWorldPosition (dGeomID  geom,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the offset position of a geom from its body. -

    -Sets the geom's positional offset to move it to the new world coordinates. After this call, the geom will be at the world position passed in, and the offset will be the difference from the current body position. The geom must be attached to a body. If the geom did not have an offset, it is automatically created.

    -

    Parameters:
    - - - - - -
    geom the geom to set.
    x the new X coordinate.
    y the new Y coordinate.
    z the new Z coordinate.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetOffsetWorldQuaternion (dGeomID  geom,
    const   dQuaternion 
    )
    -
    -
    - -

    -Set the offset rotation of a geom from its body. -

    -Sets the geom's rotational offset to orient it to the new world rotation matrix. After this call, the geom will be at the world orientation passed in, and the offset will be the difference from the current body orientation. The geom must be attached to a body. If the geom did not have an offset, it is automatically created.

    -

    Parameters:
    - - - -
    geom the geom to set.
    Q the new rotation.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetOffsetWorldRotation (dGeomID  geom,
    const dMatrix3  R 
    )
    -
    -
    - -

    -Set the offset rotation of a geom from its body. -

    -Sets the geom's rotational offset to orient it to the new world rotation matrix. After this call, the geom will be at the world orientation passed in, and the offset will be the difference from the current body orientation. The geom must be attached to a body. If the geom did not have an offset, it is automatically created.

    -

    Parameters:
    - - - -
    geom the geom to set.
    R the new rotation matrix.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetPosition (dGeomID  geom,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the position vector of a placeable geom. -

    -If the geom is attached to a body, the body's position will also be changed. Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - - - - -
    geom the geom to set.
    x the new X coordinate.
    y the new Y coordinate.
    z the new Z coordinate.
    -
    -
    See also:
    dBodySetPosition
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetQuaternion (dGeomID  geom,
    const dQuaternion  Q 
    )
    -
    -
    - -

    -Set the rotation of a placeable geom. -

    -If the geom is attached to a body, the body's rotation will also be changed.

    -Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - - -
    geom the geom to set.
    Q the new rotation.
    -
    -
    See also:
    dBodySetQuaternion
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSetRotation (dGeomID  geom,
    const dMatrix3  R 
    )
    -
    -
    - -

    -Set the rotation matrix of a placeable geom. -

    -If the geom is attached to a body, the body's rotation will also be changed. Calling this function on a non-placeable geom results in a runtime error in the debug build of ODE.

    -

    Parameters:
    - - - -
    geom the geom to set.
    R the new rotation matrix.
    -
    -
    See also:
    dBodySetRotation
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dSpaceCollide (dSpaceID  space,
    void *  data,
    dNearCallback callback 
    )
    -
    -
    - -

    -Determines which pairs of geoms in a space may potentially intersect, and calls the callback function for each candidate pair. -

    -

    Parameters:
    - - - - -
    space The space to test.
    data Passed from dSpaceCollide directly to the callback function. Its meaning is user defined. The o1 and o2 arguments are the geoms that may be near each other.
    callback A callback function is of type dNearCallback.
    -
    -
    Remarks:
    Other spaces that are contained within the colliding space are not treated specially, i.e. they are not recursed into. The callback function may be passed these contained spaces as one or both geom arguments.

    -dSpaceCollide() is guaranteed to pass all intersecting geom pairs to the callback function, but may also pass close but non-intersecting pairs. The number of these calls depends on the internal algorithms used by the space. Thus you should not expect that dCollide will return contacts for every pair passed to the callback.

    -
    See also:
    dSpaceCollide2
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dSpaceCollide2 (dGeomID  space1,
    dGeomID  space2,
    void *  data,
    dNearCallback callback 
    )
    -
    -
    - -

    -Determines which geoms from one space may potentially intersect with geoms from another space, and calls the callback function for each candidate pair. -

    -

    Parameters:
    - - - - - -
    space1 The first space to test.
    space2 The second space to test.
    data Passed from dSpaceCollide directly to the callback function. Its meaning is user defined. The o1 and o2 arguments are the geoms that may be near each other.
    callback A callback function is of type dNearCallback.
    -
    -
    Remarks:
    This function can also test a single non-space geom against a space. This function is useful when there is a collision hierarchy, i.e. when there are spaces that contain other spaces.

    -Other spaces that are contained within the colliding space are not treated specially, i.e. they are not recursed into. The callback function may be passed these contained spaces as one or both geom arguments.

    -dSpaceCollide2() is guaranteed to pass all intersecting geom pairs to the callback function, but may also pass close but non-intersecting pairs. The number of these calls depends on the internal algorithms used by the space. Thus you should not expect that dCollide will return contacts for every pair passed to the callback.

    -
    See also:
    dSpaceCollide
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__collide__box.html b/libraries/ode-0.9/docs/group__collide__box.html deleted file mode 100644 index 341c2c19a4..0000000000 --- a/libraries/ode-0.9/docs/group__collide__box.html +++ /dev/null @@ -1,182 +0,0 @@ - - -Open Dynamics Engine: Box Class - - - - - -

    Box Class
    - -[Collision Detection] -

    - - - - - - - - - - - -

    Functions

    ODE_API dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz)
     Create a box geom with the provided side lengths.
    ODE_API void dGeomBoxSetLengths (dGeomID box, dReal lx, dReal ly, dReal lz)
     Set the side lengths of the given box.
    ODE_API void dGeomBoxGetLengths (dGeomID box, dVector3 result)
     Get the side lengths of a box.
    -

    Function Documentation

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API dGeomID dCreateBox (dSpaceID  space,
    dReal  lx,
    dReal  ly,
    dReal  lz 
    )
    -
    -
    - -

    -Create a box geom with the provided side lengths. -

    -

    Parameters:
    - - - - - -
    space a space to contain the new geom. May be null.
    lx the length of the box along the X axis
    ly the length of the box along the Y axis
    lz the length of the box along the Z axis
    -
    -
    Returns:
    A new box geom.
    -
    Remarks:
    The point of reference for a box is its center.
    -
    See also:
    dGeomDestroy

    -dGeomBoxSetLengths

    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomBoxGetLengths (dGeomID  box,
    dVector3  result 
    )
    -
    -
    - -

    -Get the side lengths of a box. -

    -

    Parameters:
    - - - -
    box the box to query
    result the returned side lengths
    -
    -
    See also:
    dGeomBoxSetLengths
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomBoxSetLengths (dGeomID  box,
    dReal  lx,
    dReal  ly,
    dReal  lz 
    )
    -
    -
    - -

    -Set the side lengths of the given box. -

    -

    Parameters:
    - - - - - -
    box the box to set
    lx the length of the box along the X axis
    ly the length of the box along the Y axis
    lz the length of the box along the Z axis
    -
    -
    See also:
    dGeomBoxGetLengths
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__collide__sphere.html b/libraries/ode-0.9/docs/group__collide__sphere.html deleted file mode 100644 index c0174cc5d7..0000000000 --- a/libraries/ode-0.9/docs/group__collide__sphere.html +++ /dev/null @@ -1,199 +0,0 @@ - - -Open Dynamics Engine: Sphere Class - - - - - -

    Sphere Class
    - -[Collision Detection] -

    - - - - - - - - - - - - - - -

    Functions

    ODE_API dGeomID dCreateSphere (dSpaceID space, dReal radius)
     Create a sphere geom of the given radius, and return its ID.
    ODE_API void dGeomSphereSetRadius (dGeomID sphere, dReal radius)
     Set the radius of a sphere geom.
    ODE_API dReal dGeomSphereGetRadius (dGeomID sphere)
     Retrieves the radius of a sphere geom.
    ODE_API dReal dGeomSpherePointDepth (dGeomID sphere, dReal x, dReal y, dReal z)
     Calculate the depth of the a given point within a sphere.
    -

    Function Documentation

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dGeomID dCreateSphere (dSpaceID  space,
    dReal  radius 
    )
    -
    -
    - -

    -Create a sphere geom of the given radius, and return its ID. -

    -

    Parameters:
    - - - -
    space a space to contain the new geom. May be null.
    radius the radius of the sphere.
    -
    -
    Returns:
    A new sphere geom.
    -
    Remarks:
    The point of reference for a sphere is its center.
    -
    See also:
    dGeomDestroy

    -dGeomSphereSetRadius

    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dGeomSphereGetRadius (dGeomID  sphere  ) 
    -
    -
    - -

    -Retrieves the radius of a sphere geom. -

    -

    Parameters:
    - - -
    sphere the sphere to query.
    -
    -
    See also:
    dGeomSphereSetRadius
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API dReal dGeomSpherePointDepth (dGeomID  sphere,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Calculate the depth of the a given point within a sphere. -

    -

    Parameters:
    - - - - - -
    sphere the sphere to query.
    x the X coordinate of the point.
    y the Y coordinate of the point.
    z the Z coordinate of the point.
    -
    -
    Returns:
    The depth of the point. Points inside the sphere will have a positive depth, points outside it will have a negative depth, and points on the surface will have a depth of zero.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dGeomSphereSetRadius (dGeomID  sphere,
    dReal  radius 
    )
    -
    -
    - -

    -Set the radius of a sphere geom. -

    -

    Parameters:
    - - - -
    sphere the sphere to set.
    radius the new radius.
    -
    -
    See also:
    dGeomSphereGetRadius
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__disable.html b/libraries/ode-0.9/docs/group__disable.html deleted file mode 100644 index ad8bb2c393..0000000000 --- a/libraries/ode-0.9/docs/group__disable.html +++ /dev/null @@ -1,563 +0,0 @@ - - -Open Dynamics Engine: Automatic Enabling and Disabling - - - - - -

    Automatic Enabling and Disabling

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Functions

    -ODE_API void dWorldSetAutoEnableDepthSF1 (dWorldID, int autoEnableDepth)
     Set the AutoEnableDepth parameter used by the StepFast1 algorithm.
    -ODE_API int dWorldGetAutoEnableDepthSF1 (dWorldID)
     Get the AutoEnableDepth parameter used by the StepFast1 algorithm.
    ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID)
     Get auto disable linear threshold for newly created bodies.
    ODE_API void dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold)
     Set auto disable linear threshold for newly created bodies.
    ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID)
     Get auto disable angular threshold for newly created bodies.
    ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold)
     Set auto disable angular threshold for newly created bodies.
    ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID)
     Get auto disable linear average threshold for newly created bodies.
    ODE_API void dWorldSetAutoDisableLinearAverageThreshold (dWorldID, dReal linear_average_threshold)
     Set auto disable linear average threshold for newly created bodies.
    ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID)
     Get auto disable angular average threshold for newly created bodies.
    ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID, dReal angular_average_threshold)
     Set auto disable angular average threshold for newly created bodies.
    ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID)
     Get auto disable sample count for newly created bodies.
    ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID, unsigned int average_samples_count)
     Set auto disable average sample count for newly created bodies.
    ODE_API int dWorldGetAutoDisableSteps (dWorldID)
     Get auto disable steps for newly created bodies.
    ODE_API void dWorldSetAutoDisableSteps (dWorldID, int steps)
     Set auto disable steps for newly created bodies.
    ODE_API dReal dWorldGetAutoDisableTime (dWorldID)
     Get auto disable time for newly created bodies.
    ODE_API void dWorldSetAutoDisableTime (dWorldID, dReal time)
     Set auto disable time for newly created bodies.
    ODE_API int dWorldGetAutoDisableFlag (dWorldID)
     Get auto disable flag for newly created bodies.
    ODE_API void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable)
     Set auto disable flag for newly created bodies.
    -

    Detailed Description

    -Every body can be enabled or disabled. Enabled bodies participate in the simulation, while disabled bodies are turned off and do not get updated during a simulation step. New bodies are always created in the enabled state.

    -A disabled body that is connected through a joint to an enabled body will be automatically re-enabled at the next simulation step.

    -Disabled bodies do not consume CPU time, therefore to speed up the simulation bodies should be disabled when they come to rest. This can be done automatically with the auto-disable feature.

    -If a body has its auto-disable flag turned on, it will automatically disable itself when

      -
    • It has been idle for a given number of simulation steps.
    • -
    • It has also been idle for a given amount of simulation time.
    • -
    -A body is considered to be idle when the magnitudes of both its linear average velocity and angular average velocity are below given thresholds. The sample size for the average defaults to one and can be disabled by setting to zero with

    -Thus, every body has six auto-disable parameters: an enabled flag, a idle step count, an idle time, linear/angular average velocity thresholds, and the average samples count.

    -Newly created bodies get these parameters from world.


    Function Documentation

    - -
    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID   ) 
    -
    -
    - -

    -Get auto disable angular average threshold for newly created bodies. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID   ) 
    -
    -
    - -

    -Get auto disable angular threshold for newly created bodies. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID   ) 
    -
    -
    - -

    -Get auto disable sample count for newly created bodies. -

    -

    Returns:
    number of samples used
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dWorldGetAutoDisableFlag (dWorldID   ) 
    -
    -
    - -

    -Get auto disable flag for newly created bodies. -

    -

    Returns:
    0 or 1
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID   ) 
    -
    -
    - -

    -Get auto disable linear average threshold for newly created bodies. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID   ) 
    -
    -
    - -

    -Get auto disable linear threshold for newly created bodies. -

    -

    Returns:
    the threshold
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dWorldGetAutoDisableSteps (dWorldID   ) 
    -
    -
    - -

    -Get auto disable steps for newly created bodies. -

    -

    Returns:
    nr of steps
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetAutoDisableTime (dWorldID   ) 
    -
    -
    - -

    -Get auto disable time for newly created bodies. -

    -

    Returns:
    nr of seconds
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID ,
    dReal  angular_average_threshold 
    )
    -
    -
    - -

    -Set auto disable angular average threshold for newly created bodies. -

    -

    Parameters:
    - - -
    linear_average_threshold default is 0.01
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID ,
    dReal  angular_threshold 
    )
    -
    -
    - -

    -Set auto disable angular threshold for newly created bodies. -

    -

    Parameters:
    - - -
    linear_threshold default is 0.01
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID ,
    unsigned int  average_samples_count 
    )
    -
    -
    - -

    -Set auto disable average sample count for newly created bodies. -

    -

    Parameters:
    - - -
    average_samples_count Default is 1, meaning only instantaneous velocity is used. Set to zero to disable sampling and thus prevent any body from auto-disabling.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableFlag (dWorldID ,
    int  do_auto_disable 
    )
    -
    -
    - -

    -Set auto disable flag for newly created bodies. -

    -

    Parameters:
    - - -
    do_auto_disable default is false.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableLinearAverageThreshold (dWorldID ,
    dReal  linear_average_threshold 
    )
    -
    -
    - -

    -Set auto disable linear average threshold for newly created bodies. -

    -

    Parameters:
    - - -
    linear_average_threshold default is 0.01
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableLinearThreshold (dWorldID ,
    dReal  linear_threshold 
    )
    -
    -
    - -

    -Set auto disable linear threshold for newly created bodies. -

    -

    Parameters:
    - - -
    linear_threshold default is 0.01
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableSteps (dWorldID ,
    int  steps 
    )
    -
    -
    - -

    -Set auto disable steps for newly created bodies. -

    -

    Parameters:
    - - -
    steps default is 10
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetAutoDisableTime (dWorldID ,
    dReal  time 
    )
    -
    -
    - -

    -Set auto disable time for newly created bodies. -

    -

    Parameters:
    - - -
    time default is 0 seconds
    -
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__drawstuff.html b/libraries/ode-0.9/docs/group__drawstuff.html deleted file mode 100644 index 6cf86504eb..0000000000 --- a/libraries/ode-0.9/docs/group__drawstuff.html +++ /dev/null @@ -1,668 +0,0 @@ - - -Open Dynamics Engine: DrawStuff - - - - - -

    DrawStuff

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Data Structures

    struct  dsFunctions
     Set of functions to be used as callbacks by the simulation loop. More...

    Functions

    DS_API void dsSimulationLoop (int argc, char **argv, int window_width, int window_height, struct dsFunctions *fn)
     Does the complete simulation.
    DS_API void dsError (char *msg,...)
     exit with error message.
    DS_API void dsDebug (char *msg,...)
     exit with error message and core dump.
    DS_API void dsPrint (char *msg,...)
     print log message
    DS_API void dsSetViewpoint (float xyz[3], float hpr[3])
     Sets the viewpoint.
    DS_API void dsGetViewpoint (float xyz[3], float hpr[3])
     Gets the viewpoint.
    DS_API void dsStop ()
     Stop the simulation loop.
    DS_API double dsElapsedTime ()
     Get the elapsed time (on wall-clock).
    DS_API void dsSetTexture (int texture_number)
     Toggle the rendering of textures.
    DS_API void dsSetColor (float red, float green, float blue)
     Set the color with which geometry is drawn.
    DS_API void dsSetColorAlpha (float red, float green, float blue, float alpha)
     Set the color and transparency with which geometry is drawn.
    DS_API void dsDrawBox (const float pos[3], const float R[12], const float sides[3])
     Draw a box.
    DS_API void dsDrawSphere (const float pos[3], const float R[12], float radius)
     Draw a sphere.
    DS_API void dsDrawTriangle (const float pos[3], const float R[12], const float *v0, const float *v1, const float *v2, int solid)
     Draw a triangle.
    -DS_API void dsDrawCylinder (const float pos[3], const float R[12], float length, float radius)
     Draw a z-aligned cylinder.
    -DS_API void dsDrawCapsule (const float pos[3], const float R[12], float length, float radius)
     Draw a z-aligned capsule.
    -DS_API void dsDrawLine (const float pos1[3], const float pos2[3])
     Draw a line.
    -DS_API void dsDrawConvex (const float pos[3], const float R[12], float *_planes, unsigned int _planecount, float *_points, unsigned int _pointcount, unsigned int *_polygons)
     Draw a convex shape.
    DS_API void dsSetSphereQuality (int n)
     Set the quality with which curved objects are rendered.
    -

    Detailed Description

    -DrawStuff is a library for rendering simple 3D objects in a virtual environment, for the purposes of demonstrating the features of ODE. It is provided for demonstration purposes and is not intended for production use.

    -Notes

    -In the virtual world, the z axis is "up" and z=0 is the floor.

    -The user is able to click+drag in the main window to move the camera: left button - pan and tilt. right button - forward and sideways. left + right button (or middle button) - sideways and up.


    Function Documentation

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    DS_API void dsDebug (char *  msg,
      ... 
    )
    -
    -
    - -

    -exit with error message and core dump. -

    -this functions tries to dump core or start the debugger.

    Parameters:
    - - -
    msg format strin, like printf, without the newline character.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    DS_API void dsDrawBox (const float  pos[3],
    const float  R[12],
    const float  sides[3] 
    )
    -
    -
    - -

    -Draw a box. -

    -

    Parameters:
    - - - - -
    pos is the x,y,z of the center of the object.
    R is a 3x3 rotation matrix for the object, stored by row like this: [ R11 R12 R13 0 ] [ R21 R22 R23 0 ] [ R31 R32 R33 0 ]
    sides[] is an array of x,y,z side lengths.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    DS_API void dsDrawSphere (const float  pos[3],
    const float  R[12],
    float  radius 
    )
    -
    -
    - -

    -Draw a sphere. -

    -

    Parameters:
    - - - - -
    pos Position of center.
    R orientation.
    radius 
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    DS_API void dsDrawTriangle (const float  pos[3],
    const float  R[12],
    const float *  v0,
    const float *  v1,
    const float *  v2,
    int  solid 
    )
    -
    -
    - -

    -Draw a triangle. -

    -

    Parameters:
    - - - - - - - -
    pos Position of center
    R orientation
    v0 first vertex
    v1 second
    v2 third vertex
    solid set to 0 for wireframe
    -
    - -
    -

    - -

    -
    - - - - - - - - -
    DS_API double dsElapsedTime (  ) 
    -
    -
    - -

    -Get the elapsed time (on wall-clock). -

    -It returns the nr of seconds since the last call to this function. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    DS_API void dsError (char *  msg,
      ... 
    )
    -
    -
    - -

    -exit with error message. -

    -This function displays an error message then exit.

    Parameters:
    - - -
    msg format strin, like printf, without the newline character.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    DS_API void dsGetViewpoint (float  xyz[3],
    float  hpr[3] 
    )
    -
    -
    - -

    -Gets the viewpoint. -

    -

    Parameters:
    - - - -
    xyz position
    hpr heading,pitch,roll.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    DS_API void dsPrint (char *  msg,
      ... 
    )
    -
    -
    - -

    -print log message -

    -

    Parameters:
    - - -
    msg format string, like printf, without the
    -.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    DS_API void dsSetColor (float  red,
    float  green,
    float  blue 
    )
    -
    -
    - -

    -Set the color with which geometry is drawn. -

    -

    Parameters:
    - - - - -
    red Red component from 0 to 1
    green Green component from 0 to 1
    blue Blue component from 0 to 1
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    DS_API void dsSetColorAlpha (float  red,
    float  green,
    float  blue,
    float  alpha 
    )
    -
    -
    - -

    -Set the color and transparency with which geometry is drawn. -

    -

    Parameters:
    - - -
    alpha Note that alpha transparency is a misnomer: it is alpha opacity. 1.0 means fully opaque, and 0.0 means fully transparent.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    DS_API void dsSetSphereQuality (int  n  ) 
    -
    -
    - -

    -Set the quality with which curved objects are rendered. -

    -Higher numbers are higher quality, but slower to draw. This must be set before the first objects are drawn to be effective. Default sphere quality is 1, default capsule quality is 3. -

    -

    - -

    -
    - - - - - - - - - -
    DS_API void dsSetTexture (int  texture_number  ) 
    -
    -
    - -

    -Toggle the rendering of textures. -

    -It changes the way objects are drawn. these changes will apply to all further dsDrawXXX() functions.

    Parameters:
    - - -
    the texture number must be a DS_xxx texture constant. The current texture is colored according to the current color. At the start of each frame, the texture is reset to none and the color is reset to white.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    DS_API void dsSetViewpoint (float  xyz[3],
    float  hpr[3] 
    )
    -
    -
    - -

    -Sets the viewpoint. -

    -

    Parameters:
    - - - -
    xyz camera position.
    hpr contains heading, pitch and roll numbers in degrees. heading=0 points along the x axis, pitch=0 is looking towards the horizon, and roll 0 is "unrotated".
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    DS_API void dsSimulationLoop (int  argc,
    char **  argv,
    int  window_width,
    int  window_height,
    struct dsFunctions fn 
    )
    -
    -
    - -

    -Does the complete simulation. -

    -This function starts running the simulation, and only exits when the simulation is done. Function pointers should be provided for the callbacks.

    Parameters:
    - - - -
    argv supports flags like '-notex' '-noshadow' '-pause'
    fn Callback functions.
    -
    - -
    -

    - -

    -
    - - - - - - - - -
    DS_API void dsStop (  ) 
    -
    -
    - -

    -Stop the simulation loop. -

    -Calling this from within dsSimulationLoop() will cause it to exit and return to the caller. it is the same as if the user used the exit command. using this outside the loop will have no effect. -

    -

    -


    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__joints.html b/libraries/ode-0.9/docs/group__joints.html deleted file mode 100644 index efe718e967..0000000000 --- a/libraries/ode-0.9/docs/group__joints.html +++ /dev/null @@ -1,2127 +0,0 @@ - - -Open Dynamics Engine: Joints - - - - - -

    Joints

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Functions

    ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID)
     Create a new joint of the ball type.
    ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID)
     Create a new joint of the hinge type.
    ODE_API dJointID dJointCreateSlider (dWorldID, dJointGroupID)
     Create a new joint of the slider type.
    ODE_API dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *)
     Create a new joint of the contact type.
    ODE_API dJointID dJointCreateHinge2 (dWorldID, dJointGroupID)
     Create a new joint of the hinge2 type.
    ODE_API dJointID dJointCreateUniversal (dWorldID, dJointGroupID)
     Create a new joint of the universal type.
    ODE_API dJointID dJointCreatePR (dWorldID, dJointGroupID)
     Create a new joint of the PR (Prismatic and Rotoide) type.
    ODE_API dJointID dJointCreateFixed (dWorldID, dJointGroupID)
     Create a new joint of the fixed type.
    ODE_API dJointID dJointCreateAMotor (dWorldID, dJointGroupID)
     Create a new joint of the A-motor type.
    ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID)
     Create a new joint of the L-motor type.
    ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID)
     Create a new joint of the plane-2d type.
    ODE_API void dJointDestroy (dJointID)
     Destroy a joint.
    ODE_API dJointGroupID dJointGroupCreate (int max_size)
     Create a joint group.
    ODE_API void dJointGroupDestroy (dJointGroupID)
     Destroy a joint group.
    ODE_API void dJointGroupEmpty (dJointGroupID)
     Empty a joint group.
    ODE_API void dJointAttach (dJointID, dBodyID body1, dBodyID body2)
     Attach the joint to some new bodies.
    -ODE_API void dJointSetData (dJointID, void *data)
     Set the user-data pointer.
    -ODE_API void * dJointGetData (dJointID)
     Get the user-data pointer.
    ODE_API int dJointGetType (dJointID)
     Get the type of the joint.
    ODE_API dBodyID dJointGetBody (dJointID, int index)
     Return the bodies that this joint connects.
    ODE_API void dJointSetFeedback (dJointID, dJointFeedback *)
     Sets the datastructure that is to receive the feedback.
    -ODE_API dJointFeedback * dJointGetFeedback (dJointID)
     Gets the datastructure that is to receive the feedback.
    ODE_API void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z)
     Set the joint anchor point.
    -ODE_API void dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z)
     Set the joint anchor point.
    -ODE_API void dJointSetBallParam (dJointID, int parameter, dReal value)
     Param setting for Ball joints.
    -ODE_API void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z)
     Set hinge anchor parameter.
    -ODE_API void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z)
     Set hinge axis.
    -ODE_API void dJointSetHingeParam (dJointID, int parameter, dReal value)
     set joint parameter
    ODE_API void dJointAddHingeTorque (dJointID joint, dReal torque)
     Applies the torque about the hinge axis.
    -ODE_API void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z)
     set the joint axis
    -ODE_API void dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az)
    -ODE_API void dJointSetSliderParam (dJointID, int parameter, dReal value)
     set joint parameter
    ODE_API void dJointAddSliderForce (dJointID joint, dReal force)
     Applies the given force in the slider's direction.
    -ODE_API void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z)
     set anchor
    -ODE_API void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z)
     set axis
    -ODE_API void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z)
     set axis
    -ODE_API void dJointSetHinge2Param (dJointID, int parameter, dReal value)
     set joint parameter
    ODE_API void dJointAddHinge2Torques (dJointID joint, dReal torque1, dReal torque2)
     Applies torque1 about the hinge2's axis 1, torque2 about the hinge2's axis 2.
    -ODE_API void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z)
     set anchor
    -ODE_API void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z)
     set axis
    -ODE_API void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z)
     set axis
    -ODE_API void dJointSetUniversalParam (dJointID, int parameter, dReal value)
     set joint parameter
    ODE_API void dJointAddUniversalTorques (dJointID joint, dReal torque1, dReal torque2)
     Applies torque1 about the universal's axis 1, torque2 about the universal's axis 2.
    -ODE_API void dJointSetPRAnchor (dJointID, dReal x, dReal y, dReal z)
     set anchor
    -ODE_API void dJointSetPRAxis1 (dJointID, dReal x, dReal y, dReal z)
     set the axis for the prismatic articulation
    -ODE_API void dJointSetPRAxis2 (dJointID, dReal x, dReal y, dReal z)
     set the axis for the rotoide articulation
    ODE_API void dJointSetPRParam (dJointID, int parameter, dReal value)
     set joint parameter
    ODE_API void dJointAddPRTorque (dJointID j, dReal torque)
     Applies the torque about the rotoide axis of the PR joint.
    -ODE_API void dJointSetFixed (dJointID)
     Call this on the fixed joint after it has been attached to remember the current desired relative offset and desired relative rotation between the bodies.
    ODE_API void dJointSetAMotorNumAxes (dJointID, int num)
     set the nr of axes
    -ODE_API void dJointSetAMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z)
     set axis
    ODE_API void dJointSetAMotorAngle (dJointID, int anum, dReal angle)
     Tell the AMotor what the current angle is along axis anum.
    -ODE_API void dJointSetAMotorParam (dJointID, int parameter, dReal value)
     set joint parameter
    -ODE_API void dJointSetAMotorMode (dJointID, int mode)
     set mode
    ODE_API void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3)
     Applies torque0 about the AMotor's axis 0, torque1 about the AMotor's axis 1, and torque2 about the AMotor's axis 2.
    ODE_API void dJointSetLMotorNumAxes (dJointID, int num)
     Set the number of axes that will be controlled by the LMotor.
    ODE_API void dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z)
     Set the AMotor axes.
    -ODE_API void dJointSetLMotorParam (dJointID, int parameter, dReal value)
     set joint parameter
    -ODE_API void dJointSetPlane2DXParam (dJointID, int parameter, dReal value)
    -ODE_API void dJointSetPlane2DYParam (dJointID, int parameter, dReal value)
    -ODE_API void dJointSetPlane2DAngleParam (dJointID, int parameter, dReal value)
    -ODE_API dReal dJointGetBallParam (dJointID, int parameter)
     get joint parameter
    ODE_API void dJointGetHingeAnchor (dJointID, dVector3 result)
     Get the hinge anchor point, in world coordinates.
    ODE_API void dJointGetHingeAnchor2 (dJointID, dVector3 result)
     Get the joint anchor point, in world coordinates.
    -ODE_API void dJointGetHingeAxis (dJointID, dVector3 result)
     get axis
    -ODE_API dReal dJointGetHingeParam (dJointID, int parameter)
     get joint parameter
    ODE_API dReal dJointGetHingeAngle (dJointID)
     Get the hinge angle.
    -ODE_API dReal dJointGetHingeAngleRate (dJointID)
     Get the hinge angle time derivative.
    ODE_API dReal dJointGetSliderPosition (dJointID)
     Get the slider linear position (i.e. the slider's extension).
    -ODE_API dReal dJointGetSliderPositionRate (dJointID)
     Get the slider linear position's time derivative.
    -ODE_API void dJointGetSliderAxis (dJointID, dVector3 result)
     Get the slider axis.
    -ODE_API dReal dJointGetSliderParam (dJointID, int parameter)
     get joint parameter
    ODE_API void dJointGetHinge2Anchor (dJointID, dVector3 result)
     Get the joint anchor point, in world coordinates.
    -ODE_API void dJointGetHinge2Anchor2 (dJointID, dVector3 result)
     Get the joint anchor point, in world coordinates. This returns the point on body 2. If the joint is perfectly satisfied, this will return the same value as dJointGetHinge2Anchor. If not, this value will be slightly different. This can be used, for example, to see how far the joint has come apart.
    -ODE_API void dJointGetHinge2Axis1 (dJointID, dVector3 result)
     Get joint axis.
    -ODE_API void dJointGetHinge2Axis2 (dJointID, dVector3 result)
     Get joint axis.
    -ODE_API dReal dJointGetHinge2Param (dJointID, int parameter)
     get joint parameter
    -ODE_API dReal dJointGetHinge2Angle1 (dJointID)
     Get angle.
    -ODE_API dReal dJointGetHinge2Angle1Rate (dJointID)
     Get time derivative of angle.
    -ODE_API dReal dJointGetHinge2Angle2Rate (dJointID)
     Get time derivative of angle.
    ODE_API void dJointGetUniversalAnchor (dJointID, dVector3 result)
     Get the joint anchor point, in world coordinates.
    ODE_API void dJointGetUniversalAnchor2 (dJointID, dVector3 result)
     Get the joint anchor point, in world coordinates.
    -ODE_API void dJointGetUniversalAxis1 (dJointID, dVector3 result)
     Get axis.
    -ODE_API void dJointGetUniversalAxis2 (dJointID, dVector3 result)
     Get axis.
    -ODE_API dReal dJointGetUniversalParam (dJointID, int parameter)
     get joint parameter
    ODE_API void dJointGetUniversalAngles (dJointID, dReal *angle1, dReal *angle2)
     Get both angles at the same time.
    -ODE_API dReal dJointGetUniversalAngle1 (dJointID)
     Get angle.
    -ODE_API dReal dJointGetUniversalAngle2 (dJointID)
     Get angle.
    -ODE_API dReal dJointGetUniversalAngle1Rate (dJointID)
     Get time derivative of angle.
    -ODE_API dReal dJointGetUniversalAngle2Rate (dJointID)
     Get time derivative of angle.
    ODE_API void dJointGetPRAnchor (dJointID, dVector3 result)
     Get the joint anchor point, in world coordinates.
    ODE_API dReal dJointGetPRPosition (dJointID)
     Get the PR linear position (i.e. the prismatic's extension).
    -ODE_API dReal dJointGetPRPositionRate (dJointID)
     Get the PR linear position's time derivative.
    -ODE_API void dJointGetPRAxis1 (dJointID, dVector3 result)
     Get the prismatic axis.
    -ODE_API void dJointGetPRAxis2 (dJointID, dVector3 result)
     Get the Rotoide axis.
    -ODE_API dReal dJointGetPRParam (dJointID, int parameter)
     get joint parameter
    ODE_API int dJointGetAMotorNumAxes (dJointID)
     Get the number of angular axes that will be controlled by the AMotor.
    ODE_API void dJointGetAMotorAxis (dJointID, int anum, dVector3 result)
     Get the AMotor axes.
    ODE_API int dJointGetAMotorAxisRel (dJointID, int anum)
     Get axis.
    ODE_API dReal dJointGetAMotorAngle (dJointID, int anum)
     Get the current angle for axis.
    ODE_API dReal dJointGetAMotorAngleRate (dJointID, int anum)
     Get the current angle rate for axis anum.
    -ODE_API dReal dJointGetAMotorParam (dJointID, int parameter)
     get joint parameter
    ODE_API int dJointGetAMotorMode (dJointID)
     Get the angular motor mode.
    -ODE_API int dJointGetLMotorNumAxes (dJointID)
     Get nr of axes.
    -ODE_API void dJointGetLMotorAxis (dJointID, int anum, dVector3 result)
     Get axis.
    -ODE_API dReal dJointGetLMotorParam (dJointID, int parameter)
     get joint parameter
    -ODE_API dReal dJointGetFixedParam (dJointID, int parameter)
     get joint parameter
    -ODE_API dJointID dConnectingJoint (dBodyID, dBodyID)
    -ODE_API int dConnectingJointList (dBodyID, dBodyID, dJointID *)
    ODE_API int dAreConnected (dBodyID, dBodyID)
     Utility function.
    ODE_API int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type)
     Utility function.
    -

    Detailed Description

    -In real life a joint is something like a hinge, that is used to connect two objects. In ODE a joint is very similar: It is a relationship that is enforced between two bodies so that they can only have certain positions and orientations relative to each other. This relationship is called a constraint -- the words joint and constraint are often used interchangeably.

    -A joint has a set of parameters that can be set. These include:

    -

      -
    • dParamLoStop Low stop angle or position. Setting this to -dInfinity (the default value) turns off the low stop. For rotational joints, this stop must be greater than -pi to be effective.
    • -
    • dParamHiStop High stop angle or position. Setting this to dInfinity (the default value) turns off the high stop. For rotational joints, this stop must be less than pi to be effective. If the high stop is less than the low stop then both stops will be ineffective.
    • -
    • dParamVel Desired motor velocity (this will be an angular or linear velocity).
    • -
    • dParamFMax The maximum force or torque that the motor will use to achieve the desired velocity. This must always be greater than or equal to zero. Setting this to zero (the default value) turns off the motor.
    • -
    • dParamFudgeFactor The current joint stop/motor implementation has a small problem: when the joint is at one stop and the motor is set to move it away from the stop, too much force may be applied for one time step, causing a ``jumping'' motion. This fudge factor is used to scale this excess force. It should have a value between zero and one (the default value). If the jumping motion is too visible in a joint, the value can be reduced. Making this value too small can prevent the motor from being able to move the joint away from a stop.
    • -
    • dParamBounce The bouncyness of the stops. This is a restitution parameter in the range 0..1. 0 means the stops are not bouncy at all, 1 means maximum bouncyness.
    • -
    • dParamCFM The constraint force mixing (CFM) value used when not at a stop.
    • -
    • dParamStopERP The error reduction parameter (ERP) used by the stops.
    • -
    • dParamStopCFM The constraint force mixing (CFM) value used by the stops. Together with the ERP value this can be used to get spongy or soft stops. Note that this is intended for unpowered joints, it does not really work as expected when a powered joint reaches its limit.
    • -
    • dParamSuspensionERP Suspension error reduction parameter (ERP). Currently this is only implemented on the hinge-2 joint.
    • -
    • dParamSuspensionCFM Suspension constraint force mixing (CFM) value. Currently this is only implemented on the hinge-2 joint.
    • -
    -If a particular parameter is not implemented by a given joint, setting it will have no effect. These parameter names can be optionally followed by a digit (2 or 3) to indicate the second or third set of parameters, e.g. for the second axis in a hinge-2 joint, or the third axis in an AMotor joint.

    Function Documentation

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API int dAreConnected (dBodyID ,
    dBodyID  
    )
    -
    -
    - -

    -Utility function. -

    -

    Returns:
    1 if the two bodies are connected together by a joint, otherwise return 0.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API int dAreConnectedExcluding (dBodyID  body1,
    dBodyID  body2,
    int  joint_type 
    )
    -
    -
    - -

    -Utility function. -

    -

    Returns:
    1 if the two bodies are connected together by a joint that does not have type
      -
    • {joint_type}, otherwise return 0.
    • -
    -
    -
    Parameters:
    - - - - -
    body1 A body to check.
    body2 A body to check.
    joint_type is a dJointTypeXXX constant. This is useful for deciding whether to add contact joints between two bodies: if they are already connected by non-contact joints then it may not be appropriate to add contacts, however it is okay to add more contact between- bodies that already have contacts.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAddAMotorTorques (dJointID ,
    dReal  torque1,
    dReal  torque2,
    dReal  torque3 
    )
    -
    -
    - -

    -Applies torque0 about the AMotor's axis 0, torque1 about the AMotor's axis 1, and torque2 about the AMotor's axis 2. -

    -

    Remarks:
    If the motor has fewer than three axes, the higher torques are ignored. This function is just a wrapper for dBodyAddTorque().
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAddHinge2Torques (dJointID  joint,
    dReal  torque1,
    dReal  torque2 
    )
    -
    -
    - -

    -Applies torque1 about the hinge2's axis 1, torque2 about the hinge2's axis 2. -

    -

    Remarks:
    This function is just a wrapper for dBodyAddTorque().
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAddHingeTorque (dJointID  joint,
    dReal  torque 
    )
    -
    -
    - -

    -Applies the torque about the hinge axis. -

    -That is, it applies a torque with specified magnitude in the direction of the hinge axis, to body 1, and with the same magnitude but in opposite direction to body 2. This function is just a wrapper for dBodyAddTorque()} -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAddPRTorque (dJointID  j,
    dReal  torque 
    )
    -
    -
    - -

    -Applies the torque about the rotoide axis of the PR joint. -

    -That is, it applies a torque with specified magnitude in the direction of the rotoide axis, to body 1, and with the same magnitude but in opposite direction to body 2. This function is just a wrapper for dBodyAddTorque()} -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAddSliderForce (dJointID  joint,
    dReal  force 
    )
    -
    -
    - -

    -Applies the given force in the slider's direction. -

    -That is, it applies a force with specified magnitude, in the direction of slider's axis, to body1, and with the same magnitude but opposite direction to body2. This function is just a wrapper for dBodyAddForce(). -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAddUniversalTorques (dJointID  joint,
    dReal  torque1,
    dReal  torque2 
    )
    -
    -
    - -

    -Applies torque1 about the universal's axis 1, torque2 about the universal's axis 2. -

    -

    Remarks:
    This function is just a wrapper for dBodyAddTorque().
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointAttach (dJointID ,
    dBodyID  body1,
    dBodyID  body2 
    )
    -
    -
    - -

    -Attach the joint to some new bodies. -

    -If the joint is already attached, it will be detached from the old bodies first. To attach this joint to only one body, set body1 or body2 to zero - a zero body refers to the static environment. Setting both bodies to zero puts the joint into "limbo", i.e. it will have no effect on the simulation.

    Remarks:
    Some joints, like hinge-2 need to be attached to two bodies to work.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateAMotor (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the A-motor type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateBall (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the ball type. -

    -

    Remarks:
    The joint is initially in "limbo" (i.e. it has no effect on the simulation) because it does not connect to any bodies.
    -
    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateContact (dWorldID ,
    dJointGroupID ,
    const dContact *  
    )
    -
    -
    - -

    -Create a new joint of the contact type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateFixed (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the fixed type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateHinge (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the hinge type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateHinge2 (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the hinge2 type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateLMotor (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the L-motor type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreatePlane2D (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the plane-2d type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreatePR (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the PR (Prismatic and Rotoide) type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateSlider (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the slider type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dJointID dJointCreateUniversal (dWorldID ,
    dJointGroupID  
    )
    -
    -
    - -

    -Create a new joint of the universal type. -

    -

    Parameters:
    - - -
    dJointGroupID set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dJointDestroy (dJointID   ) 
    -
    -
    - -

    -Destroy a joint. -

    -disconnects it from its attached bodies and removing it from the world. However, if the joint is a member of a group then this function has no effect - to destroy that joint the group must be emptied or destroyed. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dReal dJointGetAMotorAngle (dJointID ,
    int  anum 
    )
    -
    -
    - -

    -Get the current angle for axis. -

    -

    Remarks:
    In dAMotorUser mode this is simply the value that was set with dJointSetAMotorAngle(). In dAMotorEuler mode this is the corresponding euler angle.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dReal dJointGetAMotorAngleRate (dJointID ,
    int  anum 
    )
    -
    -
    - -

    -Get the current angle rate for axis anum. -

    -

    Remarks:
    In dAMotorUser mode this is always zero, as not enough information is available. In dAMotorEuler mode this is the corresponding euler angle rate.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetAMotorAxis (dJointID ,
    int  anum,
    dVector3  result 
    )
    -
    -
    - -

    -Get the AMotor axes. -

    -

    Parameters:
    - - - -
    anum selects the axis to change (0,1 or 2).
    rel Each axis can have one of three ``relative orientation'' modes.
      -
    • 0: The axis is anchored to the global frame.
    • -
    • 1: The axis is anchored to the first body.
    • -
    • 2: The axis is anchored to the second body.
    • -
    -
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API int dJointGetAMotorAxisRel (dJointID ,
    int  anum 
    )
    -
    -
    - -

    -Get axis. -

    -

    Remarks:
    The axis vector is always specified in global coordinates regardless of the setting of rel. There are two GetAMotorAxis functions, one to return the axis and one to return the relative mode.
    -For dAMotorEuler mode:
      -
    • Only axes 0 and 2 need to be set. Axis 1 will be determined automatically at each time step.
    • -
    • Axes 0 and 2 must be perpendicular to each other.
    • -
    • Axis 0 must be anchored to the first body, axis 2 must be anchored to the second body.
    • -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dJointGetAMotorMode (dJointID   ) 
    -
    -
    - -

    -Get the angular motor mode. -

    -

    Parameters:
    - - -
    mode must be one of the following constants:
      -
    • dAMotorUser The AMotor axes and joint angle settings are entirely controlled by the user. This is the default mode.
    • -
    • dAMotorEuler Euler angles are automatically computed. The axis a1 is also automatically computed. The AMotor axes must be set correctly when in this mode, as described below. When this mode is initially set the current relative orientations of the bodies will correspond to all euler angles at zero.
    • -
    -
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dJointGetAMotorNumAxes (dJointID   ) 
    -
    -
    - -

    -Get the number of angular axes that will be controlled by the AMotor. -

    -

    Parameters:
    - - -
    num can range from 0 (which effectively deactivates the joint) to 3. This is automatically set to 3 in dAMotorEuler mode.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API dBodyID dJointGetBody (dJointID ,
    int  index 
    )
    -
    -
    - -

    -Return the bodies that this joint connects. -

    -

    Parameters:
    - - -
    index return the first (0) or second (1) body.
    -
    -
    Remarks:
    If one of these returned body IDs is zero, the joint connects the other body to the static environment. If both body IDs are zero, the joint is in ``limbo'' and has no effect on the simulation.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetHinge2Anchor (dJointID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the joint anchor point, in world coordinates. -

    -

    Returns:
    the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetHingeAnchor (dJointID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the hinge anchor point, in world coordinates. -

    -This returns the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetHingeAnchor2 (dJointID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the joint anchor point, in world coordinates. -

    -

    Returns:
    The point on body 2. If the joint is perfectly satisfied, this will return the same value as dJointGetHingeAnchor(). If not, this value will be slightly different. This can be used, for example, to see how far the joint has come apart.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dJointGetHingeAngle (dJointID   ) 
    -
    -
    - -

    -Get the hinge angle. -

    -The angle is measured between the two bodies, or between the body and the static environment. The angle will be between -pi..pi. When the hinge anchor or axis is set, the current position of the attached bodies is examined and that position will be the zero angle. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetPRAnchor (dJointID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the joint anchor point, in world coordinates. -

    -

    Returns:
    the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2.
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dJointGetPRPosition (dJointID   ) 
    -
    -
    - -

    -Get the PR linear position (i.e. the prismatic's extension). -

    -When the axis is set, the current position of the attached bodies is examined and that position will be the zero position.

    -The position is the "oriented" length between the position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)] -

    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dJointGetSliderPosition (dJointID   ) 
    -
    -
    - -

    -Get the slider linear position (i.e. the slider's extension). -

    -When the axis is set, the current position of the attached bodies is examined and that position will be the zero position. -

    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dJointGetType (dJointID   ) 
    -
    -
    - -

    -Get the type of the joint. -

    -

    Returns:
    the type, being one of these:
      -
    • JointTypeBall
    • -
    • JointTypeHinge
    • -
    • JointTypeSlider
    • -
    • JointTypeContact
    • -
    • JointTypeUniversal
    • -
    • JointTypeHinge2
    • -
    • JointTypeFixed
    • -
    • JointTypeAMotor
    • -
    • JointTypeLMotor
    • -
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetUniversalAnchor (dJointID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the joint anchor point, in world coordinates. -

    -

    Returns:
    the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetUniversalAnchor2 (dJointID ,
    dVector3  result 
    )
    -
    -
    - -

    -Get the joint anchor point, in world coordinates. -

    -

    Returns:
    This returns the point on body 2.
    -
    Remarks:
    You can think of the ball and socket part of a universal joint as trying to keep the result of dJointGetBallAnchor() and dJointGetBallAnchor2() the same. If the joint is perfectly satisfied, this function will return the same value as dJointGetUniversalAnchor() to within roundoff errors. dJointGetUniversalAnchor2() can be used, along with dJointGetUniversalAnchor(), to see how far the joint has come apart.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointGetUniversalAngles (dJointID ,
    dReal *  angle1,
    dReal *  angle2 
    )
    -
    -
    - -

    -Get both angles at the same time. -

    -

    Parameters:
    - - - - -
    joint The universal joint for which we want to calculate the angles
    angle1 The angle between the body1 and the axis 1
    angle2 The angle between the body2 and the axis 2
    -
    -
    Note:
    This function combine getUniversalAngle1 and getUniversalAngle2 together and try to avoid redundant calculation
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dJointGroupID dJointGroupCreate (int  max_size  ) 
    -
    -
    - -

    -Create a joint group. -

    -

    Parameters:
    - - -
    max_size deprecated. Set to 0.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dJointGroupDestroy (dJointGroupID   ) 
    -
    -
    - -

    -Destroy a joint group. -

    -All joints in the joint group will be destroyed. -

    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dJointGroupEmpty (dJointGroupID   ) 
    -
    -
    - -

    -Empty a joint group. -

    -All joints in the joint group will be destroyed, but the joint group itself will not be destroyed. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetAMotorAngle (dJointID ,
    int  anum,
    dReal  angle 
    )
    -
    -
    - -

    -Tell the AMotor what the current angle is along axis anum. -

    -This function should only be called in dAMotorUser mode, because in this mode the AMotor has no other way of knowing the joint angles. The angle information is needed if stops have been set along the axis, but it is not needed for axis motors. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetAMotorNumAxes (dJointID ,
    int  num 
    )
    -
    -
    - -

    -set the nr of axes -

    -

    Parameters:
    - - -
    num 0..3
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetBallAnchor (dJointID ,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the joint anchor point. -

    -The joint will try to keep this point on each body together. The input is specified in world coordinates. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetFeedback (dJointID ,
    dJointFeedback *  
    )
    -
    -
    - -

    -Sets the datastructure that is to receive the feedback. -

    -The feedback can be used by the user, so that it is known how much force an individual joint exerts. -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetLMotorAxis (dJointID ,
    int  anum,
    int  rel,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the AMotor axes. -

    -

    Parameters:
    - - - -
    anum selects the axis to change (0,1 or 2).
    rel Each axis can have one of three ``relative orientation'' modes
      -
    • 0: The axis is anchored to the global frame.
    • -
    • 1: The axis is anchored to the first body.
    • -
    • 2: The axis is anchored to the second body.
    • -
    -
    -
    -
    Remarks:
    The axis vector is always specified in global coordinates regardless of the setting of rel.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetLMotorNumAxes (dJointID ,
    int  num 
    )
    -
    -
    - -

    -Set the number of axes that will be controlled by the LMotor. -

    -

    Parameters:
    - - -
    num can range from 0 (which effectively deactivates the joint) to 3.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dJointSetPRParam (dJointID ,
    int  parameter,
    dReal  value 
    )
    -
    -
    - -

    -set joint parameter -

    -

    Note:
    parameterX where X equal 2 refer to parameter for the rotoide articulation
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/group__world.html b/libraries/ode-0.9/docs/group__world.html deleted file mode 100644 index 9b48f47015..0000000000 --- a/libraries/ode-0.9/docs/group__world.html +++ /dev/null @@ -1,697 +0,0 @@ - - -Open Dynamics Engine: World - - - - - -

    World

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Functions

    ODE_API dWorldID dWorldCreate (void)
     Create a new, empty world and return its ID number.
    ODE_API void dWorldDestroy (dWorldID world)
     Destroy a world and everything in it.
    ODE_API void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z)
     Set the world's global gravity vector.
    -ODE_API void dWorldGetGravity (dWorldID, dVector3 gravity)
     Get the gravity vector for a given world.
    ODE_API void dWorldSetERP (dWorldID, dReal erp)
     Set the global ERP value, that controls how much error correction is performed in each time step.
    ODE_API dReal dWorldGetERP (dWorldID)
     Get the error reduction parameter.
    ODE_API void dWorldSetCFM (dWorldID, dReal cfm)
     Set the global CFM (constraint force mixing) value.
    ODE_API dReal dWorldGetCFM (dWorldID)
     Get the constraint force mixing value.
    ODE_API void dWorldStep (dWorldID, dReal stepsize)
     Step the world.
    ODE_API void dWorldImpulseToForce (dWorldID, dReal stepsize, dReal ix, dReal iy, dReal iz, dVector3 force)
     Converts an impulse to a force.
    ODE_API void dWorldQuickStep (dWorldID w, dReal stepsize)
     Step the world.
    ODE_API void dWorldSetQuickStepNumIterations (dWorldID, int num)
     Set the number of iterations that the QuickStep method performs per step.
    ODE_API int dWorldGetQuickStepNumIterations (dWorldID)
     Get the number of iterations that the QuickStep method performs per step.
    ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation)
     Set the SOR over-relaxation parameter.
    ODE_API dReal dWorldGetQuickStepW (dWorldID)
     Get the SOR over-relaxation parameter.
    ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel)
     Set the maximum correcting velocity that contacts are allowed to generate.
    -ODE_API dReal dWorldGetContactMaxCorrectingVel (dWorldID)
     Get the maximum correcting velocity that contacts are allowed to generated.
    ODE_API void dWorldSetContactSurfaceLayer (dWorldID, dReal depth)
     Set the depth of the surface layer around all geometry objects.
    ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID)
     Get the depth of the surface layer around all geometry objects.
    ODE_API void dWorldStepFast1 (dWorldID, dReal stepsize, int maxiterations)
     Step the world using the StepFast1 algorithm.
    -

    Detailed Description

    -The world object is a container for rigid bodies and joints. Objects in different worlds can not interact, for example rigid bodies from two different worlds can not collide.

    -All the objects in a world exist at the same point in time, thus one reason to use separate worlds is to simulate systems at different rates. Most applications will only need one world.


    Function Documentation

    - -
    -
    - - - - - - - - - -
    ODE_API dWorldID dWorldCreate (void   ) 
    -
    -
    - -

    -Create a new, empty world and return its ID number. -

    -

    Returns:
    an identifier
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API void dWorldDestroy (dWorldID  world  ) 
    -
    -
    - -

    -Destroy a world and everything in it. -

    -This includes all bodies, and all joints that are not part of a joint group. Joints that are part of a joint group will be deactivated, and can be destroyed by calling, for example, dJointGroupEmpty().

    -

    Parameters:
    - - -
    world the identifier for the world the be destroyed.
    -
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetCFM (dWorldID   ) 
    -
    -
    - -

    -Get the constraint force mixing value. -

    -

    Returns:
    CFM value
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID   ) 
    -
    -
    - -

    -Get the depth of the surface layer around all geometry objects. -

    -

    Returns:
    the depth
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetERP (dWorldID   ) 
    -
    -
    - -

    -Get the error reduction parameter. -

    -

    Returns:
    ERP value
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API int dWorldGetQuickStepNumIterations (dWorldID   ) 
    -
    -
    - -

    -Get the number of iterations that the QuickStep method performs per step. -

    -

    Returns:
    nr of iterations
    - -
    -

    - -

    -
    - - - - - - - - - -
    ODE_API dReal dWorldGetQuickStepW (dWorldID   ) 
    -
    -
    - -

    -Get the SOR over-relaxation parameter. -

    -

    Returns:
    the over-relaxation setting
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldImpulseToForce (dWorldID ,
    dReal  stepsize,
    dReal  ix,
    dReal  iy,
    dReal  iz,
    dVector3  force 
    )
    -
    -
    - -

    -Converts an impulse to a force. -

    -

    Remarks:
    If you want to apply a linear or angular impulse to a rigid body, instead of a force or a torque, then you can use this function to convert the desired impulse into a force/torque vector before calling the BodyAdd... function. The current algorithm simply scales the impulse by 1/stepsize, where stepsize is the step size for the next step that will be taken. This function is given a dWorldID because, in the future, the force computation may depend on integrator parameters that are set as properties of the world.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldQuickStep (dWorldID  w,
    dReal  stepsize 
    )
    -
    -
    - -

    -Step the world. -

    -

    Remarks:
    This uses an iterative method that takes time on the order of m*N and memory on the order of m, where m is the total number of constraint rows N is the number of iterations. For large systems this is a lot faster than dWorldStep(), but it is less accurate.

    -QuickStep is great for stacks of objects especially when the auto-disable feature is used as well. However, it has poor accuracy for near-singular systems. Near-singular systems can occur when using high-friction contacts, motors, or certain articulated structures. For example, a robot with multiple legs sitting on the ground may be near-singular.

    -There are ways to help overcome QuickStep's inaccuracy problems:

      -
    • Increase CFM.
    • -
    • Reduce the number of contacts in your system (e.g. use the minimum number of contacts for the feet of a robot or creature).
    • -
    • Don't use excessive friction in the contacts.
    • -
    • Use contact slip if appropriate
    • -
    • Avoid kinematic loops (however, kinematic loops are inevitable in legged creatures).
    • -
    • Don't use excessive motor strength. force-based motors instead of velocity-based motors.
    • -
    -Increasing the number of QuickStep iterations may help a little bit, but it is not going to help much if your system is really near singular.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetCFM (dWorldID ,
    dReal  cfm 
    )
    -
    -
    - -

    -Set the global CFM (constraint force mixing) value. -

    -

    Parameters:
    - - -
    cfm Typical values are in the range {10^{-9}} -- 1. The default is 10^-5 if single precision is being used, or 10^-10 if double precision is being used.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID ,
    dReal  vel 
    )
    -
    -
    - -

    -Set the maximum correcting velocity that contacts are allowed to generate. -

    -

    Parameters:
    - - -
    vel The default value is infinity (i.e. no limit).
    -
    -
    Remarks:
    Reducing this value can help prevent "popping" of deeply embedded objects.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetContactSurfaceLayer (dWorldID ,
    dReal  depth 
    )
    -
    -
    - -

    -Set the depth of the surface layer around all geometry objects. -

    -

    Remarks:
    Contacts are allowed to sink into the surface layer up to the given depth before coming to rest.
    -
    Parameters:
    - - -
    depth The default value is zero.
    -
    -
    Remarks:
    Increasing this to some small value (e.g. 0.001) can help prevent jittering problems due to contacts being repeatedly made and broken.
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetERP (dWorldID ,
    dReal  erp 
    )
    -
    -
    - -

    -Set the global ERP value, that controls how much error correction is performed in each time step. -

    -

    Parameters:
    - - - -
    dWorldID the identifier of the world.
    erp Typical values are in the range 0.1--0.8. The default is 0.2.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetGravity (dWorldID ,
    dReal  x,
    dReal  y,
    dReal  z 
    )
    -
    -
    - -

    -Set the world's global gravity vector. -

    -The units are m/s^2, so Earth's gravity vector would be (0,0,-9.81), assuming that +z is up. The default is no gravity, i.e. (0,0,0). -

    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetQuickStepNumIterations (dWorldID ,
    int  num 
    )
    -
    -
    - -

    -Set the number of iterations that the QuickStep method performs per step. -

    -

    Remarks:
    More iterations will give a more accurate solution, but will take longer to compute.
    -
    Parameters:
    - - -
    num The default is 20 iterations.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldSetQuickStepW (dWorldID ,
    dReal  over_relaxation 
    )
    -
    -
    - -

    -Set the SOR over-relaxation parameter. -

    -

    Parameters:
    - - -
    over_relaxation value to use by SOR
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldStep (dWorldID ,
    dReal  stepsize 
    )
    -
    -
    - -

    -Step the world. -

    -This uses a "big matrix" method that takes time on the order of m^3 and memory on the order of m^2, where m is the total number of constraint rows. For large systems this will use a lot of memory and can be very slow, but this is currently the most accurate method.

    -

    Parameters:
    - - -
    stepsize The number of seconds that the simulation has to advance.
    -
    - -
    -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ODE_API void dWorldStepFast1 (dWorldID ,
    dReal  stepsize,
    int  maxiterations 
    )
    -
    -
    - -

    -Step the world using the StepFast1 algorithm. -

    -

    Parameters:
    - - - -
    stepsize the nr of seconds to advance the simulation.
    maxiterations The number of iterations to perform.
    -
    - -
    -

    -


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/index.html b/libraries/ode-0.9/docs/index.html deleted file mode 100644 index a2112e753c..0000000000 --- a/libraries/ode-0.9/docs/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - -Open Dynamics Engine: Open Dynamics Engine API Reference - - - - - -

    Open Dynamics Engine API Reference

    -

    -

    This document is © Russell Smith and the ODE Project

    -The Open Dynamics Engine (ODE) is a free, industrial quality library for simulating articulated rigid body dynamics. ODE is being developed by Russell Smith with help from several contributors.

    -This document describes the library API. For a more general introduction to ODE, please see the Online Handbook.

    -

    Important: this document is not yet complete!

    -

    -We are still working on getting the full API documentated. In the meantime, please refer to the Online Handbook


    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/mass_8h-source.html b/libraries/ode-0.9/docs/mass_8h-source.html deleted file mode 100644 index 145605bd68..0000000000 --- a/libraries/ode-0.9/docs/mass_8h-source.html +++ /dev/null @@ -1,137 +0,0 @@ - - -Open Dynamics Engine: mass.h Source File - - - - - -

    mass.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_MASS_H_
    -00024 #define _ODE_MASS_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 
    -00028 #ifdef __cplusplus
    -00029 extern "C" {
    -00030 #endif
    -00031 
    -00032 struct dMass;
    -00033 typedef struct dMass dMass;
    -00034 
    -00043 ODE_API int dMassCheck(const dMass *m);
    -00044 
    -00045 ODE_API void dMassSetZero (dMass *);
    -00046 
    -00047 ODE_API void dMassSetParameters (dMass *, dReal themass,
    -00048           dReal cgx, dReal cgy, dReal cgz,
    -00049           dReal I11, dReal I22, dReal I33,
    -00050           dReal I12, dReal I13, dReal I23);
    -00051 
    -00052 ODE_API void dMassSetSphere (dMass *, dReal density, dReal radius);
    -00053 ODE_API void dMassSetSphereTotal (dMass *, dReal total_mass, dReal radius);
    -00054 
    -00055 ODE_API void dMassSetCapsule (dMass *, dReal density, int direction,
    -00056          dReal radius, dReal length);
    -00057 ODE_API void dMassSetCapsuleTotal (dMass *, dReal total_mass, int direction,
    -00058          dReal radius, dReal length);
    -00059 
    -00060 ODE_API void dMassSetCylinder (dMass *, dReal density, int direction,
    -00061              dReal radius, dReal length);
    -00062 ODE_API void dMassSetCylinderTotal (dMass *, dReal total_mass, int direction,
    -00063              dReal radius, dReal length);
    -00064 
    -00065 ODE_API void dMassSetBox (dMass *, dReal density,
    -00066         dReal lx, dReal ly, dReal lz);
    -00067 ODE_API void dMassSetBoxTotal (dMass *, dReal total_mass,
    -00068              dReal lx, dReal ly, dReal lz);
    -00069 
    -00070 ODE_API void dMassSetTrimesh (dMass *, dReal density, dGeomID g);
    -00071 
    -00072 ODE_API void dMassSetTrimeshTotal (dMass *m, dReal total_mass, dGeomID g);
    -00073 
    -00074 ODE_API void dMassAdjust (dMass *, dReal newmass);
    -00075 
    -00076 ODE_API void dMassTranslate (dMass *, dReal x, dReal y, dReal z);
    -00077 
    -00078 ODE_API void dMassRotate (dMass *, const dMatrix3 R);
    -00079 
    -00080 ODE_API void dMassAdd (dMass *a, const dMass *b);
    -00081 
    -00082 // Backwards compatible API
    -00083 #define dMassSetCappedCylinder dMassSetCapsule
    -00084 #define dMassSetCappedCylinderTotal dMassSetCapsuleTotal
    -00085 
    -00086 
    -00087 struct dMass {
    -00088   dReal mass;
    -00089   dVector4 c;
    -00090   dMatrix3 I;
    -00091 
    -00092 #ifdef __cplusplus
    -00093   dMass()
    -00094     { dMassSetZero (this); }
    -00095   void setZero()
    -00096     { dMassSetZero (this); }
    -00097   void setParameters (dReal themass, dReal cgx, dReal cgy, dReal cgz,
    -00098             dReal I11, dReal I22, dReal I33,
    -00099             dReal I12, dReal I13, dReal I23)
    -00100     { dMassSetParameters (this,themass,cgx,cgy,cgz,I11,I22,I33,I12,I13,I23); }
    -00101   void setSphere (dReal density, dReal radius)
    -00102     { dMassSetSphere (this,density,radius); }
    -00103   void setCapsule (dReal density, int direction, dReal a, dReal b)
    -00104     { dMassSetCappedCylinder (this,density,direction,a,b); }
    -00105   void setCappedCylinder (dReal density, int direction, dReal a, dReal b)
    -00106     { setCapsule(density, direction, a, b); }
    -00107   void setBox (dReal density, dReal lx, dReal ly, dReal lz)
    -00108     { dMassSetBox (this,density,lx,ly,lz); }
    -00109   void adjust (dReal newmass)
    -00110     { dMassAdjust (this,newmass); }
    -00111   void translate (dReal x, dReal y, dReal z)
    -00112     { dMassTranslate (this,x,y,z); }
    -00113   void rotate (const dMatrix3 R)
    -00114     { dMassRotate (this,R); }
    -00115   void add (const dMass *b)
    -00116     { dMassAdd (this,b); }
    -00117 #endif
    -00118 };
    -00119 
    -00120 
    -00121 #ifdef __cplusplus
    -00122 }
    -00123 #endif
    -00124 
    -00125 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/matrix_8h-source.html b/libraries/ode-0.9/docs/matrix_8h-source.html deleted file mode 100644 index 8f34e5e6d7..0000000000 --- a/libraries/ode-0.9/docs/matrix_8h-source.html +++ /dev/null @@ -1,214 +0,0 @@ - - -Open Dynamics Engine: matrix.h Source File - - - - - -

    matrix.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 /* optimized and unoptimized vector and matrix functions */
    -00024 
    -00025 #ifndef _ODE_MATRIX_H_
    -00026 #define _ODE_MATRIX_H_
    -00027 
    -00028 #include <ode/common.h>
    -00029 
    -00030 
    -00031 #ifdef __cplusplus
    -00032 extern "C" {
    -00033 #endif
    -00034 
    -00035 
    -00036 /* set a vector/matrix of size n to all zeros, or to a specific value. */
    -00037 
    -00038 ODE_API void dSetZero (dReal *a, int n);
    -00039 ODE_API void dSetValue (dReal *a, int n, dReal value);
    -00040 
    -00041 
    -00042 /* get the dot product of two n*1 vectors. if n <= 0 then
    -00043  * zero will be returned (in which case a and b need not be valid).
    -00044  */
    -00045 
    -00046 ODE_API dReal dDot (const dReal *a, const dReal *b, int n);
    -00047 
    -00048 
    -00049 /* get the dot products of (a0,b), (a1,b), etc and return them in outsum.
    -00050  * all vectors are n*1. if n <= 0 then zeroes will be returned (in which case
    -00051  * the input vectors need not be valid). this function is somewhat faster
    -00052  * than calling dDot() for all of the combinations separately.
    -00053  */
    -00054 
    -00055 /* NOT INCLUDED in the library for now.
    -00056 void dMultidot2 (const dReal *a0, const dReal *a1,
    -00057        const dReal *b, dReal *outsum, int n);
    -00058 */
    -00059 
    -00060 
    -00061 /* matrix multiplication. all matrices are stored in standard row format.
    -00062  * the digit refers to the argument that is transposed:
    -00063  *   0:   A = B  * C   (sizes: A:p*r B:p*q C:q*r)
    -00064  *   1:   A = B' * C   (sizes: A:p*r B:q*p C:q*r)
    -00065  *   2:   A = B  * C'  (sizes: A:p*r B:p*q C:r*q)
    -00066  * case 1,2 are equivalent to saying that the operation is A=B*C but
    -00067  * B or C are stored in standard column format.
    -00068  */
    -00069 
    -00070 ODE_API void dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r);
    -00071 ODE_API void dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r);
    -00072 ODE_API void dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r);
    -00073 
    -00074 
    -00075 /* do an in-place cholesky decomposition on the lower triangle of the n*n
    -00076  * symmetric matrix A (which is stored by rows). the resulting lower triangle
    -00077  * will be such that L*L'=A. return 1 on success and 0 on failure (on failure
    -00078  * the matrix is not positive definite).
    -00079  */
    -00080 
    -00081 ODE_API int dFactorCholesky (dReal *A, int n);
    -00082 
    -00083 
    -00084 /* solve for x: L*L'*x = b, and put the result back into x.
    -00085  * L is size n*n, b is size n*1. only the lower triangle of L is considered.
    -00086  */
    -00087 
    -00088 ODE_API void dSolveCholesky (const dReal *L, dReal *b, int n);
    -00089 
    -00090 
    -00091 /* compute the inverse of the n*n positive definite matrix A and put it in
    -00092  * Ainv. this is not especially fast. this returns 1 on success (A was
    -00093  * positive definite) or 0 on failure (not PD).
    -00094  */
    -00095 
    -00096 ODE_API int dInvertPDMatrix (const dReal *A, dReal *Ainv, int n);
    -00097 
    -00098 
    -00099 /* check whether an n*n matrix A is positive definite, return 1/0 (yes/no).
    -00100  * positive definite means that x'*A*x > 0 for any x. this performs a
    -00101  * cholesky decomposition of A. if the decomposition fails then the matrix
    -00102  * is not positive definite. A is stored by rows. A is not altered.
    -00103  */
    -00104 
    -00105 ODE_API int dIsPositiveDefinite (const dReal *A, int n);
    -00106 
    -00107 
    -00108 /* factorize a matrix A into L*D*L', where L is lower triangular with ones on
    -00109  * the diagonal, and D is diagonal.
    -00110  * A is an n*n matrix stored by rows, with a leading dimension of n rounded
    -00111  * up to 4. L is written into the strict lower triangle of A (the ones are not
    -00112  * written) and the reciprocal of the diagonal elements of D are written into
    -00113  * d.
    -00114  */
    -00115 ODE_API void dFactorLDLT (dReal *A, dReal *d, int n, int nskip);
    -00116 
    -00117 
    -00118 /* solve L*x=b, where L is n*n lower triangular with ones on the diagonal,
    -00119  * and x,b are n*1. b is overwritten with x.
    -00120  * the leading dimension of L is `nskip'.
    -00121  */
    -00122 ODE_API void dSolveL1 (const dReal *L, dReal *b, int n, int nskip);
    -00123 
    -00124 
    -00125 /* solve L'*x=b, where L is n*n lower triangular with ones on the diagonal,
    -00126  * and x,b are n*1. b is overwritten with x.
    -00127  * the leading dimension of L is `nskip'.
    -00128  */
    -00129 ODE_API void dSolveL1T (const dReal *L, dReal *b, int n, int nskip);
    -00130 
    -00131 
    -00132 /* in matlab syntax: a(1:n) = a(1:n) .* d(1:n) */
    -00133 
    -00134 ODE_API void dVectorScale (dReal *a, const dReal *d, int n);
    -00135 
    -00136 
    -00137 /* given `L', a n*n lower triangular matrix with ones on the diagonal,
    -00138  * and `d', a n*1 vector of the reciprocal diagonal elements of an n*n matrix
    -00139  * D, solve L*D*L'*x=b where x,b are n*1. x overwrites b.
    -00140  * the leading dimension of L is `nskip'.
    -00141  */
    -00142 
    -00143 ODE_API void dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip);
    -00144 
    -00145 
    -00146 /* given an L*D*L' factorization of an n*n matrix A, return the updated
    -00147  * factorization L2*D2*L2' of A plus the following "top left" matrix:
    -00148  *
    -00149  *    [ b a' ]     <-- b is a[0]
    -00150  *    [ a 0  ]     <-- a is a[1..n-1]
    -00151  *
    -00152  *   - L has size n*n, its leading dimension is nskip. L is lower triangular
    -00153  *     with ones on the diagonal. only the lower triangle of L is referenced.
    -00154  *   - d has size n. d contains the reciprocal diagonal elements of D.
    -00155  *   - a has size n.
    -00156  * the result is written into L, except that the left column of L and d[0]
    -00157  * are not actually modified. see ldltaddTL.m for further comments. 
    -00158  */
    -00159 ODE_API void dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip);
    -00160 
    -00161 
    -00162 /* given an L*D*L' factorization of a permuted matrix A, produce a new
    -00163  * factorization for row and column `r' removed.
    -00164  *   - A has size n1*n1, its leading dimension in nskip. A is symmetric and
    -00165  *     positive definite. only the lower triangle of A is referenced.
    -00166  *     A itself may actually be an array of row pointers.
    -00167  *   - L has size n2*n2, its leading dimension in nskip. L is lower triangular
    -00168  *     with ones on the diagonal. only the lower triangle of L is referenced.
    -00169  *   - d has size n2. d contains the reciprocal diagonal elements of D.
    -00170  *   - p is a permutation vector. it contains n2 indexes into A. each index
    -00171  *     must be in the range 0..n1-1.
    -00172  *   - r is the row/column of L to remove.
    -00173  * the new L will be written within the old L, i.e. will have the same leading
    -00174  * dimension. the last row and column of L, and the last element of d, are
    -00175  * undefined on exit.
    -00176  *
    -00177  * a fast O(n^2) algorithm is used. see ldltremove.m for further comments.
    -00178  */
    -00179 ODE_API void dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d,
    -00180         int n1, int n2, int r, int nskip);
    -00181 
    -00182 
    -00183 /* given an n*n matrix A (with leading dimension nskip), remove the r'th row
    -00184  * and column by moving elements. the new matrix will have the same leading
    -00185  * dimension. the last row and column of A are untouched on exit.
    -00186  */
    -00187 ODE_API void dRemoveRowCol (dReal *A, int n, int nskip, int r);
    -00188 
    -00189 
    -00190 #ifdef __cplusplus
    -00191 }
    -00192 #endif
    -00193 
    -00194 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/memory_8h-source.html b/libraries/ode-0.9/docs/memory_8h-source.html deleted file mode 100644 index 001fd88ea5..0000000000 --- a/libraries/ode-0.9/docs/memory_8h-source.html +++ /dev/null @@ -1,79 +0,0 @@ - - -Open Dynamics Engine: memory.h Source File - - - - - -

    memory.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 /* this comes from the `reuse' library. copy any changes back to the source */
    -00024 
    -00025 #ifndef _ODE_MEMORY_H_
    -00026 #define _ODE_MEMORY_H_
    -00027 
    -00028 #include "ode/config.h"
    -00029 
    -00030 #ifdef __cplusplus
    -00031 extern "C" {
    -00032 #endif
    -00033 
    -00034 /* function types to allocate and free memory */
    -00035 typedef void * dAllocFunction (size_t size);
    -00036 typedef void * dReallocFunction (void *ptr, size_t oldsize, size_t newsize);
    -00037 typedef void dFreeFunction (void *ptr, size_t size);
    -00038 
    -00039 /* set new memory management functions. if fn is 0, the default handlers are
    -00040  * used. */
    -00041 ODE_API void dSetAllocHandler (dAllocFunction *fn);
    -00042 ODE_API void dSetReallocHandler (dReallocFunction *fn);
    -00043 ODE_API void dSetFreeHandler (dFreeFunction *fn);
    -00044 
    -00045 /* get current memory management functions */
    -00046 ODE_API dAllocFunction *dGetAllocHandler (void);
    -00047 ODE_API dReallocFunction *dGetReallocHandler (void);
    -00048 ODE_API dFreeFunction *dGetFreeHandler (void);
    -00049 
    -00050 /* allocate and free memory. */
    -00051 ODE_API void * dAlloc (size_t size);
    -00052 ODE_API void * dRealloc (void *ptr, size_t oldsize, size_t newsize);
    -00053 ODE_API void dFree (void *ptr, size_t size);
    -00054 
    -00055 #ifdef __cplusplus
    -00056 }
    -00057 #endif
    -00058 
    -00059 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/misc_8h-source.html b/libraries/ode-0.9/docs/misc_8h-source.html deleted file mode 100644 index 72bbc1043b..0000000000 --- a/libraries/ode-0.9/docs/misc_8h-source.html +++ /dev/null @@ -1,105 +0,0 @@ - - -Open Dynamics Engine: misc.h Source File - - - - - -

    misc.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 /* miscellaneous math functions. these are mostly useful for testing */
    -00024 
    -00025 #ifndef _ODE_MISC_H_
    -00026 #define _ODE_MISC_H_
    -00027 
    -00028 #include <ode/common.h>
    -00029 
    -00030 
    -00031 #ifdef __cplusplus
    -00032 extern "C" {
    -00033 #endif
    -00034 
    -00035 
    -00036 /* return 1 if the random number generator is working. */
    -00037 ODE_API int dTestRand(void);
    -00038 
    -00039 /* return next 32 bit random number. this uses a not-very-random linear
    -00040  * congruential method.
    -00041  */
    -00042 ODE_API unsigned long dRand(void);
    -00043 
    -00044 /* get and set the current random number seed. */
    -00045 ODE_API unsigned long  dRandGetSeed(void);
    -00046 ODE_API void dRandSetSeed (unsigned long s);
    -00047 
    -00048 /* return a random integer between 0..n-1. the distribution will get worse
    -00049  * as n approaches 2^32.
    -00050  */
    -00051 ODE_API int dRandInt (int n);
    -00052 
    -00053 /* return a random real number between 0..1 */
    -00054 ODE_API dReal dRandReal(void);
    -00055 
    -00056 /* print out a matrix */
    -00057 #ifdef __cplusplus
    -00058 ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt = "%10.4f ",
    -00059          FILE *f=stdout);
    -00060 #else
    -00061 ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt, FILE *f);
    -00062 #endif
    -00063 
    -00064 /* make a random vector with entries between +/- range. A has n elements. */
    -00065 ODE_API void dMakeRandomVector (dReal *A, int n, dReal range);
    -00066 
    -00067 /* make a random matrix with entries between +/- range. A has size n*m. */
    -00068 ODE_API void dMakeRandomMatrix (dReal *A, int n, int m, dReal range);
    -00069 
    -00070 /* clear the upper triangle of a square matrix */
    -00071 ODE_API void dClearUpperTriangle (dReal *A, int n);
    -00072 
    -00073 /* return the maximum element difference between the two n*m matrices */
    -00074 ODE_API dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m);
    -00075 
    -00076 /* return the maximum element difference between the lower triangle of two
    -00077  * n*n matrices */
    -00078 ODE_API dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n);
    -00079 
    -00080 
    -00081 #ifdef __cplusplus
    -00082 }
    -00083 #endif
    -00084 
    -00085 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/modules.html b/libraries/ode-0.9/docs/modules.html deleted file mode 100644 index 60c4d80f81..0000000000 --- a/libraries/ode-0.9/docs/modules.html +++ /dev/null @@ -1,32 +0,0 @@ - - -Open Dynamics Engine: Module Index - - - - - -

    Open Dynamics Engine Modules

    Here is a list of all modules: -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/objects_8h-source.html b/libraries/ode-0.9/docs/objects_8h-source.html deleted file mode 100644 index 33871dfd2c..0000000000 --- a/libraries/ode-0.9/docs/objects_8h-source.html +++ /dev/null @@ -1,563 +0,0 @@ - - -Open Dynamics Engine: objects.h Source File - - - - - -

    objects.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_OBJECTS_H_
    -00024 #define _ODE_OBJECTS_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 #include <ode/mass.h>
    -00028 #include <ode/contact.h>
    -00029 
    -00030 #ifdef __cplusplus
    -00031 extern "C" {
    -00032 #endif
    -00033 
    -00052 ODE_API dWorldID dWorldCreate(void);
    -00053 
    -00054 
    -00064 ODE_API void dWorldDestroy (dWorldID world);
    -00065 
    -00066 
    -00075 ODE_API void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z);
    -00076 
    -00077 
    -00082 ODE_API void dWorldGetGravity (dWorldID, dVector3 gravity);
    -00083 
    -00084 
    -00092 ODE_API void dWorldSetERP (dWorldID, dReal erp);
    -00093 
    -00099 ODE_API dReal dWorldGetERP (dWorldID);
    -00100 
    -00101 
    -00109 ODE_API void dWorldSetCFM (dWorldID, dReal cfm);
    -00110 
    -00116 ODE_API dReal dWorldGetCFM (dWorldID);
    -00117 
    -00118 
    -00129 ODE_API void dWorldStep (dWorldID, dReal stepsize);
    -00130 
    -00131 
    -00146 ODE_API void dWorldImpulseToForce
    -00147 (
    -00148   dWorldID, dReal stepsize,
    -00149   dReal ix, dReal iy, dReal iz, dVector3 force
    -00150 );
    -00151 
    -00152 
    -00184 ODE_API void dWorldQuickStep (dWorldID w, dReal stepsize);
    -00185 
    -00186 
    -00196 ODE_API void dWorldSetQuickStepNumIterations (dWorldID, int num);
    -00197 
    -00198 
    -00205 ODE_API int dWorldGetQuickStepNumIterations (dWorldID);
    -00206 
    -00212 ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation);
    -00213 
    -00219 ODE_API dReal dWorldGetQuickStepW (dWorldID);
    -00220 
    -00221 /* World contact parameter functions */
    -00222 
    -00231 ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel);
    -00232 
    -00238 ODE_API dReal dWorldGetContactMaxCorrectingVel (dWorldID);
    -00239 
    -00251 ODE_API void dWorldSetContactSurfaceLayer (dWorldID, dReal depth);
    -00252 
    -00258 ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID);
    -00259 
    -00260 /* StepFast1 functions */
    -00261 
    -00268 ODE_API void dWorldStepFast1(dWorldID, dReal stepsize, int maxiterations);
    -00269 
    -00270 
    -00306 ODE_API void dWorldSetAutoEnableDepthSF1(dWorldID, int autoEnableDepth);
    -00307 
    -00312 ODE_API int dWorldGetAutoEnableDepthSF1(dWorldID);
    -00313 
    -00319 ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID);
    -00320 
    -00326 ODE_API void  dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold);
    -00327 
    -00333 ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID);
    -00334 
    -00340 ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold);
    -00341 
    -00347 ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID);
    -00348 
    -00354 ODE_API void  dWorldSetAutoDisableLinearAverageThreshold (dWorldID, dReal linear_average_threshold);
    -00355 
    -00361 ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID);
    -00362 
    -00368 ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID, dReal angular_average_threshold);
    -00369 
    -00375 ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID);
    -00376 
    -00383 ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID, unsigned int average_samples_count );
    -00384 
    -00390 ODE_API int dWorldGetAutoDisableSteps (dWorldID);
    -00391 
    -00397 ODE_API void dWorldSetAutoDisableSteps (dWorldID, int steps);
    -00398 
    -00404 ODE_API dReal dWorldGetAutoDisableTime (dWorldID);
    -00405 
    -00411 ODE_API void dWorldSetAutoDisableTime (dWorldID, dReal time);
    -00412 
    -00418 ODE_API int dWorldGetAutoDisableFlag (dWorldID);
    -00419 
    -00425 ODE_API void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable);
    -00426 
    -00427 
    -00428 
    -00468 ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID);
    -00469 
    -00475 ODE_API void  dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_average_threshold);
    -00476 
    -00482 ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID);
    -00483 
    -00489 ODE_API void  dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_average_threshold);
    -00490 
    -00496 ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID);
    -00497 
    -00503 ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID, unsigned int average_samples_count);
    -00504 
    -00505 
    -00511 ODE_API int dBodyGetAutoDisableSteps (dBodyID);
    -00512 
    -00518 ODE_API void dBodySetAutoDisableSteps (dBodyID, int steps);
    -00519 
    -00525 ODE_API dReal dBodyGetAutoDisableTime (dBodyID);
    -00526 
    -00532 ODE_API void  dBodySetAutoDisableTime (dBodyID, dReal time);
    -00533 
    -00539 ODE_API int dBodyGetAutoDisableFlag (dBodyID);
    -00540 
    -00546 ODE_API void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable);
    -00547 
    -00554 ODE_API void  dBodySetAutoDisableDefaults (dBodyID);
    -00555 
    -00556 
    -00563 ODE_API dWorldID dBodyGetWorld (dBodyID);
    -00564 
    -00571 ODE_API dBodyID dBodyCreate (dWorldID);
    -00572 
    -00581 ODE_API void dBodyDestroy (dBodyID);
    -00582 
    -00588 ODE_API void  dBodySetData (dBodyID, void *data);
    -00589 
    -00595 ODE_API void *dBodyGetData (dBodyID);
    -00596 
    -00605 ODE_API void dBodySetPosition   (dBodyID, dReal x, dReal y, dReal z);
    -00606 
    -00615 ODE_API void dBodySetRotation   (dBodyID, const dMatrix3 R);
    -00616 
    -00625 ODE_API void dBodySetQuaternion (dBodyID, const dQuaternion q);
    -00626 
    -00631 ODE_API void dBodySetLinearVel  (dBodyID, dReal x, dReal y, dReal z);
    -00632 
    -00637 ODE_API void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z);
    -00638 
    -00648 ODE_API const dReal * dBodyGetPosition   (dBodyID);
    -00649 
    -00650 
    -00658 ODE_API void dBodyCopyPosition (dBodyID body, dVector3 pos);
    -00659 
    -00660 
    -00666 ODE_API const dReal * dBodyGetRotation   (dBodyID);
    -00667 
    -00668 
    -00676 ODE_API void dBodyCopyRotation (dBodyID, dMatrix3 R);
    -00677 
    -00678 
    -00684 ODE_API const dReal * dBodyGetQuaternion (dBodyID);
    -00685 
    -00686 
    -00694 ODE_API void dBodyCopyQuaternion(dBodyID body, dQuaternion quat);
    -00695 
    -00696 
    -00701 ODE_API const dReal * dBodyGetLinearVel  (dBodyID);
    -00702 
    -00707 ODE_API const dReal * dBodyGetAngularVel (dBodyID);
    -00708 
    -00713 ODE_API void dBodySetMass (dBodyID, const dMass *mass);
    -00714 
    -00719 ODE_API void dBodyGetMass (dBodyID, dMass *mass);
    -00720 
    -00725 ODE_API void dBodyAddForce            (dBodyID, dReal fx, dReal fy, dReal fz);
    -00726 
    -00731 ODE_API void dBodyAddTorque           (dBodyID, dReal fx, dReal fy, dReal fz);
    -00732 
    -00737 ODE_API void dBodyAddRelForce         (dBodyID, dReal fx, dReal fy, dReal fz);
    -00738 
    -00743 ODE_API void dBodyAddRelTorque        (dBodyID, dReal fx, dReal fy, dReal fz);
    -00744 
    -00749 ODE_API void dBodyAddForceAtPos       (dBodyID, dReal fx, dReal fy, dReal fz,
    -00750                          dReal px, dReal py, dReal pz);
    -00755 ODE_API void dBodyAddForceAtRelPos    (dBodyID, dReal fx, dReal fy, dReal fz,
    -00756                          dReal px, dReal py, dReal pz);
    -00761 ODE_API void dBodyAddRelForceAtPos    (dBodyID, dReal fx, dReal fy, dReal fz,
    -00762                          dReal px, dReal py, dReal pz);
    -00767 ODE_API void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz,
    -00768                          dReal px, dReal py, dReal pz);
    -00769 
    -00779 ODE_API const dReal * dBodyGetForce   (dBodyID);
    -00780 
    -00790 ODE_API const dReal * dBodyGetTorque  (dBodyID);
    -00791 
    -00800 ODE_API void dBodySetForce  (dBodyID b, dReal x, dReal y, dReal z);
    -00801 
    -00810 ODE_API void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z);
    -00811 
    -00817 ODE_API void dBodyGetRelPointPos
    -00818 (
    -00819   dBodyID, dReal px, dReal py, dReal pz,
    -00820   dVector3 result
    -00821 );
    -00822 
    -00828 ODE_API void dBodyGetRelPointVel
    -00829 (
    -00830   dBodyID, dReal px, dReal py, dReal pz,
    -00831   dVector3 result
    -00832 );
    -00833 
    -00840 ODE_API void dBodyGetPointVel
    -00841 (
    -00842   dBodyID, dReal px, dReal py, dReal pz,
    -00843   dVector3 result
    -00844 );
    -00845 
    -00854 ODE_API void dBodyGetPosRelPoint
    -00855 (
    -00856   dBodyID, dReal px, dReal py, dReal pz,
    -00857   dVector3 result
    -00858 );
    -00859 
    -00865 ODE_API void dBodyVectorToWorld
    -00866 (
    -00867   dBodyID, dReal px, dReal py, dReal pz,
    -00868   dVector3 result
    -00869 );
    -00870 
    -00876 ODE_API void dBodyVectorFromWorld
    -00877 (
    -00878   dBodyID, dReal px, dReal py, dReal pz,
    -00879   dVector3 result
    -00880 );
    -00881 
    -00899 ODE_API void dBodySetFiniteRotationMode (dBodyID, int mode);
    -00900 
    -00917 ODE_API void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z);
    -00918 
    -00924 ODE_API int dBodyGetFiniteRotationMode (dBodyID);
    -00925 
    -00931 ODE_API void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result);
    -00932 
    -00938 ODE_API int dBodyGetNumJoints (dBodyID b);
    -00939 
    -00946 ODE_API dJointID dBodyGetJoint (dBodyID, int index);
    -00947 
    -00953 ODE_API void dBodyEnable (dBodyID);
    -00954 
    -00962 ODE_API void dBodyDisable (dBodyID);
    -00963 
    -00969 ODE_API int dBodyIsEnabled (dBodyID);
    -00970 
    -00978 ODE_API void dBodySetGravityMode (dBodyID b, int mode);
    -00979 
    -00985 ODE_API int dBodyGetGravityMode (dBodyID b);
    -00986 
    -00987 
    -00988 
    -01064 ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID);
    -01065 
    -01072 ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID);
    -01073 
    -01080 ODE_API dJointID dJointCreateSlider (dWorldID, dJointGroupID);
    -01081 
    -01088 ODE_API dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *);
    -01089 
    -01096 ODE_API dJointID dJointCreateHinge2 (dWorldID, dJointGroupID);
    -01097 
    -01104 ODE_API dJointID dJointCreateUniversal (dWorldID, dJointGroupID);
    -01105 
    -01112 ODE_API dJointID dJointCreatePR (dWorldID, dJointGroupID);
    -01113 
    -01120 ODE_API dJointID dJointCreateFixed (dWorldID, dJointGroupID);
    -01121 
    -01122 ODE_API dJointID dJointCreateNull (dWorldID, dJointGroupID);
    -01123 
    -01130 ODE_API dJointID dJointCreateAMotor (dWorldID, dJointGroupID);
    -01131 
    -01138 ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID);
    -01139 
    -01146 ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID);
    -01147 
    -01156 ODE_API void dJointDestroy (dJointID);
    -01157 
    -01158 
    -01164 ODE_API dJointGroupID dJointGroupCreate (int max_size);
    -01165 
    -01172 ODE_API void dJointGroupDestroy (dJointGroupID);
    -01173 
    -01181 ODE_API void dJointGroupEmpty (dJointGroupID);
    -01182 
    -01196 ODE_API void dJointAttach (dJointID, dBodyID body1, dBodyID body2);
    -01197 
    -01202 ODE_API void dJointSetData (dJointID, void *data);
    -01203 
    -01208 ODE_API void *dJointGetData (dJointID);
    -01209 
    -01224 ODE_API int dJointGetType (dJointID);
    -01225 
    -01236 ODE_API dBodyID dJointGetBody (dJointID, int index);
    -01237 
    -01245 ODE_API void dJointSetFeedback (dJointID, dJointFeedback *);
    -01246 
    -01251 ODE_API dJointFeedback *dJointGetFeedback (dJointID);
    -01252 
    -01260 ODE_API void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z);
    -01261 
    -01266 ODE_API void dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z);
    -01267 
    -01272 ODE_API void dJointSetBallParam (dJointID, int parameter, dReal value);
    -01273 
    -01278 ODE_API void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z);
    -01279 
    -01280 ODE_API void dJointSetHingeAnchorDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
    -01281 
    -01286 ODE_API void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z);
    -01287 
    -01292 ODE_API void dJointSetHingeParam (dJointID, int parameter, dReal value);
    -01293 
    -01302 ODE_API void dJointAddHingeTorque(dJointID joint, dReal torque);
    -01303 
    -01308 ODE_API void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z);
    -01309 
    -01313 ODE_API void dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az);
    -01314 
    -01319 ODE_API void dJointSetSliderParam (dJointID, int parameter, dReal value);
    -01320 
    -01329 ODE_API void dJointAddSliderForce(dJointID joint, dReal force);
    -01330 
    -01335 ODE_API void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z);
    -01336 
    -01341 ODE_API void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z);
    -01342 
    -01347 ODE_API void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z);
    -01348 
    -01353 ODE_API void dJointSetHinge2Param (dJointID, int parameter, dReal value);
    -01354 
    -01361 ODE_API void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2);
    -01362 
    -01367 ODE_API void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z);
    -01368 
    -01373 ODE_API void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z);
    -01374 
    -01379 ODE_API void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z);
    -01380 
    -01385 ODE_API void dJointSetUniversalParam (dJointID, int parameter, dReal value);
    -01386 
    -01393 ODE_API void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2);
    -01394 
    -01395 
    -01400 ODE_API void dJointSetPRAnchor (dJointID, dReal x, dReal y, dReal z);
    -01401 
    -01406 ODE_API void dJointSetPRAxis1 (dJointID, dReal x, dReal y, dReal z);
    -01407 
    -01412 ODE_API void dJointSetPRAxis2 (dJointID, dReal x, dReal y, dReal z);
    -01413 
    -01420 ODE_API void dJointSetPRParam (dJointID, int parameter, dReal value);
    -01421 
    -01430 ODE_API void dJointAddPRTorque (dJointID j, dReal torque);
    -01431 
    -01432 
    -01439 ODE_API void dJointSetFixed (dJointID);
    -01440 
    -01441 /*
    -01442  * @brief Sets joint parameter
    -01443  *
    -01444  * @ingroup joints
    -01445  */
    -01446 ODE_API void dJointSetFixedParam (dJointID, int parameter, dReal value);
    -01447 
    -01453 ODE_API void dJointSetAMotorNumAxes (dJointID, int num);
    -01454 
    -01459 ODE_API void dJointSetAMotorAxis (dJointID, int anum, int rel,
    -01460            dReal x, dReal y, dReal z);
    -01461 
    -01471 ODE_API void dJointSetAMotorAngle (dJointID, int anum, dReal angle);
    -01472 
    -01477 ODE_API void dJointSetAMotorParam (dJointID, int parameter, dReal value);
    -01478 
    -01483 ODE_API void dJointSetAMotorMode (dJointID, int mode);
    -01484 
    -01493 ODE_API void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3);
    -01494 
    -01500 ODE_API void dJointSetLMotorNumAxes (dJointID, int num);
    -01501 
    -01513 ODE_API void dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z);
    -01514 
    -01519 ODE_API void dJointSetLMotorParam (dJointID, int parameter, dReal value);
    -01520 
    -01524 ODE_API void dJointSetPlane2DXParam (dJointID, int parameter, dReal value);
    -01525 
    -01530 ODE_API void dJointSetPlane2DYParam (dJointID, int parameter, dReal value);
    -01531 
    -01535 ODE_API void dJointSetPlane2DAngleParam (dJointID, int parameter, dReal value);
    -01536 
    -01543 ODE_API void dJointGetBallAnchor (dJointID, dVector3 result);
    -01544 
    -01555 ODE_API void dJointGetBallAnchor2 (dJointID, dVector3 result);
    -01556 
    -01561 ODE_API dReal dJointGetBallParam (dJointID, int parameter);
    -01562 
    -01570 ODE_API void dJointGetHingeAnchor (dJointID, dVector3 result);
    -01571 
    -01580 ODE_API void dJointGetHingeAnchor2 (dJointID, dVector3 result);
    -01581 
    -01586 ODE_API void dJointGetHingeAxis (dJointID, dVector3 result);
    -01587 
    -01592 ODE_API dReal dJointGetHingeParam (dJointID, int parameter);
    -01593 
    -01604 ODE_API dReal dJointGetHingeAngle (dJointID);
    -01605 
    -01610 ODE_API dReal dJointGetHingeAngleRate (dJointID);
    -01611 
    -01619 ODE_API dReal dJointGetSliderPosition (dJointID);
    -01620 
    -01625 ODE_API dReal dJointGetSliderPositionRate (dJointID);
    -01626 
    -01631 ODE_API void dJointGetSliderAxis (dJointID, dVector3 result);
    -01632 
    -01637 ODE_API dReal dJointGetSliderParam (dJointID, int parameter);
    -01638 
    -01645 ODE_API void dJointGetHinge2Anchor (dJointID, dVector3 result);
    -01646 
    -01655 ODE_API void dJointGetHinge2Anchor2 (dJointID, dVector3 result);
    -01656 
    -01661 ODE_API void dJointGetHinge2Axis1 (dJointID, dVector3 result);
    -01662 
    -01667 ODE_API void dJointGetHinge2Axis2 (dJointID, dVector3 result);
    -01668 
    -01673 ODE_API dReal dJointGetHinge2Param (dJointID, int parameter);
    -01674 
    -01679 ODE_API dReal dJointGetHinge2Angle1 (dJointID);
    -01680 
    -01685 ODE_API dReal dJointGetHinge2Angle1Rate (dJointID);
    -01686 
    -01691 ODE_API dReal dJointGetHinge2Angle2Rate (dJointID);
    -01692 
    -01699 ODE_API void dJointGetUniversalAnchor (dJointID, dVector3 result);
    -01700 
    -01714 ODE_API void dJointGetUniversalAnchor2 (dJointID, dVector3 result);
    -01715 
    -01720 ODE_API void dJointGetUniversalAxis1 (dJointID, dVector3 result);
    -01721 
    -01726 ODE_API void dJointGetUniversalAxis2 (dJointID, dVector3 result);
    -01727 
    -01728 
    -01733 ODE_API dReal dJointGetUniversalParam (dJointID, int parameter);
    -01734 
    -01746 ODE_API void dJointGetUniversalAngles (dJointID, dReal *angle1, dReal *angle2);
    -01747 
    -01752 ODE_API dReal dJointGetUniversalAngle1 (dJointID);
    -01753 
    -01758 ODE_API dReal dJointGetUniversalAngle2 (dJointID);
    -01759 
    -01764 ODE_API dReal dJointGetUniversalAngle1Rate (dJointID);
    -01765 
    -01770 ODE_API dReal dJointGetUniversalAngle2Rate (dJointID);
    -01771 
    -01772 
    -01773 
    -01780 ODE_API void dJointGetPRAnchor (dJointID, dVector3 result);
    -01781 
    -01793 ODE_API dReal dJointGetPRPosition (dJointID);
    -01794 
    -01800 ODE_API dReal dJointGetPRPositionRate (dJointID);
    -01801 
    -01802 
    -01807 ODE_API void dJointGetPRAxis1 (dJointID, dVector3 result);
    -01808 
    -01813 ODE_API void dJointGetPRAxis2 (dJointID, dVector3 result);
    -01814 
    -01819 ODE_API dReal dJointGetPRParam (dJointID, int parameter);
    -01820 
    -01821 
    -01822 
    -01831 ODE_API int dJointGetAMotorNumAxes (dJointID);
    -01832 
    -01842 ODE_API void dJointGetAMotorAxis (dJointID, int anum, dVector3 result);
    -01843 
    -01860 ODE_API int dJointGetAMotorAxisRel (dJointID, int anum);
    -01861 
    -01870 ODE_API dReal dJointGetAMotorAngle (dJointID, int anum);
    -01871 
    -01880 ODE_API dReal dJointGetAMotorAngleRate (dJointID, int anum);
    -01881 
    -01886 ODE_API dReal dJointGetAMotorParam (dJointID, int parameter);
    -01887 
    -01901 ODE_API int dJointGetAMotorMode (dJointID);
    -01902 
    -01907 ODE_API int dJointGetLMotorNumAxes (dJointID);
    -01908 
    -01913 ODE_API void dJointGetLMotorAxis (dJointID, int anum, dVector3 result);
    -01914 
    -01919 ODE_API dReal dJointGetLMotorParam (dJointID, int parameter);
    -01920 
    -01925 ODE_API dReal dJointGetFixedParam (dJointID, int parameter);
    -01926 
    -01927 
    -01931 ODE_API dJointID dConnectingJoint (dBodyID, dBodyID);
    -01932 
    -01936 ODE_API int dConnectingJointList (dBodyID, dBodyID, dJointID*);
    -01937 
    -01944 ODE_API int dAreConnected (dBodyID, dBodyID);
    -01945 
    -01959 ODE_API int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type);
    -01960 
    -01961 
    -01962 #ifdef __cplusplus
    -01963 }
    -01964 #endif
    -01965 
    -01966 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/ode_8h-source.html b/libraries/ode-0.9/docs/ode_8h-source.html deleted file mode 100644 index 6b083e0965..0000000000 --- a/libraries/ode-0.9/docs/ode_8h-source.html +++ /dev/null @@ -1,67 +0,0 @@ - - -Open Dynamics Engine: ode.h Source File - - - - - -

    ode.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_ODE_H_
    -00024 #define _ODE_ODE_H_
    -00025 
    -00026 /* include *everything* here */
    -00027 
    -00028 #include <ode/config.h>
    -00029 #include <ode/compatibility.h>
    -00030 #include <ode/common.h>
    -00031 #include <ode/contact.h>
    -00032 #include <ode/error.h>
    -00033 #include <ode/memory.h>
    -00034 #include <ode/odemath.h>
    -00035 #include <ode/matrix.h>
    -00036 #include <ode/timer.h>
    -00037 #include <ode/rotation.h>
    -00038 #include <ode/mass.h>
    -00039 #include <ode/misc.h>
    -00040 #include <ode/objects.h>
    -00041 #include <ode/odecpp.h>
    -00042 #include <ode/collision_space.h>
    -00043 #include <ode/collision.h>
    -00044 #include <ode/odecpp_collision.h>
    -00045 #include <ode/export-dif.h>
    -00046 
    -00047 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/odecpp_8h-source.html b/libraries/ode-0.9/docs/odecpp_8h-source.html deleted file mode 100644 index 33c6dacf5f..0000000000 --- a/libraries/ode-0.9/docs/odecpp_8h-source.html +++ /dev/null @@ -1,732 +0,0 @@ - - -Open Dynamics Engine: odecpp.h Source File - - - - - -

    odecpp.h

    00001 /*************************************************************************
    -00002  *                          *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.    *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org    *
    -00005  *                          *
    -00006  * This library is free software; you can redistribute it and/or   *
    -00007  * modify it under the terms of EITHER:             *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *  Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *  your option) any later version. The text of the GNU Lesser  *
    -00011  *  General Public License is included with this library in the    *
    -00012  *  file LICENSE.TXT.                   *
    -00013  *   (2) The BSD-style license that is included with this library in  *
    -00014  *  the file LICENSE-BSD.TXT.              *
    -00015  *                          *
    -00016  * This library is distributed in the hope that it will be useful,    *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of  *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.         *
    -00020  *                          *
    -00021  *************************************************************************/
    -00022 
    -00023 /* C++ interface for non-collision stuff */
    -00024 
    -00025 
    -00026 #ifndef _ODE_ODECPP_H_
    -00027 #define _ODE_ODECPP_H_
    -00028 #ifdef __cplusplus
    -00029 
    -00030 #include <ode/error.h>
    -00031 
    -00032 
    -00033 class dWorld {
    -00034   dWorldID _id;
    -00035 
    -00036   // intentionally undefined, don't use these
    -00037   dWorld (const dWorld &);
    -00038   void operator= (const dWorld &);
    -00039 
    -00040 public:
    -00041   dWorld()
    -00042     { _id = dWorldCreate(); }
    -00043   ~dWorld()
    -00044     { dWorldDestroy (_id); }
    -00045 
    -00046   dWorldID id() const
    -00047     { return _id; }
    -00048   operator dWorldID() const
    -00049     { return _id; }
    -00050 
    -00051   void setGravity (dReal x, dReal y, dReal z)
    -00052     { dWorldSetGravity (_id,x,y,z); }
    -00053   void getGravity (dVector3 g) const
    -00054     { dWorldGetGravity (_id,g); }
    -00055 
    -00056   void setERP (dReal erp)
    -00057     { dWorldSetERP(_id, erp); }
    -00058   dReal getERP() const
    -00059     { return dWorldGetERP(_id); }
    -00060 
    -00061   void setCFM (dReal cfm)
    -00062     { dWorldSetCFM(_id, cfm); }
    -00063   dReal getCFM() const
    -00064     { return dWorldGetCFM(_id); }
    -00065 
    -00066   void step (dReal stepsize)
    -00067     { dWorldStep (_id,stepsize); }
    -00068 
    -00069   void stepFast1 (dReal stepsize, int maxiterations)
    -00070     { dWorldStepFast1 (_id,stepsize,maxiterations); }
    -00071   void setAutoEnableDepthSF1(dWorldID, int depth)
    -00072     { dWorldSetAutoEnableDepthSF1 (_id, depth); }
    -00073   int getAutoEnableDepthSF1(dWorldID)
    -00074     { return dWorldGetAutoEnableDepthSF1 (_id); }
    -00075 
    -00076   void  setAutoDisableLinearThreshold (dReal threshold) 
    -00077     { dWorldSetAutoDisableLinearThreshold (_id,threshold); }
    -00078   dReal getAutoDisableLinearThreshold()
    -00079     { return dWorldGetAutoDisableLinearThreshold (_id); }
    -00080   void setAutoDisableAngularThreshold (dReal threshold)
    -00081     { dWorldSetAutoDisableAngularThreshold (_id,threshold); }
    -00082   dReal getAutoDisableAngularThreshold()
    -00083     { return dWorldGetAutoDisableAngularThreshold (_id); }
    -00084   void setAutoDisableSteps (int steps)
    -00085     { dWorldSetAutoDisableSteps (_id,steps); }
    -00086   int getAutoDisableSteps()
    -00087     { return dWorldGetAutoDisableSteps (_id); }
    -00088   void setAutoDisableTime (dReal time)
    -00089     { dWorldSetAutoDisableTime (_id,time); }
    -00090   dReal getAutoDisableTime()
    -00091     { return dWorldGetAutoDisableTime (_id); }
    -00092   void setAutoDisableFlag (int do_auto_disable)
    -00093     { dWorldSetAutoDisableFlag (_id,do_auto_disable); }
    -00094   int getAutoDisableFlag()
    -00095     { return dWorldGetAutoDisableFlag (_id); }
    -00096 
    -00097   void impulseToForce (dReal stepsize, dReal ix, dReal iy, dReal iz,
    -00098              dVector3 force)
    -00099     { dWorldImpulseToForce (_id,stepsize,ix,iy,iz,force); }
    -00100 };
    -00101 
    -00102 
    -00103 class dBody {
    -00104   dBodyID _id;
    -00105 
    -00106   // intentionally undefined, don't use these
    -00107   dBody (const dBody &);
    -00108   void operator= (const dBody &);
    -00109 
    -00110 public:
    -00111   dBody()
    -00112     { _id = 0; }
    -00113   dBody (dWorldID world)
    -00114     { _id = dBodyCreate (world); }
    -00115   ~dBody()
    -00116     { if (_id) dBodyDestroy (_id); }
    -00117 
    -00118   void create (dWorldID world) {
    -00119     if (_id) dBodyDestroy (_id);
    -00120     _id = dBodyCreate (world);
    -00121   }
    -00122 
    -00123   dBodyID id() const
    -00124     { return _id; }
    -00125   operator dBodyID() const
    -00126     { return _id; }
    -00127 
    -00128   void setData (void *data)
    -00129     { dBodySetData (_id,data); }
    -00130   void *getData() const
    -00131     { return dBodyGetData (_id); }
    -00132 
    -00133   void setPosition (dReal x, dReal y, dReal z)
    -00134     { dBodySetPosition (_id,x,y,z); }
    -00135   void setRotation (const dMatrix3 R)
    -00136     { dBodySetRotation (_id,R); }
    -00137   void setQuaternion (const dQuaternion q)
    -00138     { dBodySetQuaternion (_id,q); }
    -00139   void setLinearVel  (dReal x, dReal y, dReal z)
    -00140     { dBodySetLinearVel (_id,x,y,z); }
    -00141   void setAngularVel (dReal x, dReal y, dReal z)
    -00142     { dBodySetAngularVel (_id,x,y,z); }
    -00143 
    -00144   const dReal * getPosition() const
    -00145     { return dBodyGetPosition (_id); }
    -00146   const dReal * getRotation() const
    -00147     { return dBodyGetRotation (_id); }
    -00148   const dReal * getQuaternion() const
    -00149     { return dBodyGetQuaternion (_id); }
    -00150   const dReal * getLinearVel() const
    -00151     { return dBodyGetLinearVel (_id); }
    -00152   const dReal * getAngularVel() const
    -00153     { return dBodyGetAngularVel (_id); }
    -00154 
    -00155   void setMass (const dMass *mass)
    -00156     { dBodySetMass (_id,mass); }
    -00157   void getMass (dMass *mass) const
    -00158     { dBodyGetMass (_id,mass); }
    -00159 
    -00160   void addForce (dReal fx, dReal fy, dReal fz)
    -00161     { dBodyAddForce (_id, fx, fy, fz); }
    -00162   void addTorque (dReal fx, dReal fy, dReal fz)
    -00163     { dBodyAddTorque (_id, fx, fy, fz); }
    -00164   void addRelForce (dReal fx, dReal fy, dReal fz)
    -00165     { dBodyAddRelForce (_id, fx, fy, fz); }
    -00166   void addRelTorque (dReal fx, dReal fy, dReal fz)
    -00167     { dBodyAddRelTorque (_id, fx, fy, fz); }
    -00168   void addForceAtPos (dReal fx, dReal fy, dReal fz,
    -00169             dReal px, dReal py, dReal pz)
    -00170     { dBodyAddForceAtPos (_id, fx, fy, fz, px, py, pz); }
    -00171   void addForceAtRelPos (dReal fx, dReal fy, dReal fz,
    -00172             dReal px, dReal py, dReal pz)
    -00173     { dBodyAddForceAtRelPos (_id, fx, fy, fz, px, py, pz); }
    -00174   void addRelForceAtPos (dReal fx, dReal fy, dReal fz,
    -00175           dReal px, dReal py, dReal pz)
    -00176     { dBodyAddRelForceAtPos (_id, fx, fy, fz, px, py, pz); }
    -00177   void addRelForceAtRelPos (dReal fx, dReal fy, dReal fz,
    -00178              dReal px, dReal py, dReal pz)
    -00179     { dBodyAddRelForceAtRelPos (_id, fx, fy, fz, px, py, pz); }
    -00180 
    -00181   const dReal * getForce() const
    -00182     { return dBodyGetForce(_id); }
    -00183   const dReal * getTorque() const
    -00184     { return dBodyGetTorque(_id); }
    -00185   void setForce (dReal x, dReal y, dReal z)
    -00186     { dBodySetForce (_id,x,y,z); }
    -00187   void setTorque (dReal x, dReal y, dReal z)
    -00188     { dBodySetTorque (_id,x,y,z); }
    -00189 
    -00190   void enable()
    -00191     { dBodyEnable (_id); }
    -00192   void disable()
    -00193     { dBodyDisable (_id); }
    -00194   int isEnabled() const
    -00195     { return dBodyIsEnabled (_id); }
    -00196 
    -00197   void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const
    -00198     { dBodyGetRelPointPos (_id, px, py, pz, result); }
    -00199   void getRelPointVel (dReal px, dReal py, dReal pz, dVector3 result) const
    -00200     { dBodyGetRelPointVel (_id, px, py, pz, result); }
    -00201   void getPointVel (dReal px, dReal py, dReal pz, dVector3 result) const
    -00202     { dBodyGetPointVel (_id,px,py,pz,result); }
    -00203   void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const
    -00204     { dBodyGetPosRelPoint (_id,px,py,pz,result); }
    -00205   void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const
    -00206     { dBodyVectorToWorld (_id,px,py,pz,result); }
    -00207   void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const
    -00208     { dBodyVectorFromWorld (_id,px,py,pz,result); }
    -00209 
    -00210   void setFiniteRotationMode (int mode)
    -00211     { dBodySetFiniteRotationMode (_id, mode); }
    -00212   void setFiniteRotationAxis (dReal x, dReal y, dReal z)
    -00213     { dBodySetFiniteRotationAxis (_id, x, y, z); }
    -00214 
    -00215   int getFiniteRotationMode() const
    -00216     { return dBodyGetFiniteRotationMode (_id); }
    -00217   void getFiniteRotationAxis (dVector3 result) const
    -00218     { dBodyGetFiniteRotationAxis (_id, result); }
    -00219 
    -00220   int getNumJoints() const
    -00221     { return dBodyGetNumJoints (_id); }
    -00222   dJointID getJoint (int index) const
    -00223     { return dBodyGetJoint (_id, index); }
    -00224 
    -00225   void setGravityMode (int mode)
    -00226     { dBodySetGravityMode (_id,mode); }
    -00227   int getGravityMode() const
    -00228     { return dBodyGetGravityMode (_id); }
    -00229 
    -00230   int isConnectedTo (dBodyID body) const
    -00231     { return dAreConnected (_id, body); }
    -00232 
    -00233   void  setAutoDisableLinearThreshold (dReal threshold) 
    -00234     { dBodySetAutoDisableLinearThreshold (_id,threshold); }
    -00235   dReal getAutoDisableLinearThreshold()
    -00236     { return dBodyGetAutoDisableLinearThreshold (_id); }
    -00237   void setAutoDisableAngularThreshold (dReal threshold)
    -00238     { dBodySetAutoDisableAngularThreshold (_id,threshold); }
    -00239   dReal getAutoDisableAngularThreshold()
    -00240     { return dBodyGetAutoDisableAngularThreshold (_id); }
    -00241   void setAutoDisableSteps (int steps)
    -00242     { dBodySetAutoDisableSteps (_id,steps); }
    -00243   int getAutoDisableSteps()
    -00244     { return dBodyGetAutoDisableSteps (_id); }
    -00245   void setAutoDisableTime (dReal time)
    -00246     { dBodySetAutoDisableTime (_id,time); }
    -00247   dReal getAutoDisableTime()
    -00248     { return dBodyGetAutoDisableTime (_id); }
    -00249   void setAutoDisableFlag (int do_auto_disable)
    -00250     { dBodySetAutoDisableFlag (_id,do_auto_disable); }
    -00251   int getAutoDisableFlag()
    -00252     { return dBodyGetAutoDisableFlag (_id); }
    -00253 };
    -00254 
    -00255 
    -00256 class dJointGroup {
    -00257   dJointGroupID _id;
    -00258 
    -00259   // intentionally undefined, don't use these
    -00260   dJointGroup (const dJointGroup &);
    -00261   void operator= (const dJointGroup &);
    -00262 
    -00263 public:
    -00264   dJointGroup (int dummy_arg=0)
    -00265     { _id = dJointGroupCreate (0); }
    -00266   ~dJointGroup()
    -00267     { dJointGroupDestroy (_id); }
    -00268   void create (int dummy_arg=0) {
    -00269     if (_id) dJointGroupDestroy (_id);
    -00270     _id = dJointGroupCreate (0);
    -00271   }
    -00272 
    -00273   dJointGroupID id() const
    -00274     { return _id; }
    -00275   operator dJointGroupID() const
    -00276     { return _id; }
    -00277 
    -00278   void empty()
    -00279     { dJointGroupEmpty (_id); }
    -00280 };
    -00281 
    -00282 
    -00283 class dJoint {
    -00284 private:
    -00285   // intentionally undefined, don't use these
    -00286   dJoint (const dJoint &) ;
    -00287   void operator= (const dJoint &);
    -00288 
    -00289 protected:
    -00290   dJointID _id;
    -00291 
    -00292 public:
    -00293   dJoint()
    -00294     { _id = 0; }
    -00295   ~dJoint()
    -00296     { if (_id) dJointDestroy (_id); }
    -00297 
    -00298   dJointID id() const
    -00299     { return _id; }
    -00300   operator dJointID() const
    -00301     { return _id; }
    -00302 
    -00303   void attach (dBodyID body1, dBodyID body2)
    -00304     { dJointAttach (_id, body1, body2); }
    -00305 
    -00306   void setData (void *data)
    -00307     { dJointSetData (_id, data); }
    -00308   void *getData() const
    -00309     { return dJointGetData (_id); }
    -00310 
    -00311   int getType() const
    -00312     { return dJointGetType (_id); }
    -00313 
    -00314   dBodyID getBody (int index) const
    -00315     { return dJointGetBody (_id, index); }
    -00316 
    -00317   void setFeedback(dJointFeedback *fb)
    -00318     { dJointSetFeedback(_id, fb); }
    -00319   dJointFeedback *getFeedback() const
    -00320     { return dJointGetFeedback(_id); }
    -00321 };
    -00322 
    -00323 
    -00324 class dBallJoint : public dJoint {
    -00325 private:
    -00326   // intentionally undefined, don't use these
    -00327   dBallJoint (const dBallJoint &);
    -00328   void operator= (const dBallJoint &);
    -00329 
    -00330 public:
    -00331   dBallJoint() { }
    -00332   dBallJoint (dWorldID world, dJointGroupID group=0)
    -00333     { _id = dJointCreateBall (world, group); }
    -00334 
    -00335   void create (dWorldID world, dJointGroupID group=0) {
    -00336     if (_id) dJointDestroy (_id);
    -00337     _id = dJointCreateBall (world, group);
    -00338   }
    -00339 
    -00340   void setAnchor (dReal x, dReal y, dReal z)
    -00341     { dJointSetBallAnchor (_id, x, y, z); }
    -00342   void getAnchor (dVector3 result) const
    -00343     { dJointGetBallAnchor (_id, result); }
    -00344   void getAnchor2 (dVector3 result) const
    -00345     { dJointGetBallAnchor2 (_id, result); }
    -00346   void setParam (int parameter, dReal value)
    -00347     { dJointSetBallParam (_id, parameter, value); }
    -00348   dReal getParam (int parameter) const
    -00349     { return dJointGetBallParam (_id, parameter); }
    -00350 } ;
    -00351 
    -00352 
    -00353 class dHingeJoint : public dJoint {
    -00354   // intentionally undefined, don't use these
    -00355   dHingeJoint (const dHingeJoint &);
    -00356   void operator = (const dHingeJoint &);
    -00357 
    -00358 public:
    -00359   dHingeJoint() { }
    -00360   dHingeJoint (dWorldID world, dJointGroupID group=0)
    -00361     { _id = dJointCreateHinge (world, group); }
    -00362 
    -00363   void create (dWorldID world, dJointGroupID group=0) {
    -00364     if (_id) dJointDestroy (_id);
    -00365     _id = dJointCreateHinge (world, group);
    -00366   }
    -00367 
    -00368   void setAnchor (dReal x, dReal y, dReal z)
    -00369     { dJointSetHingeAnchor (_id, x, y, z); }
    -00370   void getAnchor (dVector3 result) const
    -00371     { dJointGetHingeAnchor (_id, result); }
    -00372   void getAnchor2 (dVector3 result) const
    -00373     { dJointGetHingeAnchor2 (_id, result); }
    -00374 
    -00375   void setAxis (dReal x, dReal y, dReal z)
    -00376     { dJointSetHingeAxis (_id, x, y, z); }
    -00377   void getAxis (dVector3 result) const
    -00378     { dJointGetHingeAxis (_id, result); }
    -00379 
    -00380   dReal getAngle() const
    -00381     { return dJointGetHingeAngle (_id); }
    -00382   dReal getAngleRate() const
    -00383     { return dJointGetHingeAngleRate (_id); }
    -00384 
    -00385   void setParam (int parameter, dReal value)
    -00386     { dJointSetHingeParam (_id, parameter, value); }
    -00387   dReal getParam (int parameter) const
    -00388     { return dJointGetHingeParam (_id, parameter); }
    -00389 
    -00390   void addTorque (dReal torque)
    -00391    { dJointAddHingeTorque(_id, torque); }
    -00392 };
    -00393 
    -00394 
    -00395 class dSliderJoint : public dJoint {
    -00396   // intentionally undefined, don't use these
    -00397   dSliderJoint (const dSliderJoint &);
    -00398   void operator = (const dSliderJoint &);
    -00399 
    -00400 public:
    -00401   dSliderJoint() { }
    -00402   dSliderJoint (dWorldID world, dJointGroupID group=0)
    -00403     { _id = dJointCreateSlider (world, group); }
    -00404 
    -00405   void create (dWorldID world, dJointGroupID group=0) {
    -00406     if (_id) dJointDestroy (_id);
    -00407     _id = dJointCreateSlider (world, group);
    -00408   }
    -00409 
    -00410   void setAxis (dReal x, dReal y, dReal z)
    -00411     { dJointSetSliderAxis (_id, x, y, z); }
    -00412   void getAxis (dVector3 result) const
    -00413     { dJointGetSliderAxis (_id, result); }
    -00414 
    -00415   dReal getPosition() const
    -00416     { return dJointGetSliderPosition (_id); }
    -00417   dReal getPositionRate() const
    -00418     { return dJointGetSliderPositionRate (_id); }
    -00419 
    -00420   void setParam (int parameter, dReal value)
    -00421     { dJointSetSliderParam (_id, parameter, value); }
    -00422   dReal getParam (int parameter) const
    -00423     { return dJointGetSliderParam (_id, parameter); }
    -00424 
    -00425   void addForce (dReal force)
    -00426    { dJointAddSliderForce(_id, force); }
    -00427 };
    -00428 
    -00429 
    -00430 class dUniversalJoint : public dJoint {
    -00431   // intentionally undefined, don't use these
    -00432   dUniversalJoint (const dUniversalJoint &);
    -00433   void operator = (const dUniversalJoint &);
    -00434 
    -00435 public:
    -00436   dUniversalJoint() { }
    -00437   dUniversalJoint (dWorldID world, dJointGroupID group=0)
    -00438     { _id = dJointCreateUniversal (world, group); }
    -00439 
    -00440   void create (dWorldID world, dJointGroupID group=0) {
    -00441     if (_id) dJointDestroy (_id);
    -00442     _id = dJointCreateUniversal (world, group);
    -00443   }
    -00444 
    -00445   void setAnchor (dReal x, dReal y, dReal z)
    -00446     { dJointSetUniversalAnchor (_id, x, y, z); }
    -00447   void setAxis1 (dReal x, dReal y, dReal z)
    -00448     { dJointSetUniversalAxis1 (_id, x, y, z); }
    -00449   void setAxis2 (dReal x, dReal y, dReal z)
    -00450     { dJointSetUniversalAxis2 (_id, x, y, z); }
    -00451   void setParam (int parameter, dReal value)
    -00452     { dJointSetUniversalParam (_id, parameter, value); }
    -00453 
    -00454   void getAnchor (dVector3 result) const
    -00455     { dJointGetUniversalAnchor (_id, result); }
    -00456   void getAnchor2 (dVector3 result) const
    -00457     { dJointGetUniversalAnchor2 (_id, result); }
    -00458   void getAxis1 (dVector3 result) const
    -00459     { dJointGetUniversalAxis1 (_id, result); }
    -00460   void getAxis2 (dVector3 result) const
    -00461     { dJointGetUniversalAxis2 (_id, result); }
    -00462   dReal getParam (int parameter) const
    -00463     { return dJointGetUniversalParam (_id, parameter); }
    -00464  void getAngles(dReal *angle1, dReal *angle2) const
    -00465     { dJointGetUniversalAngles (_id, angle1, angle2); }
    -00466 
    -00467   dReal getAngle1() const
    -00468     { return dJointGetUniversalAngle1 (_id); }
    -00469   dReal getAngle1Rate() const
    -00470     { return dJointGetUniversalAngle1Rate (_id); }
    -00471   dReal getAngle2() const
    -00472     { return dJointGetUniversalAngle2 (_id); }
    -00473   dReal getAngle2Rate() const
    -00474     { return dJointGetUniversalAngle2Rate (_id); }
    -00475 
    -00476   void addTorques (dReal torque1, dReal torque2)
    -00477    { dJointAddUniversalTorques(_id, torque1, torque2); }
    -00478 };
    -00479 
    -00480 
    -00481 class dHinge2Joint : public dJoint {
    -00482   // intentionally undefined, don't use these
    -00483   dHinge2Joint (const dHinge2Joint &);
    -00484   void operator = (const dHinge2Joint &);
    -00485 
    -00486 public:
    -00487   dHinge2Joint() { }
    -00488   dHinge2Joint (dWorldID world, dJointGroupID group=0)
    -00489     { _id = dJointCreateHinge2 (world, group); }
    -00490 
    -00491   void create (dWorldID world, dJointGroupID group=0) {
    -00492     if (_id) dJointDestroy (_id);
    -00493     _id = dJointCreateHinge2 (world, group);
    -00494   }
    -00495 
    -00496   void setAnchor (dReal x, dReal y, dReal z)
    -00497     { dJointSetHinge2Anchor (_id, x, y, z); }
    -00498   void setAxis1 (dReal x, dReal y, dReal z)
    -00499     { dJointSetHinge2Axis1 (_id, x, y, z); }
    -00500   void setAxis2 (dReal x, dReal y, dReal z)
    -00501     { dJointSetHinge2Axis2 (_id, x, y, z); }
    -00502 
    -00503   void getAnchor (dVector3 result) const
    -00504     { dJointGetHinge2Anchor (_id, result); }
    -00505   void getAnchor2 (dVector3 result) const
    -00506     { dJointGetHinge2Anchor2 (_id, result); }
    -00507   void getAxis1 (dVector3 result) const
    -00508     { dJointGetHinge2Axis1 (_id, result); }
    -00509   void getAxis2 (dVector3 result) const
    -00510     { dJointGetHinge2Axis2 (_id, result); }
    -00511 
    -00512   dReal getAngle1() const
    -00513     { return dJointGetHinge2Angle1 (_id); }
    -00514   dReal getAngle1Rate() const
    -00515     { return dJointGetHinge2Angle1Rate (_id); }
    -00516   dReal getAngle2Rate() const
    -00517     { return dJointGetHinge2Angle2Rate (_id); }
    -00518 
    -00519   void setParam (int parameter, dReal value)
    -00520     { dJointSetHinge2Param (_id, parameter, value); }
    -00521   dReal getParam (int parameter) const
    -00522     { return dJointGetHinge2Param (_id, parameter); }
    -00523 
    -00524   void addTorques(dReal torque1, dReal torque2)
    -00525    { dJointAddHinge2Torques(_id, torque1, torque2); }
    -00526 };
    -00527 
    -00528 
    -00529 class dPRJoint : public dJoint {
    -00530   dPRJoint (const dPRJoint &);
    -00531   void operator = (const dPRJoint &);
    -00532 
    -00533 public:
    -00534   dPRJoint() { }
    -00535   dPRJoint (dWorldID world, dJointGroupID group=0)
    -00536     { _id = dJointCreatePR (world, group); }
    -00537 
    -00538   void create (dWorldID world, dJointGroupID group=0) {
    -00539     if (_id) dJointDestroy (_id);
    -00540     _id = dJointCreatePR (world, group);
    -00541   }
    -00542 
    -00543   void setAnchor (dReal x, dReal y, dReal z)
    -00544     { dJointSetPRAnchor (_id, x, y, z); }
    -00545   void setAxis1 (dReal x, dReal y, dReal z)
    -00546     { dJointSetPRAxis1 (_id, x, y, z); }
    -00547   void setAxis2 (dReal x, dReal y, dReal z)
    -00548     { dJointSetPRAxis2 (_id, x, y, z); }
    -00549 
    -00550   void getAnchor (dVector3 result) const
    -00551     { dJointGetPRAnchor (_id, result); }
    -00552   void getAxis1 (dVector3 result) const
    -00553     { dJointGetPRAxis1 (_id, result); }
    -00554   void getAxis2 (dVector3 result) const
    -00555     { dJointGetPRAxis2 (_id, result); }
    -00556 
    -00557   dReal getPosition() const
    -00558     { return dJointGetPRPosition (_id); }
    -00559   dReal getPositionRate() const
    -00560     { return dJointGetPRPositionRate (_id); }
    -00561 
    -00562   void setParam (int parameter, dReal value)
    -00563     { dJointSetPRParam (_id, parameter, value); }
    -00564   dReal getParam (int parameter) const
    -00565     { return dJointGetPRParam (_id, parameter); }
    -00566 };
    -00567 
    -00568 
    -00569 class dFixedJoint : public dJoint {
    -00570   // intentionally undefined, don't use these
    -00571   dFixedJoint (const dFixedJoint &);
    -00572   void operator = (const dFixedJoint &);
    -00573 
    -00574 public:
    -00575   dFixedJoint() { }
    -00576   dFixedJoint (dWorldID world, dJointGroupID group=0)
    -00577     { _id = dJointCreateFixed (world, group); }
    -00578 
    -00579   void create (dWorldID world, dJointGroupID group=0) {
    -00580     if (_id) dJointDestroy (_id);
    -00581     _id = dJointCreateFixed (world, group);
    -00582   }
    -00583 
    -00584   void set()
    -00585     { dJointSetFixed (_id); }
    -00586 
    -00587   void setParam (int parameter, dReal value)
    -00588     { dJointSetFixedParam (_id, parameter, value); }
    -00589 
    -00590   dReal getParam (int parameter) const
    -00591     { return dJointGetFixedParam (_id, parameter); }
    -00592 };
    -00593 
    -00594 
    -00595 class dContactJoint : public dJoint {
    -00596   // intentionally undefined, don't use these
    -00597   dContactJoint (const dContactJoint &);
    -00598   void operator = (const dContactJoint &);
    -00599 
    -00600 public:
    -00601   dContactJoint() { }
    -00602   dContactJoint (dWorldID world, dJointGroupID group, dContact *contact)
    -00603     { _id = dJointCreateContact (world, group, contact); }
    -00604 
    -00605   void create (dWorldID world, dJointGroupID group, dContact *contact) {
    -00606     if (_id) dJointDestroy (_id);
    -00607     _id = dJointCreateContact (world, group, contact);
    -00608   }
    -00609 };
    -00610 
    -00611 
    -00612 class dNullJoint : public dJoint {
    -00613   // intentionally undefined, don't use these
    -00614   dNullJoint (const dNullJoint &);
    -00615   void operator = (const dNullJoint &);
    -00616 
    -00617 public:
    -00618   dNullJoint() { }
    -00619   dNullJoint (dWorldID world, dJointGroupID group=0)
    -00620     { _id = dJointCreateNull (world, group); }
    -00621 
    -00622   void create (dWorldID world, dJointGroupID group=0) {
    -00623     if (_id) dJointDestroy (_id);
    -00624     _id = dJointCreateNull (world, group);
    -00625   }
    -00626 };
    -00627 
    -00628 
    -00629 class dAMotorJoint : public dJoint {
    -00630   // intentionally undefined, don't use these
    -00631   dAMotorJoint (const dAMotorJoint &);
    -00632   void operator = (const dAMotorJoint &);
    -00633 
    -00634 public:
    -00635   dAMotorJoint() { }
    -00636   dAMotorJoint (dWorldID world, dJointGroupID group=0)
    -00637     { _id = dJointCreateAMotor (world, group); }
    -00638 
    -00639   void create (dWorldID world, dJointGroupID group=0) {
    -00640     if (_id) dJointDestroy (_id);
    -00641     _id = dJointCreateAMotor (world, group);
    -00642   }
    -00643 
    -00644   void setMode (int mode)
    -00645     { dJointSetAMotorMode (_id, mode); }
    -00646   int getMode() const
    -00647     { return dJointGetAMotorMode (_id); }
    -00648 
    -00649   void setNumAxes (int num)
    -00650     { dJointSetAMotorNumAxes (_id, num); }
    -00651   int getNumAxes() const
    -00652     { return dJointGetAMotorNumAxes (_id); }
    -00653 
    -00654   void setAxis (int anum, int rel, dReal x, dReal y, dReal z)
    -00655     { dJointSetAMotorAxis (_id, anum, rel, x, y, z); }
    -00656   void getAxis (int anum, dVector3 result) const
    -00657     { dJointGetAMotorAxis (_id, anum, result); }
    -00658   int getAxisRel (int anum) const
    -00659     { return dJointGetAMotorAxisRel (_id, anum); }
    -00660 
    -00661   void setAngle (int anum, dReal angle)
    -00662     { dJointSetAMotorAngle (_id, anum, angle); }
    -00663   dReal getAngle (int anum) const
    -00664     { return dJointGetAMotorAngle (_id, anum); }
    -00665   dReal getAngleRate (int anum)
    -00666     { return dJointGetAMotorAngleRate (_id,anum); }
    -00667 
    -00668   void setParam (int parameter, dReal value)
    -00669     { dJointSetAMotorParam (_id, parameter, value); }
    -00670   dReal getParam (int parameter) const
    -00671     { return dJointGetAMotorParam (_id, parameter); }
    -00672 
    -00673   void addTorques(dReal torque1, dReal torque2, dReal torque3)
    -00674    { dJointAddAMotorTorques(_id, torque1, torque2, torque3); }
    -00675 };
    -00676 
    -00677 
    -00678 class dLMotorJoint : public dJoint {
    -00679   // intentionally undefined, don't use these
    -00680   dLMotorJoint (const dLMotorJoint &);
    -00681   void operator = (const dLMotorJoint &);
    -00682 
    -00683 public:
    -00684   dLMotorJoint() { }
    -00685   dLMotorJoint (dWorldID world, dJointGroupID group=0)
    -00686     { _id = dJointCreateLMotor (world, group); }
    -00687 
    -00688   void create (dWorldID world, dJointGroupID group=0) {
    -00689     if (_id) dJointDestroy (_id);
    -00690     _id = dJointCreateLMotor (world, group);
    -00691   }
    -00692 
    -00693   void setNumAxes (int num)
    -00694     { dJointSetLMotorNumAxes (_id, num); }
    -00695   int getNumAxes() const
    -00696     { return dJointGetLMotorNumAxes (_id); }
    -00697 
    -00698   void setAxis (int anum, int rel, dReal x, dReal y, dReal z)
    -00699     { dJointSetLMotorAxis (_id, anum, rel, x, y, z); }
    -00700   void getAxis (int anum, dVector3 result) const
    -00701     { dJointGetLMotorAxis (_id, anum, result); }
    -00702 
    -00703   void setParam (int parameter, dReal value)
    -00704     { dJointSetLMotorParam (_id, parameter, value); }
    -00705   dReal getParam (int parameter) const
    -00706     { return dJointGetLMotorParam (_id, parameter); }
    -00707 };
    -00708 
    -00709 
    -00710 
    -00711 #endif
    -00712 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/odecpp__collision_8h-source.html b/libraries/ode-0.9/docs/odecpp__collision_8h-source.html deleted file mode 100644 index f4943ba891..0000000000 --- a/libraries/ode-0.9/docs/odecpp__collision_8h-source.html +++ /dev/null @@ -1,366 +0,0 @@ - - -Open Dynamics Engine: odecpp_collision.h Source File - - - - - -

    odecpp_collision.h

    00001 /*************************************************************************
    -00002  *                          *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.    *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org    *
    -00005  *                          *
    -00006  * This library is free software; you can redistribute it and/or   *
    -00007  * modify it under the terms of EITHER:             *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *  Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *  your option) any later version. The text of the GNU Lesser  *
    -00011  *  General Public License is included with this library in the    *
    -00012  *  file LICENSE.TXT.                   *
    -00013  *   (2) The BSD-style license that is included with this library in  *
    -00014  *  the file LICENSE-BSD.TXT.              *
    -00015  *                          *
    -00016  * This library is distributed in the hope that it will be useful,    *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of  *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.         *
    -00020  *                          *
    -00021  *************************************************************************/
    -00022 
    -00023 /* C++ interface for new collision API */
    -00024 
    -00025 
    -00026 #ifndef _ODE_ODECPP_COLLISION_H_
    -00027 #define _ODE_ODECPP_COLLISION_H_
    -00028 #ifdef __cplusplus
    -00029 
    -00030 #include <ode/error.h>
    -00031 
    -00032 
    -00033 class dGeom {
    -00034   // intentionally undefined, don't use these
    -00035   dGeom (dGeom &);
    -00036   void operator= (dGeom &);
    -00037 
    -00038 protected:
    -00039   dGeomID _id;
    -00040 
    -00041 public:
    -00042   dGeom()
    -00043     { _id = 0; }
    -00044   ~dGeom()
    -00045     { if (_id) dGeomDestroy (_id); }
    -00046 
    -00047   dGeomID id() const
    -00048     { return _id; }
    -00049   operator dGeomID() const
    -00050     { return _id; }
    -00051 
    -00052   void destroy() {
    -00053     if (_id) dGeomDestroy (_id);
    -00054     _id = 0;
    -00055   }
    -00056 
    -00057   int getClass() const
    -00058     { return dGeomGetClass (_id); }
    -00059 
    -00060   dSpaceID getSpace() const
    -00061     { return dGeomGetSpace (_id); }
    -00062 
    -00063   void setData (void *data)
    -00064     { dGeomSetData (_id,data); }
    -00065   void *getData() const
    -00066     { return dGeomGetData (_id); }
    -00067 
    -00068   void setBody (dBodyID b)
    -00069     { dGeomSetBody (_id,b); }
    -00070   dBodyID getBody() const
    -00071     { return dGeomGetBody (_id); }
    -00072 
    -00073   void setPosition (dReal x, dReal y, dReal z)
    -00074     { dGeomSetPosition (_id,x,y,z); }
    -00075   const dReal * getPosition() const
    -00076     { return dGeomGetPosition (_id); }
    -00077 
    -00078   void setRotation (const dMatrix3 R)
    -00079     { dGeomSetRotation (_id,R); }
    -00080   const dReal * getRotation() const
    -00081     { return dGeomGetRotation (_id); }
    -00082     
    -00083   void setQuaternion (const dQuaternion quat)
    -00084     { dGeomSetQuaternion (_id,quat); }
    -00085   void getQuaternion (dQuaternion quat) const
    -00086     { dGeomGetQuaternion (_id,quat); }
    -00087 
    -00088   void getAABB (dReal aabb[6]) const
    -00089     { dGeomGetAABB (_id, aabb); }
    -00090 
    -00091   int isSpace()
    -00092     { return dGeomIsSpace (_id); }
    -00093 
    -00094   void setCategoryBits (unsigned long bits)
    -00095     { dGeomSetCategoryBits (_id, bits); }
    -00096   void setCollideBits (unsigned long bits)
    -00097     { dGeomSetCollideBits (_id, bits); }
    -00098   unsigned long getCategoryBits()
    -00099     { return dGeomGetCategoryBits (_id); }
    -00100   unsigned long getCollideBits()
    -00101     { return dGeomGetCollideBits (_id); }
    -00102 
    -00103   void enable()
    -00104     { dGeomEnable (_id); }
    -00105   void disable()
    -00106     { dGeomDisable (_id); }
    -00107   int isEnabled()
    -00108     { return dGeomIsEnabled (_id); }
    -00109 
    -00110   void collide2 (dGeomID g, void *data, dNearCallback *callback)
    -00111     { dSpaceCollide2 (_id,g,data,callback); }
    -00112 };
    -00113 
    -00114 
    -00115 class dSpace : public dGeom {
    -00116   // intentionally undefined, don't use these
    -00117   dSpace (dSpace &);
    -00118   void operator= (dSpace &);
    -00119 
    -00120 protected:
    -00121   // the default constructor is protected so that you
    -00122   // can't instance this class. you must instance one
    -00123   // of its subclasses instead.
    -00124   dSpace () { _id = 0; }
    -00125 
    -00126 public:
    -00127   dSpaceID id() const
    -00128     { return (dSpaceID) _id; }
    -00129   operator dSpaceID() const
    -00130     { return (dSpaceID) _id; }
    -00131 
    -00132   void setCleanup (int mode)
    -00133     { dSpaceSetCleanup (id(), mode); }
    -00134   int getCleanup()
    -00135     { return dSpaceGetCleanup (id()); }
    -00136 
    -00137   void add (dGeomID x)
    -00138     { dSpaceAdd (id(), x); }
    -00139   void remove (dGeomID x)
    -00140     { dSpaceRemove (id(), x); }
    -00141   int query (dGeomID x)
    -00142     { return dSpaceQuery (id(),x); }
    -00143 
    -00144   int getNumGeoms()
    -00145     { return dSpaceGetNumGeoms (id()); }
    -00146   dGeomID getGeom (int i)
    -00147     { return dSpaceGetGeom (id(),i); }
    -00148 
    -00149   void collide (void *data, dNearCallback *callback)
    -00150     { dSpaceCollide (id(),data,callback); }
    -00151 };
    -00152 
    -00153 
    -00154 class dSimpleSpace : public dSpace {
    -00155   // intentionally undefined, don't use these
    -00156   dSimpleSpace (dSimpleSpace &);
    -00157   void operator= (dSimpleSpace &);
    -00158 
    -00159 public:
    -00160   dSimpleSpace (dSpaceID space)
    -00161     { _id = (dGeomID) dSimpleSpaceCreate (space); }
    -00162 };
    -00163 
    -00164 
    -00165 class dHashSpace : public dSpace {
    -00166   // intentionally undefined, don't use these
    -00167   dHashSpace (dHashSpace &);
    -00168   void operator= (dHashSpace &);
    -00169 
    -00170 public:
    -00171   dHashSpace (dSpaceID space)
    -00172     { _id = (dGeomID) dHashSpaceCreate (space); }
    -00173   void setLevels (int minlevel, int maxlevel)
    -00174     { dHashSpaceSetLevels (id(),minlevel,maxlevel); }
    -00175 };
    -00176 
    -00177 
    -00178 class dQuadTreeSpace : public dSpace {
    -00179   // intentionally undefined, don't use these
    -00180   dQuadTreeSpace (dQuadTreeSpace &);
    -00181   void operator= (dQuadTreeSpace &);
    -00182 
    -00183 public:
    -00184   dQuadTreeSpace (dSpaceID space, dVector3 center, dVector3 extents, int depth)
    -00185     { _id = (dGeomID) dQuadTreeSpaceCreate (space,center,extents,depth); }
    -00186 };
    -00187 
    -00188 
    -00189 class dSphere : public dGeom {
    -00190   // intentionally undefined, don't use these
    -00191   dSphere (dSphere &);
    -00192   void operator= (dSphere &);
    -00193 
    -00194 public:
    -00195   dSphere () { }
    -00196   dSphere (dSpaceID space, dReal radius)
    -00197     { _id = dCreateSphere (space, radius); }
    -00198 
    -00199   void create (dSpaceID space, dReal radius) {
    -00200     if (_id) dGeomDestroy (_id);
    -00201     _id = dCreateSphere (space, radius);
    -00202   }
    -00203 
    -00204   void setRadius (dReal radius)
    -00205     { dGeomSphereSetRadius (_id, radius); }
    -00206   dReal getRadius() const
    -00207     { return dGeomSphereGetRadius (_id); }
    -00208 };
    -00209 
    -00210 
    -00211 class dBox : public dGeom {
    -00212   // intentionally undefined, don't use these
    -00213   dBox (dBox &);
    -00214   void operator= (dBox &);
    -00215 
    -00216 public:
    -00217   dBox () { }
    -00218   dBox (dSpaceID space, dReal lx, dReal ly, dReal lz)
    -00219     { _id = dCreateBox (space,lx,ly,lz); }
    -00220 
    -00221   void create (dSpaceID space, dReal lx, dReal ly, dReal lz) {
    -00222     if (_id) dGeomDestroy (_id);
    -00223     _id = dCreateBox (space,lx,ly,lz);
    -00224   }
    -00225 
    -00226   void setLengths (dReal lx, dReal ly, dReal lz)
    -00227     { dGeomBoxSetLengths (_id, lx, ly, lz); }
    -00228   void getLengths (dVector3 result) const
    -00229     { dGeomBoxGetLengths (_id,result); }
    -00230 };
    -00231 
    -00232 
    -00233 class dPlane : public dGeom {
    -00234   // intentionally undefined, don't use these
    -00235   dPlane (dPlane &);
    -00236   void operator= (dPlane &);
    -00237 
    -00238 public:
    -00239   dPlane() { }
    -00240   dPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d)
    -00241     { _id = dCreatePlane (space,a,b,c,d); }
    -00242 
    -00243   void create (dSpaceID space, dReal a, dReal b, dReal c, dReal d) {
    -00244     if (_id) dGeomDestroy (_id);
    -00245     _id = dCreatePlane (space,a,b,c,d);
    -00246   }
    -00247 
    -00248   void setParams (dReal a, dReal b, dReal c, dReal d)
    -00249     { dGeomPlaneSetParams (_id, a, b, c, d); }
    -00250   void getParams (dVector4 result) const
    -00251     { dGeomPlaneGetParams (_id,result); }
    -00252 };
    -00253 
    -00254 
    -00255 class dCapsule : public dGeom {
    -00256   // intentionally undefined, don't use these
    -00257   dCapsule (dCapsule &);
    -00258   void operator= (dCapsule &);
    -00259 
    -00260 public:
    -00261   dCapsule() { }
    -00262   dCapsule (dSpaceID space, dReal radius, dReal length)
    -00263     { _id = dCreateCapsule (space,radius,length); }
    -00264 
    -00265   void create (dSpaceID space, dReal radius, dReal length) {
    -00266     if (_id) dGeomDestroy (_id);
    -00267     _id = dCreateCapsule (space,radius,length);
    -00268   }
    -00269 
    -00270   void setParams (dReal radius, dReal length)
    -00271     { dGeomCapsuleSetParams (_id, radius, length); }
    -00272   void getParams (dReal *radius, dReal *length) const
    -00273     { dGeomCapsuleGetParams (_id,radius,length); }
    -00274 };
    -00275 
    -00276 
    -00277 class dRay : public dGeom {
    -00278   // intentionally undefined, don't use these
    -00279   dRay (dRay &);
    -00280   void operator= (dRay &);
    -00281 
    -00282 public:
    -00283   dRay() { }
    -00284   dRay (dSpaceID space, dReal length)
    -00285     { _id = dCreateRay (space,length); }
    -00286 
    -00287   void create (dSpaceID space, dReal length) {
    -00288     if (_id) dGeomDestroy (_id);
    -00289     _id = dCreateRay (space,length);
    -00290   }
    -00291 
    -00292   void setLength (dReal length)
    -00293     { dGeomRaySetLength (_id, length); }
    -00294   dReal getLength()
    -00295     { return dGeomRayGetLength (_id); }
    -00296 
    -00297   void set (dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz)
    -00298     { dGeomRaySet (_id, px, py, pz, dx, dy, dz); }
    -00299   void get (dVector3 start, dVector3 dir)
    -00300     { dGeomRayGet (_id, start, dir); }
    -00301 
    -00302   void setParams (int firstContact, int backfaceCull)
    -00303     { dGeomRaySetParams (_id, firstContact, backfaceCull); }
    -00304   void getParams (int *firstContact, int *backfaceCull)
    -00305     { dGeomRayGetParams (_id, firstContact, backfaceCull); }
    -00306   void setClosestHit (int closestHit)
    -00307     { dGeomRaySetClosestHit (_id, closestHit); }
    -00308   int getClosestHit()
    -00309     { return dGeomRayGetClosestHit (_id); }
    -00310 };
    -00311 
    -00312 
    -00313 class dGeomTransform : public dGeom {
    -00314   // intentionally undefined, don't use these
    -00315   dGeomTransform (dGeomTransform &);
    -00316   void operator= (dGeomTransform &);
    -00317 
    -00318 public:
    -00319   dGeomTransform() { }
    -00320   dGeomTransform (dSpaceID space)
    -00321     { _id = dCreateGeomTransform (space); }
    -00322 
    -00323   void create (dSpaceID space=0) {
    -00324     if (_id) dGeomDestroy (_id);
    -00325     _id = dCreateGeomTransform (space);
    -00326   }
    -00327 
    -00328   void setGeom (dGeomID geom)
    -00329     { dGeomTransformSetGeom (_id, geom); }
    -00330   dGeomID getGeom() const
    -00331     { return dGeomTransformGetGeom (_id); }
    -00332 
    -00333   void setCleanup (int mode)
    -00334     { dGeomTransformSetCleanup (_id,mode); }
    -00335   int getCleanup ()
    -00336     { return dGeomTransformGetCleanup (_id); }
    -00337 
    -00338   void setInfo (int mode)
    -00339     { dGeomTransformSetInfo (_id,mode); }
    -00340   int getInfo()
    -00341     { return dGeomTransformGetInfo (_id); }
    -00342 };
    -00343 
    -00344 
    -00345 #endif
    -00346 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/odemath_8h-source.html b/libraries/ode-0.9/docs/odemath_8h-source.html deleted file mode 100644 index b330c60df6..0000000000 --- a/libraries/ode-0.9/docs/odemath_8h-source.html +++ /dev/null @@ -1,350 +0,0 @@ - - -Open Dynamics Engine: odemath.h Source File - - - - - -

    odemath.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_ODEMATH_H_
    -00024 #define _ODE_ODEMATH_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 
    -00028 #ifdef __GNUC__
    -00029 #define PURE_INLINE extern inline
    -00030 #else
    -00031 #define PURE_INLINE inline
    -00032 #endif
    -00033 
    -00034 /*
    -00035  * macro to access elements i,j in an NxM matrix A, independent of the
    -00036  * matrix storage convention.
    -00037  */
    -00038 #define dACCESS33(A,i,j) ((A)[(i)*4+(j)])
    -00039 
    -00040 /*
    -00041  * Macro to test for valid floating point values
    -00042  */
    -00043 #define dVALIDVEC3(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2])))
    -00044 #define dVALIDVEC4(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]) || dIsNan(v[3])))
    -00045 #define dVALIDMAT3(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11])))
    -00046 #define dVALIDMAT4(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]) || dIsNan(m[12]) || dIsNan(m[13]) || dIsNan(m[14]) || dIsNan(m[15]) ))
    -00047 
    -00048 
    -00049 
    -00050 /*
    -00051  * General purpose vector operations with other vectors or constants.
    -00052  */
    -00053 
    -00054 #define dOP(a,op,b,c) \
    -00055     (a)[0] = ((b)[0]) op ((c)[0]); \
    -00056     (a)[1] = ((b)[1]) op ((c)[1]); \
    -00057     (a)[2] = ((b)[2]) op ((c)[2]);
    -00058 #define dOPC(a,op,b,c) \
    -00059     (a)[0] = ((b)[0]) op (c); \
    -00060     (a)[1] = ((b)[1]) op (c); \
    -00061     (a)[2] = ((b)[2]) op (c);
    -00062 #define dOPE(a,op,b) \
    -00063     (a)[0] op ((b)[0]); \
    -00064     (a)[1] op ((b)[1]); \
    -00065     (a)[2] op ((b)[2]);
    -00066 #define dOPEC(a,op,c) \
    -00067     (a)[0] op (c); \
    -00068     (a)[1] op (c); \
    -00069     (a)[2] op (c);
    -00070 
    -00071 
    -00072 /*
    -00073  * Length, and squared length helpers. dLENGTH returns the length of a dVector3.
    -00074  * dLENGTHSQUARED return the squared length of a dVector3.
    -00075  */
    -00076 
    -00077 #define dLENGTHSQUARED(a) (((a)[0])*((a)[0]) + ((a)[1])*((a)[1]) + ((a)[2])*((a)[2]))
    -00078 
    -00079 #ifdef __cplusplus
    -00080 
    -00081 PURE_INLINE dReal dLENGTH (const dReal *a) { return dSqrt(dLENGTHSQUARED(a)); }
    -00082 
    -00083 #else
    -00084 
    -00085 #define dLENGTH(a) ( dSqrt( ((a)[0])*((a)[0]) + ((a)[1])*((a)[1]) + ((a)[2])*((a)[2]) ) )
    -00086 
    -00087 #endif /* __cplusplus */
    -00088 
    -00089 
    -00090 
    -00091 
    -00092 
    -00093 /*
    -00094  * 3-way dot product. dDOTpq means that elements of `a' and `b' are spaced
    -00095  * p and q indexes apart respectively. dDOT() means dDOT11.
    -00096  * in C++ we could use function templates to get all the versions of these
    -00097  * functions - but on some compilers this will result in sub-optimal code.
    -00098  */
    -00099 
    -00100 #define dDOTpq(a,b,p,q) ((a)[0]*(b)[0] + (a)[p]*(b)[q] + (a)[2*(p)]*(b)[2*(q)])
    -00101 
    -00102 #ifdef __cplusplus
    -00103 
    -00104 PURE_INLINE dReal dDOT   (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,1); }
    -00105 PURE_INLINE dReal dDOT13 (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,3); }
    -00106 PURE_INLINE dReal dDOT31 (const dReal *a, const dReal *b) { return dDOTpq(a,b,3,1); }
    -00107 PURE_INLINE dReal dDOT33 (const dReal *a, const dReal *b) { return dDOTpq(a,b,3,3); }
    -00108 PURE_INLINE dReal dDOT14 (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,4); }
    -00109 PURE_INLINE dReal dDOT41 (const dReal *a, const dReal *b) { return dDOTpq(a,b,4,1); }
    -00110 PURE_INLINE dReal dDOT44 (const dReal *a, const dReal *b) { return dDOTpq(a,b,4,4); }
    -00111 
    -00112 #else
    -00113 
    -00114 #define dDOT(a,b)   dDOTpq(a,b,1,1)
    -00115 #define dDOT13(a,b) dDOTpq(a,b,1,3)
    -00116 #define dDOT31(a,b) dDOTpq(a,b,3,1)
    -00117 #define dDOT33(a,b) dDOTpq(a,b,3,3)
    -00118 #define dDOT14(a,b) dDOTpq(a,b,1,4)
    -00119 #define dDOT41(a,b) dDOTpq(a,b,4,1)
    -00120 #define dDOT44(a,b) dDOTpq(a,b,4,4)
    -00121 
    -00122 #endif /* __cplusplus */
    -00123 
    -00124 
    -00125 /*
    -00126  * cross product, set a = b x c. dCROSSpqr means that elements of `a', `b'
    -00127  * and `c' are spaced p, q and r indexes apart respectively.
    -00128  * dCROSS() means dCROSS111. `op' is normally `=', but you can set it to
    -00129  * +=, -= etc to get other effects.
    -00130  */
    -00131 
    -00132 #define dCROSS(a,op,b,c) \
    -00133 do { \
    -00134   (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \
    -00135   (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \
    -00136   (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]); \
    -00137 } while(0)
    -00138 #define dCROSSpqr(a,op,b,c,p,q,r) \
    -00139 do { \
    -00140   (a)[  0] op ((b)[  q]*(c)[2*r] - (b)[2*q]*(c)[  r]); \
    -00141   (a)[  p] op ((b)[2*q]*(c)[  0] - (b)[  0]*(c)[2*r]); \
    -00142   (a)[2*p] op ((b)[  0]*(c)[  r] - (b)[  q]*(c)[  0]); \
    -00143 } while(0)
    -00144 #define dCROSS114(a,op,b,c) dCROSSpqr(a,op,b,c,1,1,4)
    -00145 #define dCROSS141(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,1)
    -00146 #define dCROSS144(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,4)
    -00147 #define dCROSS411(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,1)
    -00148 #define dCROSS414(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,4)
    -00149 #define dCROSS441(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,1)
    -00150 #define dCROSS444(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,4)
    -00151 
    -00152 
    -00153 /*
    -00154  * set a 3x3 submatrix of A to a matrix such that submatrix(A)*b = a x b.
    -00155  * A is stored by rows, and has `skip' elements per row. the matrix is
    -00156  * assumed to be already zero, so this does not write zero elements!
    -00157  * if (plus,minus) is (+,-) then a positive version will be written.
    -00158  * if (plus,minus) is (-,+) then a negative version will be written.
    -00159  */
    -00160 
    -00161 #define dCROSSMAT(A,a,skip,plus,minus) \
    -00162 do { \
    -00163   (A)[1] = minus (a)[2]; \
    -00164   (A)[2] = plus (a)[1]; \
    -00165   (A)[(skip)+0] = plus (a)[2]; \
    -00166   (A)[(skip)+2] = minus (a)[0]; \
    -00167   (A)[2*(skip)+0] = minus (a)[1]; \
    -00168   (A)[2*(skip)+1] = plus (a)[0]; \
    -00169 } while(0)
    -00170 
    -00171 
    -00172 /*
    -00173  * compute the distance between two 3D-vectors
    -00174  */
    -00175 
    -00176 #ifdef __cplusplus
    -00177 PURE_INLINE dReal dDISTANCE (const dVector3 a, const dVector3 b)
    -00178    { return dSqrt( (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]) + (a[2]-b[2])*(a[2]-b[2]) ); }
    -00179 #else
    -00180 #define dDISTANCE(a,b) \
    -00181    (dSqrt( ((a)[0]-(b)[0])*((a)[0]-(b)[0]) + ((a)[1]-(b)[1])*((a)[1]-(b)[1]) + ((a)[2]-(b)[2])*((a)[2]-(b)[2]) ))
    -00182 #endif
    -00183 
    -00184 
    -00185 /*
    -00186  * special case matrix multipication, with operator selection
    -00187  */
    -00188 
    -00189 #define dMULTIPLYOP0_331(A,op,B,C) \
    -00190 do { \
    -00191   (A)[0] op dDOT((B),(C)); \
    -00192   (A)[1] op dDOT((B+4),(C)); \
    -00193   (A)[2] op dDOT((B+8),(C)); \
    -00194 } while(0)
    -00195 #define dMULTIPLYOP1_331(A,op,B,C) \
    -00196 do { \
    -00197   (A)[0] op dDOT41((B),(C)); \
    -00198   (A)[1] op dDOT41((B+1),(C)); \
    -00199   (A)[2] op dDOT41((B+2),(C)); \
    -00200 } while(0)
    -00201 #define dMULTIPLYOP0_133(A,op,B,C) \
    -00202 do { \
    -00203   (A)[0] op dDOT14((B),(C)); \
    -00204   (A)[1] op dDOT14((B),(C+1)); \
    -00205   (A)[2] op dDOT14((B),(C+2)); \
    -00206 } while(0)
    -00207 #define dMULTIPLYOP0_333(A,op,B,C) \
    -00208 do { \
    -00209   (A)[0] op dDOT14((B),(C)); \
    -00210   (A)[1] op dDOT14((B),(C+1)); \
    -00211   (A)[2] op dDOT14((B),(C+2)); \
    -00212   (A)[4] op dDOT14((B+4),(C)); \
    -00213   (A)[5] op dDOT14((B+4),(C+1)); \
    -00214   (A)[6] op dDOT14((B+4),(C+2)); \
    -00215   (A)[8] op dDOT14((B+8),(C)); \
    -00216   (A)[9] op dDOT14((B+8),(C+1)); \
    -00217   (A)[10] op dDOT14((B+8),(C+2)); \
    -00218 } while(0)
    -00219 #define dMULTIPLYOP1_333(A,op,B,C) \
    -00220 do { \
    -00221   (A)[0] op dDOT44((B),(C)); \
    -00222   (A)[1] op dDOT44((B),(C+1)); \
    -00223   (A)[2] op dDOT44((B),(C+2)); \
    -00224   (A)[4] op dDOT44((B+1),(C)); \
    -00225   (A)[5] op dDOT44((B+1),(C+1)); \
    -00226   (A)[6] op dDOT44((B+1),(C+2)); \
    -00227   (A)[8] op dDOT44((B+2),(C)); \
    -00228   (A)[9] op dDOT44((B+2),(C+1)); \
    -00229   (A)[10] op dDOT44((B+2),(C+2)); \
    -00230 } while(0)
    -00231 #define dMULTIPLYOP2_333(A,op,B,C) \
    -00232 do { \
    -00233   (A)[0] op dDOT((B),(C)); \
    -00234   (A)[1] op dDOT((B),(C+4)); \
    -00235   (A)[2] op dDOT((B),(C+8)); \
    -00236   (A)[4] op dDOT((B+4),(C)); \
    -00237   (A)[5] op dDOT((B+4),(C+4)); \
    -00238   (A)[6] op dDOT((B+4),(C+8)); \
    -00239   (A)[8] op dDOT((B+8),(C)); \
    -00240   (A)[9] op dDOT((B+8),(C+4)); \
    -00241   (A)[10] op dDOT((B+8),(C+8)); \
    -00242 } while(0)
    -00243 
    -00244 #ifdef __cplusplus
    -00245 
    -00246 #define DECL template <class TA, class TB, class TC> PURE_INLINE void
    -00247 
    -00248 DECL dMULTIPLY0_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_331(A,=,B,C); }
    -00249 DECL dMULTIPLY1_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_331(A,=,B,C); }
    -00250 DECL dMULTIPLY0_133(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_133(A,=,B,C); }
    -00251 DECL dMULTIPLY0_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_333(A,=,B,C); }
    -00252 DECL dMULTIPLY1_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_333(A,=,B,C); }
    -00253 DECL dMULTIPLY2_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP2_333(A,=,B,C); }
    -00254 
    -00255 DECL dMULTIPLYADD0_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_331(A,+=,B,C); }
    -00256 DECL dMULTIPLYADD1_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_331(A,+=,B,C); }
    -00257 DECL dMULTIPLYADD0_133(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_133(A,+=,B,C); }
    -00258 DECL dMULTIPLYADD0_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_333(A,+=,B,C); }
    -00259 DECL dMULTIPLYADD1_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_333(A,+=,B,C); }
    -00260 DECL dMULTIPLYADD2_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP2_333(A,+=,B,C); }
    -00261 
    -00262 #undef DECL
    -00263 
    -00264 #else
    -00265 
    -00266 #define dMULTIPLY0_331(A,B,C) dMULTIPLYOP0_331(A,=,B,C)
    -00267 #define dMULTIPLY1_331(A,B,C) dMULTIPLYOP1_331(A,=,B,C)
    -00268 #define dMULTIPLY0_133(A,B,C) dMULTIPLYOP0_133(A,=,B,C)
    -00269 #define dMULTIPLY0_333(A,B,C) dMULTIPLYOP0_333(A,=,B,C)
    -00270 #define dMULTIPLY1_333(A,B,C) dMULTIPLYOP1_333(A,=,B,C)
    -00271 #define dMULTIPLY2_333(A,B,C) dMULTIPLYOP2_333(A,=,B,C)
    -00272 
    -00273 #define dMULTIPLYADD0_331(A,B,C) dMULTIPLYOP0_331(A,+=,B,C)
    -00274 #define dMULTIPLYADD1_331(A,B,C) dMULTIPLYOP1_331(A,+=,B,C)
    -00275 #define dMULTIPLYADD0_133(A,B,C) dMULTIPLYOP0_133(A,+=,B,C)
    -00276 #define dMULTIPLYADD0_333(A,B,C) dMULTIPLYOP0_333(A,+=,B,C)
    -00277 #define dMULTIPLYADD1_333(A,B,C) dMULTIPLYOP1_333(A,+=,B,C)
    -00278 #define dMULTIPLYADD2_333(A,B,C) dMULTIPLYOP2_333(A,+=,B,C)
    -00279 
    -00280 #endif
    -00281 
    -00282 
    -00283 #ifdef __cplusplus
    -00284 extern "C" {
    -00285 #endif
    -00286 
    -00287 /*
    -00288  * normalize 3x1 and 4x1 vectors (i.e. scale them to unit length)
    -00289  */
    -00290 ODE_API int  dSafeNormalize3 (dVector3 a);
    -00291 ODE_API int  dSafeNormalize4 (dVector4 a);
    -00292 
    -00293 // For some reason demo_chain1.c does not understand "inline" keyword.
    -00294 static __inline void _dNormalize3(dVector3 a)
    -00295 {
    -00296    int bNormalizationResult = dSafeNormalize3(a);
    -00297    dIASSERT(bNormalizationResult);
    -00298    dVARIABLEUSED(bNormalizationResult);
    -00299 }
    -00300 
    -00301 static __inline void _dNormalize4(dVector4 a)
    -00302 {
    -00303    int bNormalizationResult = dSafeNormalize4(a);
    -00304    dIASSERT(bNormalizationResult);
    -00305    dVARIABLEUSED(bNormalizationResult);
    -00306 }
    -00307 
    -00308 // For DLL export
    -00309 ODE_API void dNormalize3 (dVector3 a); // Potentially asserts on zero vec
    -00310 ODE_API void dNormalize4 (dVector4 a); // Potentially asserts on zero vec
    -00311 
    -00312 // For internal use
    -00313 #define dNormalize3(a) _dNormalize3(a)
    -00314 #define dNormalize4(a) _dNormalize4(a)
    -00315 
    -00316 /*
    -00317  * given a unit length "normal" vector n, generate vectors p and q vectors
    -00318  * that are an orthonormal basis for the plane space perpendicular to n.
    -00319  * i.e. this makes p,q such that n,p,q are all perpendicular to each other.
    -00320  * q will equal n x p. if n is not unit length then p will be unit length but
    -00321  * q wont be.
    -00322  */
    -00323 
    -00324 ODE_API void dPlaneSpace (const dVector3 n, dVector3 p, dVector3 q);
    -00325 
    -00326 #ifdef __cplusplus
    -00327 }
    -00328 #endif
    -00329 
    -00330 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/rotation_8h-source.html b/libraries/ode-0.9/docs/rotation_8h-source.html deleted file mode 100644 index 54ca2485d8..0000000000 --- a/libraries/ode-0.9/docs/rotation_8h-source.html +++ /dev/null @@ -1,90 +0,0 @@ - - -Open Dynamics Engine: rotation.h Source File - - - - - -

    rotation.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_ROTATION_H_
    -00024 #define _ODE_ROTATION_H_
    -00025 
    -00026 #include <ode/common.h>
    -00027 #include <ode/compatibility.h>
    -00028 
    -00029 #ifdef __cplusplus
    -00030 extern "C" {
    -00031 #endif
    -00032 
    -00033 
    -00034 ODE_API void dRSetIdentity (dMatrix3 R);
    -00035 
    -00036 ODE_API void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az,
    -00037           dReal angle);
    -00038 
    -00039 ODE_API void dRFromEulerAngles (dMatrix3 R, dReal phi, dReal theta, dReal psi);
    -00040 
    -00041 ODE_API void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az,
    -00042         dReal bx, dReal by, dReal bz);
    -00043 
    -00044 ODE_API void dRFromZAxis (dMatrix3 R, dReal ax, dReal ay, dReal az);
    -00045 
    -00046 ODE_API void dQSetIdentity (dQuaternion q);
    -00047 
    -00048 ODE_API void dQFromAxisAndAngle (dQuaternion q, dReal ax, dReal ay, dReal az,
    -00049           dReal angle);
    -00050 
    -00051 /* Quaternion multiplication, analogous to the matrix multiplication routines. */
    -00052 /* qa = rotate by qc, then qb */
    -00053 ODE_API void dQMultiply0 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
    -00054 /* qa = rotate by qc, then by inverse of qb */
    -00055 ODE_API void dQMultiply1 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
    -00056 /* qa = rotate by inverse of qc, then by qb */
    -00057 ODE_API void dQMultiply2 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
    -00058 /* qa = rotate by inverse of qc, then by inverse of qb */
    -00059 ODE_API void dQMultiply3 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
    -00060 
    -00061 ODE_API void dRfromQ (dMatrix3 R, const dQuaternion q);
    -00062 ODE_API void dQfromR (dQuaternion q, const dMatrix3 R);
    -00063 ODE_API void dDQfromW (dReal dq[4], const dVector3 w, const dQuaternion q);
    -00064 
    -00065 
    -00066 #ifdef __cplusplus
    -00067 }
    -00068 #endif
    -00069 
    -00070 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/structd_contact_geom.html b/libraries/ode-0.9/docs/structd_contact_geom.html deleted file mode 100644 index 9be3fca7af..0000000000 --- a/libraries/ode-0.9/docs/structd_contact_geom.html +++ /dev/null @@ -1,70 +0,0 @@ - - -Open Dynamics Engine: dContactGeom Struct Reference - - - - - - -

    dContactGeom Struct Reference
    - -[Collision Detection] -

    Describe the contact point between two geoms. -More... -

    -#include <contact.h> -

    - - - - - - - - - - - - - - - - - - - - - - -

    Data Fields

    -dVector3 pos
     contact position
    -dVector3 normal
     normal vector
    -dReal depth
     penetration depth
    -dGeomID g1
    -dGeomID g2
     the colliding geoms
    -int side1
    -int side2
     (to be documented)
    -


    Detailed Description

    -Describe the contact point between two geoms. -

    -If two bodies touch, or if a body touches a static feature in its environment, the contact is represented by one or more "contact points", described by dContactGeom.

    -The convention is that if body 1 is moved along the normal vector by a distance depth (or equivalently if body 2 is moved the same distance in the opposite direction) then the contact depth will be reduced to zero. This means that the normal vector points "in" to body 1.


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/structds_functions.html b/libraries/ode-0.9/docs/structds_functions.html deleted file mode 100644 index 6d5685aa7c..0000000000 --- a/libraries/ode-0.9/docs/structds_functions.html +++ /dev/null @@ -1,59 +0,0 @@ - - -Open Dynamics Engine: dsFunctions Struct Reference - - - - - - -

    dsFunctions Struct Reference
    - -[DrawStuff] -

    Set of functions to be used as callbacks by the simulation loop. -More... -

    -#include <drawstuff.h> -

    - - - - - - - - - - - - - - - -

    Data Fields

    -int version
    -void(* start )()
    -void(* step )(int pause)
    -void(* command )(int cmd)
    -void(* stop )()
    -char * path_to_textures
    -


    Detailed Description

    -Set of functions to be used as callbacks by the simulation loop.
    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 12 08:36:52 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/tab_b.gif b/libraries/ode-0.9/docs/tab_b.gif deleted file mode 100644 index 0d623483ff..0000000000 Binary files a/libraries/ode-0.9/docs/tab_b.gif and /dev/null differ diff --git a/libraries/ode-0.9/docs/tab_l.gif b/libraries/ode-0.9/docs/tab_l.gif deleted file mode 100644 index 9b1e6337c9..0000000000 Binary files a/libraries/ode-0.9/docs/tab_l.gif and /dev/null differ diff --git a/libraries/ode-0.9/docs/tab_r.gif b/libraries/ode-0.9/docs/tab_r.gif deleted file mode 100644 index ce9dd9f533..0000000000 Binary files a/libraries/ode-0.9/docs/tab_r.gif and /dev/null differ diff --git a/libraries/ode-0.9/docs/tabs.css b/libraries/ode-0.9/docs/tabs.css deleted file mode 100644 index c37faafe80..0000000000 --- a/libraries/ode-0.9/docs/tabs.css +++ /dev/null @@ -1,102 +0,0 @@ -/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ - -DIV.tabs -{ - float : left; - width : 100%; - background : url("tab_b.gif") repeat-x bottom; - margin-bottom : 4px; -} - -DIV.tabs UL -{ - margin : 0px; - padding-left : 10px; - list-style : none; -} - -DIV.tabs LI, DIV.tabs FORM -{ - display : inline; - margin : 0px; - padding : 0px; -} - -DIV.tabs FORM -{ - float : right; -} - -DIV.tabs A -{ - float : left; - background : url("tab_r.gif") no-repeat right top; - border-bottom : 1px solid #84B0C7; - font-size : x-small; - font-weight : bold; - text-decoration : none; -} - -DIV.tabs A:hover -{ - background-position: 100% -150px; -} - -DIV.tabs A:link, DIV.tabs A:visited, -DIV.tabs A:active, DIV.tabs A:hover -{ - color: #1A419D; -} - -DIV.tabs SPAN -{ - float : left; - display : block; - background : url("tab_l.gif") no-repeat left top; - padding : 5px 9px; - white-space : nowrap; -} - -DIV.tabs INPUT -{ - float : right; - display : inline; - font-size : 1em; -} - -DIV.tabs TD -{ - font-size : x-small; - font-weight : bold; - text-decoration : none; -} - - - -/* Commented Backslash Hack hides rule from IE5-Mac \*/ -DIV.tabs SPAN {float : none;} -/* End IE5-Mac hack */ - -DIV.tabs A:hover SPAN -{ - background-position: 0% -150px; -} - -DIV.tabs LI.current A -{ - background-position: 100% -150px; - border-width : 0px; -} - -DIV.tabs LI.current SPAN -{ - background-position: 0% -150px; - padding-bottom : 6px; -} - -DIV.nav -{ - background : none; - border : none; - border-bottom : 1px solid #84B0C7; -} diff --git a/libraries/ode-0.9/docs/timer_8h-source.html b/libraries/ode-0.9/docs/timer_8h-source.html deleted file mode 100644 index 3d0b1e63ae..0000000000 --- a/libraries/ode-0.9/docs/timer_8h-source.html +++ /dev/null @@ -1,96 +0,0 @@ - - -Open Dynamics Engine: timer.h Source File - - - - - -

    timer.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef _ODE_TIMER_H_
    -00024 #define _ODE_TIMER_H_
    -00025 
    -00026 #include <ode/config.h>
    -00027 
    -00028 #ifdef __cplusplus
    -00029 extern "C" {
    -00030 #endif
    -00031 
    -00032 
    -00033 /* stop watch objects */
    -00034 
    -00035 typedef struct dStopwatch {
    -00036   double time;       /* total clock count */
    -00037   unsigned long cc[2];     /* clock count since last `start' */
    -00038 } dStopwatch;
    -00039 
    -00040 ODE_API void dStopwatchReset (dStopwatch *);
    -00041 ODE_API void dStopwatchStart (dStopwatch *);
    -00042 ODE_API void dStopwatchStop  (dStopwatch *);
    -00043 ODE_API double dStopwatchTime (dStopwatch *);   /* returns total time in secs */
    -00044 
    -00045 
    -00046 /* code timers */
    -00047 
    -00048 ODE_API void dTimerStart (const char *description);   /* pass a static string here */
    -00049 ODE_API void dTimerNow (const char *description);  /* pass a static string here */
    -00050 ODE_API void dTimerEnd(void);
    -00051 
    -00052 /* print out a timer report. if `average' is nonzero, print out the average
    -00053  * time for each slot (this is only meaningful if the same start-now-end
    -00054  * calls are being made repeatedly.
    -00055  */
    -00056 ODE_API void dTimerReport (FILE *fout, int average);
    -00057 
    -00058 
    -00059 /* resolution */
    -00060 
    -00061 /* returns the timer ticks per second implied by the timing hardware or API.
    -00062  * the actual timer resolution may not be this great.
    -00063  */
    -00064 ODE_API double dTimerTicksPerSecond(void);
    -00065 
    -00066 /* returns an estimate of the actual timer resolution, in seconds. this may
    -00067  * be greater than 1/ticks_per_second.
    -00068  */
    -00069 ODE_API double dTimerResolution(void);
    -00070 
    -00071 
    -00072 #ifdef __cplusplus
    -00073 }
    -00074 #endif
    -00075 
    -00076 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/docs/version_8h-source.html b/libraries/ode-0.9/docs/version_8h-source.html deleted file mode 100644 index 74430d1db2..0000000000 --- a/libraries/ode-0.9/docs/version_8h-source.html +++ /dev/null @@ -1,49 +0,0 @@ - - -Open Dynamics Engine: version.h Source File - - - - - -

    version.h

    00001 /*************************************************************************
    -00002  *                                                                       *
    -00003  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
    -00004  * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
    -00005  *                                                                       *
    -00006  * This library is free software; you can redistribute it and/or         *
    -00007  * modify it under the terms of EITHER:                                  *
    -00008  *   (1) The GNU Lesser General Public License as published by the Free  *
    -00009  *       Software Foundation; either version 2.1 of the License, or (at  *
    -00010  *       your option) any later version. The text of the GNU Lesser      *
    -00011  *       General Public License is included with this library in the     *
    -00012  *       file LICENSE.TXT.                                               *
    -00013  *   (2) The BSD-style license that is included with this library in     *
    -00014  *       the file LICENSE-BSD.TXT.                                       *
    -00015  *                                                                       *
    -00016  * This library is distributed in the hope that it will be useful,       *
    -00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
    -00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
    -00019  * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
    -00020  *                                                                       *
    -00021  *************************************************************************/
    -00022 
    -00023 #ifndef __VERSION_H
    -00024 #define __VERSION_H
    -00025 
    -00026 /* high byte is major version, low byte is minor version */
    -00027 #define DS_VERSION 0x0002
    -00028 
    -00029 #endif
    -

    Generated on Fri Oct 12 08:36:51 2007 for Open Dynamics Engine by  - -doxygen 1.5.3
    - - diff --git a/libraries/ode-0.9/drawstuff/Makefile.am b/libraries/ode-0.9/drawstuff/Makefile.am deleted file mode 100644 index 2993d0b475..0000000000 --- a/libraries/ode-0.9/drawstuff/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = src dstest \ No newline at end of file diff --git a/libraries/ode-0.9/drawstuff/Makefile.in b/libraries/ode-0.9/drawstuff/Makefile.in deleted file mode 100644 index 974102bb2a..0000000000 --- a/libraries/ode-0.9/drawstuff/Makefile.in +++ /dev/null @@ -1,488 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = drawstuff -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = src dstest -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign drawstuff/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign drawstuff/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic ctags \ - ctags-recursive distclean distclean-generic distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-recursive uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/drawstuff/dstest/Makefile.am b/libraries/ode-0.9/drawstuff/dstest/Makefile.am deleted file mode 100644 index 9d74664511..0000000000 --- a/libraries/ode-0.9/drawstuff/dstest/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -noinst_PROGRAMS= dstest -dstest_CXXFLAGS = -I$(top_srcdir)/include -I$(top_builddir) - -dstest_SOURCES= dstest.cpp -dstest_DEPENDENCIES=$(top_builddir)/drawstuff/src/libdrawstuff.a -dstest_LDFLAGS = -L$(top_builddir)/drawstuff/src -dstest_LDADD=-ldrawstuff @LDFLAGS@ @GL_LIBS@ @LIBS@ -if WIN32 -dstest_DEPENDENCIES+=resources.o -resources.o: ../src/resources.rc ../src/resource.h - @WINDRES@ ../src/resources.rc -o resources.o -dstest_LDADD+= resources.o -endif diff --git a/libraries/ode-0.9/drawstuff/dstest/Makefile.in b/libraries/ode-0.9/drawstuff/dstest/Makefile.in deleted file mode 100644 index 0b7aed3443..0000000000 --- a/libraries/ode-0.9/drawstuff/dstest/Makefile.in +++ /dev/null @@ -1,446 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -noinst_PROGRAMS = dstest$(EXEEXT) -@WIN32_TRUE@am__append_1 = resources.o -@WIN32_TRUE@am__append_2 = resources.o -subdir = drawstuff/dstest -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_dstest_OBJECTS = dstest-dstest.$(OBJEXT) -dstest_OBJECTS = $(am_dstest_OBJECTS) -dstest_LINK = $(CXXLD) $(dstest_CXXFLAGS) $(CXXFLAGS) \ - $(dstest_LDFLAGS) $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I. -I$(top_builddir)/include/ode@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ - -o $@ -SOURCES = $(dstest_SOURCES) -DIST_SOURCES = $(dstest_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -dstest_CXXFLAGS = -I$(top_srcdir)/include -I$(top_builddir) -dstest_SOURCES = dstest.cpp -dstest_DEPENDENCIES = $(top_builddir)/drawstuff/src/libdrawstuff.a \ - $(am__append_1) -dstest_LDFLAGS = -L$(top_builddir)/drawstuff/src -dstest_LDADD = -ldrawstuff @LDFLAGS@ @GL_LIBS@ @LIBS@ $(am__append_2) -all: all-am - -.SUFFIXES: -.SUFFIXES: .cpp .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign drawstuff/dstest/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign drawstuff/dstest/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -dstest$(EXEEXT): $(dstest_OBJECTS) $(dstest_DEPENDENCIES) - @rm -f dstest$(EXEEXT) - $(dstest_LINK) $(dstest_OBJECTS) $(dstest_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dstest-dstest.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -dstest-dstest.o: dstest.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -MT dstest-dstest.o -MD -MP -MF $(DEPDIR)/dstest-dstest.Tpo -c -o dstest-dstest.o `test -f 'dstest.cpp' || echo '$(srcdir)/'`dstest.cpp -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dstest-dstest.Tpo $(DEPDIR)/dstest-dstest.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dstest.cpp' object='dstest-dstest.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -c -o dstest-dstest.o `test -f 'dstest.cpp' || echo '$(srcdir)/'`dstest.cpp - -dstest-dstest.obj: dstest.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -MT dstest-dstest.obj -MD -MP -MF $(DEPDIR)/dstest-dstest.Tpo -c -o dstest-dstest.obj `if test -f 'dstest.cpp'; then $(CYGPATH_W) 'dstest.cpp'; else $(CYGPATH_W) '$(srcdir)/dstest.cpp'; fi` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/dstest-dstest.Tpo $(DEPDIR)/dstest-dstest.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='dstest.cpp' object='dstest-dstest.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dstest_CXXFLAGS) $(CXXFLAGS) -c -o dstest-dstest.obj `if test -f 'dstest.cpp'; then $(CYGPATH_W) 'dstest.cpp'; else $(CYGPATH_W) '$(srcdir)/dstest.cpp'; fi` - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-noinstPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am - -@WIN32_TRUE@resources.o: ../src/resources.rc ../src/resource.h -@WIN32_TRUE@ @WINDRES@ ../src/resources.rc -o resources.o -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/drawstuff/dstest/dstest.cpp b/libraries/ode-0.9/drawstuff/dstest/dstest.cpp deleted file mode 100644 index 27f042fc7e..0000000000 --- a/libraries/ode-0.9/drawstuff/dstest/dstest.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include -#include -#include - - -#ifndef M_PI -#define M_PI (3.14159265358979323846) -#endif - - -void start() -{ - // adjust the starting viewpoint a bit - float xyz[3],hpr[3]; - dsGetViewpoint (xyz,hpr); - hpr[0] += 7; - dsSetViewpoint (xyz,hpr); -} - - -void simLoop (int pause) -{ - float pos[3]; - float R[12]; - static float a = 0; - - if (!pause) a += 0.02f; - if (a > (2*M_PI)) a -= (float) (2*M_PI); - float ca = (float) cos(a); - float sa = (float) sin(a); - - dsSetTexture (DS_WOOD); - - float b = (a > M_PI) ? (2*(a-(float)M_PI)) : a*2; - pos[0] = -0.3f; - pos[1] = 0; - pos[2] = (float) (0.1f*(2*M_PI*b - b*b) + 0.65f); - R[0] = ca; R[1] = 0; R[2] = -sa; - R[4] = 0; R[5] = 1; R[6] = 0; - R[8] = sa; R[9] = 0; R[10] = ca; - dsSetColor (1,0.8f,0.6f); - dsDrawSphere (pos,R,0.3f); - - dsSetTexture (DS_NONE); - - pos[0] = -0.2f; - pos[1] = 0.8f; - pos[2] = 0.4f; - R[0] = ca; R[1] = -sa; R[2] = 0; - R[4] = sa; R[5] = ca; R[6] = 0; - R[8] = 0; R[9] = 0; R[10] = 1; - float sides[3] = {0.1f,0.4f,0.8f}; - dsSetColor (0.6f,0.6f,1); - dsDrawBox (pos,R,sides); - - dsSetTexture (DS_WOOD); - - float r = 0.3f; // cylinder radius - float d = (float)cos(a*2) * 0.4f; - float cd = (float)cos(-d/r); - float sd = (float)sin(-d/r); - pos[0] = -0.2f; - pos[1] = -1 + d; - pos[2] = 0.3f; - R[0] = 0; R[1] = 0; R[2] = -1; - R[4] = -sd; R[5] = cd; R[6] = 0; - R[8] = cd; R[9] = sd; R[10] = 0; - dsSetColor (0.4f,1,1); - dsDrawCylinder (pos,R,0.8f,r); - - pos[0] = 0; - pos[1] = 0; - pos[2] = 0.2f; - R[0] = 0; R[1] = sa; R[2] = -ca; - R[4] = 0; R[5] = ca; R[6] = sa; - R[8] = 1; R[9] = 0; R[10] = 0; - dsSetColor (1,0.9f,0.2f); - dsDrawCappedCylinder (pos,R,0.8f,0.2f); -} - - -void command (int cmd) -{ - dsPrint ("received command %d (`%c')\n",cmd,cmd); -} - - -int main (int argc, char **argv) -{ - // setup pointers to callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = command; - fn.stop = 0; - fn.path_to_textures = 0; // uses default - - // run simulation - dsSimulationLoop (argc,argv,400,400,&fn); - - return 0; -} diff --git a/libraries/ode-0.9/drawstuff/src/Makefile.am b/libraries/ode-0.9/drawstuff/src/Makefile.am deleted file mode 100644 index ed9b2f5b64..0000000000 --- a/libraries/ode-0.9/drawstuff/src/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# We build drawstuff as a non libtool static library manually -# so it doesn't get installed when 'make install' is called, -# drawstuff is meant as an aid for testing and not as a full -# rendering library. - -noinst_LIBRARIES = libdrawstuff.a -libdrawstuff_a_SOURCES = drawstuff.cpp internal.h -libdrawstuff_a_CXXFLAGS = @ARCHFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include - -# libdrawstuff_a_LIBADD = @GL_LIBS@ - -if WIN32 -libdrawstuff_a_SOURCES+= windows.cpp -endif -if X11 -libdrawstuff_a_SOURCES+= x11.cpp -endif -if OSX -libdrawstuff_a_SOURCES+= osx.cpp -endif - diff --git a/libraries/ode-0.9/drawstuff/src/Makefile.in b/libraries/ode-0.9/drawstuff/src/Makefile.in deleted file mode 100644 index 0e0f633f54..0000000000 --- a/libraries/ode-0.9/drawstuff/src/Makefile.in +++ /dev/null @@ -1,507 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# We build drawstuff as a non libtool static library manually -# so it doesn't get installed when 'make install' is called, -# drawstuff is meant as an aid for testing and not as a full -# rendering library. - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ - -# libdrawstuff_a_LIBADD = @GL_LIBS@ -@WIN32_TRUE@am__append_1 = windows.cpp -@X11_TRUE@am__append_2 = x11.cpp -@OSX_TRUE@am__append_3 = osx.cpp -subdir = drawstuff/src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -AR = ar -ARFLAGS = cru -libdrawstuff_a_AR = $(AR) $(ARFLAGS) -libdrawstuff_a_LIBADD = -am__libdrawstuff_a_SOURCES_DIST = drawstuff.cpp internal.h windows.cpp \ - x11.cpp osx.cpp -@WIN32_TRUE@am__objects_1 = libdrawstuff_a-windows.$(OBJEXT) -@X11_TRUE@am__objects_2 = libdrawstuff_a-x11.$(OBJEXT) -@OSX_TRUE@am__objects_3 = libdrawstuff_a-osx.$(OBJEXT) -am_libdrawstuff_a_OBJECTS = libdrawstuff_a-drawstuff.$(OBJEXT) \ - $(am__objects_1) $(am__objects_2) $(am__objects_3) -libdrawstuff_a_OBJECTS = $(am_libdrawstuff_a_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(top_builddir)/include/ode@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ - -o $@ -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libdrawstuff_a_SOURCES) -DIST_SOURCES = $(am__libdrawstuff_a_SOURCES_DIST) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LIBRARIES = libdrawstuff.a -libdrawstuff_a_SOURCES = drawstuff.cpp internal.h $(am__append_1) \ - $(am__append_2) $(am__append_3) -libdrawstuff_a_CXXFLAGS = @ARCHFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include -all: all-am - -.SUFFIXES: -.SUFFIXES: .cpp .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign drawstuff/src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign drawstuff/src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libdrawstuff.a: $(libdrawstuff_a_OBJECTS) $(libdrawstuff_a_DEPENDENCIES) - -rm -f libdrawstuff.a - $(libdrawstuff_a_AR) libdrawstuff.a $(libdrawstuff_a_OBJECTS) $(libdrawstuff_a_LIBADD) - $(RANLIB) libdrawstuff.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-drawstuff.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-osx.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-windows.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdrawstuff_a-x11.Po@am__quote@ - -.cpp.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -libdrawstuff_a-drawstuff.o: drawstuff.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-drawstuff.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo -c -o libdrawstuff_a-drawstuff.o `test -f 'drawstuff.cpp' || echo '$(srcdir)/'`drawstuff.cpp -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo $(DEPDIR)/libdrawstuff_a-drawstuff.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drawstuff.cpp' object='libdrawstuff_a-drawstuff.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-drawstuff.o `test -f 'drawstuff.cpp' || echo '$(srcdir)/'`drawstuff.cpp - -libdrawstuff_a-drawstuff.obj: drawstuff.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-drawstuff.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo -c -o libdrawstuff_a-drawstuff.obj `if test -f 'drawstuff.cpp'; then $(CYGPATH_W) 'drawstuff.cpp'; else $(CYGPATH_W) '$(srcdir)/drawstuff.cpp'; fi` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-drawstuff.Tpo $(DEPDIR)/libdrawstuff_a-drawstuff.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drawstuff.cpp' object='libdrawstuff_a-drawstuff.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-drawstuff.obj `if test -f 'drawstuff.cpp'; then $(CYGPATH_W) 'drawstuff.cpp'; else $(CYGPATH_W) '$(srcdir)/drawstuff.cpp'; fi` - -libdrawstuff_a-windows.o: windows.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-windows.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-windows.Tpo -c -o libdrawstuff_a-windows.o `test -f 'windows.cpp' || echo '$(srcdir)/'`windows.cpp -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-windows.Tpo $(DEPDIR)/libdrawstuff_a-windows.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='windows.cpp' object='libdrawstuff_a-windows.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-windows.o `test -f 'windows.cpp' || echo '$(srcdir)/'`windows.cpp - -libdrawstuff_a-windows.obj: windows.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-windows.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-windows.Tpo -c -o libdrawstuff_a-windows.obj `if test -f 'windows.cpp'; then $(CYGPATH_W) 'windows.cpp'; else $(CYGPATH_W) '$(srcdir)/windows.cpp'; fi` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-windows.Tpo $(DEPDIR)/libdrawstuff_a-windows.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='windows.cpp' object='libdrawstuff_a-windows.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-windows.obj `if test -f 'windows.cpp'; then $(CYGPATH_W) 'windows.cpp'; else $(CYGPATH_W) '$(srcdir)/windows.cpp'; fi` - -libdrawstuff_a-x11.o: x11.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-x11.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-x11.Tpo -c -o libdrawstuff_a-x11.o `test -f 'x11.cpp' || echo '$(srcdir)/'`x11.cpp -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-x11.Tpo $(DEPDIR)/libdrawstuff_a-x11.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='x11.cpp' object='libdrawstuff_a-x11.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-x11.o `test -f 'x11.cpp' || echo '$(srcdir)/'`x11.cpp - -libdrawstuff_a-x11.obj: x11.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-x11.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-x11.Tpo -c -o libdrawstuff_a-x11.obj `if test -f 'x11.cpp'; then $(CYGPATH_W) 'x11.cpp'; else $(CYGPATH_W) '$(srcdir)/x11.cpp'; fi` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-x11.Tpo $(DEPDIR)/libdrawstuff_a-x11.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='x11.cpp' object='libdrawstuff_a-x11.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-x11.obj `if test -f 'x11.cpp'; then $(CYGPATH_W) 'x11.cpp'; else $(CYGPATH_W) '$(srcdir)/x11.cpp'; fi` - -libdrawstuff_a-osx.o: osx.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-osx.o -MD -MP -MF $(DEPDIR)/libdrawstuff_a-osx.Tpo -c -o libdrawstuff_a-osx.o `test -f 'osx.cpp' || echo '$(srcdir)/'`osx.cpp -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-osx.Tpo $(DEPDIR)/libdrawstuff_a-osx.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='osx.cpp' object='libdrawstuff_a-osx.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-osx.o `test -f 'osx.cpp' || echo '$(srcdir)/'`osx.cpp - -libdrawstuff_a-osx.obj: osx.cpp -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -MT libdrawstuff_a-osx.obj -MD -MP -MF $(DEPDIR)/libdrawstuff_a-osx.Tpo -c -o libdrawstuff_a-osx.obj `if test -f 'osx.cpp'; then $(CYGPATH_W) 'osx.cpp'; else $(CYGPATH_W) '$(srcdir)/osx.cpp'; fi` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libdrawstuff_a-osx.Tpo $(DEPDIR)/libdrawstuff_a-osx.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='osx.cpp' object='libdrawstuff_a-osx.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libdrawstuff_a_CXXFLAGS) $(CXXFLAGS) -c -o libdrawstuff_a-osx.obj `if test -f 'osx.cpp'; then $(CYGPATH_W) 'osx.cpp'; else $(CYGPATH_W) '$(srcdir)/osx.cpp'; fi` - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-noinstLIBRARIES ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/drawstuff/src/drawstuff.cpp b/libraries/ode-0.9/drawstuff/src/drawstuff.cpp deleted file mode 100644 index f588266f8c..0000000000 --- a/libraries/ode-0.9/drawstuff/src/drawstuff.cpp +++ /dev/null @@ -1,1597 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -simple graphics. - -the following command line flags can be used (typically under unix) - -notex Do not use any textures - -noshadow[s] Do not draw any shadows - -pause Start the simulation paused - -TODO ----- - -manage openGL state changes better - -*/ - -#ifdef WIN32 -#include -#endif - -#include -#ifdef HAVE_APPLE_OPENGL_FRAMEWORK -#include -#include -#else -#include -#include -#endif - -#include "drawstuff/drawstuff.h" -#include "internal.h" - -//*************************************************************************** -// misc - -#ifdef WIN32 -#define DEFAULT_PATH_TO_TEXTURES "..\\textures\\" -#else -#define DEFAULT_PATH_TO_TEXTURES "../textures/" -#endif - -#ifndef M_PI -#define M_PI (3.14159265358979323846) -#endif - -// constants to convert degrees to radians and the reverse -#define RAD_TO_DEG (180.0/M_PI) -#define DEG_TO_RAD (M_PI/180.0) - -// light vector. LIGHTZ is implicitly 1 -#define LIGHTX (1.0f) -#define LIGHTY (0.4f) - -// ground and sky -#define SHADOW_INTENSITY (0.65f) -#define GROUND_R (0.5f) // ground color for when there's no texture -#define GROUND_G (0.5f) -#define GROUND_B (0.3f) - -const float ground_scale = 1.0f/1.0f; // ground texture scale (1/size) -const float ground_ofsx = 0.5; // offset of ground texture -const float ground_ofsy = 0.5; -const float sky_scale = 1.0f/4.0f; // sky texture scale (1/size) -const float sky_height = 1.0f; // sky height above viewpoint - -//*************************************************************************** -// misc mathematics stuff - -#define dCROSS(a,op,b,c) \ - (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \ - (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \ - (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]); - - -inline float dDOT (const float *a, const float *b) - { return ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2]); } - - -static void normalizeVector3 (float v[3]) -{ - float len = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; - if (len <= 0.0f) { - v[0] = 1; - v[1] = 0; - v[2] = 0; - } - else { - len = 1.0f / (float)sqrt(len); - v[0] *= len; - v[1] *= len; - v[2] *= len; - } -} - -//*************************************************************************** -// PPM image object - -typedef unsigned char byte; - -class Image { - int image_width,image_height; - byte *image_data; -public: - Image (char *filename); - // load from PPM file - ~Image(); - int width() { return image_width; } - int height() { return image_height; } - byte *data() { return image_data; } -}; - - -// skip over whitespace and comments in a stream. - -static void skipWhiteSpace (char *filename, FILE *f) -{ - int c,d; - for(;;) { - c = fgetc(f); - if (c==EOF) dsError ("unexpected end of file in \"%s\"",filename); - - // skip comments - if (c == '#') { - do { - d = fgetc(f); - if (d==EOF) dsError ("unexpected end of file in \"%s\"",filename); - } while (d != '\n'); - continue; - } - - if (c > ' ') { - ungetc (c,f); - return; - } - } -} - - -// read a number from a stream, this return 0 if there is none (that's okay -// because 0 is a bad value for all PPM numbers anyway). - -static int readNumber (char *filename, FILE *f) -{ - int c,n=0; - for(;;) { - c = fgetc(f); - if (c==EOF) dsError ("unexpected end of file in \"%s\"",filename); - if (c >= '0' && c <= '9') n = n*10 + (c - '0'); - else { - ungetc (c,f); - return n; - } - } -} - - -Image::Image (char *filename) -{ - FILE *f = fopen (filename,"rb"); - if (!f) dsError ("Can't open image file `%s'",filename); - - // read in header - if (fgetc(f) != 'P' || fgetc(f) != '6') - dsError ("image file \"%s\" is not a binary PPM (no P6 header)",filename); - skipWhiteSpace (filename,f); - - // read in image parameters - image_width = readNumber (filename,f); - skipWhiteSpace (filename,f); - image_height = readNumber (filename,f); - skipWhiteSpace (filename,f); - int max_value = readNumber (filename,f); - - // check values - if (image_width < 1 || image_height < 1) - dsError ("bad image file \"%s\"",filename); - if (max_value != 255) - dsError ("image file \"%s\" must have color range of 255",filename); - - // read either nothing, LF (10), or CR,LF (13,10) - int c = fgetc(f); - if (c == 10) { - // LF - } - else if (c == 13) { - // CR - c = fgetc(f); - if (c != 10) ungetc (c,f); - } - else ungetc (c,f); - - // read in rest of data - image_data = new byte [image_width*image_height*3]; - if (fread (image_data,image_width*image_height*3,1,f) != 1) - dsError ("Can not read data from image file `%s'",filename); - fclose (f); -} - - -Image::~Image() -{ - delete[] image_data; -} - -//*************************************************************************** -// Texture object. - -class Texture { - Image *image; - GLuint name; -public: - Texture (char *filename); - ~Texture(); - void bind (int modulate); -}; - - -Texture::Texture (char *filename) -{ - image = new Image (filename); - glGenTextures (1,&name); - glBindTexture (GL_TEXTURE_2D,name); - - // set pixel unpacking mode - glPixelStorei (GL_UNPACK_SWAP_BYTES, 0); - glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); - glPixelStorei (GL_UNPACK_ALIGNMENT, 1); - glPixelStorei (GL_UNPACK_SKIP_ROWS, 0); - glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0); - - // glTexImage2D (GL_TEXTURE_2D, 0, 3, image->width(), image->height(), 0, - // GL_RGB, GL_UNSIGNED_BYTE, image->data()); - gluBuild2DMipmaps (GL_TEXTURE_2D, 3, image->width(), image->height(), - GL_RGB, GL_UNSIGNED_BYTE, image->data()); - - // set texture parameters - will these also be bound to the texture??? - glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - - glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_LINEAR_MIPMAP_LINEAR); - - glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); -} - - -Texture::~Texture() -{ - delete image; - glDeleteTextures (1,&name); -} - - -void Texture::bind (int modulate) -{ - glBindTexture (GL_TEXTURE_2D,name); - glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, - modulate ? GL_MODULATE : GL_DECAL); -} - -//*************************************************************************** -// the current drawing state (for when the user's step function is drawing) - -static float color[4] = {0,0,0,0}; // current r,g,b,alpha color -static int tnum = 0; // current texture number - -//*************************************************************************** -// OpenGL utility stuff - -static void setCamera (float x, float y, float z, float h, float p, float r) -{ - glMatrixMode (GL_MODELVIEW); - glLoadIdentity(); - glRotatef (90, 0,0,1); - glRotatef (90, 0,1,0); - glRotatef (r, 1,0,0); - glRotatef (p, 0,1,0); - glRotatef (-h, 0,0,1); - glTranslatef (-x,-y,-z); -} - - -// sets the material color, not the light color - -static void setColor (float r, float g, float b, float alpha) -{ - GLfloat light_ambient[4],light_diffuse[4],light_specular[4]; - light_ambient[0] = r*0.3f; - light_ambient[1] = g*0.3f; - light_ambient[2] = b*0.3f; - light_ambient[3] = alpha; - light_diffuse[0] = r*0.7f; - light_diffuse[1] = g*0.7f; - light_diffuse[2] = b*0.7f; - light_diffuse[3] = alpha; - light_specular[0] = r*0.2f; - light_specular[1] = g*0.2f; - light_specular[2] = b*0.2f; - light_specular[3] = alpha; - glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, light_ambient); - glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, light_diffuse); - glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, light_specular); - glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 5.0f); -} - - -static void setTransform (const float pos[3], const float R[12]) -{ - GLfloat matrix[16]; - matrix[0]=R[0]; - matrix[1]=R[4]; - matrix[2]=R[8]; - matrix[3]=0; - matrix[4]=R[1]; - matrix[5]=R[5]; - matrix[6]=R[9]; - matrix[7]=0; - matrix[8]=R[2]; - matrix[9]=R[6]; - matrix[10]=R[10]; - matrix[11]=0; - matrix[12]=pos[0]; - matrix[13]=pos[1]; - matrix[14]=pos[2]; - matrix[15]=1; - glPushMatrix(); - glMultMatrixf (matrix); -} -static void setTransformD (const double pos[3], const double R[12]) -{ - GLdouble matrix[16]; - matrix[0]=R[0]; - matrix[1]=R[4]; - matrix[2]=R[8]; - matrix[3]=0; - matrix[4]=R[1]; - matrix[5]=R[5]; - matrix[6]=R[9]; - matrix[7]=0; - matrix[8]=R[2]; - matrix[9]=R[6]; - matrix[10]=R[10]; - matrix[11]=0; - matrix[12]=pos[0]; - matrix[13]=pos[1]; - matrix[14]=pos[2]; - matrix[15]=1; - glPushMatrix(); - glMultMatrixd (matrix); -} - - -// set shadow projection transform - -static void setShadowTransform() -{ - GLfloat matrix[16]; - for (int i=0; i<16; i++) matrix[i] = 0; - matrix[0]=1; - matrix[5]=1; - matrix[8]=-LIGHTX; - matrix[9]=-LIGHTY; - matrix[15]=1; - glPushMatrix(); - glMultMatrixf (matrix); -} - -static void drawConvex (float *_planes,unsigned int _planecount, - float *_points, - unsigned int _pointcount, - unsigned int *_polygons) -{ - unsigned int polyindex=0; - for(unsigned int i=0;i<_planecount;++i) - { - unsigned int pointcount=_polygons[polyindex]; - polyindex++; - glBegin (GL_POLYGON); - glNormal3f(_planes[(i*4)+0], - _planes[(i*4)+1], - _planes[(i*4)+2]); - for(unsigned int j=0;j 0) { - float q1[3],q2[3],q3[3]; // sub-vertices - for (i=0; i<3; i++) { - q1[i] = 0.5f*(p1[i]+p2[i]); - q2[i] = 0.5f*(p2[i]+p3[i]); - q3[i] = 0.5f*(p3[i]+p1[i]); - } - float length1 = (float)(1.0/sqrt(q1[0]*q1[0]+q1[1]*q1[1]+q1[2]*q1[2])); - float length2 = (float)(1.0/sqrt(q2[0]*q2[0]+q2[1]*q2[1]+q2[2]*q2[2])); - float length3 = (float)(1.0/sqrt(q3[0]*q3[0]+q3[1]*q3[1]+q3[2]*q3[2])); - for (i=0; i<3; i++) { - q1[i] *= length1; - q2[i] *= length2; - q3[i] *= length3; - } - drawPatch (p1,q1,q3,level-1); - drawPatch (q1,p2,q2,level-1); - drawPatch (q1,q2,q3,level-1); - drawPatch (q3,q2,p3,level-1); - } - else { - glNormal3f (p1[0],p1[1],p1[2]); - glVertex3f (p1[0],p1[1],p1[2]); - glNormal3f (p2[0],p2[1],p2[2]); - glVertex3f (p2[0],p2[1],p2[2]); - glNormal3f (p3[0],p3[1],p3[2]); - glVertex3f (p3[0],p3[1],p3[2]); - } -} - - -// draw a sphere of radius 1 - -static int sphere_quality = 1; - -static void drawSphere() -{ - // icosahedron data for an icosahedron of radius 1.0 -# define ICX 0.525731112119133606f -# define ICZ 0.850650808352039932f - static GLfloat idata[12][3] = { - {-ICX, 0, ICZ}, - {ICX, 0, ICZ}, - {-ICX, 0, -ICZ}, - {ICX, 0, -ICZ}, - {0, ICZ, ICX}, - {0, ICZ, -ICX}, - {0, -ICZ, ICX}, - {0, -ICZ, -ICX}, - {ICZ, ICX, 0}, - {-ICZ, ICX, 0}, - {ICZ, -ICX, 0}, - {-ICZ, -ICX, 0} - }; - - static int index[20][3] = { - {0, 4, 1}, {0, 9, 4}, - {9, 5, 4}, {4, 5, 8}, - {4, 8, 1}, {8, 10, 1}, - {8, 3, 10}, {5, 3, 8}, - {5, 2, 3}, {2, 7, 3}, - {7, 10, 3}, {7, 6, 10}, - {7, 11, 6}, {11, 0, 6}, - {0, 1, 6}, {6, 1, 10}, - {9, 0, 11}, {9, 11, 2}, - {9, 2, 5}, {7, 2, 11}, - }; - - static GLuint listnum = 0; - if (listnum==0) { - listnum = glGenLists (1); - glNewList (listnum,GL_COMPILE); - glBegin (GL_TRIANGLES); - for (int i=0; i<20; i++) { - drawPatch (&idata[index[i][2]][0],&idata[index[i][1]][0], - &idata[index[i][0]][0],sphere_quality); - } - glEnd(); - glEndList(); - } - glCallList (listnum); -} - - -static void drawSphereShadow (float px, float py, float pz, float radius) -{ - // calculate shadow constants based on light vector - static int init=0; - static float len2,len1,scale; - if (!init) { - len2 = LIGHTX*LIGHTX + LIGHTY*LIGHTY; - len1 = 1.0f/(float)sqrt(len2); - scale = (float) sqrt(len2 + 1); - init = 1; - } - - // map sphere center to ground plane based on light vector - px -= LIGHTX*pz; - py -= LIGHTY*pz; - - const float kx = 0.96592582628907f; - const float ky = 0.25881904510252f; - float x=radius, y=0; - - glBegin (GL_TRIANGLE_FAN); - for (int i=0; i<24; i++) { - // for all points on circle, scale to elongated rotated shadow and draw - float x2 = (LIGHTX*x*scale - LIGHTY*y)*len1 + px; - float y2 = (LIGHTY*x*scale + LIGHTX*y)*len1 + py; - glTexCoord2f (x2*ground_scale+ground_ofsx,y2*ground_scale+ground_ofsy); - glVertex3f (x2,y2,0); - - // rotate [x,y] vector - float xtmp = kx*x - ky*y; - y = ky*x + kx*y; - x = xtmp; - } - glEnd(); -} - - -static void drawTriangle (const float *v0, const float *v1, const float *v2, int solid) -{ - float u[3],v[3],normal[3]; - u[0] = v1[0] - v0[0]; - u[1] = v1[1] - v0[1]; - u[2] = v1[2] - v0[2]; - v[0] = v2[0] - v0[0]; - v[1] = v2[1] - v0[1]; - v[2] = v2[2] - v0[2]; - dCROSS (normal,=,u,v); - normalizeVector3 (normal); - - glBegin(solid ? GL_TRIANGLES : GL_LINE_STRIP); - glNormal3fv (normal); - glVertex3fv (v0); - glVertex3fv (v1); - glVertex3fv (v2); - glEnd(); -} - -static void drawTriangleD (const double *v0, const double *v1, const double *v2, int solid) -{ - float u[3],v[3],normal[3]; - u[0] = float( v1[0] - v0[0] ); - u[1] = float( v1[1] - v0[1] ); - u[2] = float( v1[2] - v0[2] ); - v[0] = float( v2[0] - v0[0] ); - v[1] = float( v2[1] - v0[1] ); - v[2] = float( v2[2] - v0[2] ); - dCROSS (normal,=,u,v); - normalizeVector3 (normal); - - glBegin(solid ? GL_TRIANGLES : GL_LINE_STRIP); - glNormal3fv (normal); - glVertex3dv (v0); - glVertex3dv (v1); - glVertex3dv (v2); - glEnd(); -} - - -// draw a capped cylinder of length l and radius r, aligned along the x axis - -static int capped_cylinder_quality = 3; - -static void drawCapsule (float l, float r) -{ - int i,j; - float tmp,nx,ny,nz,start_nx,start_ny,a,ca,sa; - // number of sides to the cylinder (divisible by 4): - const int n = capped_cylinder_quality*4; - - l *= 0.5; - a = float(M_PI*2.0)/float(n); - sa = (float) sin(a); - ca = (float) cos(a); - - // draw cylinder body - ny=1; nz=0; // normal vector = (0,ny,nz) - glBegin (GL_TRIANGLE_STRIP); - for (i=0; i<=n; i++) { - glNormal3d (ny,nz,0); - glVertex3d (ny*r,nz*r,l); - glNormal3d (ny,nz,0); - glVertex3d (ny*r,nz*r,-l); - // rotate ny,nz - tmp = ca*ny - sa*nz; - nz = sa*ny + ca*nz; - ny = tmp; - } - glEnd(); - - // draw first cylinder cap - start_nx = 0; - start_ny = 1; - for (j=0; j<(n/4); j++) { - // get start_n2 = rotated start_n - float start_nx2 = ca*start_nx + sa*start_ny; - float start_ny2 = -sa*start_nx + ca*start_ny; - // get n=start_n and n2=start_n2 - nx = start_nx; ny = start_ny; nz = 0; - float nx2 = start_nx2, ny2 = start_ny2, nz2 = 0; - glBegin (GL_TRIANGLE_STRIP); - for (i=0; i<=n; i++) { - glNormal3d (ny2,nz2,nx2); - glVertex3d (ny2*r,nz2*r,l+nx2*r); - glNormal3d (ny,nz,nx); - glVertex3d (ny*r,nz*r,l+nx*r); - // rotate n,n2 - tmp = ca*ny - sa*nz; - nz = sa*ny + ca*nz; - ny = tmp; - tmp = ca*ny2- sa*nz2; - nz2 = sa*ny2 + ca*nz2; - ny2 = tmp; - } - glEnd(); - start_nx = start_nx2; - start_ny = start_ny2; - } - - // draw second cylinder cap - start_nx = 0; - start_ny = 1; - for (j=0; j<(n/4); j++) { - // get start_n2 = rotated start_n - float start_nx2 = ca*start_nx - sa*start_ny; - float start_ny2 = sa*start_nx + ca*start_ny; - // get n=start_n and n2=start_n2 - nx = start_nx; ny = start_ny; nz = 0; - float nx2 = start_nx2, ny2 = start_ny2, nz2 = 0; - glBegin (GL_TRIANGLE_STRIP); - for (i=0; i<=n; i++) { - glNormal3d (ny,nz,nx); - glVertex3d (ny*r,nz*r,-l+nx*r); - glNormal3d (ny2,nz2,nx2); - glVertex3d (ny2*r,nz2*r,-l+nx2*r); - // rotate n,n2 - tmp = ca*ny - sa*nz; - nz = sa*ny + ca*nz; - ny = tmp; - tmp = ca*ny2- sa*nz2; - nz2 = sa*ny2 + ca*nz2; - ny2 = tmp; - } - glEnd(); - start_nx = start_nx2; - start_ny = start_ny2; - } - - glPopMatrix(); -} - - -// draw a cylinder of length l and radius r, aligned along the z axis - -static void drawCylinder (float l, float r, float zoffset) -{ - int i; - float tmp,ny,nz,a,ca,sa; - const int n = 24; // number of sides to the cylinder (divisible by 4) - - l *= 0.5; - a = float(M_PI*2.0)/float(n); - sa = (float) sin(a); - ca = (float) cos(a); - - // draw cylinder body - ny=1; nz=0; // normal vector = (0,ny,nz) - glBegin (GL_TRIANGLE_STRIP); - for (i=0; i<=n; i++) { - glNormal3d (ny,nz,0); - glVertex3d (ny*r,nz*r,l+zoffset); - glNormal3d (ny,nz,0); - glVertex3d (ny*r,nz*r,-l+zoffset); - // rotate ny,nz - tmp = ca*ny - sa*nz; - nz = sa*ny + ca*nz; - ny = tmp; - } - glEnd(); - - // draw top cap - glShadeModel (GL_FLAT); - ny=1; nz=0; // normal vector = (0,ny,nz) - glBegin (GL_TRIANGLE_FAN); - glNormal3d (0,0,1); - glVertex3d (0,0,l+zoffset); - for (i=0; i<=n; i++) { - if (i==1 || i==n/2+1) - setColor (color[0]*0.75f,color[1]*0.75f,color[2]*0.75f,color[3]); - glNormal3d (0,0,1); - glVertex3d (ny*r,nz*r,l+zoffset); - if (i==1 || i==n/2+1) - setColor (color[0],color[1],color[2],color[3]); - - // rotate ny,nz - tmp = ca*ny - sa*nz; - nz = sa*ny + ca*nz; - ny = tmp; - } - glEnd(); - - // draw bottom cap - ny=1; nz=0; // normal vector = (0,ny,nz) - glBegin (GL_TRIANGLE_FAN); - glNormal3d (0,0,-1); - glVertex3d (0,0,-l+zoffset); - for (i=0; i<=n; i++) { - if (i==1 || i==n/2+1) - setColor (color[0]*0.75f,color[1]*0.75f,color[2]*0.75f,color[3]); - glNormal3d (0,0,-1); - glVertex3d (ny*r,nz*r,-l+zoffset); - if (i==1 || i==n/2+1) - setColor (color[0],color[1],color[2],color[3]); - - // rotate ny,nz - tmp = ca*ny + sa*nz; - nz = -sa*ny + ca*nz; - ny = tmp; - } - glEnd(); -} - -//*************************************************************************** -// motion model - -// current camera position and orientation -static float view_xyz[3]; // position x,y,z -static float view_hpr[3]; // heading, pitch, roll (degrees) - - -// initialize the above variables - -static void initMotionModel() -{ - view_xyz[0] = 2; - view_xyz[1] = 0; - view_xyz[2] = 1; - view_hpr[0] = 180; - view_hpr[1] = 0; - view_hpr[2] = 0; -} - - -static void wrapCameraAngles() -{ - for (int i=0; i<3; i++) { - while (view_hpr[i] > 180) view_hpr[i] -= 360; - while (view_hpr[i] < -180) view_hpr[i] += 360; - } -} - - -// call this to update the current camera position. the bits in `mode' say -// if the left (1), middle (2) or right (4) mouse button is pressed, and -// (deltax,deltay) is the amount by which the mouse pointer has moved. - -void dsMotion (int mode, int deltax, int deltay) -{ - float side = 0.01f * float(deltax); - float fwd = (mode==4) ? (0.01f * float(deltay)) : 0.0f; - float s = (float) sin (view_hpr[0]*DEG_TO_RAD); - float c = (float) cos (view_hpr[0]*DEG_TO_RAD); - - if (mode==1) { - view_hpr[0] += float (deltax) * 0.5f; - view_hpr[1] += float (deltay) * 0.5f; - } - else { - view_xyz[0] += -s*side + c*fwd; - view_xyz[1] += c*side + s*fwd; - if (mode==2 || mode==5) view_xyz[2] += 0.01f * float(deltay); - } - wrapCameraAngles(); -} - -//*************************************************************************** -// drawing loop stuff - -// the current state: -// 0 = uninitialized -// 1 = dsSimulationLoop() called -// 2 = dsDrawFrame() called -static int current_state = 0; - -// textures and shadows -static int use_textures=1; // 1 if textures to be drawn -static int use_shadows=1; // 1 if shadows to be drawn -static Texture *sky_texture = 0; -static Texture *ground_texture = 0; -static Texture *wood_texture = 0; - - -#ifndef macintosh - -void dsStartGraphics (int width, int height, dsFunctions *fn) -{ - char *prefix = DEFAULT_PATH_TO_TEXTURES; - if (fn->version >= 2 && fn->path_to_textures) prefix = fn->path_to_textures; - char *s = (char*) alloca (strlen(prefix) + 20); - - strcpy (s,prefix); - strcat (s,"/sky.ppm"); - sky_texture = new Texture (s); - - strcpy (s,prefix); - strcat (s,"/ground.ppm"); - ground_texture = new Texture (s); - - strcpy (s,prefix); - strcat (s,"/wood.ppm"); - wood_texture = new Texture (s); -} - -#else // macintosh - -void dsStartGraphics (int width, int height, dsFunctions *fn) -{ - // All examples build into the same dir - char *prefix = "::::drawstuff:textures"; - char *s = (char*) alloca (strlen(prefix) + 20); - - strcpy (s,prefix); - strcat (s,":sky.ppm"); - sky_texture = new Texture (s); - - strcpy (s,prefix); - strcat (s,":ground.ppm"); - ground_texture = new Texture (s); - - strcpy (s,prefix); - strcat (s,":wood.ppm"); - wood_texture = new Texture (s); -} - -#endif - - -void dsStopGraphics() -{ - delete sky_texture; - delete ground_texture; - delete wood_texture; - sky_texture = 0; - ground_texture = 0; - wood_texture = 0; -} - - -static void drawSky (float view_xyz[3]) -{ - glDisable (GL_LIGHTING); - if (use_textures) { - glEnable (GL_TEXTURE_2D); - sky_texture->bind (0); - } - else { - glDisable (GL_TEXTURE_2D); - glColor3f (0,0.5,1.0); - } - - // make sure sky depth is as far back as possible - glShadeModel (GL_FLAT); - glEnable (GL_DEPTH_TEST); - glDepthFunc (GL_LEQUAL); - glDepthRange (1,1); - - const float ssize = 1000.0f; - static float offset = 0.0f; - - float x = ssize*sky_scale; - float z = view_xyz[2] + sky_height; - - glBegin (GL_QUADS); - glNormal3f (0,0,-1); - glTexCoord2f (-x+offset,-x+offset); - glVertex3f (-ssize+view_xyz[0],-ssize+view_xyz[1],z); - glTexCoord2f (-x+offset,x+offset); - glVertex3f (-ssize+view_xyz[0],ssize+view_xyz[1],z); - glTexCoord2f (x+offset,x+offset); - glVertex3f (ssize+view_xyz[0],ssize+view_xyz[1],z); - glTexCoord2f (x+offset,-x+offset); - glVertex3f (ssize+view_xyz[0],-ssize+view_xyz[1],z); - glEnd(); - - offset = offset + 0.002f; - if (offset > 1) offset -= 1; - - glDepthFunc (GL_LESS); - glDepthRange (0,1); -} - - -static void drawGround() -{ - glDisable (GL_LIGHTING); - glShadeModel (GL_FLAT); - glEnable (GL_DEPTH_TEST); - glDepthFunc (GL_LESS); - // glDepthRange (1,1); - - if (use_textures) { - glEnable (GL_TEXTURE_2D); - ground_texture->bind (0); - } - else { - glDisable (GL_TEXTURE_2D); - glColor3f (GROUND_R,GROUND_G,GROUND_B); - } - - // ground fog seems to cause problems with TNT2 under windows - /* - GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1}; - glEnable (GL_FOG); - glFogi (GL_FOG_MODE, GL_EXP2); - glFogfv (GL_FOG_COLOR, fogColor); - glFogf (GL_FOG_DENSITY, 0.05f); - glHint (GL_FOG_HINT, GL_NICEST); // GL_DONT_CARE); - glFogf (GL_FOG_START, 1.0); - glFogf (GL_FOG_END, 5.0); - */ - - const float gsize = 100.0f; - const float offset = 0; // -0.001f; ... polygon offsetting doesn't work well - - glBegin (GL_QUADS); - glNormal3f (0,0,1); - glTexCoord2f (-gsize*ground_scale + ground_ofsx, - -gsize*ground_scale + ground_ofsy); - glVertex3f (-gsize,-gsize,offset); - glTexCoord2f (gsize*ground_scale + ground_ofsx, - -gsize*ground_scale + ground_ofsy); - glVertex3f (gsize,-gsize,offset); - glTexCoord2f (gsize*ground_scale + ground_ofsx, - gsize*ground_scale + ground_ofsy); - glVertex3f (gsize,gsize,offset); - glTexCoord2f (-gsize*ground_scale + ground_ofsx, - gsize*ground_scale + ground_ofsy); - glVertex3f (-gsize,gsize,offset); - glEnd(); - - glDisable (GL_FOG); -} - - -static void drawPyramidGrid() -{ - // setup stuff - glEnable (GL_LIGHTING); - glDisable (GL_TEXTURE_2D); - glShadeModel (GL_FLAT); - glEnable (GL_DEPTH_TEST); - glDepthFunc (GL_LESS); - - // draw the pyramid grid - for (int i=-1; i<=1; i++) { - for (int j=-1; j<=1; j++) { - glPushMatrix(); - glTranslatef ((float)i,(float)j,(float)0); - if (i==1 && j==0) setColor (1,0,0,1); - else if (i==0 && j==1) setColor (0,0,1,1); - else setColor (1,1,0,1); - const float k = 0.03f; - glBegin (GL_TRIANGLE_FAN); - glNormal3f (0,-1,1); - glVertex3f (0,0,k); - glVertex3f (-k,-k,0); - glVertex3f ( k,-k,0); - glNormal3f (1,0,1); - glVertex3f ( k, k,0); - glNormal3f (0,1,1); - glVertex3f (-k, k,0); - glNormal3f (-1,0,1); - glVertex3f (-k,-k,0); - glEnd(); - glPopMatrix(); - } - } -} - - -void dsDrawFrame (int width, int height, dsFunctions *fn, int pause) -{ - if (current_state < 1) dsDebug ("internal error"); - current_state = 2; - - // setup stuff - glEnable (GL_LIGHTING); - glEnable (GL_LIGHT0); - glDisable (GL_TEXTURE_2D); - glDisable (GL_TEXTURE_GEN_S); - glDisable (GL_TEXTURE_GEN_T); - glShadeModel (GL_FLAT); - glEnable (GL_DEPTH_TEST); - glDepthFunc (GL_LESS); - glEnable (GL_CULL_FACE); - glCullFace (GL_BACK); - glFrontFace (GL_CCW); - - // setup viewport - glViewport (0,0,width,height); - glMatrixMode (GL_PROJECTION); - glLoadIdentity(); - const float vnear = 0.1f; - const float vfar = 100.0f; - const float k = 0.8f; // view scale, 1 = +/- 45 degrees - if (width >= height) { - float k2 = float(height)/float(width); - glFrustum (-vnear*k,vnear*k,-vnear*k*k2,vnear*k*k2,vnear,vfar); - } - else { - float k2 = float(width)/float(height); - glFrustum (-vnear*k*k2,vnear*k*k2,-vnear*k,vnear*k,vnear,vfar); - } - - // setup lights. it makes a difference whether this is done in the - // GL_PROJECTION matrix mode (lights are scene relative) or the - // GL_MODELVIEW matrix mode (lights are camera relative, bad!). - static GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1.0 }; - static GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; - static GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; - glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient); - glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse); - glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular); - glColor3f (1.0, 1.0, 1.0); - - // clear the window - glClearColor (0.5,0.5,0.5,0); - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // snapshot camera position (in MS Windows it is changed by the GUI thread) - float view2_xyz[3]; - float view2_hpr[3]; - memcpy (view2_xyz,view_xyz,sizeof(float)*3); - memcpy (view2_hpr,view_hpr,sizeof(float)*3); - - // go to GL_MODELVIEW matrix mode and set the camera - glMatrixMode (GL_MODELVIEW); - glLoadIdentity(); - setCamera (view2_xyz[0],view2_xyz[1],view2_xyz[2], - view2_hpr[0],view2_hpr[1],view2_hpr[2]); - - // set the light position (for some reason we have to do this in model view. - static GLfloat light_position[] = { LIGHTX, LIGHTY, 1.0, 0.0 }; - glLightfv (GL_LIGHT0, GL_POSITION, light_position); - - // draw the background (ground, sky etc) - drawSky (view2_xyz); - drawGround(); - - // draw the little markers on the ground - drawPyramidGrid(); - - // leave openGL in a known state - flat shaded white, no textures - glEnable (GL_LIGHTING); - glDisable (GL_TEXTURE_2D); - glShadeModel (GL_FLAT); - glEnable (GL_DEPTH_TEST); - glDepthFunc (GL_LESS); - glColor3f (1,1,1); - setColor (1,1,1,1); - - // draw the rest of the objects. set drawing state first. - color[0] = 1; - color[1] = 1; - color[2] = 1; - color[3] = 1; - tnum = 0; - if (fn->step) fn->step (pause); -} - - -int dsGetShadows() -{ - return use_shadows; -} - - -void dsSetShadows (int a) -{ - use_shadows = (a != 0); -} - - -int dsGetTextures() -{ - return use_textures; -} - - -void dsSetTextures (int a) -{ - use_textures = (a != 0); -} - -//*************************************************************************** -// C interface - -// sets lighting and texture modes, sets current color -static void setupDrawingMode() -{ - glEnable (GL_LIGHTING); - if (tnum) { - if (use_textures) { - glEnable (GL_TEXTURE_2D); - wood_texture->bind (1); - glEnable (GL_TEXTURE_GEN_S); - glEnable (GL_TEXTURE_GEN_T); - glTexGeni (GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); - glTexGeni (GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); - static GLfloat s_params[4] = {1.0f,1.0f,0.0f,1}; - static GLfloat t_params[4] = {0.817f,-0.817f,0.817f,1}; - glTexGenfv (GL_S,GL_OBJECT_PLANE,s_params); - glTexGenfv (GL_T,GL_OBJECT_PLANE,t_params); - } - else { - glDisable (GL_TEXTURE_2D); - } - } - else { - glDisable (GL_TEXTURE_2D); - } - setColor (color[0],color[1],color[2],color[3]); - - if (color[3] < 1) { - glEnable (GL_BLEND); - glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - } - else { - glDisable (GL_BLEND); - } -} - - -static void setShadowDrawingMode() -{ - glDisable (GL_LIGHTING); - if (use_textures) { - glEnable (GL_TEXTURE_2D); - ground_texture->bind (1); - glColor3f (SHADOW_INTENSITY,SHADOW_INTENSITY,SHADOW_INTENSITY); - glEnable (GL_TEXTURE_2D); - glEnable (GL_TEXTURE_GEN_S); - glEnable (GL_TEXTURE_GEN_T); - glTexGeni (GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); - glTexGeni (GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); - static GLfloat s_params[4] = {ground_scale,0,0,ground_ofsx}; - static GLfloat t_params[4] = {0,ground_scale,0,ground_ofsy}; - glTexGenfv (GL_S,GL_EYE_PLANE,s_params); - glTexGenfv (GL_T,GL_EYE_PLANE,t_params); - } - else { - glDisable (GL_TEXTURE_2D); - glColor3f (GROUND_R*SHADOW_INTENSITY,GROUND_G*SHADOW_INTENSITY, - GROUND_B*SHADOW_INTENSITY); - } - glDepthRange (0,0.9999); -} - - -extern "C" void dsSimulationLoop (int argc, char **argv, - int window_width, int window_height, - dsFunctions *fn) -{ - if (current_state != 0) dsError ("dsSimulationLoop() called more than once"); - current_state = 1; - - // look for flags that apply to us - int initial_pause = 0; - for (int i=1; iversion > DS_VERSION) - dsDebug ("bad version number in dsFunctions structure"); - - initMotionModel(); - dsPlatformSimLoop (window_width,window_height,fn,initial_pause); - - current_state = 0; -} - - -extern "C" void dsSetViewpoint (float xyz[3], float hpr[3]) -{ - if (current_state < 1) dsError ("dsSetViewpoint() called before simulation started"); - if (xyz) { - view_xyz[0] = xyz[0]; - view_xyz[1] = xyz[1]; - view_xyz[2] = xyz[2]; - } - if (hpr) { - view_hpr[0] = hpr[0]; - view_hpr[1] = hpr[1]; - view_hpr[2] = hpr[2]; - wrapCameraAngles(); - } -} - - -extern "C" void dsGetViewpoint (float xyz[3], float hpr[3]) -{ - if (current_state < 1) dsError ("dsGetViewpoint() called before simulation started"); - if (xyz) { - xyz[0] = view_xyz[0]; - xyz[1] = view_xyz[1]; - xyz[2] = view_xyz[2]; - } - if (hpr) { - hpr[0] = view_hpr[0]; - hpr[1] = view_hpr[1]; - hpr[2] = view_hpr[2]; - } -} - - -extern "C" void dsSetTexture (int texture_number) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - tnum = texture_number; -} - - -extern "C" void dsSetColor (float red, float green, float blue) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - color[0] = red; - color[1] = green; - color[2] = blue; - color[3] = 1; -} - - -extern "C" void dsSetColorAlpha (float red, float green, float blue, - float alpha) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - color[0] = red; - color[1] = green; - color[2] = blue; - color[3] = alpha; -} - - -extern "C" void dsDrawBox (const float pos[3], const float R[12], - const float sides[3]) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_FLAT); - setTransform (pos,R); - drawBox (sides); - glPopMatrix(); - - if (use_shadows) { - setShadowDrawingMode(); - setShadowTransform(); - setTransform (pos,R); - drawBox (sides); - glPopMatrix(); - glPopMatrix(); - glDepthRange (0,1); - } -} - -extern "C" void dsDrawConvex (const float pos[3], const float R[12], - float *_planes,unsigned int _planecount, - float *_points, - unsigned int _pointcount, - unsigned int *_polygons) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_FLAT); - setTransform (pos,R); - drawConvex(_planes,_planecount,_points,_pointcount,_polygons); - glPopMatrix(); - if (use_shadows) { - setShadowDrawingMode(); - setShadowTransform(); - setTransform (pos,R); - drawConvex(_planes,_planecount,_points,_pointcount,_polygons); - glPopMatrix(); - glPopMatrix(); - glDepthRange (0,1); - } -} - - -extern "C" void dsDrawSphere (const float pos[3], const float R[12], - float radius) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glEnable (GL_NORMALIZE); - glShadeModel (GL_SMOOTH); - setTransform (pos,R); - glScaled (radius,radius,radius); - drawSphere(); - glPopMatrix(); - glDisable (GL_NORMALIZE); - - // draw shadows - if (use_shadows) { - glDisable (GL_LIGHTING); - if (use_textures) { - ground_texture->bind (1); - glEnable (GL_TEXTURE_2D); - glDisable (GL_TEXTURE_GEN_S); - glDisable (GL_TEXTURE_GEN_T); - glColor3f (SHADOW_INTENSITY,SHADOW_INTENSITY,SHADOW_INTENSITY); - } - else { - glDisable (GL_TEXTURE_2D); - glColor3f (GROUND_R*SHADOW_INTENSITY,GROUND_G*SHADOW_INTENSITY, - GROUND_B*SHADOW_INTENSITY); - } - glShadeModel (GL_FLAT); - glDepthRange (0,0.9999); - drawSphereShadow (pos[0],pos[1],pos[2],radius); - glDepthRange (0,1); - } -} - - -extern "C" void dsDrawTriangle (const float pos[3], const float R[12], - const float *v0, const float *v1, - const float *v2, int solid) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_FLAT); - setTransform (pos,R); - drawTriangle (v0, v1, v2, solid); - glPopMatrix(); -} - - -extern "C" void dsDrawCylinder (const float pos[3], const float R[12], - float length, float radius) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_SMOOTH); - setTransform (pos,R); - drawCylinder (length,radius,0); - glPopMatrix(); - - if (use_shadows) { - setShadowDrawingMode(); - setShadowTransform(); - setTransform (pos,R); - drawCylinder (length,radius,0); - glPopMatrix(); - glPopMatrix(); - glDepthRange (0,1); - } -} - - -extern "C" void dsDrawCapsule (const float pos[3], const float R[12], - float length, float radius) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_SMOOTH); - setTransform (pos,R); - drawCapsule (length,radius); - glPopMatrix(); - - if (use_shadows) { - setShadowDrawingMode(); - setShadowTransform(); - setTransform (pos,R); - drawCapsule (length,radius); - glPopMatrix(); - glPopMatrix(); - glDepthRange (0,1); - } -} - - -void dsDrawLine (const float pos1[3], const float pos2[3]) -{ - setupDrawingMode(); - glColor3f (color[0],color[1],color[2]); - glDisable (GL_LIGHTING); - glLineWidth (2); - glShadeModel (GL_FLAT); - glBegin (GL_LINES); - glVertex3f (pos1[0],pos1[1],pos1[2]); - glVertex3f (pos2[0],pos2[1],pos2[2]); - glEnd(); -} - - -void dsDrawBoxD (const double pos[3], const double R[12], - const double sides[3]) -{ - int i; - float pos2[3],R2[12],fsides[3]; - for (i=0; i<3; i++) pos2[i]=(float)pos[i]; - for (i=0; i<12; i++) R2[i]=(float)R[i]; - for (i=0; i<3; i++) fsides[i]=(float)sides[i]; - dsDrawBox (pos2,R2,fsides); -} - -extern "C" void dsDrawConvexD (const double pos[3], const double R[12], - double *_planes,unsigned int _planecount, - double *_points, - unsigned int _pointcount, - unsigned int *_polygons) -{ - if (current_state != 2) dsError ("drawing function called outside simulation loop"); - setupDrawingMode(); - glShadeModel (GL_FLAT); - setTransformD (pos,R); - drawConvexD(_planes,_planecount,_points,_pointcount,_polygons); - glPopMatrix(); - if (use_shadows) { - setShadowDrawingMode(); - setShadowTransform(); - setTransformD (pos,R); - drawConvexD(_planes,_planecount,_points,_pointcount,_polygons); - glPopMatrix(); - glPopMatrix(); - glDepthRange (0,1); - } -} - -void dsDrawSphereD (const double pos[3], const double R[12], float radius) -{ - int i; - float pos2[3],R2[12]; - for (i=0; i<3; i++) pos2[i]=(float)pos[i]; - for (i=0; i<12; i++) R2[i]=(float)R[i]; - dsDrawSphere (pos2,R2,radius); -} - - -void dsDrawTriangleD (const double pos[3], const double R[12], - const double *v0, const double *v1, - const double *v2, int solid) -{ - int i; - float pos2[3],R2[12]; - for (i=0; i<3; i++) pos2[i]=(float)pos[i]; - for (i=0; i<12; i++) R2[i]=(float)R[i]; - - setupDrawingMode(); - glShadeModel (GL_FLAT); - setTransform (pos2,R2); - drawTriangleD (v0, v1, v2, solid); - glPopMatrix(); -} - - -void dsDrawCylinderD (const double pos[3], const double R[12], - float length, float radius) -{ - int i; - float pos2[3],R2[12]; - for (i=0; i<3; i++) pos2[i]=(float)pos[i]; - for (i=0; i<12; i++) R2[i]=(float)R[i]; - dsDrawCylinder (pos2,R2,length,radius); -} - - -void dsDrawCapsuleD (const double pos[3], const double R[12], - float length, float radius) -{ - int i; - float pos2[3],R2[12]; - for (i=0; i<3; i++) pos2[i]=(float)pos[i]; - for (i=0; i<12; i++) R2[i]=(float)R[i]; - dsDrawCapsule (pos2,R2,length,radius); -} - - -void dsDrawLineD (const double _pos1[3], const double _pos2[3]) -{ - int i; - float pos1[3],pos2[3]; - for (i=0; i<3; i++) pos1[i]=(float)_pos1[i]; - for (i=0; i<3; i++) pos2[i]=(float)_pos2[i]; - dsDrawLine (pos1,pos2); -} - - -void dsSetSphereQuality (int n) -{ - sphere_quality = n; -} - - -void dsSetCapsuleQuality (int n) -{ - capped_cylinder_quality = n; -} diff --git a/libraries/ode-0.9/drawstuff/src/internal.h b/libraries/ode-0.9/drawstuff/src/internal.h deleted file mode 100644 index de1aa1162f..0000000000 --- a/libraries/ode-0.9/drawstuff/src/internal.h +++ /dev/null @@ -1,50 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* functions supplied and used by the platform specific code */ - -#ifndef __DS_INTERNAL_H -#define __DS_INTERNAL_H - -#include "drawstuff/drawstuff.h" - - -// supplied by platform specific code - -void dsPlatformSimLoop (int window_width, int window_height, - dsFunctions *fn, int initial_pause); - - -// used by platform specific code - -void dsStartGraphics (int width, int height, dsFunctions *fn); -void dsDrawFrame (int width, int height, dsFunctions *fn, int pause); -void dsStopGraphics(); -void dsMotion (int mode, int deltax, int deltay); - -int dsGetShadows(); -void dsSetShadows (int a); - -int dsGetTextures(); -void dsSetTextures (int a); - -#endif diff --git a/libraries/ode-0.9/drawstuff/src/osx.cpp b/libraries/ode-0.9/drawstuff/src/osx.cpp deleted file mode 100644 index fcecba907a..0000000000 --- a/libraries/ode-0.9/drawstuff/src/osx.cpp +++ /dev/null @@ -1,542 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -// Platform-specific code for Mac OS X using Carbon+AGL -// -// Created using x11.cpp and the window-initialization -routines from GLFW -// as reference. -// Not thoroughly tested and is certain to contain deficiencies and bugs - -#include -#include -#include -#include - -#ifdef HAVE_SYS_TIME_H -#include -#endif - -#include -#include -#include "internal.h" - -#include -#include - -// Global variables - -static bool running = true; // 1 if simulation running -static bool paused = false; // 1 if in `pause' mode -static bool singlestep = false; // 1 if single step key pressed -static bool writeframes = false; // 1 if frame files to be written - -static int windowWidth = -1; -static int windowHeight = -1; -static UInt32 modifierMask = 0; -static int mouseButtonMode = 0; -static bool mouseWithOption = false; // Set if dragging the mouse with alt pressed -static bool mouseWithControl = false; // Set if dragging the mouse with ctrl pressed - -static dsFunctions* functions = NULL; -static WindowRef windowReference; -static AGLContext aglContext; - -static EventHandlerUPP mouseUPP = NULL; -static EventHandlerUPP keyboardUPP = NULL; -static EventHandlerUPP windowUPP = NULL; - -// Describes the window-events we are interested in -EventTypeSpec OSX_WINDOW_EVENT_TYPES[] = { - { kEventClassWindow, kEventWindowBoundsChanged }, - { kEventClassWindow, kEventWindowClose }, - { kEventClassWindow, kEventWindowDrawContent } -}; - -// Describes the mouse-events we are interested in -EventTypeSpec OSX_MOUSE_EVENT_TYPES[] = { - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassMouse, kEventMouseDragged } -}; - -// Describes the key-events we are interested in -EventTypeSpec OSX_KEY_EVENT_TYPES[] = { - { kEventClassKeyboard, kEventRawKeyDown }, -// { kEventClassKeyboard, kEventRawKeyUp }, - { kEventClassKeyboard, kEventRawKeyModifiersChanged } -}; - -//*************************************************************************** -// error handling for unix - -static void printMessage (char *msg1, char *msg2, va_list ap) -{ - fflush (stderr); - fflush (stdout); - fprintf (stderr,"\n%s: ",msg1); - vfprintf (stderr,msg2,ap); - fprintf (stderr,"\n"); - fflush (stderr); -} - -extern "C" void dsError (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - printMessage ("Error",msg,ap); - exit (1); -} - - -extern "C" void dsDebug (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - printMessage ("INTERNAL ERROR",msg,ap); - // *((char *)0) = 0; ... commit SEGVicide ? - abort(); -} - -extern "C" void dsPrint (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - vprintf (msg,ap); -} - -static void captureFrame( int num ){ - - fprintf( stderr,"\rcapturing frame %04d", num ); - unsigned char buffer[windowWidth*windowHeight][3]; - glReadPixels( 0, 0, windowWidth, windowHeight, GL_RGB, GL_UNSIGNED_BYTE, &buffer ); - char s[100]; - sprintf (s,"frame%04d.ppm",num); - FILE *f = fopen (s,"wb"); - if( !f ){ - dsError( "can't open \"%s\" for writing", s ); - } - fprintf( f,"P6\n%d %d\n255\n", windowWidth, windowHeight ); - for( int y=windowHeight-1; y>-1; y-- ){ - fwrite( buffer[y*windowWidth], 3*windowWidth, 1, f ); - } - fclose (f); -} - -extern "C" void dsStop(){ - - running = false; -} - -extern "C" double dsElapsedTime() -{ -#if HAVE_GETTIMEOFDAY - static double prev=0.0; - timeval tv ; - - gettimeofday(&tv, 0); - double curr = tv.tv_sec + (double) tv.tv_usec / 1000000.0 ; - if (!prev) - prev=curr; - double retval = curr-prev; - prev=curr; - if (retval>1.0) retval=1.0; - if (retval= ' ' && charCode <= 126 && functions -> command ){ - functions -> command( charCode ); - } - } - else if( ( modifierMask & controlKey ) ){ - // ctrl+key was pressed - switch(uppercase ){ - case 'T': - dsSetTextures( !dsGetTextures() ); - break; - case 'S': - dsSetShadows( !dsGetShadows() ); - break; - case 'X': - running = false; - break; - case 'P': - paused = !paused; - singlestep = false; - break; - case 'O': - if( paused ){ - singlestep = true; - } - break; - case 'V': { - float xyz[3],hpr[3]; - dsGetViewpoint( xyz,hpr ); - printf( "Viewpoint = (%.4f,%.4f,%.4f,%.4f,%.4f,%.4f)\n", xyz[0], xyz[1], xyz[2], hpr[0], hpr[1], hpr[2] ); - break; - } - case 'W': - writeframes = !writeframes; - if( writeframes ){ - printf( "Now writing frames to PPM files\n" ); - } - break; - } - - } - return noErr; - case kEventRawKeyModifiersChanged: - if( GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof( UInt32 ), NULL, &modifierMask ) == noErr ){ - if( ( mouseWithOption && !( modifierMask & optionKey ) ) || ( mouseWithControl && !( modifierMask & controlKey ) ) ){ - // The mouse was being dragged using either the command-key or the option-key modifier to emulate - // the right button or both left + right. - // Now the modifier-key has been released so the mouseButtonMode must be changed accordingly - // The following releases the right-button. - mouseButtonMode &= (~4); - mouseWithOption = false; - mouseWithControl = false; - } - return noErr; - } - break; - } - return eventNotHandledErr; -} - -OSStatus osxMouseEventHandler( EventHandlerCallRef handlerCallRef, EventRef event, void *userData ){ - - bool buttonDown = false; - HIPoint mouseLocation; - - switch( GetEventKind( event ) ){ - - case kEventMouseDown: - buttonDown = true; - case kEventMouseUp: - if( GetEventParameter( event, kEventParamWindowMouseLocation, typeHIPoint, NULL, sizeof( HIPoint ), NULL, &mouseLocation ) != noErr ){ - break; - } - EventMouseButton button; - if( GetEventParameter( event, kEventParamMouseButton, typeMouseButton, NULL, sizeof( EventMouseButton ), NULL, &button ) == noErr ){ - - if( button == kEventMouseButtonPrimary ){ - if( modifierMask & controlKey ){ - // Ctrl+button == right - button = kEventMouseButtonSecondary; - mouseWithControl = true; - } - else if( modifierMask & optionKey ){ - // Alt+button == left+right - mouseButtonMode = 5; - mouseWithOption = true; - return noErr; - } - } - if( buttonDown ){ - if( button == kEventMouseButtonPrimary ) mouseButtonMode |= 1; // Left - if( button == kEventMouseButtonTertiary ) mouseButtonMode |= 2; // Middle - if( button == kEventMouseButtonSecondary ) mouseButtonMode |= 4; // Right - } - else{ - if( button == kEventMouseButtonPrimary ) mouseButtonMode &= (~1); // Left - if( button == kEventMouseButtonTertiary ) mouseButtonMode &= (~2); // Middle - if( button == kEventMouseButtonSecondary ) mouseButtonMode &= (~4);// Right - } - return noErr; - } - break; - case kEventMouseMoved: - // NO-OP - return noErr; - case kEventMouseDragged: - // Carbon provides mouse-position deltas, so we don't have to store the old state ourselves - if( GetEventParameter( event, kEventParamMouseDelta, typeHIPoint, NULL, sizeof( HIPoint ), NULL, &mouseLocation ) == noErr ){ - //printf( "Mode %d\n", mouseButtonMode ); - dsMotion( mouseButtonMode, (int)mouseLocation.x, (int)mouseLocation.y ); - return noErr; - } - break; - case kEventMouseWheelMoved: - // NO-OP - break; - } - return eventNotHandledErr; -} - -static void osxCloseMainWindow(){ - - if( windowUPP != NULL ){ - DisposeEventHandlerUPP( windowUPP ); - windowUPP = NULL; - } - - if( aglContext != NULL ){ - aglSetCurrentContext( NULL ); - aglSetDrawable( aglContext, NULL ); - aglDestroyContext( aglContext ); - aglContext = NULL; - } - - if( windowReference != NULL ){ - ReleaseWindow( windowReference ); - windowReference = NULL; - } -} - -OSStatus osxWindowEventHandler( EventHandlerCallRef handlerCallRef, EventRef event, void *userData ){ - - //printf( "WindowEvent\n" ); - switch( GetEventKind(event) ){ - case kEventWindowBoundsChanged: - WindowRef window; - GetEventParameter( event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window ); - Rect rect; - GetWindowPortBounds( window, &rect ); - windowWidth = rect.right; - windowHeight = rect.bottom; - aglUpdateContext( aglContext ); - break; - case kEventWindowClose: - osxCloseMainWindow(); - exit( 0 ); - return noErr; - case kEventWindowDrawContent: - // NO-OP - break; - } - - return eventNotHandledErr; -} - -static void osxCreateMainWindow( int width, int height ){ - - int redbits = 4; - int greenbits = 4; - int bluebits = 4; - int alphabits = 4; - int depthbits = 16; - - OSStatus error; - - // create pixel format attribute list - - GLint pixelFormatAttributes[256]; - int numAttrs = 0; - - pixelFormatAttributes[numAttrs++] = AGL_RGBA; - pixelFormatAttributes[numAttrs++] = AGL_DOUBLEBUFFER; - - pixelFormatAttributes[numAttrs++] = AGL_RED_SIZE; - pixelFormatAttributes[numAttrs++] = redbits; - pixelFormatAttributes[numAttrs++] = AGL_GREEN_SIZE; - pixelFormatAttributes[numAttrs++] = greenbits; - pixelFormatAttributes[numAttrs++] = AGL_BLUE_SIZE; - pixelFormatAttributes[numAttrs++] = bluebits; - pixelFormatAttributes[numAttrs++] = AGL_ALPHA_SIZE; - pixelFormatAttributes[numAttrs++] = alphabits; - pixelFormatAttributes[numAttrs++] = AGL_DEPTH_SIZE; - pixelFormatAttributes[numAttrs++] = depthbits; - - pixelFormatAttributes[numAttrs++] = AGL_NONE; - - // create pixel format. - - AGLDevice mainMonitor = GetMainDevice(); - AGLPixelFormat pixelFormat = aglChoosePixelFormat( &mainMonitor, 1, pixelFormatAttributes ); - if( pixelFormat == NULL ){ - return; - } - - aglContext = aglCreateContext( pixelFormat, NULL ); - - aglDestroyPixelFormat( pixelFormat ); - - if( aglContext == NULL ){ - osxCloseMainWindow(); - return; - } - - Rect windowContentBounds; - windowContentBounds.left = 0; - windowContentBounds.top = 0; - windowContentBounds.right = width; - windowContentBounds.bottom = height; - - int windowAttributes = kWindowCloseBoxAttribute - | kWindowFullZoomAttribute - | kWindowCollapseBoxAttribute - | kWindowResizableAttribute - | kWindowStandardHandlerAttribute - | kWindowLiveResizeAttribute; - - error = CreateNewWindow( kDocumentWindowClass, windowAttributes, &windowContentBounds, &windowReference ); - if( ( error != noErr ) || ( windowReference == NULL ) ){ - osxCloseMainWindow(); - return; - } - - windowUPP = NewEventHandlerUPP( osxWindowEventHandler ); - - error = InstallWindowEventHandler( windowReference, windowUPP,GetEventTypeCount( OSX_WINDOW_EVENT_TYPES ), OSX_WINDOW_EVENT_TYPES, NULL, NULL ); - if( error != noErr ){ - osxCloseMainWindow(); - return; - } - - // The process-type must be changed for a ForegroundApplication - // Unless it is a foreground-process, the application will not show in the dock or expose and the window - // will not behave properly. - ProcessSerialNumber currentProcess; - GetCurrentProcess( ¤tProcess ); - TransformProcessType( ¤tProcess, kProcessTransformToForegroundApplication ); - SetFrontProcess( ¤tProcess ); - - SetWindowTitleWithCFString( windowReference, CFSTR( "ODE - Drawstuff" ) ); - RepositionWindow( windowReference, NULL, kWindowCenterOnMainScreen ); - - ShowWindow( windowReference ); - - if( !aglSetDrawable( aglContext, GetWindowPort( windowReference ) ) ){ - osxCloseMainWindow(); - return; - } - - if( !aglSetCurrentContext( aglContext ) ){ - osxCloseMainWindow(); - } - - windowWidth = width; - windowHeight = height; -} - -int osxInstallEventHandlers(){ - - OSStatus error; - - mouseUPP = NewEventHandlerUPP( osxMouseEventHandler ); - - error = InstallEventHandler( GetApplicationEventTarget(), mouseUPP, GetEventTypeCount( OSX_MOUSE_EVENT_TYPES ), OSX_MOUSE_EVENT_TYPES, NULL, NULL ); - if( error != noErr ){ - return GL_FALSE; - } - - keyboardUPP = NewEventHandlerUPP( osxKeyEventHandler ); - - error = InstallEventHandler( GetApplicationEventTarget(), keyboardUPP, GetEventTypeCount( OSX_KEY_EVENT_TYPES ), OSX_KEY_EVENT_TYPES, NULL, NULL ); - if( error != noErr ){ - return GL_FALSE; - } - - return GL_TRUE; -} - -extern void dsPlatformSimLoop( int givenWindowWidth, int givenWindowHeight, dsFunctions *fn, int givenPause ){ - - functions = fn; - - paused = givenPause; - - osxCreateMainWindow( givenWindowWidth, givenWindowHeight ); - osxInstallEventHandlers(); - - dsStartGraphics( windowWidth, windowHeight, fn ); - - static bool firsttime=true; - if( firsttime ) - { - fprintf - ( - stderr, - "\n" - "Simulation test environment v%d.%02d\n" - " Ctrl-P : pause / unpause (or say `-pause' on command line).\n" - " Ctrl-O : single step when paused.\n" - " Ctrl-T : toggle textures (or say `-notex' on command line).\n" - " Ctrl-S : toggle shadows (or say `-noshadow' on command line).\n" - " Ctrl-V : print current viewpoint coordinates (x,y,z,h,p,r).\n" - " Ctrl-W : write frames to ppm files: frame/frameNNN.ppm\n" - " Ctrl-X : exit.\n" - "\n" - "Change the camera position by clicking + dragging in the window.\n" - " Left button - pan and tilt.\n" - " Right button (or Ctrl + button) - forward and sideways.\n" - " Left + Right button (or middle button, or Alt + button) - sideways and up.\n" - "\n",DS_VERSION >> 8,DS_VERSION & 0xff - ); - firsttime = false; - } - - if( fn -> start ) fn->start(); - - int frame = 1; - running = true; - while( running ){ - // read in and process all pending events for the main window - EventRef event; - EventTargetRef eventDispatcher = GetEventDispatcherTarget(); - while( ReceiveNextEvent( 0, NULL, 0.0, TRUE, &event ) == noErr ){ - SendEventToEventTarget( event, eventDispatcher ); - ReleaseEvent( event ); - } - - dsDrawFrame( windowWidth, windowHeight, fn, paused && !singlestep ); - singlestep = false; - - glFlush(); - aglSwapBuffers( aglContext ); - - // capture frames if necessary - if( !paused && writeframes ){ - captureFrame( frame ); - frame++; - } - } - - if( fn->stop ) fn->stop(); - dsStopGraphics(); - - osxCloseMainWindow(); -} diff --git a/libraries/ode-0.9/drawstuff/src/resource.h b/libraries/ode-0.9/drawstuff/src/resource.h deleted file mode 100644 index 15802b6040..0000000000 --- a/libraries/ode-0.9/drawstuff/src/resource.h +++ /dev/null @@ -1,28 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by resources.rc -// -#define IDD_MSGDLG 101 -#define IDR_MENU1 102 -#define IDD_ABOUT 103 -#define IDR_ACCELERATOR1 104 -#define IDC_LIST1 1000 -#define IDM_EXIT 40001 -#define IDM_ABOUT 40002 -#define IDM_PAUSE 40003 -#define IDM_PERF_MONITOR 40004 -#define IDM_SHADOWS 40005 -#define IDM_TEXTURES 40006 -#define IDM_SAVE_SETTINGS 40007 -#define IDM_SINGLE_STEP 40008 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 108 -#define _APS_NEXT_COMMAND_VALUE 40009 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/libraries/ode-0.9/drawstuff/src/resources.rc b/libraries/ode-0.9/drawstuff/src/resources.rc deleted file mode 100644 index 61611f7b41..0000000000 --- a/libraries/ode-0.9/drawstuff/src/resources.rc +++ /dev/null @@ -1,153 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -//#include "afxres.h" - -// added by RLS to make this work with windres -#include "winresrc.h" -#define IDC_STATIC (-1) - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUT DIALOG DISCARDABLE 0, 0, 257, 105 -STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "About" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,200,84,50,14 - LTEXT "Simulation test environment",IDC_STATIC,7,7,243,8 - LTEXT "Change the camera position by clicking + dragging in the main window.", - IDC_STATIC,7,24,243,8 - LTEXT "Left button - pan and tilt.",IDC_STATIC,25,37,225,8 - LTEXT "Right button - forward and sideways.",IDC_STATIC,25,48, - 225,8 - LTEXT "Left + Right button (or middle button) - sideways and up.", - IDC_STATIC,25,59,225,8 -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - //"#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MENU1 MENU DISCARDABLE -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&Exit\tCtrl+X", IDM_EXIT - END - POPUP "&Simulation" - BEGIN - MENUITEM "&Pause\tCtrl+P", IDM_PAUSE - MENUITEM "Single Step\tCtrl+O", IDM_SINGLE_STEP - MENUITEM "Performance &Monitor", IDM_PERF_MONITOR, GRAYED - MENUITEM SEPARATOR - MENUITEM "&Shadows\tCtrl+S", IDM_SHADOWS, CHECKED - MENUITEM "&Textures\tCtrl+T", IDM_TEXTURES, CHECKED - MENUITEM SEPARATOR - MENUITEM "S&ave Settings", IDM_SAVE_SETTINGS, GRAYED - END - POPUP "&Help" - BEGIN - MENUITEM "&About", IDM_ABOUT - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE -BEGIN - IDD_ABOUT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - VERTGUIDE, 25 - TOPMARGIN, 7 - BOTTOMMARGIN, 98 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE -BEGIN - "O", IDM_SINGLE_STEP, VIRTKEY, CONTROL, NOINVERT - "P", IDM_PAUSE, VIRTKEY, CONTROL, NOINVERT - "S", IDM_SHADOWS, VIRTKEY, CONTROL, NOINVERT - "T", IDM_TEXTURES, VIRTKEY, CONTROL, NOINVERT - "X", IDM_EXIT, VIRTKEY, CONTROL, NOINVERT -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/libraries/ode-0.9/drawstuff/src/windows.cpp b/libraries/ode-0.9/drawstuff/src/windows.cpp deleted file mode 100644 index e2b442a557..0000000000 --- a/libraries/ode-0.9/drawstuff/src/windows.cpp +++ /dev/null @@ -1,527 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#if defined(WIN32) || defined(__CYGWIN__)// this prevents warnings when dependencies built -#include -#endif -#include -#include - -#include "resource.h" -#include "internal.h" - -//*************************************************************************** -// application globals - -static HINSTANCE ghInstance = 0; -static int gnCmdShow = 0; -static HACCEL accelerators = 0; -static HWND main_window = 0; - -//*************************************************************************** -// error and message handling - -static void errorBox (char *title, char *msg, va_list ap) -{ - char s[1000]; - vsprintf (s,msg,ap); - MessageBox (0,s,title,MB_OK | MB_APPLMODAL | MB_ICONEXCLAMATION); -} - - -static void dsWarning (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - errorBox ("Warning",msg,ap); -} - - -extern "C" void dsError (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - errorBox ("Error",msg,ap); - exit (1); -} - - -extern "C" void dsDebug (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - errorBox ("INTERNAL ERROR",msg,ap); - // *((char *)0) = 0; ... commit SEGVicide ? - abort(); - exit (1); // should never get here, but just in case... -} - - -extern "C" void dsPrint (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - vprintf (msg,ap); -} - -//*************************************************************************** -// rendering thread - -// globals used to communicate with rendering thread - -static volatile int renderer_run = 1; -static volatile int renderer_pause = 0; // 0=run, 1=pause -static volatile int renderer_ss = 0; // single step command -static volatile int renderer_width = 1; -static volatile int renderer_height = 1; -static dsFunctions *renderer_fn = 0; -static volatile HDC renderer_dc = 0; -static volatile int keybuffer[16]; // fifo ring buffer for keypresses -static volatile int keybuffer_head = 0; // index of next key to put in (modified by GUI) -static volatile int keybuffer_tail = 0; // index of next key to take out (modified by renderer) - - -static void setupRendererGlobals() -{ - renderer_run = 1; - renderer_pause = 0; - renderer_ss = 0; - renderer_width = 1; - renderer_height = 1; - renderer_fn = 0; - renderer_dc = 0; - keybuffer[16]; - keybuffer_head = 0; - keybuffer_tail = 0; -} - - -static DWORD WINAPI renderingThread (LPVOID lpParam) -{ - // create openGL context and make it current - HGLRC glc = wglCreateContext (renderer_dc); - if (glc==NULL) dsError ("could not create OpenGL context"); - if (wglMakeCurrent (renderer_dc,glc) != TRUE) - dsError ("could not make OpenGL context current"); - - // test openGL capabilities - int maxtsize=0; - glGetIntegerv (GL_MAX_TEXTURE_SIZE,&maxtsize); - if (maxtsize < 128) dsWarning ("max texture size too small (%dx%d)", - maxtsize,maxtsize); - - dsStartGraphics (renderer_width,renderer_height,renderer_fn); - if (renderer_fn->start) renderer_fn->start(); - - while (renderer_run) { - // need to make local copy of renderer_ss to help prevent races - int ss = renderer_ss; - dsDrawFrame (renderer_width,renderer_height,renderer_fn, - renderer_pause && !ss); - if (ss) renderer_ss = 0; - - // read keys out of ring buffer and feed them to the command function - while (keybuffer_head != keybuffer_tail) { - if (renderer_fn->command) renderer_fn->command (keybuffer[keybuffer_tail]); - keybuffer_tail = (keybuffer_tail+1) & 15; - } - - // swap buffers - SwapBuffers (renderer_dc); - } - - if (renderer_fn->stop) renderer_fn->stop(); - dsStopGraphics(); - - // delete openGL context - wglMakeCurrent (NULL,NULL); - wglDeleteContext (glc); - - return 123; // magic value used to test for thread termination -} - -//*************************************************************************** -// window handling - -// callback function for "about" dialog box - -static LRESULT CALLBACK AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam) -{ - switch (uMsg) { - case WM_INITDIALOG: - return TRUE; - case WM_COMMAND: - switch (wParam) { - case IDOK: - EndDialog (hDlg, TRUE); - return TRUE; - } - break; - } - return FALSE; -} - - -// callback function for the main window - -static LRESULT CALLBACK mainWndProc (HWND hWnd, UINT msg, WPARAM wParam, - LPARAM lParam) -{ - static int button=0,lastx=0,lasty=0; - int ctrl = int(wParam & MK_CONTROL); - - switch (msg) { - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - if (msg==WM_LBUTTONDOWN) button |= 1; - else if (msg==WM_MBUTTONDOWN) button |= 2; - else button |= 4; - lastx = SHORT(LOWORD(lParam)); - lasty = SHORT(HIWORD(lParam)); - SetCapture (hWnd); - break; - - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - if (msg==WM_LBUTTONUP) button &= ~1; - else if (msg==WM_MBUTTONUP) button &= ~2; - else button &= ~4; - if (button==0) ReleaseCapture(); - break; - - case WM_MOUSEMOVE: { - int x = SHORT(LOWORD(lParam)); - int y = SHORT(HIWORD(lParam)); - if (button) dsMotion (button,x-lastx,y-lasty); - lastx = x; - lasty = y; - break; - } - - case WM_CHAR: { - if (wParam >= ' ' && wParam <= 126) { - int nexth = (keybuffer_head+1) & 15; - if (nexth != keybuffer_tail) { - keybuffer[keybuffer_head] = int(wParam); - keybuffer_head = nexth; - } - } - break; - } - - case WM_SIZE: - // lParam will contain the size of the *client* area! - renderer_width = LOWORD(lParam); - renderer_height = HIWORD(lParam); - break; - - case WM_COMMAND: - switch (wParam & 0xffff) { - case IDM_ABOUT: - DialogBox (ghInstance,MAKEINTRESOURCE(IDD_ABOUT),hWnd, - (DLGPROC) AboutDlgProc); - break; - case IDM_PAUSE: { - renderer_pause ^= 1; - CheckMenuItem (GetMenu(hWnd),IDM_PAUSE, - renderer_pause ? MF_CHECKED : MF_UNCHECKED); - if (renderer_pause) renderer_ss = 0; - break; - } - case IDM_SINGLE_STEP: { - if (renderer_pause) - renderer_ss = 1; - else - SendMessage( hWnd, WM_COMMAND, IDM_PAUSE, 0 ); - break; - } - case IDM_PERF_MONITOR: { - dsWarning ("Performance monitor not yet implemented."); - break; - } - case IDM_TEXTURES: { - static int tex = 1; - tex ^= 1; - CheckMenuItem (GetMenu(hWnd),IDM_TEXTURES, - tex ? MF_CHECKED : MF_UNCHECKED); - dsSetTextures (tex); - break; - } - case IDM_SHADOWS: { - static int shadows = 1; - shadows ^= 1; - CheckMenuItem (GetMenu(hWnd),IDM_SHADOWS, - shadows ? MF_CHECKED : MF_UNCHECKED); - dsSetShadows (shadows); - break; - } - case IDM_SAVE_SETTINGS: { - dsWarning ("\"Save Settings\" not yet implemented."); - break; - } - case IDM_EXIT: - PostQuitMessage (0); - break; - } - break; - - case WM_CLOSE: - PostQuitMessage (0); - break; - - default: - return (DefWindowProc (hWnd, msg, wParam, lParam)); - } - - return 0; -} - - -// this comes from an MSDN example. believe it or not, this is the recommended -// way to get the console window handle. - -static HWND GetConsoleHwnd() -{ - // the console window title to a "unique" value, then find the window - // that has this title. - char title[1024]; - wsprintf (title,"DrawStuff:%d/%d",GetTickCount(),GetCurrentProcessId()); - SetConsoleTitle (title); - Sleep(40); // ensure window title has been updated - return FindWindow (NULL,title); -} - - -static void drawStuffStartup() -{ - static int startup_called = 0; - if (startup_called) return; - startup_called = 1; - if (!ghInstance) - ghInstance = GetModuleHandleA (NULL); - gnCmdShow = SW_SHOWNORMAL; // @@@ fix this later - - // redirect standard I/O to a new console (except on cygwin) -#ifndef __CYGWIN__ - FreeConsole(); - if (AllocConsole()==0) dsError ("AllocConsole() failed"); - if (freopen ("CONIN$","rt",stdin)==0) dsError ("could not open stdin"); - if (freopen ("CONOUT$","wt",stdout)==0) dsError ("could not open stdout"); - if (freopen ("CONOUT$","wt",stderr)==0) dsError ("could not open stderr"); - BringWindowToTop (GetConsoleHwnd()); - SetConsoleTitle ("DrawStuff Messages"); -#endif - - // register the window class - WNDCLASS wc; - wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; - wc.lpfnWndProc = mainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = ghInstance; - wc.hIcon = LoadIcon (NULL,IDI_APPLICATION); - wc.hCursor = LoadCursor (NULL,IDC_ARROW); - wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); - wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); - wc.lpszClassName = "SimAppClass"; - if (RegisterClass (&wc)==0) dsError ("could not register window class"); - - // load accelerators - accelerators = LoadAccelerators (ghInstance, - MAKEINTRESOURCE(IDR_ACCELERATOR1)); - if (accelerators==NULL) dsError ("could not load accelerators"); -} - - -void dsPlatformSimLoop (int window_width, int window_height, - dsFunctions *fn, int initial_pause) -{ - drawStuffStartup(); - setupRendererGlobals(); - renderer_pause = initial_pause; - - // create window - but first get window size for desired size of client area. - // if this adjustment isn't made then the openGL area will be shifted into - // the nonclient area and determining the frame buffer coordinate from the - // client area coordinate will be hard. - RECT winrect; - winrect.left = 50; - winrect.top = 80; - winrect.right = winrect.left + window_width; - winrect.bottom = winrect.top + window_height; - DWORD style = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; - AdjustWindowRect (&winrect,style,1); - char title[100]; - sprintf (title,"Simulation test environment v%d.%02d", - DS_VERSION >> 8,DS_VERSION & 0xff); - main_window = CreateWindow ("SimAppClass",title,style, - winrect.left,winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top, - NULL,NULL,ghInstance,NULL); - if (main_window==NULL) dsError ("could not create main window"); - ShowWindow (main_window, gnCmdShow); - - HDC dc = GetDC (main_window); // get DC for this window - if (dc==NULL) dsError ("could not get window DC"); - - // set pixel format for DC - - PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd - 1, // version number - PFD_DRAW_TO_WINDOW | // support window - PFD_SUPPORT_OPENGL | // support OpenGL - PFD_DOUBLEBUFFER, // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 32, // 32-bit z-buffer - 0, // no stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - // get the best available match of pixel format for the device context - int iPixelFormat = ChoosePixelFormat (dc,&pfd); - if (iPixelFormat==0) - dsError ("could not find a good OpenGL pixel format"); - // set the pixel format of the device context - if (SetPixelFormat (dc,iPixelFormat,&pfd)==FALSE) - dsError ("could not set DC pixel format for OpenGL"); - - // ********** - // start the rendering thread - - // set renderer globals - renderer_dc = dc; - renderer_width = window_width; - renderer_height = window_height; - renderer_fn = fn; - - DWORD threadId, thirdParam = 0; - HANDLE hThread; - - hThread = CreateThread( - NULL, // no security attributes - 0, // use default stack size - renderingThread, // thread function - &thirdParam, // argument to thread function - 0, // use default creation flags - &threadId); // returns the thread identifier - - if (hThread==NULL) dsError ("Could not create rendering thread"); - - // ********** - // start GUI message processing - - MSG msg; - while (GetMessage (&msg,main_window,0,0)) { - if (!TranslateAccelerator (main_window,accelerators,&msg)) { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - } - - // terminate rendering thread - renderer_run = 0; - DWORD ret = WaitForSingleObject (hThread,2000); - if (ret==WAIT_TIMEOUT) dsWarning ("Could not kill rendering thread (1)"); - DWORD exitcode=0; - if (!(GetExitCodeThread (hThread,&exitcode) && exitcode == 123)) - dsWarning ("Could not kill rendering thread (2)"); - CloseHandle (hThread); // dont need thread handle anymore - - // destroy window - DestroyWindow (main_window); -} - - -extern "C" void dsStop() -{ - // just calling PostQuitMessage() here wont work, as this function is - // typically called from the rendering thread, not the GUI thread. - // instead we must post the message to the GUI window explicitly. - - if (main_window) PostMessage (main_window,WM_QUIT,0,0); -} - - -extern "C" double dsElapsedTime() -{ - static double prev=0.0; - double curr = timeGetTime()/1000.0; - if (!prev) - prev=curr; - double retval = curr-prev; - prev=curr; - if (retval>1.0) retval=1.0; - if (retval -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_SYS_TIME_H -#include -#endif - -#include -#include -#include "internal.h" - -//*************************************************************************** -// error handling for unix - -static void printMessage (char *msg1, char *msg2, va_list ap) -{ - fflush (stderr); - fflush (stdout); - fprintf (stderr,"\n%s: ",msg1); - vfprintf (stderr,msg2,ap); - fprintf (stderr,"\n"); - fflush (stderr); -} - - -extern "C" void dsError (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - printMessage ("Error",msg,ap); - exit (1); -} - - -extern "C" void dsDebug (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - printMessage ("INTERNAL ERROR",msg,ap); - // *((char *)0) = 0; ... commit SEGVicide ? - abort(); -} - - -extern "C" void dsPrint (char *msg, ...) -{ - va_list ap; - va_start (ap,msg); - vprintf (msg,ap); -} - -//*************************************************************************** -// openGL window - -// X11 display info -static Display *display=0; -static int screen=0; -static XVisualInfo *visual=0; // best visual for openGL -static Colormap colormap=0; // window's colormap -static Atom wm_protocols_atom = 0; -static Atom wm_delete_window_atom = 0; - -// window and openGL -static Window win=0; // X11 window, 0 if not initialized -static int width=0,height=0; // window size -static GLXContext glx_context=0; // openGL rendering context -static int last_key_pressed=0; // last key pressed in the window -static int run=1; // 1 if simulation running -static int pause=0; // 1 if in `pause' mode -static int singlestep=0; // 1 if single step key pressed -static int writeframes=0; // 1 if frame files to be written - - -static void createMainWindow (int _width, int _height) -{ - // create X11 display connection - display = XOpenDisplay (NULL); - if (!display) dsError ("can not open X11 display"); - screen = DefaultScreen(display); - - // get GL visual - static int attribList[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE,16, - GLX_RED_SIZE,4, GLX_GREEN_SIZE,4, - GLX_BLUE_SIZE,4, None}; - visual = glXChooseVisual (display,screen,attribList); - if (!visual) dsError ("no good X11 visual found for OpenGL"); - - // create colormap - colormap = XCreateColormap (display,RootWindow(display,screen), - visual->visual,AllocNone); - - // initialize variables - win = 0; - width = _width; - height = _height; - glx_context = 0; - last_key_pressed = 0; - - if (width < 1 || height < 1) dsDebug (0,"bad window width or height"); - - // create the window - XSetWindowAttributes attributes; - attributes.background_pixel = BlackPixel(display,screen); - attributes.colormap = colormap; - attributes.event_mask = ButtonPressMask | ButtonReleaseMask | - KeyPressMask | KeyReleaseMask | ButtonMotionMask | PointerMotionHintMask | - StructureNotifyMask; - win = XCreateWindow (display,RootWindow(display,screen),50,50,width,height, - 0,visual->depth, InputOutput,visual->visual, - CWBackPixel | CWColormap | CWEventMask,&attributes); - - // associate a GLX context with the window - glx_context = glXCreateContext (display,visual,0,GL_TRUE); - if (!glx_context) dsError ("can't make an OpenGL context"); - - // set the window title - XTextProperty window_name; - window_name.value = (unsigned char *) "Simulation"; - window_name.encoding = XA_STRING; - window_name.format = 8; - window_name.nitems = strlen((char *) window_name.value); - XSetWMName (display,win,&window_name); - - // participate in the window manager 'delete yourself' protocol - wm_protocols_atom = XInternAtom (display,"WM_PROTOCOLS",False); - wm_delete_window_atom = XInternAtom (display,"WM_DELETE_WINDOW",False); - if (XSetWMProtocols (display,win,&wm_delete_window_atom,1)==0) - dsError ("XSetWMProtocols() call failed"); - - // pop up the window - XMapWindow (display,win); - XSync (display,win); -} - - -static void destroyMainWindow() -{ - glXDestroyContext (display,glx_context); - XDestroyWindow (display,win); - XSync (display,0); - XCloseDisplay(display); - display = 0; - win = 0; - glx_context = 0; -} - - -static void handleEvent (XEvent &event, dsFunctions *fn) -{ - static int mx=0,my=0; // mouse position - static int mode = 0; // mouse button bits - - switch (event.type) { - - case ButtonPress: { - if (event.xbutton.button == Button1) mode |= 1; - if (event.xbutton.button == Button2) mode |= 2; - if (event.xbutton.button == Button3) mode |= 4; - mx = event.xbutton.x; - my = event.xbutton.y; - } - return; - - case ButtonRelease: { - if (event.xbutton.button == Button1) mode &= (~1); - if (event.xbutton.button == Button2) mode &= (~2); - if (event.xbutton.button == Button3) mode &= (~4); - mx = event.xbutton.x; - my = event.xbutton.x; - } - return; - - case MotionNotify: { - if (event.xmotion.is_hint) { - Window root,child; - unsigned int mask; - XQueryPointer (display,win,&root,&child,&event.xbutton.x_root, - &event.xbutton.y_root,&event.xbutton.x,&event.xbutton.y, - &mask); - } - dsMotion (mode, event.xmotion.x - mx, event.xmotion.y - my); - mx = event.xmotion.x; - my = event.xmotion.y; - } - return; - - case KeyPress: { - KeySym key; - XLookupString (&event.xkey,NULL,0,&key,0); - if ((event.xkey.state & ControlMask) == 0) { - if (key >= ' ' && key <= 126 && fn->command) fn->command (key); - } - else if (event.xkey.state & ControlMask) { - switch (key) { - case 't': case 'T': - dsSetTextures (dsGetTextures() ^ 1); - break; - case 's': case 'S': - dsSetShadows (dsGetShadows() ^ 1); - break; - case 'x': case 'X': - run = 0; - break; - case 'p': case 'P': - pause ^= 1; - singlestep = 0; - break; - case 'o': case 'O': - if (pause) singlestep = 1; - break; - case 'v': case 'V': { - float xyz[3],hpr[3]; - dsGetViewpoint (xyz,hpr); - printf ("Viewpoint = (%.4f,%.4f,%.4f,%.4f,%.4f,%.4f)\n", - xyz[0],xyz[1],xyz[2],hpr[0],hpr[1],hpr[2]); - break; - } - case 'w': case 'W': - writeframes ^= 1; - if (writeframes) printf ("Now writing frames to PPM files\n"); - break; - } - } - last_key_pressed = key; // a kludgy place to put this... - } - return; - - case KeyRelease: { - // hmmmm... - } - return; - - case ClientMessage: - if (event.xclient.message_type == wm_protocols_atom && - event.xclient.format == 32 && - Atom(event.xclient.data.l[0]) == wm_delete_window_atom) { - run = 0; - return; - } - return; - - case ConfigureNotify: - width = event.xconfigure.width; - height = event.xconfigure.height; - return; - } -} - - -// return the index of the highest bit -static int getHighBitIndex (unsigned int x) -{ - int i = 0; - while (x) { - i++; - x >>= 1; - } - return i-1; -} - - -// shift x left by i, where i can be positive or negative -#define SHIFTL(x,i) (((i) >= 0) ? ((x) << (i)) : ((x) >> (-i))) - - -static void captureFrame (int num) -{ - fprintf (stderr,"capturing frame %04d\n",num); - - char s[100]; - sprintf (s,"frame/frame%04d.ppm",num); - FILE *f = fopen (s,"wb"); - if (!f) dsError ("can't open \"%s\" for writing",s); - fprintf (f,"P6\n%d %d\n255\n",width,height); - XImage *image = XGetImage (display,win,0,0,width,height,~0,ZPixmap); - - int rshift = 7 - getHighBitIndex (image->red_mask); - int gshift = 7 - getHighBitIndex (image->green_mask); - int bshift = 7 - getHighBitIndex (image->blue_mask); - - for (int y=0; yred_mask,rshift); - b[1] = SHIFTL(pixel & image->green_mask,gshift); - b[2] = SHIFTL(pixel & image->blue_mask,bshift); - fwrite (b,3,1,f); - } - } - fclose (f); - XDestroyImage (image); -} - - -void dsPlatformSimLoop (int window_width, int window_height, dsFunctions *fn, - int initial_pause) -{ - pause = initial_pause; - createMainWindow (window_width, window_height); - glXMakeCurrent (display,win,glx_context); - - dsStartGraphics (window_width,window_height,fn); - - static bool firsttime=true; - if (firsttime) - { - fprintf - ( - stderr, - "\n" - "Simulation test environment v%d.%02d\n" - " Ctrl-P : pause / unpause (or say `-pause' on command line).\n" - " Ctrl-O : single step when paused.\n" - " Ctrl-T : toggle textures (or say `-notex' on command line).\n" - " Ctrl-S : toggle shadows (or say `-noshadow' on command line).\n" - " Ctrl-V : print current viewpoint coordinates (x,y,z,h,p,r).\n" - " Ctrl-W : write frames to ppm files: frame/frameNNN.ppm\n" - " Ctrl-X : exit.\n" - "\n" - "Change the camera position by clicking + dragging in the window.\n" - " Left button - pan and tilt.\n" - " Right button - forward and sideways.\n" - " Left + Right button (or middle button) - sideways and up.\n" - "\n",DS_VERSION >> 8,DS_VERSION & 0xff - ); - firsttime = false; - } - - if (fn->start) fn->start(); - - int frame = 1; - run = 1; - while (run) { - // read in and process all pending events for the main window - XEvent event; - while (run && XPending (display)) { - XNextEvent (display,&event); - handleEvent (event,fn); - } - - dsDrawFrame (width,height,fn,pause && !singlestep); - singlestep = 0; - - glFlush(); - glXSwapBuffers (display,win); - XSync (display,0); - - // capture frames if necessary - if (pause==0 && writeframes) { - captureFrame (frame); - frame++; - } - }; - - if (fn->stop) fn->stop(); - dsStopGraphics(); - - destroyMainWindow(); -} - - -extern "C" void dsStop() -{ - run = 0; -} - - -extern "C" double dsElapsedTime() -{ -#if HAVE_GETTIMEOFDAY - static double prev=0.0; - timeval tv ; - - gettimeofday(&tv, 0); - double curr = tv.tv_sec + (double) tv.tv_usec / 1000000.0 ; - if (!prev) - prev=curr; - double retval = curr-prev; - prev=curr; - if (retval>1.0) retval=1.0; - if (retvalB9owulttslnv}{|||ultnv{{u{{u{{|lksmk{{}{{|z{||red{u{lri|z||{tttsl||{ttslezl|uzt{u{{u{ztl{{tllduslesle}tt{j]\f]cf]cultultlks{ttedk\[b{{llkddc]bZ{{tlld{tt}]cd{u{ttsUTS|zttsuztekdlld|ztl\[bmttlksSKJ{ttlrikk]dc\UUYsle[[TjcVmttkd\||rg]tts{||tllsleJHFddcdc\b[Uult{||\[[:97zll{{ttslztlsreUMRztltts\UZ{{t{{tttslek}|ult{{t}kk]d\\{u{vtzltslzlllrif]c|uutUTSulttzlf]c||ult{u{{u{|}ldd[TTSKJ{{t~ztl{tt{ttreddc\{tt{||uztSKJ{zmek]lrittslddvu{{UMRultD;9UTSLKRlri{u{{u{{{{{tt{lekttslri}tts]cd{{u{{{{lksmtt{{^fs|mtt{{~tt{tll{{{|||zedk||{ttSKJ{tt}|j]\tllJHF{{{{lri|zdc\tsl{||{{{{kd\ztl\UZ}|{||f]cv~f]c{{{tt||lek|u{ttuztulttts}||}}lld}{ttu{{ultlks{{tts|z\UZllk[TTddctsl]bZtzlSKJreduztu{{ldd}|{ttekdztfred[[T{{tek]redllk}[TT:97zllkk]d\\kd\lldred\[bf]clldlri{u{{||tzllddf]c|llkult{zmztl}v{kd\ttslks}mttu{{mttuzt]cdultut||[[T|{tt|{||||lri||ztlbVZ[[T||cbVlldMRKd\\ekd}SKJj]\SKJUMRult{zm|mw{{}}ult{{|]cd]cd}lkslkstt{{{\[b{{f]cmtt{zm}v{Ó{zmtts|]cdlektsltt{ztltts|ztsl{zmtslultu{{tll|v|tlltsl{{}b[Uv{}v{ldd{{fkk}UTS}{|||llk{tt{{t}tlllekv}ldd{u{||tt{|{u{cbV|lldiq]jV[}ztltslSKJutVTLlrivlriUTSlddJHFFD;llkttsSKJ:97lld{u{||rg]JHFlek[[T|zekdlddbVU|zVTLek]|zdc\|z}||tsltllut{||tt{llkekdtllu{{t[[T{{|z{{VTLtt{tlltts}tsl{tttts[TTyl{u{lddekdVTLUMRwlsre{u{kd\lksu{{\UZf]csleg\rredmttv{{||{u{}||lek{||{{{{{||}{{tt{|mttmtt^fs{{|{{{{{{|}ă}lddv{tlluzttsl{{tf]cJHFf]culttt{u||[[Tsle[[Tkd\f]c||tt{\UZ{{|\[blkslri]bZttssle{ttttszllkd\tllult}lekmttedk{{{{{{{{lld|zlldlrittscbVUTStt{|z\[[{{t\UZ{ttttssreslerfk|||u{ttfkkddc[[TllkzlmttlriztlUMR:97||ukd\ztlu{{ylekd\{tttllek]llk|{tt||{||wl}]bZlriuztldd}{{t|uuztult{{ult{||||||z{{f]czllult||SKJ{ttsleuzt||{{MRKUMRlekf]c{ttdc\tlld\\tsltllj]\VTLVTLutt{vtsl|[[T[TT\UZultzllultedkldd|z{u{lddddc{{tts{{{{yllks|\UZmtt|{{nv{{|{{nv{{{{}u{{}lriuztllklek{||f]c\[[llk|z{ttultmwlekb[Ulrimttf]csle{ttVZ[mtt]cdnv|lks]bZzlltslldd{ttultfkku{{{{lddtsl\[[lri{{ttt{d\\VTL||ttslrikd\|SKJaWM[[Tf]c[TTVTLlldlriJHFUUYsle||ldd||{ttultedkvlritsltts{{||{zmultntzlsretts|zztl{tt{{t{{|ztllut|]bZkd\{u{ztlldd{{d\\edktt{||UUY[[TLKR{{f]cultttslksultUMRlksddc\UZ\UZlek}rfk}|tsl|{{tulttts}{||tllf]cmtt{{tj]\f]c}mk{tt|zmttu{{lks{{|lksult\UZtlllek\[b|^^q\[[mtt|n{{MSSult{{~{{^fs}{||}|llk{tt|]bZ|}{{uttll|u||{{t||lri|ztt{{||SKJekd{{t|{{lri||{{tuzt{u{}mttfkkult|uuztuztlksultttsb[U|zultlek|||srerg]||d\\ddcztllldFD;f]clkskk]|z|zllk3+*ttsUMRf]cr]g{u{tsllek{zmsletzllek}}ttsldd|zztl{{t{u{{||}||}|}|kd\ult{{tsl|}{u{[[Tddclld{||VTLJHFVZTtsllks{u{{||{{t{{\[[\[[}f]c{ttlldttsf]c|uttskk]aWMVTLedklksmtt||f]clddtt{\[bult{||{{{u{|{{t}{{ttsttsmtt\[bedk\[bmtt{{mttnv~{{tttssre|tts{||||tts|z}|z}{{t|zwlu{u{ulttt{lek\[[||{||llk{{\[blks}}VZ[UMRedkuzt}{{tfkk{{{{{{f]c}ultult[[Tmttfkklek{tt{tt|ddckk]yfdtts||kk]|ttsSKJtt{tzl[[T]cdlek}UTS*)(ultbVZlek{{t{u{||{{wluztlriu{{{||f]cu{{|z||}|ultrg]wlsleut||{tt|tt{{{t|z|uztf]c[TTddctlld\\tllkd\ldd\[[ultttsekdlkslks||UTSd\\llkVTLtt{tts|{||{||[[Tg\rLKRlksf]cek]dc\VTLkd\]cd]cdek]||}ult|llklksmtt{{{{|{{edk|\[[edk{{{{vuzt{{{{tt{}{u{|ztsllksultult||tll||{||]bZttstt{\[[lri|ztzl]bZttsu{{tllwl}u|zedkuztu{{{{mttult{{t{{lri\[b]cdmtt|zz}lri|lksf]c|u{{\UZ}|ult}tll{tt|uUMRllk{{tlksultlks{u{mtttts}}[[TSKJbVZ}tt{}[TTllktslkd\||sle|ztll{{tllk74,SKJtllddcmttldd{{tslef]cslesle|lri|z|u{tt|usre|lldmtt|ddctt{{u{tslr]Zu{{|uultllkfkkSKJ]bZ]bZF=CF=Cmttlri|{{ttsllkstlltts]bZlekuzt|ddclkslrid\\sleu{{slesred\\cbVtll}uztlritll{tt{{llk{u{}lks|{{|tt{||nv|{{lks{||}{{tlltts[TT{tt}v{ztl||mtt{u{{||SKJ|u{{t~{{|edk|tsltzl{{t{{lektt{{{mttldd]cdvlksu{{\[bUUYmtt|{{{{VZ[|mtttt{lkslksult\[[dc\||UMRyflreddc\j]\j]\{ttllkedkb[Uultult]cddc\[TTVTLtll[[Ttllr]g}{{tekdultbVZj]\UTSC8.JHFlddJHF!ekd{{{{tultllksle|zb[U{{|||}{tt}v{|ttssleuf]c}mtt{{tlri|{||tt{dc\tllekdlldvmkmtt{|||rfkekd[TTekdlldmttek]}lek\UZVTLlks}redultd\\{{{||}\[[ddcult{||}lks|tts|v||~|lks{u{ldd{{mttMSSUTStts~ztlv|]bZcbV|z\UZddc\[[[TT{|||mtt\UZlksultJHF\[bUMR}|||ult{{tult||z~{{}f]c[TTleksleztl{u{red{ttrfkult|ddcztl|||j]\u|cbVddcztlllk}kd\u{{t||{zmMRK*)(|ztlltts[TTlriredtsl|}lld||n||u}{zmlriztlbVU{tt|ztt{uzttts|z||ttsmttUTS^^qlks{u{{{{||lddztldc\ult}||}{{}\UZ{{||}~|{u{uzt{{|ultmttedk{ttllkult|ult|z|{||tzlsle{|||]bZult{||{zm||{{|z{{t}{{t{{t|{{tdc\tsl[TTkk]f]cf]c{{tt{tt{lek|tt{fkkmtt]cd}|Ù{{ult|}{||tsl{||llkedk}||{u{ldd{tt||slesle{{tj]\}kd\ek]dc\ekdredVTLb[UVTL]bZSKJlksVTL*)(|{u{{u{ztlttsutsre|u{{b[U|zultut|iq]{{t{||b[U{zm{{t|z{||{u{tt{tt{tslmttuzt|z}ttsuztlritsl]cdMRKllkmtttll\[[|ztl{{{{t{tt|utsl{tt|zbVZ}}{ttmttlldSKJlddJHF|z}|}lrimttmtt{{|}wl~mtt|ztt{|{||ultu{{mttmttlks{||lks|ddcf]c{{{u{lks[TT\[[dc\|ztsl|z}}{{d\\llktsl{{t}ttsdc\ult[[TUUYlriuztMRKtllllkylddc{{ult{||}tt{ztl{||tsltt{u{{ddc\[blldlddedkdc\{{tlldj]\{ttSKJSKJ]bZlridc\d\\j]\j]\lddekdttsUTS*)({tti\Vldd{tt}zllsre{{t{{tllktsllrid\\yle||{u{lldyletts}|{||d\\|u|{|||lrikd\kd\uztu{{uzt]cdUMR]cdddcd\\]bZult\UZd\\nsleu{{||{ttf]c{{tdc\|}JHF{tt[TT|utsl|mwUMRttslksultlkstts{u{{{||{||{{t|lks{{{{{{{{{{{{nvlksnjultu{{ut{{tts{{{||\UZult]cdult{ttultllk|ultedktts\[bf]cult{u{{{ttsmtt|tt{mtt{{}lld|zdc\v{tts|zd\\lks|d\\red{{}\[[tslSKJ||tsl{ttultdkVSKJVTLVZTmtt\UZredtllztl\[[SKJ{{tJHF*)(dc\ultd\\i\V{tt|~sred\\v{lldek]f]c|z||zlltll{tttt{|z|llk|||}ek]|cbVlldmttd\\lldllkedk{{llkulttts~bVU[[T|sreddcttsf]cv|||sleb[U|utt{d\\\[bLKR{{llku{{{||}rfk}{{{u{zllu{{ultult{{{{{{tsl}|{||lldmttlrittsslemtt\[bult}|zuztlldttslriurfk}dc\JHFf]cultlldult{u{f]c}{||mttlld{{}{u{ztl|z{{ttslsleudc\ztl|tzlslelksekd{{t{||ultleksleUTS{||d\\slett{vldd{ttsle{{tUUYztlult|sremttSKJcbVF=C*)(d\\tts[TTv{{tt{{tu{zmultred{{t}lddllk|z\[blld{{|uu|ult|zf]c|z}ttsu{{]cdJHF}[[Tf]c\[[tt{ulttlllri{{}lekedkllk|z|u|udc\llkb[Ui\VUTSlddUMRkd\VTLrg]f]cf]c|u|v{{{||tll}|uztlks{{{{|}{{^fs}|~}tll|tt{tsllriullk}lektt{}lldf]ctts{tt|uztj]\|}tzl}ukjV||ztltll\[[ddcultult{u{{{tlluzt|utll{{|{{{u{u{{{||]bZlriUTSd\\u{{f]c}ult{||d\\{ttsle|uztl}u{{|{||{u{||{|||||u}JHF[TTkd\VTL74,ulttslttsbVU|wl[TTsle{tt{ttultvleklldlriekd||tll|ut|u}|{|||z{tt{{t|zulttslult}{||ekdf]cUMRVZ[\[b}||u{{ek][TTlri{{|ddclridc\j]\lriultlek}[TT}}{{~|tt{}uztlri}|zu{{lriuzt{||lkstt{{{||lld||z|||ztts{ttlekUTStts}}|{zm{{tv{ttsVTLlldlldSKJlekedkuzttts}}{u{{ttult~tts||mttf]c}lldv{}tt{ztlrfkultbVUu{{|ultslev{{}{||cbV{{tedk{||JHF*)({{lddttsztlultcbV||rfk{zm}tllj]\uztuztztflddd\\|tt{u|{||lri{{t|llklek{||||tts||}mtt}d\\{||srett{lekztltzlkd\|kk]kd\{zm}{ttu{{lrilldf]cztl~{{tddcvmttrfkUTStsl{{|lldtslylult{||mtt{||{{tleku{{}|{u{lriuzt{u{ē}bVZsleult}lekrg]sle}lri{zmtzl{{t[[Tllduztu{{mtt}]bZultu{u{ulttsllksVZT{{u{{}{u{}{{}lldsle|z{{ttslkd\ultlksult}ddcu{{bVZ[TTd\\{tt{tttygtts{{tlektllkd\|ulkslldtslFD;*)(|vtt{rg]||utsltsltll{u{kd\|vztllriedk{{|uultzllld{{}lldf]c}{{ttlltts|\[[rfk||uzt|zu{{lri{{{{|z||}{tt}rg]{{t|z}}|zlriuzt}leklldllk~u{{llk{u{||{||tts{||vtts{ttf]ctt{|{{t{{tddc}u{{tts{{|mtttt{u{{{{|||{u{edk{{u{{redtll}VTLztl}usleztlVTL{u{}f]c|u{{mtttt{lks||z||u{{~bVUtsl~JHFek]lks\[[lrilri\UZbVUultkd\zll[TTd\\uzt|usred\\uztmw[[TSKJ|JHFd\\ultJHF*)(|uztlredulekrg]ztlult}sreult|zttsfkk|z}srellk{u{{||{u{lldu{{|uztultLKRVTL\UZlekuzttts{u{[[T{{lldultllk||uztl}redvlddtsl{ttuztlldlks||~lri[TTtslf]cuttsltllv{}||||lks|||zult{{||{{{{}{u{llkĂvyfd||rfk}{||ztluztlri|lrillktt{|{{]cd]cdmttfkkfkk{{Ù|}|{{mtt{||lldlrikk]lldddc|zlld||ddcldd{{{{JHFUUYu{{lddJHFf]cldd||ttsllklriv{ddclldj]\dc\}}lri|JHFJHFuztlld{ttztlllkjV[|z|zkd\uzttsl}|zztl}tsltts{tt{||ult|zlekuzt]bZMRKlld]bZ|tt{{{tllk||u{{||zbVUtsllldfkk|tslsred\\fkkldd}|{{t}{||tts]bZ{u{~|||{u{tts{||f]c|u|tts~ldduztu{{|}||mtt|{{||ttstt{uzt{ttut~}~f]cmw}llklektts{{lrilriedkultJHFlks{{{{lksedk|z|zlks|zuzt}|}|uVTL|v}slerr]tzl|z|[TT|lri}|tslUTSd\\|ekduztyl[[T}~VZTlekvlldultztlf]c{ttF=Ckk]rg]UTS*)(slej]\}||uldd}}ttsrg]sle|utt{VTLsleztl}zll|}u{{{{tts|zlriUTSJHF[TT{{{{}|uzt{{t{||fkktslmttsre{ttu{{}b[U}{||tzlkd\74,{u{ztl}ztl||uztmtt{u{f]clrid\\lddttsultult}[TTlks{{|z|fkk||{{ttsu{{]cdtts{u{||\[[}|kd\{zmttsekdttsf]ctlldc\tzlJHF{||lkstll{{lkszlld\\dc\v{redv|{u{f]cedku{{~llkekduzt|zttsmtt}{||tllkk]{||tllllklri|zVTLek]dc\|z|dc\{{t{||lksmttultmtt{{}{{|[TTsresle{||lld]bZrr]JHFttsJHF{zm|uJHF:97tsllrilld|}|}}uukd\v{|tt{}{u{u{{lks||lri||{||llkmttf]c{{{||{{t|zuztlekdc\tt{kk]lek||d\\|z|z{||||||kd\VTL{||tllsre|||UMR~}{tt||kk]}{{{u{{{|{tt|z|{||{||{{{||}ttsuztUTSUTSSKJSKJ|}utultslelksddcd\\lek||uztddctsl}{u{\[b}{{f]c]cdJHFultllktsl||lddD;9lldbVUuztekd|z{ttek]|z|z|z|z|z||yleekd}||||[[TbVU{||||{{t|dc\\[[mttlld[[TSKJVTL}tts|\[b{{tj]\JHF*)({tt|z|u}}|u{zmdc\leklld|{{tslellk||uzt{||}zl||||llk{u{|z~{{v{mttlekullk{{ldd|{{ekd{tt|z|ttsldd{u{|z|u|ztllztldc\b[U[[TddcVZTtlldc\ekdldduztlri||{ttlek}u{{ekd{||}zll{{ultmtt{{{{{{mttek]lri||z|z{{tlldultttsUUYdc\v|Ē}|v{s_qred}VTL]cdtzltzlmtt{||f]c[[T|lksedk\[[}tt{|u{{}b[U{{d\\tt{|mtt{{{{}|||redslej]\ultbVUr]ZcbVkd\slelddkd\{tttll\UZVZ[dc\edkuzt[[T[TT\UZlld[[Tzllkd\VTLj]\>EC:97ult|z{{tzllztlVTL|}}|}|red{tt{tttllttsuult||ultdc\{u{}vedk{{{|||LKRtslmttu{{ttsd\\ttsuztldduztj]\|tt{llklddkk]tt{|uldd|{zm|zlrid\\||ekdlek|z|z{u{{zm[TT|zttsUTS|u{{t||{{{ttfkklks{{|]cdtt{fkktt{||mttultttsf]c|z|z{u{{u{ultkd\SKJkd\tll}{{t{{t}uttslSKJJHFb[U|tslvldd|]bZdc\mtt|ttsVZTult|{{}{u{}ċ||bVU~ult|z}dc\ldd|ztslUTSSKJlld[TTslej]\\[[MRK[[T{{tlksllk{||{||mttlrimttddc[TTj]\}kk]lddtslu{{{u{\[bVZ[}|JHF*)(tll|z|uyleutkd\sle||j]\{{tvddc}kk]ztl||}tts}|{tttt{|ztts{tttsl{{t{u{tsllriuVTL\[b[[Tedk|u|zlektt{{{lddtts||leklddlldtll}tll||tsl\[[{||ult{{tMSS|z|zu{{|lddu{{|{tt|sleSKJfkkVTL{ttztltzl|u}{{t{{{zmtllv{ult{{|znvultmttult|zttstt{|{{tkd\dc\{{kd\ult}{tt}kd\iq]|zUTS|{ttllk[TTedklksu{{]bZVZ[lri]cdlek|lekllkllkkk]{tt{{tllk||u|ulksllkb[Udc\VTLjcVcbV]bZlddVTL}dc\\[[uzt{{tlksttslddmtt|z]cdlld{u{[[TVTL{{tlrillk{{tuddc[[TedkmttUMR>EC74,|||ztsl|utllkd\{zmldd|z]bZ|u}}tt{{zm|ztl{u{lks|z}|}u{{||{ttf]c[[Tsre{|||ztslldd]cdtt{{{lks|lksfkk||tllSKJlddSKJ[[Tlek}ultekdlld\[[||uMSS\[b\[[lldd\\edkf]ckd\|zult|||zultult}|edkf]c{{lks|{{mttmtt|{u{|tsl{{{{Ǧ}sreutsre}{{t{u{{tt|zwv{{tukd\|ulldtsl{{ttt{leklksult}u{{ulttts{tt~ultllk|||llku{{tts|kd\||ult|zllkkd\usre}VZTekdlksJHFUMRlri|]cdbVZ|zlldUTS|ulld||dc\sleVTLJHFJHFJHFztlJHF3+*{u{u]bZtsl|u{ttut{{tjcVb[Ukd\ttssle||{u{{u{rfkutfkk}llkult{||}|zf]c{u{zll\[[tt{lekdc\\[bf]cult{{tllkllkldd}uf]cv{|uultVTLuztttsslef]c||ddc\[[|z}u{{ldd|||tllrfkttslek{||{||tzl{{t|{u{|}lriedkllk}{{|||z|{{||bVUredtllƨ|udc\}|uv~]bZuztkd\lek~\UZ|bVZultf]cf]c}}}fkk{{{{mttUTStzl}tllultult{{tultdc\u{{uztekd[[Tlridc\|zlrisleddctzldc\VZ[lriUTS\[[ddcVZT|fkk}bVUtt{|tsllld{zmlriulldf]c{ttUTS|zJHF*)(lksuztuztzlluu{tt{ttuzt}{u{|bVU|u}tll}{||uzt{u{lekvtts{||}v{{u{{||{{t{u{SKJlld{{t|{u{ult{u{lld{||{||{tt}j]\}s_qzll}tsl|ud\\zllcbVtslmtttsl\[[tll\UZ{zmuztu{{u{{|{{t}ttslek}uzt{{tult}{tt{{~ttstt{{{uzttt{ldd|zu{{|z|tsltt{tt{ddcddcSKJ{tttllv{}||ztlmw{||uztfkkMRKlrilrillkddc}{||edk{{f]cleku{{u{{mtt{{tsl|mtt|z{||tsl|dc\{u{edk|JHFVTLVTLiq]VTLu{{]bZlekllkuzt\UZttsJHF]bZvJHF]cd]bZSKJut}ub[UlldcbVzll|}|{{t|zmttmttJHF*)(ldd{zmvu{zm}|{{tut|vutv{{||tts|u{tttts{zm}{u{tlltt{ztl|{||}v{||llktlllldlddlri}{{f]cult||}mttf]c||ultrfkulttll~}{tt{||{ttddctzluztttsuzt||edktts{||{{{{tmtt||{tt}|tts}d\\lekttstt{|}}tts{ttekd}|b[Uzll{tt}lksult{u{~}tllv{v{tll{{|z|zlldf]c}{{]cduzt}{{}v{[[Tuzt{||{{tVTLcbVllk|tzl[[TuztUTSuzt\UZVZ[ekdtll\[[uztUMRlri[[Ttts}|zkk]ekd{zm||ztzl[[Tedkv{:973+*|zttslld{zm}||ztlldd|utsl||{ttą{{t{u{||lrif]c{{\UZ\[bf]c{{}||[TT}\UZ{u{sle~ut|z|lriuztSKJ{||ultlksMSS|{{}|zlks{||||}|uzt}{tttts||ult}vuztttslddlddtsllks}ultlksultlddldd~||}ulttll}|zlridc\|zekdlri|tslf]c||{{t{{uzt|z|lldllduztkk]]bZ{ttllk[[T|mttddcVTL{{}f]cUTSlkslkslri{||lksttsultultlks}|{{tdc\]bZ|z[[T[[TLKR*)({{tll{zm|z{{t}z}|{tttt{uzt}{||}}|ddc{u{{{{||ttsleku{{ttslek\UZlddVZ[}lkstt{{||tllttsrfk}|v|lddrg]v{utlddlldekdtzlekdtlllld~{{}\[[f]c|z{||llkllk{tt|lldtts{u{{{{{ddcttsultult{{|z{{}d\\{ttv{}tt{tllf]cut{{\UZrfkult|||uztllk}sle{u{d\\]bZtsllrillkmtt{ttmttd\\|||v{ult|tsltzl{|||lriuztlksztl||z{{t{{t[TTlldekd}d\\{u{d\\[TTJHFVZTuzt{||ekdf]c{{lek||lrizllztltzl|z{{t]bZ]cdu{{:97*)(kk][TTu|uzt}}}sle}|ult}|{||edk|z}{{d\\]cd|z}}~ylemttkd\ddcf]c{u{sre}ttskd\zlldc\llktslttsd\\|ultu{{ttslrilksddclksddc||lks}}||z{{{ttrfk{zmtsl{{tv{{}tts|{{t|tts|{{tv|}}}}\[b}ddc{{ttllf]culritsl}|{zm||}}]cdu{{u{{[TT{{mttv{|ztl{{tll{u{{{|z|z|zlrikk]|z}tzltllllk{tt|\[[kk]||tllVZT|u{{tt{|z]bZ}[TTtt{lri{||ultlld|zllkekd[TT{||mtttzltll{||F=C7-2utztl||{zmsrekd\{{tsleultzlut{u{}}mtt}{u{uzt|lksmtt{ttu{{{{tuztdc\tt{ult{||||tll[TT{{tddcut{||\[[{||ekdlld|{{t{||tts\[blks|lrilks}llklddllkllkf]c\[[tts|ulldu{{edk}}ut}|u{||}|ttssre}}}u}{{f]c{u{zlllddztl{ttttslksedkFD;kd\zl[TT}UMR\UZ|lksedkUTSu{{u{{|zyl{{t}{{tllkd\\||{{|ult{||]bZ{{tlddVTL{||||{{t|mttf]cuztultlksllktt{{u{edkrfktll}lri{{{tt|u}ztl[[Tztl~|{{tlldlldJHF*)(tsld\\|zztlwl[[T}v{u{{}{tt}~zll}~ttstts{u{|z{||||tlllritt{\[b|}ekdldd||llk{{t|z|ztsl}{{ult{{tcbV{tt}||cbV|u{||VTL\UZ|{{||||uyle|{tt|tllllktts|ztts||~|f]c{{~|lld{u{{{lri{{{{ztl}tlltsl}f]c{u{tts{||[[Td\\zllj]\vSKJv{sre\[[}|{{mttf]c}tts}tzlVZT}\[[ultdc\lri|{{tu{{ult}ddc}|VZTVTLuztmttJHF|z|zlld}lld}tts|ultf]cddc[TTtslf]c{{trfk>EC{{tVTLlldllk{ttfkktsl|z]bZ:97:97}||tll|u{{t|ztl{{t|u}u}|ultdc\slerfk|v{{{t|{||vtt{{{t]cdtt{uzt{ttddclri]bZrfk|{{t|u{{ultlriredu{{|r]g{{t}ldd||lddredredmttUMRu{{{tt{||srett{}{{||rfk{||{||ttslri{||}{tt~f]cv|\[[vtt{llk|u|z|||lldtt{ztf}{||dc\f]c}}|}kd\lekVZTlrisleredzlltllztlsreVTL{{tv{{lks|zuztsle\[b]cd}~uztmttttsmttddc{|||z{||sleJHF|\[[[TTdc\}lri|z\[[]cdrg]ekdtsl||ddcuzttt{|lld|vdc\u{{SKJdc\tslVTLlld[TTsre||lriaWMSKJ|zD;9*)(}tslu}{{t|lekaWMut|}}|[[T[[T]bZmttd\\{zmtsl{{t||}lriztl}{ttldd}{u{}ult||z|zekdu{{f]cztltts}ztfddc{{tsre||{tt{||lksulttt{llk{{sle{{|{{tult}vllktllcbV|z|ztltt{{||mwsresleult{tt}uzllutylelritlltlltzlkd\b[Uddc}lekedkut|||u{{|zllk{{|tslu{{}lld}UTS|z[[Tultuzttt{mtt{{t{{tlld]bZbVUultultUMR}{||b[Uztlf]c{{ultult|{||{{{{kd\tt{fkkf]cd\\utzll{{tlrilridc\\[[ekduzt:97*)(tzlsre}{tttts|{tttts||z{tt||ddcldd|]bZ\[b||tt{v}b[U|z|{||u{{ldd{u{}kd\zllkd\lekv{kd\edk}{{|tts[[T{{mttdc\]cdSKJleklkskk]{||tsllldllkslelld[[T{tt}|ddc|zldd}v{ultuztttslddmw{ttultv{{|||tlltsl{{t{||\UZ{{|{ttSKJttsjcVldd]bZ|}|lekf]cdc\tts{{}lri{{}yledkbVZj]\[[T|uekdd\\{{{ttddcttsf]c[[Tek]sleultlksFD;zllztl||tt{UMRfkkultu{{|uJHFred}}{{{||\UZztl{||||z]bZkk]dc\\[[UTS]bZ:97*)({{t{ttlddred}{zm}ztfztl|}{||{tt||{||ddc{{||lektlld\\lld}sredc\u{{{||sleSKJ|tlltllzllr]gmtt{||tsl}|z{{tuztd\\||ddc|ztllrittsztl|z|||{u{ut{{lld{{t}}|lekult}tt{tts{{UTSlksttslritts{u{||}|uek]|u{||tsl{{t||{||tts|z{{t\UZddcztldc\VTLVTLek]tll{ttyfltt{\[[}[TTtt{leku{{VTL]cduztu{{lksd\\|zf]clri{u{j]\edkttsllk]bZllk{{\[[SKJek]tll|vVZT[TT{||dc\ldd[[Tvlksf]c}ttsf]cJHF]cd{{lektt{fkk}v{|zsle\[b~lrisre]bZ[[TFD;||:97:97rfkkd\{tt{{t|||zult}{{lektts{{tllk{u{{{{ttb[UbVZtsl|ultztfv{{u{llkztlUTS{{sre|mtt||mtt}ek]}{{\[[lrisle{u{}rfk}lri|||}tslultmtt||llk|u}{u{}ttsllk}{||dc\{||ult|z{{ttslult||uztÓ|{||{||lldv}}ultbVUf]cldd}edk[[Tlriultultlriek]{{tdkVmtt}ztlulttt{llkUMRLKR}{tttts{{\[[ttstts}|kk]llk|||uztlek}{{f]cJHF{||VTLlri}|mttllk\[b{u{ultllkttssre{{trg]|zuztMRK\[[dc\:97*)(dc\ztl}||{u{u}|{||}uuzt{{t{{{u{SKJ[TT|zkd\u{{UTS||j]\{zmldd}rfk{{tll{tt{tt{||JHFtslv{{{tu{{uzttts|zlldd\\v{|z}|ullkf]cultult|u{tt|z{||v|ylult{u{|{u{{||ztlult[TT{tt{{[TTtlltsl{u{tlltslred}{||tts{tt|uzt{u{||||z{tt{{[TT]bZb[Ulriuztdc\{tt{{tredult|z{||{{t{zm{{t{{tVTL\UZttsd\\}ddc||\UZek]SKJ{{ttt{UMR{{td\\VZTUMRlri{ttddc||}d\\tsltts[TT|}|u{{zllri}ddcUTS[TTlektslFD;,55}yle}ut||}{{|}~|sre|z|ulri|tllu{{|z}ult|v{||dc\fkkleklks~|{||j]\tll~{u{ututtts{u{}{||uztuztllklld\UZVTL{{|z|lrikk]{{t}tllrr]{{ttt{lddf]cv{lri|~{{|]bZ}~fkk}|llkb[U{u{||d\\||tzldc\cbV{{dc\j]\ddc}|zu{{tsl}{||leklek}zll|zvsle}v{VZ[ultultbVZ}|tllSKJVZ[uztUUYUTS|ddctslllk{{}{ttleku{{lri{{{{tztltll[TT{{{ttut}ddcUUYllklritt{ztlVTL|{{tlddtslmttlriztltslUTSJHF:97*)(}{||ut}tll{{tztlultuzt{{t|{|||u|}|zlks{tt|tsl{tt||v{ddcutJHF}tts}bVU{u{{{t{u{{{slerfk{{|{{tult\[[]cd[[TmttlriVTLlri|ztl||lld|{ttd\\{{}{{tll~||}}lri{tt{||llkzll|slellk{u{sletll|u||}lkstzl||ulld|v~{tt{u{\[[}{||uzt[[Trfkd\\{u{tsl|z|uult{u{UUY\[[ldd{{t{u{utult{{t}ultj]\lektt{ztllriddc{ttb[ULKRVZ[lksf]cttslddult||{u{ultut{{tbVU{||VZT\[[{{ttllVZ[mtt{ttmtt{{tf]cSKJ{u{|\UZztldc\SKJv{tsl{{tuztuzt|\[[VZTUTS:97*)(||kd\{{tztl||srettstsltt{}|z{u{UTSztl|z{||tts{||ekdbVZekdu|uVTL\UZ{||f]cult{u{}|lekv{{u{leklksf]clldUMR{{cbVddcSKJuztddc|usle{u{}kd\ult}}{{t{{{ttdc\zllztlut||zv{{tttsl|kd\}j]\~{{{tttts[TTmttu{{kk]leku{ttuztlekedklrimttd\\\[[||{{ultwl{u{UTSedkd\\|UUYtllf]ctts}|z||UTS\[[llkUMRrededk{{|lek|sre||utddclrimtttt{{u{|lri\[b\[b[[Tlri{||lldf]cmtttlllekdc\uuttsmttv{[[Tekd:97*)(ztlutsl}||{tt||{{}tsl}{tt|zUTS]cdlritll|lkslldtslmtt||uultwltslrfk}j]\\[[uztleksresre{||{u{||{||d\\}{tttt{|z|ulks}|ulld}|z|tllu{{|||u{{|sle}{u{}lddv{|umwtll{{t}}ttsfkklri{{t{|||ztts{u{b[U{||i\Vvllk}tt{lriSKJb[U]bZ{u{llk{ttdc\uztfkkddc{u{||}tzl{zmtsl{ttztllldllktt{||lri{u{slef]c|{{tMRKsretzlsretslUUYUTS~ttsldd{||{u{\[b[TTf]ctslcbVtlltt{b[UUUY{{kd\ultJHFleklld{ttfkk}UTSJHFVTL|z}JHF*)(}ut|z||}{tt}{||v{||uzt|ztts|lri|uedk]cd]cdf]ctsl{u{|z{{tt{ult|bVUlrif]cJHFbVZlek|ultvslezlltt{}fkkj]\}{ttult{zm{||||}|~n|ztll{u{{{t|zddctllztl{{|z|}}}}{||||||||~ultzll{||llkkd\lek}sle{tt|ullkllkzll~[[Ttlltt{[TT\[[ddcSKJutredu{{tt{|z|zlridc\tt{lrif]c{u{{||{u{lkslektllylezlltslmttsleultJHF{{ek]lldzlllldekdztl|z]cd|ekdUTSultJHFVTLkd\v{sle|tt{tll{{ttts}lek{{tlks]bZF=C*)(lld|z|tslvtll~rfk{{tts{||ttstll||sremttu{{fkk|uzt{ttuztmtt}{||||z{||uzt||tts}tt{f]cJHFfkk{||ddc{tt}ultult|zddcsle}lrillk|sle||tll|{{||lrilks|u{||||{u{tll|ztt{v[[T|u|ztl|uwlzllsleuztut{u{yfdllklld{||{u{cbV}||ttszllb[U}ttsrg]ultUMRrfk[TT{||ttslldllkJHFedk{zm]bZred||cbVlkslks}|ultrfkulttts|ult[TTztlVTL{{|ult[[T{zmfkklrilekJHFdc\tsl~lddlldlri|{{tztlSKJ||mttiWUd\\lritzl}ldd{||tzlfkkLKR*)(u{{|||v{|z{|||z}{||{||lkslddlrilri{{||u||ztl{|||uJHF|rfk{tt{{kd\leklksf]cmttbVUult[TTtts]bZdc\tslv{ztlttsekd||uddc\UZsle{ttu{{tts|z{tt|z{u{tts||\UZztlwl|mw||urfk}|f]cultsleu{{}{{uzt\[[{||ut}}zllztfVTLlekddc}lddultkd\mttekd]bZ||SKJuzt\UZdc\kk]{||zllv{|tts{{t{{tUTSdc\tt{JHF]cdddcjcVlriyflu{{{{[[Tmtt|zlri|zlks{{tmttVTLredcbVlksdc\ttsuzt||tsl{||ddcfkk]bZJHF*)(||z|u}|~}sre}|z|tsl||tt{|u{{mttlekulttsltts{||lldslelldultf]c}fkktt{f]c{{tlritll|lddultultttslld}{u{{zmtllultekd|{zm|uultult|ttsddc{{tedkred{{}tts}|llk{{}{||ult|u|usle}sleyfl[TT{||ddc{||lri{tttsllksi\V|u{u{{tttll{u{{{rg]tll}v{ttsredtslztltslVZT\[[ekdu{{ek]ultbVZf]clek|ldduzt}rfklksu{{ult|z|{||lld[TTf]clri|{||]bZddcllduzt|llduzt}bVUtlltlltlluv|zfkktzltslllkllklek\[b|zVTLsle\[b:97]bZrr]ut}ztl|\[[{tt|kd\lld{{tultu{{tt{ultu{{lksmttedk{{||{||tll|zf]c||kd\tlllldlld}llk||{{|zultedkekd{u{||JHFtllUTSmttultuzt\UZ}|zd\\ult]bZd\\tts{zmtts|||[TT||lld|||z|z{{|z||u{{dc\{u{llk}}|||v{||||||lks}{tt|uultultleklek}||ututfkkddc}wlj]\{yfj]\f]c|uekdllkv{ultd\\i\V[TTv{v{ttsutek]ldd||\[[ult{{ttllfkk|f]cuztldd{u{uzt}u{{|UTSult{{t]cdVZ[}uztJHFMRK{{t|zSKJ\UZlld}{{llduztllktll|JHFJHFVTLllk\[[&&ek]{||}|||{{ldd||z}{||}|lriultlksmttlriUMR{{sle{{lriult}bVZtslfkk}{u{ddc{tt]cdUTS|mw{||d\\|dc\llk{||lri||{ttu{{ultldd}{ttUTSVTLrfk{u{slelritllztllld{||}ddc{tt|ttsv|b[Uuzt|{||sle{{tttsulttsltllultred|ulddVTLcbV}||ldd||}v}||ttsttsddctsllekSKJd\\{{t\[[dc\}ult{||llk||v{{u{mttlldf]cbVZf]c}ddcttslek}\UZv|uultredUUY{zmmtt|z{{tult||||~lrilritsltsl|z|zf]cu{{{tttllllklddekd|ztzl|ztl}\UZlek\[[VTLslemttMRK%&tsllld{tt||ultuztuzt|z|UTS|{{|[[T\[[]cdlekd\\{ttleklrif]cldd{{}sle}mttSKJllklldsle{ttddc{ttj]\llklritlluzt|lld|}{ttbVU]cdVZTlldultslef]cdc\ztl||{||||mtttslmtt{{tlltt{|tll{{sleztl{u{|||ukk]v{dc\v|f]c}|v}f]c}|||ukd\||kd\}\[[ztlsre{tt{{t{||sre[[Tlddkk]{||bVZ{{t{{tzllf]clek{tttsltt{ztllekult}{{tf]c|uddc{{j]\{u{f]c\[b|zlek|mttlek]cdtts|z}[[T{ttlddlldlld}ekd\[[dc\lriu{{{u{}llkmttf]clddddcMRK*)(VZTmttztl|u}|}{{t|zlekllktsl|z}[TTd\\{{{u{}f]cttstsl{tttslmttJHFlld[[T{{llkj]\VTL||ldd|z{ttllkult|z{||MRKutll|v|j]\}lldsleulttts}|}|z}}tt{|z}{tt}utrfkb[Utll[[TlksbVZ}|{ttrg]}}ulttt{tts}}lksrfk|j]\{{tllkllk}ut{u{lri}ddckk]|{u{ttstll|lekb[U{tttts{zmuzt{ttuztztlldd}{{}}|tsl[[T||}tllyl\UZ|}[TTVZTtlllri|tllztlrfkultd\\ult|zu{tt{{t{{tlld{||]bZtzl{{lekmttlldztldc\>ECtts{u{}|||z{{|zuzt}SKJ|]bZVTLkd\lld]cd\[blek{u{{tt{{ekdlldult{||{tt{{t{ttSKJlld|lriuzt|{tt||u{{u{{{{|ulttt{lri|zllttsttstt{kk]ut}{u{tlltts}tts}v{|umttldd[[Tlldsleztlultllk|lddztl{{tmtt{tt{u{zllut}{{t||}||tsl{||sle[[Tlldlri{{{{tt{{u{lksuzt{||sled\\SKJ[[Tuzt{|||}{u{|tsl|z{|||||lks]bZmttslemttedktslmttldd{{t{||ultttsj]\llklld{tt}lek{{ttstll[[Tmtt}lek{||{{tlldlld]cd-1+tsl|{||Ĥult|||z}}|lddu{{uztllktt{lek{u{|ztlu{||{||}}}kd\lld{||u{{zlllkstzlmtttts{||ldd{||mtt|z|}}ddc{zm|z{ttlriddc}}tt{{{{{{{tllttsfkktsl{||{tt{u{d\\SKJu{{rfkv{zll{{t||{{tu{||ttskd\tsl||lekut|u{{ztlsre{||]bZtsl{||tlluztuztsle{ttedkzll|ztsltllj]\zllslelld|{tt||tsldc\tsltt{lrikd\slered{u{lddddc|u\[bllkmttSKJtsllrib[Uedk{{ultedk}|ztll}zll\UZllktt{ttslksmtttt{[[Tultlri{{tlrisle\[bLKR%&}{||Ħ|{{{tt}{{{{t||utll|zVTLlddmttmttlksttsult|z\[[ztld\\tlllld{{tsl{{sle|lld||{ttUTSlek{zm{{LKRekd|ukk]|z{ttttsuuzt}||{{t{|||u|fkktts{||{|||z{||ttsu{{lddlddd\\tts~[[Ttsl||}}}|u{{t\[[j]\lriSKJ}||}||ztzl}{tt}ldd|{{ttll{||lddrg]{u{lrilri\[[|mtt{{t|z{{tVTLbVZztl{{ttsldc\]bZllk|ttsldd{u{|tt{u|u{||[[T{{\[btt{b[Umtt{{{ttrfk{u{UTSlritlltts}ult{||ddclri{||tsl|b[Uttsllk[TT\[[ek]FD;}~|{{t||{tt|lri{u{llklri\[[{{{||{u{dc\{tttslzll||{tt}}||sreut{||ddc}ttslrikk]llkllklld{{tUMRttstslultuzt}{ttultlekekdlriddcu{{}lldtt{uzttts{{t|}lddult~|z}SKJ{u{v{sre|ztl}||||mttllk}{ttv{}ldd\[[lldjcV}]bZkk]bVZ{tt}u{zmVTL\[[|\[[f]clddekd|sle{ttutf]cVTL|UTS]bZztluztlridc\}rfk\UZ|z|u{{{{tts}u{{tt{u{{|z}|lrilddf]cVZT{||UTSttsVTLtsl~dc\ultu{{ultllkUTS)+2|||zl{{t|||z{{ddc{||lks}uzt{{t}{u{{u{utlddf]ctllztluVTLult|d\\ultVTL}{{llkllk{tt{u{u{{ztlttskd\JHFlri|tll|||lld|tllsle|ztl\[[}{||tt{||zll{{t}llkdc\yleutlltts}{tt}uzt}{tt{u{ttsdc\{||{{tllkztlztflddlrillkddcek]|zdc\|zdc\lddUTSf]clekred[[T{{|u{{t}edk}|srett{{u{lrimttuztddcekduzt]bZedk|ziq]lks{||sletllutult{||uztu{{dc\tts{{dc\tts\[[|zddc{ttuzt}{u{tll\[bLKR|zu}v|||Ĝ||||fkk{{{||{{}ult{u{tsltt{}tslldddc\rg]llk{ttlldsleutult}llk{||d\\|u|{{llkdc\]bZttslek|uldd{u{}cbV{||{ttu{tt{||{{||z{u{ttsult{||fkk\[[u{{{u{{tt|{tt{zm{tt|u|ldd\UZsled\\kd\{tt{{tlldmtt]bZekdtts}bVZ}llklldkd\SKJddc{u{ztlllktzlb[U{u{{tt{{tu{{lri||r]g||ucbV|z}||zekd|z|zmttuzt||d\\UMR||lksf]c{{t]bZ|uuztmtt[[Tttslri|zdc\JHF}tll}[TT{ttultd\\MSSLKRv{|||tzledk\[b}lks||||llkztl|z{{t||lld|utsl{||}sleu{{|z\[[ttsu}ekdllktt{ddctzltsljcV||{|||zzll}||{ttu{{zll{{t||{tt|tt{tslttstlltt{tt{\[[ultllk}lksu{{t|}tts{u{||tts||}|{ttsle{tt[TTkd\tsl{u{{{tkd\{u{v{JHF}|ztllri{ttultbVUdc\{u{lek}ttsttsut||{{ut{||ztl|zsle|tzl|]bZ|]bZu{{\[buztJHF\[b{tt]bZyle\UZ{||tllredVZTek]fkklddlekedk|ttsu{{]bZ]bZ|zv{ult|||sle\[bMRKUTS|cbV~}|znsle|{||lldllklri|u{|||u{{ult{{}{{lkslldd\\ut}}ztlutv{lek|ured{u{{u{{tt}lddldddc\sle||z\[[{||ult{u{\UZllkf]cf]ctzlsreSKJ|tzl[TTutsle|u[[Tu{||tsltsltsluzttts}|u}uztldd{{tldd||ztl}f]cuztult|u|ztsl}ult}}|ult{||d\\}ult|{{t||uyle{|||usle{{t||tsllldFD;uztllktzllld\[[lld}dc\bVZSKJtzlztllriultztlkd\{{tkk]ztltsluztu{{mttv{u{{{||lksddcllkMSSlldult}{{tUMRf]clektll{{tlld{||u{{tll\[[dc\]cd]bZlriutult}~UMRf]cJHF?;C|}}u}|ztsluztUUY}lksultlksmtt|||{u{}{{t|||z}ldd~{u{cbV{{tuu{zmj]\||ttstts|ztllf]c}|lrilriulri{tt{||zllut||||||z{u{{{ulttll{u{u{{tsl{{t|tllf]c{{||{tt{{zll\[[||{||uu{{b[UslejV[|uztl}ttsv{}j]\|v{tt{tt[TT|u}|ylett{sre||tlllddiq]{u{|||kd\{{ttslf]ctll{u{b[Ulksztl|uzt{{tmtt{||\[b|lksUTS{||\[[|lkssle\[bllk\[bUMRttsuzt\[b{{lekdc\tt{u\[[{{t|[[T{{t|{{tultldd}tlllddbVZldd\UZJHFlks||u}{{t|z|uyleult]cd{{tlekultedklksu{{|dc\lek{||{{tlri{ttultlddUTS|||sleddc\[[lri|lek[[T{tttll|u|uztJHFlkscbV|zllk|z}}|kd\|ztll}tll}{{||{tt|ddculttll[TT{u{}}|zn{||{{tlddmw}||}ylebVZ}|ekd}{ttkd\zll{tt{u{ult[TT}[TTlri{u{{tt}mtttt{ultllkztlUTStll{tt{tt[[Tllk\[[ttsLKR[TTtzl\[[SKJmtt|mttddcu{{lekdc\ultlks{u{ult[[Ttzl{{t}fkkfkk|{||uztuzt{tt{{t}ultkd\tllJHF*)(|zzlī}|}lld}ult{u{llk|lri{tt||utddc||{u{f]c[TTlldcbV}UTSn[[Tlrikd\{{lri{{tlri{zm{tt|zll{{t}|z||{{t|}fkkuttslultu{{}}ddctt{||lddldd{{d\\ultv{{ttlriut|z}uztztlzll||tllttsuzt|ulddztltts||lek|uttsek]||}}}lek||ztlslewldc\uztztl{ttuzt|zllklddu{{|{{t]bZ{u{SKJUMRmttSKJ]cd]bZ|zmttlriMRK}f]clldJHFdc\UTSd\\mtt|tlllriekdlri|\[[tlltt{dc\lridc\{u{{{lddlektll}d\\lddJHF$|lektsl{{t\UZUTS|{ttlri|lri|zltllutv{||ttsslebVUldd|zdc\|j]\dc\redzlluztttsJHFlek{{sretsl{||{zm{||}sleult|uzt}tts||ulttzl{||tt{|lriv{{u{|||zmttultek]{u{ttszllv{lekutslcbV|zuztkd\}zll}tsl|z|uv{red{{r]glrilld{u{{u{}|[[Tkd\}|u|zj]\lddf]ckd\{u{}[TTdc\|ek][TTlld{{t{||{u{ult{|||mtt{{tUTSddc|z\[blrimttuztlriu{{leku{{lksmttlri{{{||{{t{{|zllddcttsuztllkuzt|zlekdc\ztl{u{ult}}{tt{||ttsultVZT*)(|utslwl}Ǥ|zĜ||tzl|z||z[TTVTL[TTlriu{{utv{tll||v{}}zll}lld{{tlldlekyfd~}kd\tsl{tt{{t{tt||v|uztllklddcbV{u{SKJlri|ztzldc\{u{{zm{tt{tt}tsltsl|z|zutsl|utts||}ultult|ttsuzt{{t}|utsl{{tlltts{{tult|zdc\tslv{||{{t|uut{{tuzttzl{zm}||u|uuzt||}|ztllztfb[Uekdttsj]\u|zllk{u{~{u{{||||[[T|]cdUTS|uf]cbVUb[U{{tj]\llk{||}{tt[[T[[Td\\llk|z{tt{{|lks{{MSSlriVTLbVUf]cUMR>B9|||]cdtts]cd|ek]}{{t|z{ttb[U{u{ult{ttr]Z{ttMRK*)(ultmw¿wl{||{ttllku|zFD;ultu{{u{{fkkUTS{ttzll}d\\{u{lld}|||}uzt{ttkk]UMRrfkutttsSKJztlrfktsl\UZwlllkttsb[Uldd{||{||kk]}ek]|ultlldllk{tt}slesle{tttsl{u{}}|ut|uztu{{{{{{t}lri||ttslriult{tt{{tkk]{{tultttsllddc\{{t{zm{{tj]\zllv{{u{tll|tzlb[U{{t}|tll}|}ult}lrilriVTL{zm|u|uultlddzllztlf]ctts|z{tt{||uztlldtsl{||fkkek]tts{zmddctllVTLultuztbVUlriuztekdf]cttstt{u{{UUYJHF]bZ}{{[[Ttsl{{mttv{{tldduztttslriuztuzt{zmllkf]ctllkd\lddv{rfkztlv{leklekJHF,55llklks}|z~v{uzt}|z{tt||ztl|v\[[lritlllld{{t{{t~tyguzttll|z}{||rg]kk]}|ult|tsllek}v{zll[[Tb[Uultrfk||u{u{}{{}|{u{}tt{jcVi\Vu|||{u{|sreztf{u{|u|z{zm|tsl|z|z|}|tll{{t}~{u{}fkku{{tllult{tt\[b{{t|sle|lektll|zu{u{|u}{||tsltslrg]|sle{{t|tslkk]ult|||lld}ut{||bVUrg]kd\lek||tsluzttts{u{zlmtt{zmztlj]\tts{{zlekdtll|yl]bZ|u{||fkk|\[bUTSD;9lksmtt|u{{lksmtt{{}{||ttsuttsltt{|ztlllekredf]cf]c}{tt}tlltllMRK*)(||vƤtts}ttsVTLttsuzt{tttts]bZ|uztllk{{tztl|uztd\\ldd|||uztl}utedkttslldldd}}}f]c{{tldduttts[TTSKJlriekdu}ttsv|}ukk]||ztlult|}}{|||{ttlrikk]{u{|tll{||}{||u{{{{tult|u}tslv{{{trg]{{t||ut{{td\\ttskk]~tts|vsre|u{{tdc\kk]|||d\\{u{slered{tt{tttll\[[{u{lld{||VTL{tt|ttslldztllks{||lrittsuztlddtll|zllk{||VZT\UZlrislef]cu{{{{tlldc\UTSlrilks|{|||{|||zddctsl}ekd{tt[TT|{tt{u{}{tt}dc\JHF*)(}}Ǧ|||tzl}}uuztuzt}tsltts}ddc|z}|zlridc\||ttsuzt||ldd{u{d\\zll|{{tll}ttsyletll|mttVTLtt{|kd\uVTL|uwltt{|ullkdc\tslult||jcVmw{zm{u{{||{u{{||{{ttsl|||{||}tts|z{zmtll{u{|{{t{{t||||{{t||u}yle||red||dc\uzt||slekd\mtttzl\[[ult||sle|||z{{tb[Utlllld|||ztllddtts}|zmtt{tt{{mtt|tt{}redv{lksekdleklksztllekuztdc\[[Tekdlek}lld{||[TTtlllddlek{ttut}}|]bZJHFF=C~|~|ēllk{tt}}lrittstsldc\tts|\[[[[Tkd\VTL[[Tr]gek]{ttlldllkut|ttszlldc\{||rfktsl|||tllllktzl||wl{||redsleSKJ{{t|zllsletsl{zmlekf]crg]vtts}{||sle|z}u{{{ttut}tt{}llkllk|lld{tt{ttultf]c|u}sre{|||u{ttllk{ttJHFtts{zmrg]{{t{{tjcVdc\sre]cd{{tutttsut[TTddcsref]clldultu{{kk]ztl}ultu{{|lri]bZlldfkkVZT]cdllk{tt|uVZ[mtt}llk{ttmtt]bZedkdc\{||fkk{u{lddzll{{tllultyfdredldd|||JHF*)(tsl~wl|vu{{}{||dc\uzt]bZ{|||tzllri}|u{tt{tt|}kd\r]gztltsl{||llkVTLtt{}uzt{||sre{{tsletsl|lddtt{{{kd\sre|ztll||{zm}f]cVTLztl|vsleu|}mtttslultd\\lksldd|ztts}tsl[TT|{zmdc\ztl{tt|u}{{tult{ttlri}zllulttll|uf]cult}sre|lddredSKJtslcbVtll||||sleVTLb[Uddc|tll{{tllkuzt|zSKJlri{||{ttlri{{kd\uzt}JHF|lri}f]c\UZ]bZult|}}lkslrimtt|zttsSKJlriuztedklks|||ttsttsrfkd\\{u{}}{||:97*)(}}}llk{{tuzttll||ztzllri{zm{tt{tt|utztltsl}{||{zm{||{{{u{|uzt{{tVTLf]c|z{||d\\{zmdkV[[Tddc}|u[[T{{{ttsle||f]c{u{}{tt|tsltt{ultzllddc{tt||{{tu{{ut|utll{zm|||wlv{yl}{ttsle}{{t{tt{ttlddekdut}{{tredkd\VTLsleldd{|||u{tt}|z{ttlldlriztl{{tVZ[tts]bZ{||}tll}{zm{tt{||ztlfkkrg]tt{mtttslddcMRKlkslri}tlltts{{{{}|{||ekduztttsedklrilks|lri[TT{{{u{||kd\{tttlltts{{t:97*)(||}}||}}}}}|u|z[[Tkk]|z|z}{zm||uztlu|z{||f]cttstll{{tkd\tzlf]c\UZ{{tut{tt|zekd}ttszlrg]u||}{||utf]c{||lddkd\tllsle|z||{||{tttts}|||{u{|z|z]cdtts{{|||ttsttsult{||ztlwlzll}{{t\UZ{{t{{tn{||wlldd{zm{u{mwzllbVUkd\lddslef]c[[Tredtlluzt{zm\[bj]\VTL|z{{tVTLlri{tt\UZek]lld{{tt{ddclddUMRlldztltt{ddcleklddf]cv{lksVZTf]ccbV{{lldddc{{ultvlksfkk|zuztlld\[[mtt{||ldd|ztt{}llklddztftts|lriVTL:97*)(}|}}~}u||dc\llk||{{tiq]|zuzttzl{{t|u}sle}ttstlltsluzttzld\\{ttlddrfkkd\{{tdc\{ttutu{{tllrg]UTStllsleultred|u{{t|[[Trg]j]\tllldd{{ttsl{ttzll|uddclld{{{||{||lek{{lldultmtt{ttdc\{tt}{ttuzt{u{}ztl}tslulttts|zultutrg]{{t|uVTLSKJkd\|||{{tztlttsd\\ztltllzllkd\f]clld[TT\UZultVTLsrelri]bZ{ttd\\:97{ttekdntt{ztljV[{u{VTL[[Tdc\|lek|{ttultldd{||lld}|UMRbVU}mttFD;llkuztf]clri{{ult{tt[[TVZ[nv\[b]cdtsllkstsluztf]clddd\\lkstsllek}bVUzll||tll|ddcb[U:97*)(ǜu{zmzll}|{||VZT|sleulttzlut|u{{|]bZ[TT{{ukd\sletsl{zm}{{ttts}{|||ddc{||SKJzllslesreUUY|u|UTS{ttVTLJHF|{u{{{taWMmtttsl{u{}|tzldc\uztut{||}{tt}ultut}||lek||{{llk\[[uzttlllldlks|u|z||}}||utll}u||z}VTLvek]tll{zmaWMlldVTLkk]rg]\[[{tttts{u{|u{{tult||[TTultbVUSKJ}dc\dc\{||ldd[TTlrildddc\|u||v{tzl{{t{{tutll{{t{tt}v{~}edkVZ[\UZVZTfkklldUUY{|||z]cdekd||mttlekVZTlksuzt|u{{lekf]clddultsleult||ztl{ttsreJHF74,}}||v{{{{{ttsl|||{tttslddcMRKuztsre\UZ|||}ztlulldVTL||{u{}lddf]c{{rfk~rr]}v{||}||tzl|z{||lks|{{|u||}z|{{t|tt{ut{tt{{|z|z||tt{mtt||u{{tztl||lek}lrirg]|z{ttddcwl|z{tt}dc\|u}wlcbVkd\ztld\\tzl{{tlldkd\tllllk{ttsred\\llklek}redkd\SKJekd\[[dc\\[[UTSsre\[b{{dc\rfkultult}llk}UMR\[[lldddc{||{u{|{{t{ttulttll}||z|tt{}MRK{{mtt{||tsl{||mtt|tts}{{UMRSKJred|lddd\\ttsu>B9:97}|}}}||u||usre|u{||}tlllrilritslultmtt|z|utsltslrfk{tt}|}kd\[[T|zkk]}redUMRbVUrfk||VTLldd{ttut|uut[[TVTLb[Uztlf]clksut}|zred|ulritsllekzll||z{tt}|||ekd}|tts||tsl~{u{sle{{yleut}|f]cttslriUTSd\\lldtsltzlllk{yfslewltsltll|lek|uuiWUslettsslelek||ultult|VTLztlkk]}{||]bZulddtt{tts{zmbVU}f]c|ttstsl{u{}lektll|zaWMlks{{{||}fkk|\[[VZ[ult\[bttsekdf]c{{{||srett{j]\|uj]\lddlddddclriJHF-1+slev|u}{zm|ztf}{tt[TT~|utll[[Tr]Zrfkult{||llk||UMR}}}tllbVZ{zm}tslkk]uzttslUTSmw\UZ{{SKJkd\ztfdc\{u{|uut||}lld{tt|z}|zll{{t||ekd\UZ{{rg]{zmjcVlldult|||lri||{zmu{{tsltt{llkmttUUYredu{{llk|zuzt{||}|dc\}||lksf]credult{{tsle{ttrr]tt{||||{zm{{twltllztl|j]\VTL|}vd\\ulttllultf]cuztlri{||[[Tztlf]cutek]ekduzt{{ztltllult|lritt{ztllek{{t|z{tt}{{{{\[[||lks|u{{{{VZTllkztlult{{t{{{{tts|tsl}lddbVUbVUtts{{tuzttslvMRK*)(wl{tt}}||||{{}|ljsleutyfl||{{}}}|}ultuztztl\[[vlldddc{ttut}ttsb[UlksttsbVUUMRj]\zllztfiWU}d\\}|utult|lddtslSKJlddred||i\V}|zv{}lldedktsl|uzllddclksztl|}{u{llkkd\~llktsltts}d\\{{tlldllk||||v{|u{{|srekd\{u{lek||uzt{{tddcttsfkkv{}UTS{{t||~uzt{||}kd\kd\rg]lritzluztzltts{tttll|{{||f]cddcut|lrif]c}ddcuztu{{tts[TTllk{tt{u{bVUlek{ttldd{{tJHF*)(zllwlü¿wl}|}}i\Vtslzllllk||tllekdlri}u{{tslelldlrilldaWM[[Tj]\}|zdc\ultutSKJ\[[VTLtllztlv{lekUMR{||\UZzllusledc\{{{u{ut{tt|ullkd\\|{tt}{tt|||ttsfkkv{tllleklks|z|||ult{{ult{||{ttlld}lddUTStsl}}{ttztff]cUTSd\\lri|tsllldVTL[[Tsre{u{lldtslddc{tt}slekd\llku}{tt{{t}tsl}|vkk]llkuztult}ultldd{ttttstts{zmtsl|||lkstzllkslekdc\utsleVTLlek|{||b[U{u{}|sle{||tll{{||vtll{{~tslldd{tt{{\[[mtt|lks|z{{\[[slered{u{|:97*)(}}}}ult{tt}{{tzll}slezllUTSVTLtsltts{||{u{{tt}uttsl{|||u|uUTSredrfkuztdc\VTL}{ttVTL}d\\uztyfd|udc\ut||}|f]c{tt|ttsUTSu{||kd\|sle}{tt}||||}}lektsldc\{zmtt{{{tt{|{{||bVZ{||{ttttsd\\[TT[[Tulttll~tll{u{||}VTL|ztl{||aWMbVUVTLSKJcbVlek[[TaWMMRKrg]{||}d\\v{}{tt{{tVTLub[U{tt\UZ{{tUTSkd\{||ult{{ttslb[Uult{{t|{{tbVU}lek\UZzll|tll]bZ{{t{u{tts|z}ttsf]c{{\[[\[b]cd]cd\[b{u{{{{{uzt|tslu{{{{utztlkd\ztllld[[TD;9:97wl|utult{tt}|ulld|ubVZuzt}{yf}lri}}ttsu||ztl|usrelddkk]kd\[[T[[T{tt|ub[Ured}ultv{|}|||f]cr]ZultcbVjcV{||ultred{{tlldrfklrillk|zrfk}}||||}tllu{{edk|zlld|utddcmtt||~jV[edkzlllriu{{tt{sleuzt|uult{u{rg]mtt|zu{tt[TTbVUb[U[TT3+*kd\kd\ek]cbVlld}ztl}{tt|uttslVTLtsl|u|z{ttv{\[[dc\b[Uddcb[Ub[Ulld\[[{u{lldultllddc\tsllekllk~sleuztlritslu{{ultlddv}}|}|{u{f]cllk}lddlekmttmttdc\tt{mttedktll|}lri\[[{{tuztutslezllkd\red{ttdc\uztlldUMR:97}ljlj}}sle}d\\|ztsltzl|uv||ztlttsv{{{uzt{{lld{ttdc\{{t|lldrfk{||||}||ulldlldbVU{ttv{yleek]{ttddc||]bZtsl{zmlddutdc\aWMddcttsredtll{{tzll{{tlddutb[U}uzt}{ttsle\[[||llktts{||lrifkk|rg]ult|ullk{||llk||ztllkd\llkuztf]c{{ttslsle|ztllultVTLj]\{ttrfk|ub[UvVTL|ulld{{tdc\|uzttslsledkVu|llk{ttv{tslrg]lldVTLlrivttsllkb[Ullkttsrfk{u{llk|z|{{d\\ldd|ulriuultf]cldd|tt{ddctt{{{edklri\[bu{{ultd\\lksek]lkslri\[[{tt}}|tlllddi\Vlriwlj]\||tzlVTLJHFwlv~}|¾Ʋtts}}ttslddtll{{utultlrileku{{t||ttslriulttts}ukk]SKJj]\ldd[TT}|ztt{||zllbVUVTLbVZ{tt{tt{{t]bZyle||d\\|{{t|u}sletsltlltll|ztllek{u{{tt{{tttsttsu{{ultttstllulttt{ddcllkulttlltt{|ulttsl[TTtlltsl||ultztlkd\|ullkkk]UMR}srezll|uyle}SKJllk{ttsreVTLuuzt{{tztl\[[{tt{tt}|j]\{tt|sletllzll}}LKRuztutljedkv{|uttslridc\|u{tt|utsltsl~lksttsf]cztl]cd[TTtzl{||mtt{{u{{UUY]cdkd\uzt|lriUTS{||d\\{tt{u{yleyleyleJHFkd\red{{t{{t}JHF*)(wlüü|||}|ult|rfkjcV{{tldd{|||zultj]\lldldd{{tcbV{ttwl{{tcbVSKJ|ukd\j]\lld{tttll}kd\tsluttyg|zdc\uttll}tll{{t}f]csleuzt}||rg]b[U{u{{u{lld{tt{tttts{|||}|ldd{u{u{{tlllek{{{tt|v{}|||ztl{{tsleVTL[[Tzll}}z|}|redtsldc\]bZldd{||ek]mtt|rfkzllult}kd\tslcbV}edktll{ttuzt{{d\\VTLbVUlrib[Uldddc\dc\}}|uztl{tt{{tf]ctsl{tt|zmttVTLdc\|{{{{tt{ekdddc{{t{|||d\\uztlldtlltll||tllztlllkr]Z}}}kk]{{tFD;74,~~}|||u{{ttsl}sretts}bVUddc}lek||||u{{ttsl}|z|u[[Tj]\\[[tts|u|mttultbVU}VTLcbV[TT}rfkekd\[[uztj]\MRKultrg]sle{{t{tt{||tll||tts|||zj]\yle|||z|llk|z{u{d\\|ult{|||z}}|[TT||ztl{zmrg]d\\ekdztlwltsl}||}ut}utdc\kk]}{{t|||ultlekkk]{ttsle}|yle||[[Tek]tzltllultultutb[Ulri\[[bVZwld\\sleultztl{u{}{zmuttll}|u|tsl{{tMRK{||{||lri{||lddekdd\\f]cddc{tt}{ttcbV|u{{t|u|uVTL-1+}}uzt{{t}}llkdc\uztfsrerg]lddttsulturfk}{{t{tt{||u{{tzllddultsle}}ttsVTLrfkf]cv{|lri{||{||lld|uztlkd\ztl|u[TTdc\|utsltllbVZ||}|tslsre|z|cbVkk]{||{tt{||tsl|utts{||{ttuzt\[[|lksztl|uekd{tt||f]c}dc\{||lldmttrfkldd{tt}|zll}|ztltll||{{t{tt{{t||ukd\kk]tslv|red}|utllztlddclri|z{||uzt}{ttzllztlddcllduzt{{ttll{tt}|zllultldd{u{lldr]g{{sleztl{{uzttsl|u{|||v|{u{{u{{u{rfklri|zulttts}VZ[|zlritts{|||z]bZtslsleztl}||vdc\llk}|ut{tt|z[[T*)(tllwl}ü}}}|{tt}ztf{zmuultb[UlldVTLrg]ultzlltsltllultslef]c}|zllk{{tztlbVU}tll\UZJHF[TTtllllk[TTldd{u{f]c{tt{||sleulti\VVTLVTLkd\ztlekdcbVcbVttstlllddtllut}ldd}}ttsult||{tt|f]c{{t{{}{{|znv{u{||ult{u{|}tts|rg]{tt|jcVSKJjcV{{tf]c{zmtsltzltll\UZzll||}ultv{|u}|||}{||zllf]cdc\tsl{{|u|[[T}{||}|ek]~|slef]cmttzlltllbVZSKJ{||||{{{{t{||\UZv{{ttlekutztl{tt}VTL}{{tu{{ultult{ttuzt|z}{ttb[U|utllyle{ttutv}sreD;9*)(}||v}~sre}}|||}|zltsl}tt{v{}VTLultulttt{|f]c{||kd\}srebVUbVUult{u{\[[sleultlld||b[UtslbVUSKJFD;]bZSKJsrekd\[[Tlddd\\ztltzlttskk]sleut|u{ttvztl|||z|zlksf]ctt{fkklksUMR}tsl{{lldleku||||lldsletslb[Uztfldd{tt{{t{{tlldultcbVut|u|uult}j]\{tttts|vrg]tll{ttd\\uzt{{tuztrg]bVZlddlddtts|u}MRK|tslrfkv{UMRbVZ}}|{{tll{tt}sretts}f]cut}|{{tdc\dc\}||||ddcf]cf]c{||{{ut}zlltllredj]\|utslj]\red||ztlJHF*)(~utüütsl||ztluztztlutkd\rfklddutJHFuzt{||{||uzttzl{{t{{lrizllrg]{||lddlrijcVttsv{ultf]cSKJtll{||}|{{t{tt[[TUTSVTLj]\llklddlksttsv}{||r]Zekdddc|||ztl{||||}j]\{ttllkuzt{{|u{{{||{{lksedk{u{tsl|z|zttslks{{tkd\lksttsedk{tt{u{{{tultllddc\redredut{tttts||ttstllkd\yfdzll|uultdc\d\\{tt{u{}ldd{{tttsv|lddllk{tt}|usre{||tsllddlek|uUMRultbVZtts[[T{u{||tsl|tllult||ultbVU{{td\\[TT|tzlfkk}sre{||lri|uldd{||{||||}|{u{wl{zmtlld\\utwlv|rg]rg]FD;74,}zj]\ü|zv}||{{tslellk{{t||{tttt{{tttts{zmztl||tll||}|||zlddtts[[T{{ttzlkd\{tt{u{[TTd\\[TT}{tt{{tddc[TTd\\ekdrg]kk]bVZllkldd[TTtzllritll[[Td\\b[U{{t{tt{{ttts}|}}|{u{||u{{{{tllktt{{{|}tts}|vtt{}|{u{tll{u{{u{}||llkdc\red}zf]c}{||ut{{tUTS|utllsreyletts}|yfd{{t||sleyfl}{{tut}{{||v{{u{}v{VTLv{{edktllf]c[[Tslelddllk{zmu{{ultztlrg]{zm{{t|tll{{t|]bZtt{|zlek|}ddclekd\\kd\llkddc{tt}|uztldd\UZf]c}|v>B93+*||ü}}||ztt{u~lld{ttkd\tts{ttlldj]\tllv{f]ctsl{tt{ttrg]ddctll|}|llkiWU]bZtlluzttsl{{t{||ultlekdc\}|JHF{|||ttsrfktllJHF{||v{srellkddckd\b[Utslslekk]d\\{|||lekyleztl}ddctts}u{{uzt|zuztddc\[[|z|}\[bf]clksldd||}}}|j]\lldi\V{{tzllkd\ldd}|i\V||llktlllld{||llk}|b[UbVUutbVZ{ttsrettszll}ult||{tt}lek{{t}[[Tddcttstlledktll{{|}srecbV{{tsreu{{kk]tll|vzll|u||||ult{tt|{||{||n{u{}ult|tsld\\rfk}|{zmtll{zm}|zllyleztlkd\kd\:97*)(}u|||ztf{u{yfdut{zmulddtslv{}}}llksle{{|uldd}tzl|uddclri|FD;d\\u{{]bZllkd\\rfklddlddsrezllSKJ}tsl|zsleVTLtsldc\|lddsleVTLzlllldrg]srelddultd\\{u{||{tt|uztl||mttllk|{{|}||ddclriuzt{ttlkslekUUY}||kk]ldddc\}tllsrekd\bVZultlldv{bVZbVZlddlri~kd\v}{{|}|f]clddultldd{||llkd\\kk]{u{v{|||||{||tsl{u{VTL{zmbVUddcttslriztltllUTSulttsl|vttsrg]||tslv||kd\[[T{{tll|lek||{tt|vutztfzllsle||kd\wl:97*)(lddut}}{{tuut|u||}ttswlv{{{t|u|u}|sle{||f]crfk{{t||}zll{||d\\rg]redlddztlllkf]c}rfk[[Ttll}tt{j]\VTLkk]lldslettslridc\||tll}dc\tyg|ztllddj]\mtt{zmut{{t||f]cv{tlllddd\\}}ekd|{{tt{|z{u{tlllek{||~{{{{tllkleksle|zsle|u{ttllklriredkk]VZTzllredbVZ[[T{{t{tt}ultddc{tt|utredrfk{u{{{{||}lriztl]bZ\[[utVTL|lldlriddctsl{zm[[Tf]ctsl{tt}v{lek{||bVZ}{u{ztl{{tkd\uztuzt|z|{{||ztt{ut{||{{t{zmlldlldd\\sletll|uzllldd}|yle|}>B9&&~{tt}u{{t|||utrr]redtsl{u{tsl}ztl}|{{t}{{t{||zllsle|tll}}ult{tttllsleultllksrettskd\\[[tllf]csreztld\\ttstll}{{tVTLUTS[[Tlldztlkd\b[U{||}kk]ekduzt||kd\lddlkszll||{ttkd\u{{{{ddcek]lks|mtt|edk}||{u{}ddc{||||~cbVkk]tllkd\f]clrib[U||j]\ztf{||{u{{zm||ldd{tt|ud\\}||rfk}|utsltts{||tslkk]}ut{ttredsrej]\ttsUTStts{u{{||{tt~ult}|uztttszll{|||u~{zmztl|zllsrelri}|zekdekdslellkldd|u|u|tzl|u{zm|{tt}|vredkk]i\VD;9*)({{t|v||}u|uutztl}}yleb[U[[Tzllf]czll~{ttulttsl{u{kd\{tt|zkd\||zll|ultlldzll|v}|sledkVv{dc\dc\{tt||}lridc\kk]mttSKJ{{trfkFD;sre{{ttll{{t|[TTb[Usle}b[U{{tsre||tll{||tll}~v{||tt{lldultuztmtt{{{{{{lrilks|z{u{uztult||}ttslddlks{u{{{tvu{{{u{|}yle{||tsl{{ztlkd\d\\f]cuzt}tzl{||bVUrg]}|v{tttslkd\}|||{u{{ttrg]kd\[[Tlldtsl]bZult{tt{{sleztlztfztlut}|||uztlsle}lek|zwl}tll}ek]{||{||tsl||{||{tt||JHF}i\Vutztl}|wlredFD;*)(v|}ut~vldd{ttubVU{||tsltll{{t{||ultuztttsu}|{tt{|||u}lri}sleldd}FD;{||ult|z}lri{ttttsllkekdu{{lldb[UlriutUTStygtllsreuzt}ztlsre[TTaWM|zztlrfklld||}tll}tll|||zlkslrilek]cd||lkstt{}fkkllk{ttultleksle{{{{t{{t|z}{u{ultrfktsltt{rg]lldutUTSzllyleslekk]{{t{||lddutlekf]c{u{{u{r]g||||{|||}tllredtzlsleVTL|z{{ttllttsllk{ttv{||]bZ{{vulttsl||}tsl{{t}}mttmttu{{{{tlddlldtzlllk{ttj]\lddsle|||uztlsletslrg]JHF*)(~{{t}}|uzll}{{t}|v|z}{||srelri}}}|u|z{{}{{tyfl}slellkr]ZbVZllkred{ttddc[[Tlld}lldlld||tzltll[[Tddc{||rg]dc\b[Usresleslensre}{{ttll|lritzlzlltll}tts{{ult]cd|z{{||u{{|mttlriultuzt{{ultf]clks\[bmttultlddztldc\kk]{ttut}llkddc|sre{ttutzllztl{{{u{kd\d\\ut{u{utred{tt{||ztltllkk]\[[lri}ult}uztwl|zmtt}tt{mtt]bZ}tts}sretts{u{{||v{ztl[[T}zl}lldttscbVlldttssrerg]sle{{tutztl|ui\VzllutllJHF!¾ƣu}{{t}{tt{{tttsztl|u{|||lld}tsldc\dc\kk]tsl|ut|||}zllllk{u{{ttb[U}{{ttsl{{lribVZlritlllriVZTUTStlluztf]c}mtttslkd\||vuztyle{zm{u{JHF||||{zm|}{{||lkslksekd}|fkkdc\ulttt{|lddd\\tsl{u{tts|uVTLn}ultf]cult|zlks{{||ztl|u{{tlekttsldd{||lddrfkbVZdc\{{tu{{tll{{t{tt|ut}||z}|u{zmkd\u{{ztlrg]||llku}}|||}{ttlri{tt}|}{||sre{{t|z{{t||sletsl}{{t{{tztl[[Tu[TTsleultb[Uztl}|{tt}v{ult>B9*)(||v{v{zlltts~dc\lekylev{{{{{ldd{||{{td\\[[Tuztllkn}ulddsle|zztlu|u||tts|ztts{tt|u{{t[[T\[[|||ldd}|tts|||}|sleslejcV||kd\tzltts|u|v}{tt{||{{{{}{{tslmttmttmttmttuzt\[b\[[{||lddlekultult|rfk{ttldddc\}tsllldttsldddc\[[Tlldlld{{t{{[[TbVUkd\ttslddedkzll\UZd\\tll{||uztlriultzll\UZ{{ttyg[TTMRK\[[llk\UZ{ttult}wlkk]||ttsztldc\{{tulld||tzl|z{zmkd\|lriiq]lldtllsrebVU{zmztlztl}|utllyle}D;9*)(}wl|wl||kd\{{t{||{tt{{tu{||{{trfkrg]}}{{t{u{wl|{tt{u{d\\|uztlu|ztl|SKJttssle}bVU[[Tultllkultlks|llk|u[[Td\\tts|u{{t|u|u|u{{tf]csle||{{tsleztllldv{ztltsltlledklld{{{{|ztt{|mtt{{mttu{{{||{{llduztd\\\UZlks[[Tf]clld{u{llk{{tlddcbVultlddult||}dc\{{t{tt[TTUMR{ttb[UmwVTLrfk{u{VTLSKJ{tt{{tv{vredldd[TTtsldc\|utsle}z}ekdllkllkldd{||{{uzt}sre}|vlekllk}|zll}||tts|{{t}|ztlb[U|{tt{||{{tlddtts|uutztl||ut||wl}:97*)(||zutll{||tts||f]cultttssleb[Uvu]bZ[TT|zddcb[U|z|u|tsl}kd\{zmv{||llklddsle}ultttsb[U}cbV}||tlli\VVTLSKJkd\tll{{t|uyletll|u}|utslsle{||b[U{tttsltsldc\{u{{ttlks{{{||uzt{{mtt|mtt|z||z|{||llk{ttlek{||{{d\\bVZbVZ{u{|z}|uzlulttlluztdc\redUTSztfkk]SKJ|lekkd\f]ctllVTLmttd\\tsl|||u\[[kd\{||{ttsle}ldd{{v{}lksmtttllsleultztlultUMRlddutllkuztttszllsre|}|u}}lddztfsre||]bZred||u{{twlztlztl||tslwlJHF*)(Ƶ}u|v|u}yle}||uuztmtt{{td\\||u}{zm|u||u}|{||f]csresre}ultllksle{||ultultuztlldd\\{u{VTL]bZ{{tsre{zm}JHFSKJdc\dc\|uztf[[Ttllkd\|u||}}lldkd\ztlj]\{tttsl{{t{ttttstllddclddlekmttu{{mtt|tt{{{{{ttslkstt{|}||ttsf]c}bVZylelri|zsre{||kk]{|||uldd|zkd\rg]|vsreztlrfk|}rfkztlkk]b[U|u}zlltlltllf]c{{trfkrg]rfkuzt|z}{u{leklektlllek||ttsmttut}|vzllnllk}|ultf]c}|lddtsl{u{}}tll{||}wl}{{t[[Tdc\tlltsl}|u|||u}{tt~ztlD;9*)(uut}lldwl{tt{u{zll{{ttts}MRKsre|z}|udc\||{{tlriuut}|utsl}|||zll||||ztld\\ddcsre\UZ{{t|}|u{{tdc\j]\f]cVTLslelddttsuzt}}b[Utll|vyleztlkd\kd\wlf]ctsl}}d\\||}{ttllktts{{n{{mttlkslksultlek|mtttt{ult]cdv{bVZ{tttt{tsllld{{tzl{{tutslf]cj]\llk{{t{{tut{{tu{{tlek{zm|urfklks||kd\}|SKJf]ccbV||sreldd}slesletsl|uzllttsultlriekd|{tt||{tt{||{ttrfk||}{u{}tll|ud\\|u[[Ttsl|usrekd\lld}lldrg]u|v{kd\||r]Zsle|uredredVTLcbVFD;*)(|v{zm{{t}}{{tu|u{u{||{{taWMllk|{{tredllk{||ut{tt}tzlSKJJHFVTL{tt{zmb[U|ult{ttutldd[TTult{ttd\\slej]\kd\|zudc\slelddkd\f]ctslb[UJHF|tts{u{dc\{tt|u}llkvtts|lddtts{{ttslcbV||{{t}ttslks||{{{{VZ[]bZfkklksleklkslrimtt|\[[\UZUUY{ttldd{u{{{tcbV[[Ttllultldd{||sretsltts{zmkk]lld}||{||ud\\tll|zv{kd\b[Utzlu{{tsl|ztsl||tll}{{tkd\|vVTLlldslelri{tt{u{lksmtttt{|z|}||{||tsl{ttult}{||uztkd\||}|}bVU{ttd\\ttstsluuzttsl|{||{{tuztf]cult{zmzlluzt}ztlrg]d\\j]\tllrg]rg]}|||{{tztlUTS*)(}|u{ttrfk{{tztltll{{t{||rg]{{t{||zll|z||tts{||{{t\[[llk|u}||ztygv{ttsj]\}||u{u{bVUztl}VTL]bZlddllk\[[UMRtll[[Ttsl{||dc\{zmlrij]\tll{zmtsltlldc\{{tztl}{ttkd\VTLlldbVUb[U{{t}|}rfk}|VTLsre{{|tt{|{{llknv{||mttd\\{{fkk|ttsf]cUTSlks\[[bVZ}v|u}~sre|llk{{tttsllkd\\ztllri[[T||z}sre}}dc\tllf]c{tt}|tts{{{u{sle{{t|z}{{t{{{{t[TTtllVZT[[T||{|||bVU{u{llk|zu{{||{||\UZ{{lrizllzllsletts{ttv|z{{tlddj]\ztl{zmslesle|}ztltsl{ttSKJlldek]v||sleutsleSKJ*)(}ƨ}{zm{zmtll}|||tll{u{lld[TTlrisle}|{{t|zek]{tt}|usle{{tlddzll{tt||{ttkd\{u{{{tttstts}lldSKJ]bZuztkd\tsl}{{ttllVTLd\\[TTD;9{{tlldv{sre{||kd\ztldkVkd\|b[U{{t}ztl|{{tlrislelksmttmtt{{VZ[{{fkkmtt{u{ulttsllksd\\d\\llk|ukk]sreuztttskd\tt{\[[lldredztl{{t}llksle|utll\UZ||ult{u{{tt{||dc\jcVtslult{{t|u{zm{{ttts{tt{u{j]\d\\edkekd|{{{||tts{{}u{{{{ttts}uzt|{ttv{|{||{{t}ttslldttsult{{t}lridc\b[UcbV|llkkk]|utsl{ttutztlrg]ddc||redD;9:97wl}||}}{tt||||{tt|uuztrg]llktts{zmultb[U\[[[TT{||kd\{||{ttsled\\||uv{tslj]\dc\sled\\||kd\lek{{ddcldd\[[dc\[[Td\\f]cslesle{ttb[U[TT]bZrfklddut|bVZj]\ztlztl}|kd\|z{zmztf|z}}rfktsl{|||zkd\tt{{{lri{ttlri\[[|mtt{{]cd\[bttsf]c{u{lks{{f]cddc\UZ{|||lld{{t|kk]kk]{{tlrildd{{ttllddcult]bZ~uzt{{tb[U}f]cf]c{ttj]\{ttsresle|ulddult{{ttts||u{|||u|zultUTS{ttttsttsf]c{{{u{ztl}ut{{{||}{||lrizll}uu{|||uuzttts||{{ttsluzt|||sre{{twl{{ttslztfkd\ztl}|sre||{{ttsl{||FD;*)(vvu||redredu{u{||}{ttztl}{||}lld{{tred[TTldd{ttslelekrg]sledc\tsl|||}tllv{[[Td\\|uztltll{||}uztf]c]bZlddb[Ulddd\\{u{{{tutulddvredVTLkk]lddbVZ|usleldd}|ldd{ttllk||u|u{{t}{||sleutztl||lri|{{{{tt{]cdult{{mtt{{|tt{edkf]clksllkekdmtt{{tlks{u{lek\[[d\\ek]lldllkkd\|tslsreldd\[[d\\sle}llktslsleddclddtt{utv{{ttultldd|uVTLkd\UTSu|}{tt{||uztldd]bZtsllks{{{u{lksult[[Tlektslllkuzt|ztzl}lek}|zlld{u{||b[USKJd\\mwFD;[TTllk|ttsudc\{tt{zmek]llkcbV[[T}{{t]bZtllsre{ttjcVyle}sleSKJ*)(}|}{ttlld{ttlld||}|z{||{{t|z{{ttts{||ult|u}|v{zmtygrfk{{t}|{tttsl||zll||ztl}{ttldd[TT}{{tddc{||tsltlltsl{u{ek]lektllrfkztl{ttlddkk]kd\ddcf]ckd\b[Uekdd\\zllaWMMRK||{||lri{ttj]\{zm}{yf|zkk]}{tt}uztddc||zlksmttuztllkmttf]c\[bultekdlksult||iq]b[U{u{}{u{\[[ldd{{t{{t[TT{{tlldtsl{zmlld}dc\sleddcd\\aWMlri|{{tVTLlldtllr]gtt{}lddd\\tslutddcztlddcb[U{||[[Tlld{{t]bZ|||u{{{||\UZ\UZSKJkd\ekdtll{tt|zf]c{||lksfkktslttsb[Uf]c{||v{{u{{ttllktsltllaWM|z{tt{||ztl{ttj]\tsl||dc\dc\lri{zm{{[[Tred|u||lldtslsre{zmtsltllcbV{ttkd\ztl{{t{ttmttlddD;9:97||uzt{ttv{|{u{|u{zm|z||{ttultlri|z||z}||{zmtsldc\red{{t||{|||slered{u{{ttredlldslelddlekj]\dc\SKJslelritslb[U{||ddcuzt{{t{{tldd{{t[TT{tt{zmSKJ|utsle{{ttll{ttztlv[TTslelrilld{ttj]\}|kd\tslllkztlbVZtts}{{tdc\lkslksddc{{{{llkmttu{{ddc\[[UUYUMR{{{{uztmttlddlekdc\ddclekllkult}lrilddlriu{ttd\\lek{{t{||ztlldd|zkk]VTL{u{j]\b[U\[bd\\[TT|ub[Ured{||[TTllkVTLb[Uredb[Uj]\]cd{||j]\tllttsekd{u{{||{ttVTLlri{u{||tll{||tllkd\{||]cd|zdc\lks||ddcbVUSKJztlVTL[TTlrittscbV{||sletygtts|zrg]||||{u{lddztllri}|z}dc\ldd[[T|zttskd\[[Td\\tslb[Utzl[[T[TTkd\{||}red|||tslj]\SKJ*)(ult}{tt|uztl||{zm|wl}{{tlks}{{t{|||zztlsredc\sre{tt}|ut}{{tzllekdttslddllktll{||kk]{{t|uultulttll\[b]bZbVU[TTtslf]c{||tsltlltll}lldkk]tlld\\kd\j]\|uFD;tll{ttsleVTLb[UlddVTLztl||ttsultkd\cbVdc\{zmusletts}tll[[T]cdslelks{{{{edkddc{||u{{mtt\UZ\[bJHFVZ[lkstt{ddclks}lks[[Td\\lekllkf]ctts}VTLtslttsbVZ[[T[TTzllkk]||mttzldc\lks||VTL\UZSKJd\\lekkd\zlllddlldddcSKJVTL[TTtsl}\[[dc\tslVTLVTLlrildd\UZlldd\\{u{llkllk{ttttstllbVZlkslridc\uztmtt}lektlluztlekj]\b[Uu{{d\\{tttts[TTVTLtslVTLkk]ddc|uddc}{{t}tll||ekd|[TTdc\lld|uultttsf]c{||kk]sredc\kd\lddztlddcb[Uutlld{tt||sleJHF*)(}|uu|{tttsl{{tt{{ttsletsl{{tzllztlllk||UTSkk]dc\ekd{ttlddtslulttsltslkd\|z|zkk]{||d\\{||lddlri|utts}ttsSKJddctllult[[TVTLSKJllkJHFSKJ\UZdc\ldd|tsllldtslb[UUTS[TT]bZVTLj]\b[UVTL{tttslVTLzllztlztfldd{u{lrilddJHFb[UVTLkd\redtsltts||{ttllk{{tsllldUTSttsekd{{]cdf]cllktts{{\[bfkkVZ[}u{{lksddc|{u{{tttlledkuztlekutuzttsltslVTLtt{\[[d\\[TTekdj]\{{tlddkk]tzl[TT\[[d\\b[Umttllkllkldddc\\UZlekbVZlldtllzll}tslj]\[[Tdc\lldttslldllkuztkd\edk\UZVTLb[UJHFf]cUTSu{{ddcb[Ukd\UTSlriuzt]bZttslddMRK{ttUMR[TT{ttllk[[TlddcbV\[[{ttlldj]\[[Ttslsre||kd\ddcb[Uddctll]bZkd\|lldtlltsl||{||ult}d\\dc\ztldc\kd\tsl{u{sle|vsleddc{{tlld[TTD;9ztl||{|||{{t|zllk|z|tts{||llkd\\kd\{u{}lrilldlldztlkk]lldtsltslu{{sleedk[[TVTLrfkf]credkd\kd\]cd|zsle}lldtts{||ekdf]ctlllld|zslelldtts{tt{||tllcbVzll[TTdc\d\\{u{]bZbVU{tt\[[VTL[[Tkd\\[bb[U[TTtllslekd\|z[TTutztl\[[b[Usletsl{||tts[TT[TTlld|zd\\tsl{{t{{t{||lldtllttsd\\[[Td\\{{lrif]cfkklkslks|z{||mtttt{VZ[LKRVZ[mttmtt]cd\[[\[bd\\d\\lddlekmttedk\[[r]guztekdekdd\\lridc\{{t[TTlldd\\FD;[TTd\\kd\tslUTSlld\[[[TTkk]f]cj]\f]cf]c[TTtllf]cbVZUTSllkkd\ttslksllkd\\SKJmttUTSUMRd\\tllSKJ[TT\[br]gf]cUMRUTSztlddcslelkszlltll\UZtllVTL{||llddc\lldtt{VZTtt{}ultd\\d\\tt{mttekdlkssleVTLkd\{{tdc\dc\{{tldd[TTztl\[[dc\d\\b[Uddcd\\f]cb[UcbVlldlld{{ttslcbV[TTztlVTLkd\dc\lldtllb[Urg][TTUTSredkd\[TT:97{||}|ttsllk|tt{mtt|}{{{u{ztltts{u{{u{llk{{}{tt{ttkd\kd\dc\{u{tsldc\slelld|{{{||{|||tllttstlldc\{ttkd\{||{u{|zlld|zVZTSKJkd\lek|ztts\[[JHFf]clrildd{||sledc\ttsttsllddc\\[[JHFd\\UTSdc\ztfkd\\UZsleVTLd\\tslaWM[[Tllk{ttkd\lldlritsl||uzttts{||{{tlld{u{kk]ztf}{{tlridc\lddultekd]bZdc\llkSKJtlllksmttlksVZ[f]cllkUTSlks\[b\[btt{\[bult\[bVTL\[bJHFUUY[TTdc\UMR\[bd\\UTS[[T[[TVTLMRK\[[|ztllttsekdd\\b[USKJUTSSKJ\[[dc\lldttsllkj]\d\\leklddUMR[TT{tt\UZleklldtsld\\VTLkd\[TTuzt[[Tddcu{{{ttd\\JHFmtt[TTldddc\\UZtts{u{u{{SKJ\UZ[TTVTLUTSekdlldedkddc[TTllkddcddclridc\JHFedkttsult\[[[[Tllktslf]ccbV[TTkk][[TlldSKJSKJtlltlld\\fkkd\\sretslllkVTL{||{{t[[TVTLUTSd\\ldd[[Tdc\tllrg]]bZttskd\ldddc\d\\[TTztlJHF*)(||{{ttzl{||tll|llk|zttstll|tt{ldd}b[U{||ddcllk[[Tultlksultu{{{ttd\\JHFdc\VTLek]lld{{t{{tlddldd||sre|||lri||ddc{||{{t|u{{ddcddcedk{u{{u{tsl[[TJHF[[T\[[ddc{u{lddultkd\f]c[TTddcd\\dc\cbVlddultuztkk]b[U[TT[[TVTL\UZtllVTLb[Udc\kd\redlldVTLb[Ulldtzl{||tllekddc\lldtll{{tlddztltsl]bZlrilldlddttslld{||\[[UUY]cdedktt{mtt\[b]cd\[bUUY\[bmttlkslksUUYfkkUTS]bZUMRJHFUMR:97JHF:97UTSUTSJHFllkllkVTLSKJllk]cdcbVLKRb[Ub[U[[T\[[SKJVTL\[[dc\lriddcVTLdc\llkf]cllklddlldlddUMRUTStts\[bkd\VTLllkJHFtllbVZuztttslddddcbVU[TT[TTUTSJHFJHFddcUUYUMR\[bJHFJHF[TTdc\d\\ekd[TTUTSJHFVTL\[[]cdD;9f]clld]bZd\\VTLSKJVTLJHFllktt{|uekdUTS]bZdc\JHFkd\[TT[TTtll[[TVTL]cdb[U[[TSKJVTLdc\lldFD;[TTUTSSKJJHF[TT[TTdc\dc\b[Ulddd\\VTL\[[bVUd\\jcVkd\}JHF-1+{tt|u}{tttts{||{ttttsdc\uztllkttsu{{tts|zJHFedkleksle\[[sleek]llk\UZf]c{{tf]cedkSKJtts{ttlddlrillddc\\[[]bZ{{ttslUTSldd{u{llklksfkkllkultkd\[[TUTS]bZ[[Td\\tllUTSddctts\[[\[[dc\VZTJHFJHFJHFFD;UTSVZTVZTtllredd\\VTLVTLdc\kd\UTSd\\kk]dc\ddcUTS[TTdc\bVUcbVJHF[[T]bZtllb[UJHFd\\tllb[Umtt[TTUTS\[[VTLb[U[TTdc\VTLb[U[[Tddc[TTUTS\[[cbVVTLddcf]cf]cUTSlksllkVZ[]cdultmtt\[[edk\UZJHFLKRUMRJHFLKRUTSJHFJHF)+2:97F=CF=CJHF:97D;9d\\d\\VTLdc\VZTLKRJHFUTSJHFFD;JHFFD;UTSMSStllMRKUTS\[[UTS\[[\[[[TTf]cSKJSKJD;9JHFUTSUMRlddVZTUTSlekdc\lks\[[[TTddcF=CSKJFD;UMR:97JHF:97:97MSS:97\[[UUY\[bllkult{||JHFJHFFD;>B9>ECJHF:97JHFLKRUTS\UZ[TTUMRMRKd\\VTLJHFekdlldlddJHFF=CFD;MRKSKJSKJlldlddSKJllkUTS[[TJHFJHFD;9D;9:97:97>B9:97>EC:97D;9:97JHF[[TSKJSKJlddJHFFD;\UZJHFJHFSKJSKJSKJ*)(ztl{{t||{{t{tt{ttllkdc\lldldddc\[[TJHFedkdc\ddcmttlkstts]bZllklddtllultVTLMRKJHFUTS]bZ[[TUTSJHF\[[UTS\[[tslbVZllktsl[TT]bZ]bZFD;JHF>ECJHFJHFJHFVZ[UTSddc[[Td\\UTSVTLd\\SKJ\[[\[[UTSVZ[JHFJHFD;9dc\JHFJHFUTSSKJUTSJHFJHFd\\JHFJHFJHF:97UTSJHF:97FD;JHFVTLJHFJHFJHFdc\[[Tkd\JHFD;9JHFJHFJHFFD;FD;SKJ[TT[[Tldd\[[JHFddc\[[lldd\\[[Tddcllddc\VTLFD;JHF]cdllkddcldd\[[[TTd\\]cd\[[]cdJHFLKRJHF]cd*)($:97*)(*)(?;C:97:97*)()+2:97:97:97:97UUY3+**)(74,!*)(*)(*)(*)(*)(74,*)(*)(*)(JHF*)(:97*)(:97*)(74,3+**)(*)(3+**)(*)(7-2*)(:97*)(*)(*)(:97*)(,55*)(*)(*)(*)(*)(*)(*)(:97&&%&*)(>EC-1+%&FD;)+2LKRLKRUTS?;CJHF*)($*)(*)(,55*)(*)(F=C*)(*)(*)(*)(*)(74,:97-1+*)(*)(*)(:97:97JHF*)(74,-1+*)(*)(*)(74,3+**)(*)(&&*)(*)(*)(!*)(*)(*)(*)(*)(*)(*)(*)(:97*)(*)(:97*)(*)(D;9:97*)(-1+VTLSKJFD;\UZ[[TJHFSKJJHFLKRJHFSKJSKJ3+*:97:97JHFJHF74,:97LKRUTSMRKMRKJHF:97*)(:97*)(:973+*:97*)(:97:97JHFLKR>ECJHF,55:977-2*)(-1+74,:9774,-1+3+**)(*)()+2*)(*)(*)()+2:97JHF:97,55*)(*)(*)()+2*)(*)(?;C*)(74,:97*)(:977-2*)(JHF*)(&&*)(*)(3+*:97*)(3+**)(*)(*)(*)(74,3+*&&&&3+**)(*)(&&-1+*)(*)(*)(SKJ*)(*)(:97*)(D;9:97:9774,74,*)(*)(>EC*)(:97*)(*)(*)(*)(*)(*)(74,*)(-1+,55,55:97)+2*)(,55:97:97:97LKRJHF?;CUUYf]c\[b\[b\[[[TTSKJUMRJHFllkUTSllkJHFMRKVTLUTSJHFF=CVTLJHFFD;JHFJHFUTSJHFJHF>ECJHF>ECJHFJHFJHF:97LKR:97F=CJHF:97D;9:97:97:97:97FD;:97:97:97JHFF=CLKRJHF\[b\[[MRKMRKdc\]cdLKRek]UTS\[bMSSMRKJHF\UZJHFJHFVZTMRKJHFMRKJHFJHFJHF:97:97:97:97JHF>B9JHFMRKJHF:97D;9UMRVTLJHFFD;VTL[[TD;9JHFFD;>B9:97:97>B9D;9FD;JHFJHF>B9D;9:97JHFD;9FD;UTSSKJD;9FD;SKJD;9SKJJHF[TT[TTJHFJHFVTLVTL:97[[Tdc\VTLllkbVZf]cek]>B9VZ[\UZ>EC\[[VZ[UUY\[[\[bLKRVZTfkk]cd\[[[TTUTS>B9MRKMSSJHFSKJddc[TTVTLVZ[UUY\UZUMR\[[MRKllkVTLJHF:97SKJ[[TVZTJHFJHFVTL\[bJHFMSS[TTLKRJHF:97JHFD;9:97JHF:97JHF\[bf]cJHF:97VTLJHFJHF>EC:97>B9JHFSKJ:97:97SKJJHFJHFJHFJHFFD;SKJD;9MRKJHF74,JHF:97:97JHFFD;UMRD;9SKJbVUFD;MRKb[UJHF:97UMRMRKMSSLKRFD;:97FD;JHFekd:97JHFUMR]bZJHFUTS:97JHF\[[LKR\[bLKRMSSJHFLKRMSSOS`OS`JHF|ztlv{tsl}Ĥv}ult}wlztl}[[T\UZ¿¾Ƶ}Ʀü||}||lks)+2?;CLKRdc\ultd\\7-2>/Att{\[[f]c]bZ!:97%lrilridc\ddc:97SKJlddlldSKJ|:97*)(JHF[[TLKRJHF\[[JHFSKJVTLldd{u{f]ckd\]cdddcred{zmSKJVTL3+*:97%JHF\UZlld7-274,%&$VZTuzttll[[TUTSMSSVZTVTLVTLtlldc\tll[[Tddc[[TJHFJHFUMRekdddcUTS74,@/7 74,73FD;VTLRP:tslredbVUVTLD;9MRKFD;FD;D;9C8.]bZ&&&&3+*FD;D;93+*3)D;9dc\VTL3)FD;%&&0FD;SKJD;9D;9VTLdc\[[TVTLjcV||SKJ>R.VTLJHFGSu]cd|z|zlrityglldsreD;9SKJsre{{t|u{ttlddf]cMRK}{tttllek]f]c[[T]cdUMRD;9UUY"%VTLFD;JHF\[bf]cMRKfkktsllri[[T ,55-1+>B9VTLUMRD;9VTLVTLlldSKJ\[[sre{||VTLd\\{ttSKJfkkJHFD;9SKJsleVTLcbV>B9VTLVTLyledc\3+*"FD;FD;d\\D;9Q?@SKJ >B9*)(:97*)(]bZ7-2SKJ3+*dc\zllUTScbVJHFlldtslJHFlldf]cJHF\[[LKR%&-1+,55{{VZ[llkUMRlks]bZJHFF=CLKRf]clddlek\UZf]cMSSSKJf]c>ECf]c74,[[T]bZVTLttstll|]bZedk{u{[TT{ttUTSLKR\[bUMRJHFVZTUTSJHFJHFVTLdc\lldultVTLtlldc\uzt{ttSKJSKJSKJ74,UTSf]cf]cJHFkk]JHFD;974,*)(>B9*)(JHF3+*fkkultUTSJHF\UZUMRVZ[[TTd\\lriowd\\uzt]bZtsl\UZLKRultuzttts\[[lddFD;-1+FD;>B9%)*)("*)(FD;SKJFD;j]\UMR[[TFD;SKJ:97C8.D;9D;9SKJFD;JHFFD;JHFtllUMR:97SKJb[UVTLFD;JHFVTLD;9F=CPF=JHFD;9D;9SKJJHFVTLJHFvu|u|vlricbVJHFtsl\[bSKJ7-2[TTuzt|lldllklrib[UJHFb[Uultult[[Tlek{{tlldSKJ\[b{{{{tj]\tllultekdSKJSKJ\UZD;9ldd\[[[[TekdF=CVZ[JHFdc\uztultlri:97]cdfkkMRKJHFttsddc\[bJHF[[Tdc\]bZlriUTSddcVTLSKJUTSf]clri[TTztlb[UVTLVTLlldVTLVTLlddd\\cbVSKJMRKVTLkd\{ttb[UUMR\UZFD;*)(:97[[TFD;[TT:97>EC:97[[TJHFFD;sle[[TMRKVZTSKJVZT\[[>EC\[[UUYUUY>EC>ECJHFJHFUUY]cdJHF\UZ]cdlksddc>ECedkJHFddcj]\UTS\UZ\[[edkbVZf]c\[b[TT:97D;9[[TMRKb[Uek]VZTUUYJHFUUYVTL]cdd\\f]c\[b\[bD;9lriMSSSKJd\\[[T[TTsle\UZ\[[UTSb[Ullk\[bSKJtll\[[SKJSKJ*)(UMRUMRSKJJHF&&3+*:97JHF74,:97JHFLKRSKJf]c]cdf]c]cdedkVTLb[UVZTmtt[[T[[T]bZ[[TUTSu{{ddc{{t{u{lksf]c]bZ]bZVTLlri&&&&SKJaWM[TT[[TVTL[TTb[UFD;3+*FD;FD;VTL74,D;9VTLSKJ[TTd\\[TTD;9SKJJHFdc\JHFJHF[[T[TTJHFbVUUTSaWM[TTVTLtllllkSKJtsl{{t{zm{u{kk]]bZ|zMRKdc\VTLJHF%UMR{||ttstts\[[|tzlrfklddult{||ekdlddldddc\ddcb[Umtttt{ldddc\{ttultlriUMRUUY|dc\lekmttVTL\[[F=CMRKVTLfkk{u{{ttMSSMRK\[b:97ekdb[Udc\ult\[[:97dc\JHF[TTMRKddcu{{dc\j]\d\\[TTllkSKJkd\j]\d\\tll[[TlddmttVTLlldVTLJHFFD;D;9SKJJHF[TTddcD;9D;9*)(FD;b[U:97SKJsle:97SKJVTLddcVTLlld{||VZTddc{||llkF=CultlrimttJHF]cd>ECLKR:97MSS\[bMSS]cdVTL\[bddc>ECSKJ\[b\[[{||}JHFddcbVUulttts\[[FD;:97VTL3+*JHFVTL:97d\\:97]bZdc\ekdddcUMRLKRD;9[[T[[TJHFf]cbVZkk]tlldc\zllSKJb[Ukk]edkf]c{u{lek]bZUTStt{f]clddUMRUTSSKJJHFVZTFD;VTL:97FD;FD;lddJHFv{fkkVZ[VZ[\[[slelldlkslriJHF[[Tkk]\UZdc\VZT{ttVTLlks]bZ[[TJHFJHF&& -&&3)[TTSKJbVUkd\f]csleSKJ:97FD;&&FD;PF=FD;VTL[[T[TT[TTb[Ured:97[TT[[TVTLFD;VTLJHF[TTVTLf]cVTLSKJVTLD;9lldbVZJHF{zm}{ttlddMRKmttiq]zl|zUMRVZTJHFSKJ|tt{d\\lkstts[TTJHF{{tlrid\\[TT[TT]bZ[TTddclldlddlldSKJJHFedkUUYJHFlekJHFUMR[TT\[[{zmUTS\[bMSSVTL]cd{{UTSekdSKJLKRddcSKJllkJHF[[TFD;]bZlek]bZek]\UZVZ[UMRkd\lddztluzt[TTb[Ulekd\\{u{FD;VTLmttmttllkSKJMRK74,D;9VTLVTLb[USKJbVZ[TT&&PF=VTLVTL\UZek]>B9D;9tsl\[[ekdkk]mttdc\llk{ttllkSKJ\UZ{{llk\[b]cd>ECLKR:97LKR{{|z\[bf]ctt{MSS\[bVZ[LKRttslldj]\iWUUUYldd[TTf]cf]cJHFJHFJHFFD;JHF[TTtlldc\FD;JHFbVZlldlldddcJHFUMRSKJSKJSKJJHFSKJ{ttSKJkd\ulttll[TTSKJ{zm\[[ult{ttj]\cbV]cd\[bJHFf]cv\UZkk]jcVVTLMRKVTLsreUMRFD;UTSlekllkUMRUTS]cd{u{{{tddcu{{]bZuzt[TTsred\\b[UVTLVTL{ttVTLf]cFD;74,VTLVTL>B9 :97*)([[TD;9SKJVTLkd\d\\VTLredb[UPF=FD;sreVTLjcVek]UMRldd[TTUMRlddSKJkd\b[UFD;D;9SKJdc\JHFtll[[TSKJ74,SKJlldf]cLKRuslev{JHFVTLsreFD;ZbNlldf]cmttUMR{{ekdttsttstll{|||{||ultsleek]llkdc\ddctlltllddcd\\\[[mtttt{\UZUTSJHFb[U\[[{{JHFUMRVZ[UTStslu{{{||\UZ\[b[TT]cd>B9FD;f]ctt{:97\[[VTLdc\[[TlritslMRKFD;[TT[[Tredtts{zmdc\UTSd\\SKJSKJD;9VTL]bZrfkttsFD;!D;9VTLJHF\[[SKJUMRVTLJHFSKJj]\d\\D;9i\VJHFD;9ztlUTSlek[[TekdVZTekdlddtsllekd\\]cd{{tbVZJHF\[b>ECLKR]cdlkstsl{{mtt{{f]cJHFUTSultlddVTLUMRf]c\UZf]cv{lekUTS]cd>B9MRKVTLVZT{{tlekfkktlltts{||]bZF=C74,SKJddc|lldlekf]cdc\zlltll|ubVUb[Ulekd\\tllultddcSKJSKJf]cUMRldd\UZSKJD;9JHF[[TVTLSKJVTLVTLJHF}}{{llk]cd[TTd\\sleultleku{{|tslf]cVTLFD;[[Td\\UMRD;974,MSSVTLFD;%>B974,MRKJHFj]\kd\FD;UMRcbVjcVkd\ztfcbVC8.VTLFD;VTLek]VTL[TTkd\PF=JHFVTLjcV{zmd\\PF=FD;SKJ[TTSKJbVUVTLcbV]bZtslek]JHFzllf]clri]bZztl|g\rq^è|~tllultuztddcf]c{u{{tt{{tuztutllultfkkf]cSKJv{dc\{u{ddc}JHF{{lrid\\|z\[[UTSUUYlksJHFddcD;9edkVTL:97lld||{||ttslldldd[TTUTSj]\b[UVTLSKJ:97{u{lddSKJrg]b[Ullkllk{{t{{D;9JHFMRKVTLUTSuzt[TTddcD;9:97sle[TTdc\SKJHR>SKJrfktslmttJHFdc\ttslrilri|z|lek{{t~MSSmtt^fsfkktt{mtt{{\[b{||[[T\[bultkd\\[bVZTmttlek~mtt{{mtt{u{JHF[[Tdc\|llktlltsluzt{u{ultllkJHFUMR]cdcbVVZTddcF=Cb[U||tlltlllddlld{{tdc\mtttll}zlldc\d\\SKJ[TTlekrfkbVZwlaWM74,JHFlriD;9ddctllekdttszllu{{u{{VTL{zmb[U{{u{{tllutll]bZ]bZztlcbVultUMRF=CSKJiq]MRK3+**)( *)(JHFredsleb[Ub[Ukk]cbVtslVTLFD;ZbNdc\jcVztfFD;]bZbVUtslb[UVTL[TTtsl}VTLZbNkd\rg]j]\{tt|vcbVFD;tll|z>B9SKJ}}]cdjcVmttkk]ekdultǜË{{{u{{||}ztl{{|uttsllk\[[b[U\[b]cd|z{u{\UZ]bZlkslld}{||llkVZTMRKF=C>ECrfk[TTMRKttsJHFlddllk|mtttllj]\redUMRJHFSKJcbVVTLFD;ek]dc\j]\lldJHFlekttsuzt]bZSKJ]bZult|u[TTUTS]cdVTL[[TsleVTLD;9aWMVTLtll{{tuzttsl{||lri|zzlllksOS`]bZlks]cdtts\[b~\[bddcUTS{||||{ttddcedkzllf]c{{fkkUMRttsJHFllkVTLlddztl{ttttsdc\lri]bZddcttsVZ[JHFrfkf]cllk[[TSKJ}lddrfkjcVslekk]lld|||SKJ{{UTSv{\[b[TTb[Uuzt[[T\UZkjVJHFD;9VTLllkbVZ{{ddc\[[\[[|lldddcrfktzl{||b[UFD;d\\VTL{ttd\\UTSFD;\[[FD;&&%74,>B9uzt{tt{yfztl{zmb[UaWMSKJVTLJHFVTLVTLVTL|zkk]VTLkd\lldbVUSKJ[TTkk]sleaWMVTLkd\SKJj]\tllutd\\ulektslVZ[SKJzllv}aWMtts]bZUTS|}}]bZdc\|d\\ztl|tts{zmj]\f]c{tt}\[[\[bf]cf]c}|||mtttyg{||UUYtt{ttsllkUMRUMRnv\[[}ddctt{{{t{{t\[[lddUMRredkd\lldaWMb[Urfklddsletllldddc\lldvUTSJHFuztv{tllkd\||LKRJHF]bZb[UuMRKUTSkk]JHFbVUdc\{{sleult|ztts{{t{{tulttts]cdMSS>ECMSSlddmttf]c}ult{{t]bZdc\f]cSKJf]c[TTleklrif]ctts]cdD;9MRKFD;[[TSKJbVU[[T{ttlld|\[bekdlritslUMRlldttsbVUtts}|||ulldiq]{tt||lkslektll|vFD;JHF\[[dc\ultlri}llk{||tts{{{{b[UztflldddcUUYiq]zlluddctsl]bZf]cultf]ckk]\[bC8.D;9]bZJHF!FD; 74,VZTtllwllddwl[TTSKJrg]C8.dc\sreaWMaWMPF=JHFFD;{ttSKJSKJ[TTVTLek]i\VSKJVTLVTLSKJ|ukd\VTLsrellktsl\UZ3+*}||zrr]tzlrg]ekd|zlldvut!VTL{yfu{{|rfk[TTlri|uj]\|zLKR{||tt{|FD;}||lks}ultlri{||lrif]cuztedklksf]ctllttsllkUUYVTLdc\dc\SKJ[TTd\\llk{||||SKJsle\UZf]cylemwrg]ekdddc}VZ[JHFVTL{{tslekk]tll\[[ekdd\\VTLb[U{ttSKJkk]kd\{u{|uldd{zm{ttu|z{ttlldultyltzlddcMSS\[bMSSUUYddc\[bMSSlks{{mtt\UZlld{{tsl{tt||f]c]bZ~ultfkkztfMRKMRKtt{SKJr]ZVTLj]\sle{{tlkskk]ttsdc\JHF]cdlritll{tt||ztllldtts}|f]cf]culti\Vfkk]bZultkk]SKJ>B9VTL|tsl{{mtt]bZdc\{zm\[b|ztll|tt{f]clri}|tllek]JHFsleJHFaWMJHF*)(:97!JHFbVZd\\j]\sle|ubVUVTLsleaWMztfztfHI/VTLFD;jcVVTLVTLSKJSKJJHFkjV}VTLd\\d\\bVUSKJztl[TTkd\VTLult{tt>EC:97{||vvu|v{{||}*)(&&nddc|}||VTLD;9tll|u{{||SKJtzl{zm\[[ztf}{||VTL[TTb[U{{tztl[TTSKJUTSMRKf]cUMRllklddultlekddcztld\\VTLwl\[[rfkkd\}|{||b[Ukd\red{u{iq]|u[TT|tslekd[TTJHFD;9[[Td\\|usle{||JHFVZTdc\kk]VTLVTLVTLjcVd\\{{t]bZ{{t{zm||z}||lek{{tsl{u{{u{>EC>EC]cd\[[\[bmtt\[b{{ultFD;d\\lkslld[TTlekUMR|{u{ult~mtt[[TVTLllkSKJztlredlld[[TtsluztVZTJHFFD;lri}f]cbVZztftzlred~{zmsleFD;sletsl{u{ddcJHFUTSSKJf]crfk\[[d\\JHFJHFlldMRK|ult{{tll{u{{{ekdsletslmtt}|||}|z|zzl||lks}UMR\UZlekb[U\UZJHFVZT?;C3+*:97SKJ|u}ztlrg]r]ZcbVd\\SKJi\VjcVcbVcbVVTLVTLaWMztl[TT[TTsrejcVredb[Utllred{ttredrg]cbV[[T|\[[:97{u{Ɣ]bZ{{|lks}|dc\iWUred||tslredcbVf]cfkklri}|lri]bZldd\UZj]\lddllduttslekSKJUTS\[[{u{rfkbVZJHF[[Tllduztwld\\[[T\[[tll|u||{{tlldf]cutb[UUMRztlbVZ}JHF[TT\[[uztdc\|u}\[[srelddkjVnVTLaWMj]\VZTllkd\\ekd}{u{{u{[[T}{u{f]cMSSn{{~ttstt{\UZJHF\[[|z|zultlekf]cvddcekdJHFmtt{tt}|{tt{||SKJkd\|ztzluztkd\j]\F=C\UZSKJ{||{u{kd\uttlltllult{u{ztlwl\[[{zmuztl[TT\[b\[[\[[llklri}UTS\[[tll}|mttiq]FD;]bZut}ddcVTLddckd\{tt\UZtsl||tyg|f]cUMR\[bd\\|VTLUTS>B9JHFUUY3)JHFj]\|u|uslecbVdc\jcV}aWMSKJb[Udc\rg]nrg]d\\rg]lldb[UztfaWMSKJlldd\\||VTLdc\j]\¿VZ[JHFtslu{{]bZ}~^~Y3+*}|zVTLiWUyle|z}|slesle|}\UZ]bZ|ztzl{{llkmttj]\dc\{{ttsltts\UZttsJHFSKJd\\lriult{u{{tt||UMRd\\ut{tt}lddldd[TTut}ultkd\lddttstllUTSSKJUTSddcb[Ulri|z}lrisresreJHFldd|{zm\[b{u{f]clrilri{||uzt{{{{uzt}\[bJHFVTLfkk|z{{tult}lriwl{u{tsltygmttlriVTLmw~sle|zbVU{zmVTLf]cbVZldd}|v{zllf]cSKJutult}zllllkcbVkd\{||b[U}}SKJSKJllk]bZekdd\\f]cFD;VTLaWMcbVj]\ddc{u{\[b~d\\ekdFD;|z}|}}tt{D;9lksJHF:C+MSSJHF MRKttsi\Vlld{{tkd\f]crr]rr]ultzllkd\VTLrg]VTLrg]j]\|uj]\FD;sletllu\[[{yf[TTUMRaWM}|VTL|u|u¾UUYJHFnVTL}JHF{{LKRr]g|zkk]kk]|{||d\\lld{||{tttsl}{||]bZ{{redtts|ldd{{lek]bZbVZlks|{{tllk|||z|u{tti\Vredd\\|j]\\[[tsl}[[T||lks\UZtt{slev}|z|uf]cuztek]ztlkk]tslSKJ\[[{zmztl}{zmuztfkktt{{{tts[TTUTSlld[TTtts|mtt]bZtt{ekdtslllk}mttd\\UMRekdtlltllleku{{MRK]bZ|kd\|zkd\wlcbV|ztslekdlddttslldyleultzll{ttutSKJzllttssle{tttslldd|{ttultlriuztVTLJHF[[TUTSFD;JHFkk]rg]|ztsl|z|z{tt{{td\\tt{fkkVTLredtts[TT\UZ:97SKJVTLFD;:97%:97\[[dc\llkztlb[UjcVd\\kjVd\\aWMdc\VTLPF=SKJylelddVTLSKJVTLdc\{zmrg]{yfrg]bVZjV[zllwl{{t|u||\[[74,ldd}rr]b[U}j]\lj}:97SKJztlnjwl||llk~{||v{kk]{{||{zm}{ttmtt[[Tf]cldd}{u{tllmttllk}tts{{tsl|VTLut|z{||rg]}{||sleVZTFD;red|vztfsle\[btsltts{ttldd[[Ttll||u\UZultlldkd\cbVztlj]\bVUlriuzttsl|}{tt{{JHFiq]llk[[T{u{{{|mtt{{ttsekdVTLddc|ttsj]\~ddc{ttf]c{||]bZMRKmttu{{|z}{||tslllk|utsltts{tt\UZ{tt|bVUllkredrg]}ut|v{ttutbVUd\\VTLtllttslks}}¾Ɯ|f]c{ttdkVkk]jV[llkf]c{zmfkkVTLzldkV}|UTSekd:97r]gUTS:97ultedkJHFD;9dc\,553+*[[TD;9JHF[TTUTS|u}{{t||zll{zmutrg]rg]kd\SKJVTLVTL[[TVTLVTLldd[TTVTLsreusreiq]VTLsleutred||lldwlztl|\[b:97wl{tt}|}zlJHFjcV.1SKJŲultf]clldv{||v{|tll|u|z|wl{ttrfk}ultlritsl}tzllrilksSKJf]c{tt}UTS|zred{||v{tslutb[Uztl{||[[Tzllkd\i\Vldd}ultuzt||tllb[USKJ[[Tllkv{yleldd~[[TMRKkk]d\\SKJkk]j]\}{{tult}|tslu{{uzt{||v{{u{{{|LKR\UZlddllk{{{{lksnvmttUTSVTL]bZtt{llktll}}|tslMRK]bZ]bZiq]]cdtzl[[Tsre{zm{{t||ztts||rg]f]c|v{dc\llkSKJv{{tt}llkztl|ztslztf}j]\rfk}sle\[[ultekd{{{{lrizlJHFtzltslyle|b[Uuztlrilrilld|ztt{]cdlrisreztlf]c{{tll*)(SKJkd\VTL3+**)(D;93+*JHFJHF{{tztl}ztfVTLSKJjcVVTLSKJb[UVTLkk]jcVwlj]\kd\i\V[[Tkk]u{{ttslZbNzllr]Zzllyle[TTkd\{{tLKRLKRf]c}}tt{j]\JHFUTSldd]bZ|u|z{{tred[TTslemttmttuzt{{t|z{{t|{{{{t}{||{||ultlld\UZllk{||lddb[Ud\\v{uztutlri{||dc\jcV{{llk||{tt\[[kd\{ttb[U|tsl||sleSKJr]glldf]c\UZVTL}|{{tVTL{ttlksSKJtsl[[TJHF{{tlrimttuztuzt|z|ultllk{{{{lks{{}|edk{{|{||sleddcddclld|f]c{tttslVTLVZ[tzltsl{ttddc||z}ut|mwUTS{{tslelekv{}}ttsutsre\[[b[U{tt}{{tslelksd\\ldduztmtt}[TT|zttsJHFz}llk|{{\UZek][[T||tlllks|mttSKJzllekd\[b?;CFD;"[TTslei\VsleutVTLrr]bVUPF=VTLjcVd\\lldVTLsrelddi\VVTLSKJwlzl}|lrirg]b[U{ttbVUut|v|ukk]|zVZTUTSult}zrg]uj]\j]\bVUMRKSKJ{ttutztl{{t|z}|usleu{{{||{ttu{zm{tt|{||}{ttlri|uv{d\\lek\[[]bZ[TTf]c}uztbVZ||wldc\lddd\\{zmtlltsl{ttj]\ztfkk]SKJ}|{tt{ttJHF[TTd\\ultekdJHF[[TSKJ\UZdc\dc\SKJVTLultult|uu{{{u{||z{tt\[b\UZultlksu{{{u{kjVu{{\UZJHFj]\]bZ]cd\UZ{tt}tzldc\{{t{||sre|z|uredf]cSKJllkf]cVTLJHFSKJbVU~ylebVZFD;kd\{yfd\\{zmzll|rfku{{d\\r]g{{tf]cJHFultf]c]bZ]bZek]{{t\[[{{{{llkf]cslett{edk{{tldd|u|jcV{||ekd\[[VZT[TTF=CFD;74,lldf]ctllwl|utVTL[[TVTLb[UVTLb[Ulrikk]bVZddcSKJsle{ttVTL{zmu|ztsllldlddtllv{rr]wlztf{{twlfkkMRKtts}|tzl}jcVVTL|zF=C?;C}tslsle||z}u]bZ|{{t||rfk{u{tsllddekd||d\\}lldllkbVUzll|z[[Tsreultulddtslwl|u{{ttslf]cekdPF=bVU}j]\[[T}lddtt{f]c{tt:97lldUMRultekd]cdVTLbVUbVZfkk|ztltslSKJ{tttsllri|u{{lrifkklkstt{JHFVZ[g\rmtt\[b{{tt{d\\[[TVTLVTL{zmcbVtts{u{bVU{u{uztVZTttsuztuztlddf]c}[TTtslMRK[[T{{v{d\\||tslf]cutrg]VTLkd\{{tlek[[T}tygllkljVTL[TT\[[|zldd|dc\lriedkekd]cd{{\UZ[[T}|uzt{{tmttttslriVTLslelldr]ZD;93+*|zkd\{yfFD;JHFSKJjcVMRK|u|dc\utkk]SKJtsl]bZbVUkjVsre[[TtllD;9aWMslesreultj]\sreusreredttsutultwlu{{t]cdMRK\[[{ttldd]bZ]bZzllwl|}||SKJFD;}u{tttll{{t}|tll|||zred{||cbV]bZ{u{ztl\UZ}|z}{||tsldc\{tt||}slekd\ultsleztlult|vtll{ttllktllredUMRtslVTLtts{tt{ttekd]bZaWMredllk|kd\u|u{||ultlek{{ddc]cdf]ctsl{{lks{{j]\VTLFD;[[Tldd|ultllk{||lri|{{t{{t{|||zd\\tzl{{t|zu}[[T3+*lektllyfltsld\\ldd}|ut{ttwl{u{VTLcbV}||[TTVTLVZTuttsl{u{{yfmtt\[[{u{kjV}|tzl|lkslldkd\llku{{|ztt{VTLusleJHFbVUUTS:97UTSD;9VTLiq]JHF%PF=b[Ulekrg]}|z|||utslkk]kjVVTLdc\llkdc\JHFb[Ukd\[[Tb[U{ttwlwlvtsl{zmred|vsle}}\[[JHF}ultdc\dc\kd\VTL}{{[[Tdc\b[Ukd\lri||}tzluzt|zsretllr]gzllri|u}}|zttsVZT}|{{tsl[[T|u}||llktll|tsl}}lddredaWMtllcbVJHF[TTult{u{j]\UTSllkztl|tzlkd\ult{{tztltslkk]|u{||lkscbVmtt}lksJHFuztmtt|ulttt{{||mtt\[[{zmSKJMRKlekultult[TTlritsl|ztsllri{tt||zdc\b[Uedkrfkred[TT}}v{[TTkk]|uutwv{lld||SKJd\\tll{||j]\mtt}tsl{zmztl|z}f]c]bZu{{{tt||ztlredu{{tslu|z|UMR7-2SKJFD;MRKLKRtt{3+*73JHF[[TutsledkV[TTPF=VTLFD;bVZu|u{zmtsl]bZ{||i\VztlSKJedkwl|zr]Zljzll|vlj|u}|v{[TT:97tsluuzt\[[}|lld]cd~f]c[TTb[Uyletzl{{ztl[TTbVU|{{tddclrisreVTLtllultkd\u|z{zm}lritzl{tt{{ttslkk]}redtslutztllri{zmaWMujcVd\\SKJVTLkd\{u{\[[lri{{tf]cSKJ{{[TTrfktts||lriyfllek{{tult{ttsresre{zm}sretll{||lrikk]{||{{tultf]cVTLVZ[|z]cdmttllk}ttsdc\MRKjcVtslztlultf]ctslult}dc\|zVTLttsult|||uztliq]lriSKJu{{UMR|zSKJf]c}{||}f]csre{u{ldd}ultuzt\UZVTLlrilld{u{ddcek]lddkk]b[Usle}\[b{zmztl{|||z}]bZu}|zttsmttlks[[TVTLFD;74,UTS3):97iq]dc\|z{{tVTL|ucbV[TTVTL|zsle\[[VTL|uztl}|edktllwl|utsllldd\\d\\}|ztl||u{zmuv{UTS*)(ztfVTL|vlriVTLllkr]Zb[U:973+*rfkyfl|ubVUVTLFD;red|ultult{{ttslv{lrilksuzttt{}zedkaWMek]|uztfzll|tll{ttwlkd\rg]sle}|ztllrir]gSKJf]cb[Uekd|u{ttd\\UTSulttslsle|kd\uztlkskd\SKJlld|zlld{{tzllldlld}ddcf]clksJHF]bZmtt\[[tt{}{{u{{bVZFD;tslddclld|uu{{lks{{t|{{tuztekdUTS~ztltt{uzt{{tztl}kjVuztultjV[|vjV[v||utf]c{{tcbV|{||ztfultb[UttstllddcMRKlriVTLFD;lld|llk{u{llkmttllktt{}lriekd]cdf]cbVUVTL>B9FD;:97FD;&&C8.{{t}kk]ultsleulttslJHFVTLVTLsre]bZVTLbVZlldlddcbVlld}wlttskk]||||}|wlbVU|usrei\V|u}>B9:97jV[bVZu{{i\Vekdllkkd\aWMVTLJHF|tts{u{sle\[[tzlr]gtslldd|z||||lri|z|SKJ}{|||zkk]tsl|}VZ[|{zm}ztflld{zm{||}SKJb[U|[TTredzllztlldduylelj{u{tll||llktllultb[U{{JHFtsl{||lriuv{]bZ}|}u{{ttswlsle|ulld}ztl}|udc\ekdrfk{{mttF=C>EC]bZf]cdc\\[bVTLVTLUTS|ui\VF=Clldiq]dc\[[T||{||uuztuzttsl]bZredult|rg]f]c[TT|v{}|z|uv{}|{zm||redbVUUTS{u{lld|||lri|zkd\d\\kk]u{{ult\UZtts\UZtt{u{{{||lrilld>EC%FD;74,FD;SKJVZT3+*&&C8.yle|z|||z}JHFJHFlri]bZVTL:97VTL{u{tzl}lddrfkllk{zmlri|VTLrfk}|v{u{}utztfMRK*)(ut|z}{zmJHF|zllkuztlekttsi\VD;9D;9}{{cbV[TTedk||b[Ulrikk]ddclldVTLekdSKJj]\F=Cj]\{{sle]bZlld{zmrg]ddcf]cj]\j]\ddcldd}tzlztlsle}ut{||~fkk}|tslmttf]ctslUMRSKJlksslef]clddddc{{tslttslriuzttslzl{||utsre||uztVTLtllultddcedkekdLKRu{{lkstts{tt{{j]\MRKVZTrfklektsluzt}ttstsllkstts|lld{||ldd~}mtt{{lek||tts||wlb[U\UZtllrfklddv{|z}j]\|uSKJ{{JHFddcredulttt{ult{zmultlddutlldllk]bZ:97aWM3+*C8.Q?@F=C%&&&tlllri{zmVTL||VTL|ztl{u{JHFVTLlldJHF\UZ[TTtsllddtlld\\tts[[Tsre[[TVTLkd\kd\}rg]}sleutMSS:97tsl|wlekdJHF|ztt{uztdc\|rg]74,bVUUTS{||ddcekdlritsl}slellkVZ[{tt\UZ{|||VTLSKJ]bZFD;[TT|zmttrg]ttsd\\rg]}|{ttkk]tsllldtslv{{zmkd\lddmtt}}{u{f]cultUMRztlultj]\}kd\llk||lri{||ttsf]c[[Tsre{tt{||ttstsl{tt{||}lek{ttuztMSSmtt{u{ek]{u{{u{f]ckd\lddd\\SKJtslf]cdc\{{t[[Ttllf]c\[[u{{mtt{||ekd|vkd\|u{ttVTL[[TVZTlri|u}|{u{tsl{u{{tt|u|zllkultlddslej]\{u{j]\}tzl}UMR[[Tj]\{ttultf]c\UZslerg]f]c{ttvfkkf]ctsl\UZ}{u{{{:97lldmttF=CFD;>B9FD;|zj]\|z|zwlsletzlaWMrfk[[T[TTlri{zm\UZlddcbVtsllldSKJttsttsVTL[[Ttllsre[[Td\\{zmrg]lldrg]||v{zmJHF3+*{{trr][TT||llk{{t|uC8.JHF{{tuzt{{t}lksdkVlld|\[[|ztltzl|zlri}{u{utult{{ttslkd\jcV||usler]gyledc\d\\|ulld{{tsletllrfklddllkyleekd{u{edktzl{zmlekf]c{{VTLrfk]bZ|z[TT{u{tzlfkk{{tredlriv{lld[[Ttslzll|z{{t}lek{||{{{{{u{ttsttsfkkd\\\[[zll{u{||||]cd||ut|tslJHFmtt{{tuulttt{kd\{zmsre{u{\UZlekult|lrirg]iq]||ttsldd[TTult||lldredlldv{||kk]u{{VTLb[U\[bSKJ{{r]gUMRuVTL]bZJHF\[b{|||udc\kk]ultrg]\UZtsltzlddclddu{{tts{{tVTLredUTSUTS]bZdc\]bZrg]SKJrg]{yfkd\i\VSKJsrelddSKJ:97{zm]bZttslriukd\dc\rg]PF=bVUv{ztl}tsl||ut{||ddcb[Uttslddkd\lrilritzlutts~d\\dc\lddjcVVTL{{t{ttztltsl|ztl{{t}|}rg]mw{zm{zmredrg]v{lddredultv{fkkd\\kk]|lek\[[kd\}tll|zek]uzt}uztlri|ufkk|{tttsl|{ttldd|ulttllb[Ukk]|fkk|z{tt[[Tslelri|z{||{{tVZTdc\\UZ||llk}||ekdttstts{u{{{tttsztluztv{tlld\\sre{ttd\\}{{tldd[TTlldbVUtllutllktzl|ubVZlekllkSKJlri[TTttsd\\{zm||tllbVZkd\}]cdu{{:97{{JHFD;9|]bZ:97dc\{||rg]wlekdtslztlllkultsretts}|mtt{{{tt|z{||||d\\slesrett{}b[Ub[UcbVrg]cbVjcVwlrg]ddc*)(zllu{{lldsleUTScbV{zmHI/ultultredf]c{zmtts{{tultultdc\{||tts}||cbVtt{{{ttsutvddc||f]cUTSkk]lldVTL{{t||ud\\ztlsre||vbVUutlrilldVTLVTLd\\kd\b[U]bZ{{JHFd\\ultek]tsl||}lri]bZdc\lek]cduzt{{kd\b[UUTSult}slelekek]tsl{{tred{{t{zmj]\lkscbV{{t|zultkd\lekUTS{{ekd{{{||{||tllek]tt{}{||lldlek{{tsl||zmttf]c]cdddcztl|u|zuzt{{f]clks|{u{zllultfkktlllldsle|u{{||lrildd|ubVUttsultztf}tllrfk{{tcbV{||mtt|UTS]bZUMRD;9\[bekdzllVTL{ttedkSKJ>B9f]c{zmredVTL}}b[U\[[{{fkk{||lks{{[[Tllkdc\dc\u{{}dc\lri{zmljsle~[TT:97uztttsj]\f]cVTLbVU{{t{ttFD;JHFyflzllmtttsldc\d\\kk]lks}llk{|||z|{||uztultlritts{ttult{||sle}{zmslesreVTLtllsrei\Vwlultlldztllldtllkd\VTLSKJ|}lektslzlllriVTLd\\{ttultuzt\[[VTLrfkttsttsuztkd\b[Ulri}{zmrfkJHFJHF74,b[U{{tVTLllktslsrelriutsl|zultbVU{u{ekdmttfkk}{{u{{f]c}JHFcbVllk}{||{||lld}||z}|{{u{{JHF]bZredyllksllksreztf|z{{t{u{f]cd\\lldsle|z\[[tllztlred{tt}tllek]bVUtslv{{}|ultekdlekylelldtzl{||slemttuztMRKVTLJHFFD;FD;tzlD;9lldsre]cdJHFJHFddcaWMrg]VTLtsl|edklddlek{{llkUTSddc{tttzlult{||llkult}|{{tSKJi\V{zm{||}VTL:97v[TTjcVkk]kk]VTLbVU%UTStsl|{{tlrid\\lksuztldd{||}zlekddc\||\UZultkd\v{VTLddcleklldultkd\rg]|u{{tlddlrid\\}wlred\[[sref]c|uVTLSKJVTL|uultredfkkd\\|dc\lldlektlllld[[Tv{f]c{ttlrid\\zlllriultztl\[buztddclldrfkuztcbVllk}{||ldd}|z||}mttlks|tsl]bZ|tts}tts\UZtts]bZultlldlks|u||tlllddllk}fkklld\[blldtt{d\\dc\}|v|uedk{||[[T{{t|r]g}|{{|zrg]llk|u}||rfktt{{u{zllkd\}|tt{sretll|\UZddcek]|z\[b>B9\[[ddc\UZVTLJHFC8.JHFFD;ddcylecbVztllriztlllkddclek{ttttsllkllkttsddclek{tt|tslsrerfkcbVv|v|v|uVZ[JHF|u{{t}||{{~lldtllkk]vsleD;9UMRultsle{{tuztu{{ultutldd[[Tddctts}b[Ullk|ztslllklldlldrg]cbV|uVTLj]\{{tztlztlredd\\u{ttFD;cbV{{tultztlSKJ]bZMRKkk]}u{{tsl|zu{{}tts}ylef]c]cdlridc\{tt{zmultlld{||tllllk{u{[[Tdc\]cdlkslks{{tt{lksubVZldd\[[{tt\[[]cdut}tll}|lksċkk]ttsuztllk{{t{||edkJHFutuztlekv{~tlltsllri|||ultj]\|utts{ttldd||b[Uslelri{||||||{{tslemttjV[tslllkmttSKJMRK]cdJHFD;9JHFSKJD;9fkkaWMedkv{ddcrg]{zmlld{zmtts{u{bVU|ztll}|lddtts}lldtslrg]b[U|ztl||v}rg]UUYLKRv}|[TT{ttuzt|ui\Vrg]FD;VTL[TT{||dc\|z||tts]bZ\UZ}|tt{dc\}}jcVzlllrilksekdd\\lkstsl}srerfksre{{tutjV[}{||u||tzlek]cbVmtt[[TlekSKJlld|zut|z[TTtsl|slelldFD;sre|||z{{t|u|v{}{ttultuzt|MSSmttu{{ttsllklkstt{{||}lekuztuddculttts{{lddĄ|zfkktslztl|uzttlllekdc\||VTL}|||{ttttsu{{||wllks|zkk]}sle~v{redrfkntslcbVztlu{||||UTSFD;ZbN:97:97SKJ[TTcbVsreSKJVTL[[T{u{[TTsleultwlcbVdc\{ttlekztlnvmtt}tllf]clddcbVdc\kk]}||uwl|u\UZ>ECztfrg]iq][[T}llkztlkd\ttsredFD;{tt{tt||zekd{{|||mtttll{{tekdkk]tt{utekd{{ttt{}|{{tjcV|||wl{{t\[[d\\lld{||iq]rfkvdc\d\\[TT\[[ttsllk|v{f]csle{u{|lldSKJd\\tll|uztfllduzt{{t|ztlbVZddctsllld}|z{{ddclks}ddc\[[{||tt{{{{tt||lkstt{{{t{u{lriztlrfkf]czllztltsl}ultldd|z||dc\b[Ukd\{zmtsl}|||}lriSKJrfkultf]c}lks|u}}|||}{zm}|zttsb[Ullk\[bFD;%UMR[TTtzlJHFVTLVTLlri}|kd\}|llkttsllkddcllk|ult{{{u{u{{lksult{||u{tt|uv{|vUMRJHF{{tj]\|uttsb[Ub[Ured|v|u{ttztlD;9FD;{{sle|zllk[TT|zv|mtt|z|{{t{||{||lkskd\f]c{u{{tt}{ttrg]|uldd{u{}|tllkk]tsl[[TVTL|z~wtlllritsld\\JHF|tsl||{tttts\[bekdllktsl|ulritlllek|zdc\lldttsd\\bVUtlltts[[T[TT{{ttsVTL{u{lridc\}||||lddf]c{{t{{mttfkklldmttuzttt{lksVZ[{||ztlVZT|llkult\[bv{||{{u{{|||f]csretllllkkd\{||d\\llkulttts]bZlld[[TSKJultv{{||{||tzli\V{tt}fkk\UZ{u{tll||redvuztdc\{||ekdj]\tlllddVTLMRK[[T>B9\[[kd\tsl\[[MRK*)(u{{{||redj]\ttsekd[TT[TTddcedk\[[tts|ztts|lekldd}~vtll\[[,55|jcVzl]bZttsztl|utFD;sref]cVTLd\\lekttsӛ|z{{tf]cult|{ttd\\}tzl}tll|redu{{zllkd\wl|}i\Vw}{zm|||lldbVUttsb[U|tygredzllv{\UZ[[Tkk]{{lkskd\rr]llduztmw||d\\ddcultzll}|ylesle|ubVU{||SKJ}|[[Tult}||zllllkttsutuzt\UZMSSMSS|UTSUTS\[[ult\[b|{||{||ultedkddcv{{{t{||{||mttutt{llk{|||zf]ccbVtllmtt|z\UZv{jV[sle[[Tkd\{||ttstts{tt|uztlkd\ttskd\r]gtslsleut||||zut|ztts|lrimttut|{ttek]JHFJHFFD;JHF{||MSSMRK}JHF|zdc\UTSyfllekf]cmttredllktts{tttll|v{zm}{tt}MRK:97{tt|usreSKJsrezll{{t|u|ubVZsrekk]SKJrfk}}lks|zedkUTS|||lritllddcrfkf]cult{u{{{t|zddcf]c|ulri|zrfk{{t{tttslzlluzll|ttsb[Ullkdc\uVTLd\\f]cddcekdf]cf]c|}tsl{ttv{tt}lldSKJtllbVZztf}|ultdkV|zllv{{{tv{ttred{{t}ult{|||ultllk>ECMSSUTSllkddc{{mttfkk{tt{||ekd{||f]clksddctlltll{{tultult}Ц|uuztsre||{{t||{{t{{t{tt{||ttsztl{ttkd\|ult{||lld||}{{|ulddult|ztzlztluztl{ttyfllddtll{u{VTL\[[FD;F=CUMRd\\[[TZbNedkUTS|u{{t{||rfk||z|ttstsl}lriu{{]cd{{t{{tkk]{{tuttll{zmllk7-2}cbVkd\wl|tzlyfd{||SKJPF=kd\|z{{]bZztld\\|ztsl}vd\\lldf]c{{rfktlllkstts{{}tslMRKlks{tt{zmtll{|||[TTredkd\}uddc||||u{{lldbVZ[[Tek]\[[{u{leklek}|zultsleekdtllkd\redllksleuztcbVlldFD;lekj]\ztl|v{tt|||}ult||i\Vredrfkult{ttultlrifkklld|z]cdmttultuztult^^qf]c||}fkk}||uztf]c{|||f]ctlltslddclri}}{||{tttt{ultlddzlluzttzl{u{v|}ddclldlld|ut|utslekd\ult|kd\{{twl|ulriztllek|}tll}lld}|kd\VZTVTL:97UMR{zmekdUTSFD;MRK]bZ|zsle{{t|z{{tztl{{tllkd\\sle|ttskk]llklddlektslztl{tt{zmv{}||}VTL*)(tzlljcbV|zzlltzlkd\sre}|74,D;9{{ttll}{||}ultjV[yfd|z|}~||tsl}}{{|tt{[[Tddcek]sletts|{zmultsle\[[kd\tslVTL|{{tlddlddulttllJHFultredtsl{{bVZmttlriv|mttkd\kd\dc\|z}{{ttslUTS{{t{ttljtlltll{u{ttsultredlddkd\{ttult{||edkultJHFmtt\[bfkk{tt|zult|{||vUTSdc\llk|vv{u{{mtt{{|{{}v{{tt[[T|u|||}}|z}|{zm||{{tmttttszll|uztd\\{{ttslztf|ztsl}}tslsle}{u{kd\d\\}ekdrfkJHF||bVUlekb[USKJJHFFD;MRKSKJVTLJHF|\UZ|f]c||u}|llkekd||lri{||kd\MRKred{|||ztts||ultu{{{||{||kd\|u}}{{tsle|u}JHF-1+|zrg]kk]jcVvb[Ub[UVTL3+*ttsVTL}tts|zmtttt{}llktt{{tttslf]clkstsl{{||vultttsdc\f]cut||redi\Vkd\zllVTLldd{||[[Tllk||ttssredc\bVUttsSKJ}ultllklriredztltsl}d\\ztl{ttdc\d\\|uztl}|cbVkk]kd\||}|wlkd\ult{{ultlldfkk|JHF\[btlluzt{{}|{{t{u{ddctll{||lri{tt||z||}edk|zslelek{||tsl}}{{t{{t{{t|zdc\rfk}{||llkult|{{tslett{{{|}|bVZlldlekztluztkd\D;9VTLFD;[TTsleUTSf]c&&\[b|u}~sle|}}lldztlttsttsutlld|v{yletsl|:9774,|u{{t|urr]rg]tslyle{u{||VTLSKJ}}|}tt{lriuztult|z|||dc\d\\[[TUTSrfkldd|}j]\b[U{{tkk]{tt|kk]uzt|zttsf]c{{tsletsl}d\\v{|z{{ult{||}uzt{||jcV\[b||{u{ultut{{ttll}|}{u{f]c}lri|lri]cd\[[ekdtt{{{tsl{u{{||||ekdtll~llkwlultwlult|z}|ultult{tt{{t{tt||sletsldc\{||lek{{t{{t}|tllmwmttd\\mttztl{u{{{t|redlldtll}|rg]uzttygC8.dc\[TTldd\[bmtt\[bkd\rfk{{t[[T|ttsv{{{tslellk|ztlutüSKJ:97kd\kjV}ztlkd\}d\\tsl|zuzt}{zm[TT{zmuztu|b[U{||{u{{{{{t{||tts\[[ek]|u{{ulksult{{t{{uu{{ut}||b[Usre||sre}tt{|||uult{ttsretzld\\lrir]Z|zuttts{{t{{{ttek]tslkd\d\\tlltlllddf]c|llk}|||lddsre}{{|]bZ{||{u{|z|}mtt{|||zttstt{}tllultldduf]cttstzl|z}ut{||ldd|{tt{{t{zmuzt{u{||{tttts}lddldd{{t[TTllk|u|}u{{~ztf{{tslekk]D;9ult{{|zmttUUYd\\fkkzll|uuzt}{u{\[[~ddc]bZ[[Tddctsltslb[U|{||v{ztl[[T74,{zm}}|z{zm|zllduzt|||zztlldd[TTddc|{u{{u{}}VZ[u{{|ldduztdc\lkslriult{tttsluzt{{d\\}}ult}zll{ttldd}{{t{{lddtsl{||u||kd\|uultj]\tllllkrfk||{{t|{ttlld|zrfkj]\v{mtt}lekrg]}ztltslldd{tt{{}reduztkd\b[Utts{||{{|{u{~mttlks[[T{||llkdc\rfkmtttt{|}f]c~tsl{{tt{{zm}|u{||v{}|u}lld|lldututttsut~mw{tt|ddc|lks{u{|z}||d\\sred\\|z|vtts\[b>B9f]cJHFtll{||uztkd\tsl{{}|z}{||lld{{t\UZmtt|llktslSKJVTLkk]kk]{{t}|tllVZT-1+|||ukd\tzlVTL[TTllk}ulrilks{{t|zlks|sre[[TUTSUUY}zll||lri|cbVslettslrikk]lddlkstts||u[[Tttsekdlddtt{[TTztltts{u{ut|zuutll{u{lddkk]vlddredbVUtlllld}tt{||||z|b[Utts{{t{u{sleSKJd\\d\\}sleldd[TTddcek]utllk{u{{{t[TTkd\|slelrimttlek|||{{{{{||llk{|||z|{||||{u{}{{}|zult{||{{|zlld}{||}|{u{{u{||tsl|||{zmd\\f]csle{||}{u{uztbVU|zkd\tsl|z]bZtll}}sletzl{{lddtzltt{SKJJHFFD;llk|ztsl|ztt{sleztl{u{kd\ekd{u{[[TbVUtts|ztsltt{lldlrib[UaWMcbVdc\tsl}tsl|vJHF3+*}|uwltsltslsletlllri|u{{sle{||ddclri\[[ttsf]cUTSzll~{u{sre||mtt|zf]cttssleddctsl:97ek]VTL[[Tttslri{|||{||v|||z{u{zllv{}ult|uztlultsreyfdsleredd\\kd\bVUttssre|]cddc\{||ttsredredUMRd\\|ud\\yle~|u{tt}{u{ttsreduzt}tll{u{\[b]cdyllks||}llk{{|}}||ztsllld|uult|z\[b}{tt|zsleult|uv{}tsl}{zmsle||u{u{utlld{{tult||}||tts|udc\tt{zll|zj]\[[T}|SKJ}SKJVTL[TTlrimttddcwl{{tu{{tt{||{u{v{b[Utsl{{}lldlek|ultttstslv{{zmtsl{ttJHF*)(}uzt||f]c|udc\|ulritllUTS|ulri}SKJvlldekd\[[UMR{tt}lks}{{tredlldSKJ{||tsl~uztlri||z||ult||zllztl}dc\|}rg]|zd\\tlltsl{ttrg]ultSKJ{|||{{tsre{{t}||tsld\\mtt{ttsleldddkVbVU{||{||mttuztllk{{}lld{||[[TbVU\[bd\\\[bedk|]bZu{{|ztts|u{u{|}{{zll{u{|zleklld[[Tlld{{||zztlutVZT}}{tt[TTkd\ek]}}|}}|ttstsl||{u{}||||}|||||ubVU||rg]ztl|ult[TT{{tslelrif]c{{ldd{|||z{{t{||d\\f]ckd\VZTtts{u{{ttv{lksVTL*)(sre|lriztl|uVTL{{t}{tt[[T|zb[U{tt]cdut||}|}zl}vsle[TTUTScbV|udc\{||u}u{{v{}tsl}tllut|zek]zll{zmv{{tuzttll|v}bVUztlslered}ldd}sle|llddc\{ttllkd\\{ttkd\tll|zj]\}}{tt}llkllk||v{}tll{{ttstslmttf]c{{mttuzt{{|z|{ttVZ[{tt}uztv{~||tll{||ddcv{}dc\{||rfk}}ztl}tslztf{{t{ttkd\sle|u|zult}ċ|j]\}red|utsl{||utlldtzl{{tSKJutVTL{{t~f]cJHFlritts}ultj]\}llktsllks|{zm{{t}tsl~\[b)+2}|}dkV|u}sreVTLsle|ulrimttztl|\[[lrizll|uuztVTLlld}lrif]ctsllri{{{{{u{tllsle}{u{}sle{ttj]\}ldd{zm|u||sledc\|vj]\]bZtll{{t{zm{u{|ukd\ttsedktlllddsleztf{u{||v{tttsldc\v{|u{u{uedk{u{ttslldult{{t{|||zuzt||||zlksu{{{zmlek}tt{}ultlks|{|||tts}{{ultyfl|usre}yfdztl|u|u{tt|z|zrfklri{ttult|{tt{{tuzt}lldztfVTLSKJsleuzt[TT:97f]cmtt\[[lri{{tmtt}{u{||}ek]tlltt{[TTu}JHF*)(lriztliq]lld{u{VTLtsld\\|uzt||uztu{{u{{tllulttts{||rfkldd\[[{{t{tttt{u{{|zultred||{{tllb[U{||tts{zmslei\V}{ttutddcddckd\|ud\\}tll||zllUTStll|zusle{u{tts}}{||{ttf]ctllwllldsle|||z{u{ultttstts{tt||||lks||lriu{{||VZT]cdu{{{{]bZ}{u{tlllri}|sle|ulttts{{tJHFztl{{t}ult~tll}|}ljlri{zm}|zllkd\|z||UTS{tt{||tll\[[}|{tt{u{|z]cdztlVTLSKJ}MRKSKJuztd\\mtt|tt{|}}ttslkstlltsl{{t|ullk||tts|MSS*)(cbV}{{t|cbVdc\sreztlekdldd|u|zJHF|[TTred[[T}~{zmllk{{tut}|{{lks}|z}wlv{yflf]clld{|||uddcdc\uztb[U||{||}|tllkd\lekut{tt}tt{|lektllztlrg]tts{u{lldv{{{tddcVTL||ult|sleiq]]bZlri}\[[v|sle||{tt{{tu{{u{{fkk}mtt{{\[btsl{{tkd\lekultddc{u{UMRuztuztu{{tllk{u{iq]tll}{{}{tttsl|ttsuzt}|||b[Utsluzt{u{||ult}{ttedkSKJslett{u}slecbVrr]SKJdkVMRKf]ctzlmwekd}ldd}tts}{||tll|z{{ttslztl}ult[TT*)({{tlks{zm{tt||{{tuzttslyle{{t|zultuzt{||f]c{ttmtttlltzlttssle]bZ}lri\[[\[[uzttt{tts{tt|uztttslddb[U|zddc{{tlriztl}ztlttsztllddb[U|uslekd\{{t}|z{||{{j]\|VTLtll|z{u{ttsllk{{ttllztl|z}tlledku{{ddc|z|ekdmttmtt||tllztlztlultulttts}v{|}|{{t{zm{{ldd||~|u|udc\|||u||}}u{{}}{||||tlltts|lddedklldztlkd\|ukk]b[U{tt~mtt}tts{||llkVZ[{tt||mwmttuzt{||||}ddc||[[T{u{{zm{{}}|LKR)+2ud\\}|usleuzttt{VZ[VTL}\UZ|u|u{{|zlriuztcbV|u|}|tsl\[[|zu{{|ulksu{{tzl|z|ztl{u{{{tlrittsvtslsleylelrirg]ztl|uult}ztlcbVf]cd\\|u{zm}|{u{lldtslddc|zu|tsl{||d\\sle|u{||sre|ud\\|vkk]tlltsluzt}sre}|||{u{{{|tts|ztl}{||}tt{sre}ddctslult{{}tll|z|z|u}}yle{||llk}f]credlddldd|zuultdc\ztl|zVTL{u{lek{{tv{llku{{v{lek}v{|{tt|llk}}kk]ultf]c[TTJHF:97sre|{tt|[[Tb[U||lldtlllrilld[[T|z}tzl{||mtt{{t~ult||u||}tsl|dc\\UZ\[[{{ddcztlVZ[ztl}}|z}lriddc}{{tsre}{|||z{ttdc\tts|lldkk]ztlSKJi\V[[T{{ek]||{ttzll{ttj]\|zllutztlllk{tt{|||ztl}zllllkdc\lldultUTS|ub[Usle}sre||{{t|z}{{t{||\[[{u{{|||]cd|{|||{{t{u{{zm}zllred|{{t|tzl{||{{||{ttwllri|||uvutlri{u{{tt{||{||{||ult}|||{tt{zmyle|uzt]bZ|zu{{ult]cdf]c|ultdc\|lekredsrev{||{|||zbVUrfk{{tlld|uldd{ttzllut:97JHF{{t|sle|||||u|ekdlritsl|||tll|VZT{{t||}{||b[U|sre}lekttslri\[[lkssleVZ[{u{{tt{{t||lri{tttllVZ[|||f]c|{||sretsllddsre{{tsre{{td\\{||lldd\\|v||b[Ukd\lddtsllldb[UUMRtllred[TTtsl{||}{||{ttut|ukd\tt{uztldd{tttt{fkkmtt{ttu{{{{ulddtt{{|||utslvrfk{||{u{tts{|||vvv{{{t{{{{t{{ttzlzll||lld}||\[[||ttsMRKztl|lkslks}bVZult}}ut{u{{u{SKJlrifkkred|u|}||utlddJHF:97rg]|z|tzllri}tll}{{t]bZVTL||llktts|d\\tt{d\\\[[yle{tttlllksttslldVTLleku{{edkd\\UTSult{u{slelrilldu||}{ttztlldd|zttsv{lld}j]\jcVkd\VTLtzl~ult{zm|u[TTjcVult{u{{{tdc\}bVUldddc\{{ztl|utslrg]}||}{{tlddztlkd\sle{|||zult||{u{ttslriedkUMRtll{{t{u{}|rfk}{{t}ultiWUzllrg]utztf}|ztl|ukd\|u}u{{ttsmttllk{||ulttsluzt}|zultuztzlllddttsVTL[[Tsref]cJHFultultzll{tttll{u{|z||{{tsledc\|zw{{ddc||tsl{||ztltll|vlddultldduD;9,55|UTS{||lld\[[{u{tll|zuztult|u{ttv{lkslks]cdddc{{tcbV~d\\wlf]c||utzl[[Tmttlld\[bttstt{lrittstsl|ztl|zlldc\{||sleVZTuztlri|tts{tt}|MRKwl{{tsletllkd\tslsle{u{lriwltt{}tlltlllldutb[Uredllk||}{tt{{t}}|ulttzlf]c{{tsled\\|u{u{\[[]cd}tts}{||edk{u{kd\|z}}kk]ttsut[[Tztl|}{u{{{t}|b[Uztl|uek]}~utztf{||{||tllulttt{tsl||usreuu{{lld|JHFdc\tsl[[TUMRMSSUMRultlks{{t{{t{ttldd{||llkuzt{{ttts{ttlld[TTv{ut}lldldd~:97*)(|}ztlu{{|d\\}|u|tts{{tUTSttsredldd{u{llkekdtt{{{tlld{||ttstllv{mttdc\||ekdlrikd\{ttlri|tts}|ztll}tzl}{u{LKRd\\rr]f]cd\\ddcf]cutdc\kk]ztltt{srekd\[TT[TTj]\ultsle}ut}|tslult{{|||uulttsl}{yf|uzluzttllrg]|tsl{u{{ttvdc\{tt{{{u{{{{ttred}ztl|u{u{|u|rfkllk|u|ttsutzllrg]}jcVsrev{red}ztlkd\}VTLtslv{kk]lriedktll{{t{{mttd\\VZT||||[TTJHFf]c{{f]ctslutlri|{||uzt}|u|wlult{||ut}JHF*)(|||mttztl|uut{{tlri{||d\\ldd]bZ}}|z|z|uuztlrillddc\{{tztlrfkkk]|[TT{||tts{||{ttlldllkmw\UZ{zm{u{||v{tslsreztfwlkk]ddcdc\ultzll{ttv{{{tkd\dc\d\\d\\[[Tkd\rfktslVTLuttslb[U{ttulttllztltllut|zlrif]c}{zm}d\\f]clri{|||zlldtt{{{|||}|tts}uztsle}ult}v{}}|zlldc\dc\{||||mtttllv{{tt}|}|kk]slev{utztf}|zsreSKJllk{||kk]ldd|}|z{{lekttslrilddlriv{ttf]clri}|{u{}||~ztl}{{ttts|z{u{{u{}|||}:97*)(}{tt}|}||{||llkkd\{u{tts\[[zl{|||u{{tslerfk{{tdc\}ek]f]c||v{zll{tt{u{[TT{{tllkzll{ttllklribVUultf]cdc\{{tVTL|||lri{zmkk]|lddtll}VTLred}f]c|zsle||tllddc{zmbVUudc\[[T{{t||}ztlttsultttsfkkllk|z\[bttsmttlrittsultutult|u{{tttstll{{tredf]c}|\UZ|ztsldc\{||ult{{tv{ztl}zllb[Utzl}dc\}wl{zm{{tuzt{tttzl{tt}{{tuztu{{}tsl{ttfkk}|{||sle]cdtts|u|z|edkf]cult}}||u||vlddultultredwlJHF)+2}ultv{slelldlek[TTlksv{|}uztu{{{u{}||umtt[TT|zlek{||{||lldultddctslslejV[{{trfklekv{f]c||lddd\\d\\b[Ullkrg]{{tkd\|}|ttstts||slen|u}lddlddtllkd\utrg]f]cztl|u}b[Ullddc\||}{u{llk{||tsl|u{ttddc}{u{ddctt{{{ttt{UTSv{lek|zddcd\\kd\ztl¾ƣ}ult|vuzt}}{||{ttd\\||sresretslv{}{{t||lld|z|ldd}uzt||{u{tts|]bZ|u|z|u\[b\[bbVUkk]|tsllld{u{}|dc\{zmzll\[b*)(zll[[T{tt|uddc{tt||ult{{t|u}edk{||tt{|uztl|zulttzl||ztltts]cd|z|u{{llklddtllmtt|}tts{u{}tllUMRllkttstll{ttmwSKJ[[Td\\cbV|uyle|ulld}ttssle}{u{zllrfkf]ctsl{tt{tt{zm}|||kd\llk||zzlltsl{zm|{tttlltsl|{{t{||{u{lriv{ult{|||||ü{zm{{tf]c||}{{tlri|v{lekf]cwl{|||{{tsre|zddc{{ttsl}llk\[[}ztl}}fkkultllksle|z{||VTL\UZ}lddedkUMRf]c{{tult{||utttslddllk~uzttsl~|z}j]\|tt{f]c*)(tll|umtt{u{}|{zmtslf]c|zlrikd\[TTtt{|ulri}dc\}{tttts{{t|||utt{~{{VTLv{|z|}}utdc\kd\\[[ut||{{t|ulriv|ttsttsllk|zj]\{u{i\Vsre}||VTLylellkztfmwlddtsl{zm|}{u{vutullksre}d\\kk]}ut{ttut{||ekdtsl}|{||{{t{{{u{{{t|tllv{u{ekd}|kk]ttsrfkv{||zlllriut}{{t{u{tsl{{tu{{ddcttsu{||{{t{u{tlllek{{|d\\ult{zmultlkslks{u{rfkdc\}lri{{t}{{tut{tt|llk{zm}||tts{zm{{ttllrfk}{ttsre||{yfztlJHF?;C}tzlulttll[[T\[[ult||tll|||z||lriekdlldu{{ult|ukk][TT{ttkd\ddc|u{{t||tllek]ddcw[[Tllkd\\f]c{u{llkutlrittstllultsle{ttj]\{||ddcsleztl[TTredlddzll||\[[v{{||{{t{ttlldu{{{||lektsl||ztltsl|z|{{ulri|llddc\{tt|ztfult||lks{{t|{u{tllllkdc\|zulttll}ult|lldlritll||kk]uttts{||rg]||}}|||{||}ukk]v|ldd||~]bZult|slellk}|z}{u{|z]bZ}|JHFlksult||tll}{{wlvslettsut{||ttsztl|uztl{{tek]:97*)(tlltslekdult}|ultkd\mtt||u{{kd\{u{lddekd{{lekVTL{{{|||lldtll|z||tslult|ddc||}{{t\UZllk{u{}ultj]\r]g{||||{u{j]\}tsl|v}ult{yftzlutbVUllkzllf]c||uttts\UZ{{tztl|||lld{{tzltts{{tttsut{||d\\ztfzllult||{u{lksllkztl{{t{{tllkv{{{utkd\lld{{ttzl|u{{t{u{dc\ut{{tjcV{u{lekmttuzttzllrimtt\UZmtt{ttztltt{tll|UUYUMR\[bultuzttll}{||lksulttt{lddsretsl||tll{u{utv{}{{t|z||lldVTL74,tt{||v{[[T]bZlekztllri{{ult{||llkultkd\sleut{{t||}{||b[Umttultf]clddttsuztSKJ[TTultultllki\V}{ttj]\||dc\}{{tVTLutSKJtzlb[U{ttSKJ{ttkd\bVU[TT}{ttuztzllkk]tll{||lddbVUutkk]lritts}|z{ttrfk{tt}ttstll{{{ttkd\ultttslldsle}|}u{{tzl}edkv|redut|}{||{zm}}{{t||z|zllk|zddc||{u{u}tt{lri}[TTf]clek{||lld|zmtttt{{{t||tt{{u{redd\\}{u{tslztlulttllut}}{tttzlmtt{zmJHF:97{{t}dc\ztlztlllkdc\|cbVzlultllk{||ult}v||}tt{{tttt{lriztl{||tll|VZT|ztt{fkkllk||[TTJHFf]c\[[lldultf]cf]c\UZllkultlekyfllek}{zm}wlSKJd\\JHF{{t|zsre{{t||red{{t|usre{||}|cbVtllzll{ttztluttllllk||{tttzlVTLtll]bZkd\u|lld{tt|v{}|{|||tt{{ttmttultzll}lddlddddc||tts}u|uredu{{ztl~}||{ttb[Ukd\}kd\|}|{{ttts{{tlritsllriz}tslultztlzll}||{ttztl||z\[[lld{u{uzt{tttll|{zm}|ulttll{zm{{ttllJHF*)(ultcbV|ztts]bZred{ttj]\tsl|kk]ultf]ckd\bVUdc\d\\|z}|}|zll{{t{{llkuztowlkstt{u{{UMRd\\lddv{UMRj]\ultmwtsledkUTS||||tt{tll{{t[[T{ttredztllldlri}tzl{{td\\u|u||u{||ldd{tt[TTd\\FD;rr]{tt{tttlltsllldd\\ztl{{tztltzl{{t|zztlrfk{u{{{ztllddj]\mtt{ttlektt{\[bllk|z|||tll{||{||u}ģf]c{{tf]cldd{tt}tll}cbVddc{u{||ztltts|}|ztl{{tu{{lddlrimtt]cd]cd}edkj]\|uredultuzt}|dc\tlllri||ztt{u{{{{t|||}tsl}|z}|umtt{u{{zmztlddcztlult{ttztl||kd\|uultf]c{{||>EC:97tslSKJ{{tVTLwl}|{u{d\\rg]|z}mtt{{tbVZ{u{sre||{||zll|z{u{uztulttll{{tldd}{tt|zUTSult\[blrilldf]ctllmwtsllekJHFuzt{tt[[T{||kk]utSKJredv{llk|zvd\\tslultedk}||b[Uztl}kjV|utll{{t{ttdc\||{||lldu}}tts{tt{{t}|{|||{||ttslektt{{tt{||}{{tv{tsltsl{tt}{tttts{zm{tt{{t{tt\UZred{u{uzt}{ttbVU{|||]bZultult|zultdc\llkkd\tlledkttsultfkklks\[blekllk{{kk]ekdtts}{||{u{uzt{{tdc\|z{{tztfllk:977-2}llk{u{|{u{tzllld|zlldu{{ttstt{lriult}]bZkd\{tt||tlllld}|z}rfk|z|{||llktt{lksf]c{u{SKJ}{ttlldtll{ttv{|z|zuzt[TT||llkwlrfkVTLsle||slettslldtts|zsle||aWMSKJFD;ztlultu{{[TTslelldkd\|utslttsuzttllb[Utyg{{ztlsrekk]{{tddcsle|ztts}{tttt{{||ddc{||{{tts~}{{tf]cmwwl|uuztbVUlldddctsl{ttsle|uult{||rg]|}lri{||mtt|ztt{ddc{||rfk}ztlzll||ldd|v{uztVTLultSKJtsl[[Ttzl{||{||{tt{{ult|{{t{u{}|||tsl{u{|u{tt|uzt>B9*)(zll|||{{tllklddbVUd\\lddek]UTSlri[[T{{tslult{{td\\}u{{cbVbVZ}sleb[U{||zll{||}tsl{ttu|zuzt||{{\[bJHFJHF\[[f]cd\\\UZb[Ud\\ttsd\\VTL}{zmtsl{|||u{{t|f]c]bZslelddddclld|ztzl|utllaWMsre{{{zmj]\tll||tslztlf]cb[U|z{||}dc\|zllek]tslut{tt|lriv}tlliq]tsld\\{||{{t|z{{}}{{{||}{u{||}{{}}sle~|||u{{t|||z\[[v{}ztl{||tsllldj]\ttstzl{||wl}lld||lldmttlks|lksuzt{{ttts}{{t||lrir]glldmtt|zlddv{tt{{{|~{{t{{tdc\VTLtllVTL]bZJHFJHF|z|]bZSKJd\\ultddcd\\b[U||zlekttssleultuzt{{t{{||zllkldd|ztts{u{ldd}|z|zMRKddcult]bZlddultf]cmtttsl[TTultd\\lddu{{}tllj]\f]c|ukd\{||{u{[TT}|{u{sreztl{zmcbV||tzltzlultkd\{||llkzllutultkd\VTLsle|zdc\||ztlsresrekk]tslutslelddulttlllddllkSKJiq]tsl}{tt{{{||llk{{|z||tts{{tkd\||{||}ult|zuzttsl|{{t|u}ldddc\ldd|utt{tt{tsl||{{t{{|ttsut}sleut{||ekd|ztsl}ztl{u{llk||}v{{{t{||{ttj]\tts}|zttsddcSKJ*)({||dc\lddtllVTLf]c{u{uztttstslu{{lriu{{f]cu{{lld||||dc\b[Ullkuzttzlddcu{{d\\ddcJHFVZTSKJv{tt{[TTlks||tsld\\[TTddc|utts{||red{ttd\\sled\\}\[[zlbVZ}|||||{||v{rg]rfkkd\|kd\{{tslesrelldred|zsletslztl{tt|u}|}{{t|u{tttsl|sle|v{tsl{tttts||{u{ttstt{mttv{llk{tt}ztl}|z}¾ƣ~}{tt{||ttsut{||}}}ult|lri|||zult|dc\{u{}|u{zm{tt}{ttttsu{{j]\uzttslv{}uztbVU||ztl{{t{tt{{tut{ttllk|u{{t|z\[[dc\:97&&UTSd\\d\\u{{ztl|{{t|z|mttsle{{tlldsletts{ttekdekdsrelrif]c{{mttsle{zmzll||lddlektlledkult{{t\[[|f]cttslddtslkd\sleSKJ\[[leklldtts{u{tll{{t}ztlrfkttssleVTLtllsleztf{u{uzt}f]csredc\}sre{u{{zm{||}|lldkd\{tttlld\\sre{{t||ttstll{u{mtt{tt{{{{{tt{{f]c~ttstts}|tsllriǔtsltsl}|ult|u{u{{{t{u{tts}{{llk|||z{{|mtt\[[||mttf]cd\\|z|uttllmtttll|mttztl{ttu{{tts}|lrilektts}|{||{tt{{t|uuztutv{lks{||{{JHF:97*)([[TSKJJHF\[[lri{||tsl{ttlri|z}u{{kd\v|zf]cf]cVTLek]kk]ultd\\VTL}{||f]ctt{edklddedkuztVTLmttldd||kd\lddzlllks|||{||{u{||lddtlld\\u{{|f]c[TTtll|||u{zmj]\zllj]\{{ttll{{tSKJ|z}|ldd}{ttuldd|z{{{tt{{t{{sle{||uzttts{u{||{{{tt{u{tsltslllktt{lek|vtt{v{}||}|{||{{|{ttv{}zllmtt|JHFlldlks{ttsleldddc\}tts{u{lldllk{||tts|zlek{{ult|uztlv{|utzl|vtlluztttsllklld{{tSKJ*)(lkslldVTLUTSsref]ctllbVZtzllldmtt|z{{t||zlld{||\[[}{||tll|zultlld{||mttdc\MSS{{}lriztlsrezllttslddztl{||llkf]cllkultVTLsre{zmzll|f]ctsl{||{u{dc\SKJultlldnf]c{||}v}ult{|||tts{zm{tt{||{tt{tttsl}|kd\sleulttll|{{t}utllkllkttsllk{u{ddc|u|||z{{{u{}|z}]cd|uztkd\{tttsl{tt|lek{tt}tzl|tll}|redUMRtt{UTS}}}|tlllri{u{u{{tt{uzttts|tslv||}kk]|ldd{u{{||JHF3+*||UTSdc\}|ut[TT{||lkstsl|z||z|z}lri{{|z{||||ekdrfkkd\utts||mtt>B9JHFlks|tsl\UZ{{\UZfkkVTLult|ud\\\[[ultek]llkbVUj]\tzlztlslekd\ult}ldd{tt{u{tt{b[USKJiWU{u{{zmVTLrg]sreedk||{tttts}|zlltll||rg]ztl||ztlbVUlddu{{}kd\lldtsltllsle{{t{ttllkedk{ttttslldedk{u{tt{llklks|sre}Ӕ|zu{u{{{v{lrif]cdc\|uwsretts{ttultvtllult|z{{tv{ldd{tt{||{{lkslek|u{{{{t}{{tult|zllktslmtt|llklddlek{{{{t|v{||vkd\redulttsldc\sle}lekJHF{{tlldkd\UMRUTSlksSKJUTS]bZ||lritslkk]tslllk{tt{||||}|ut|zv|z|ztslllkj]\|z{u{tt{\[[|zllduztkk]||tt{lek{u{dc\f]cuzt|ucbVu{{tzlddc|dc\sle|VTLb[Ulri{zmvek]lldsle{||llkd\\JHFttsb[UbVUztl{zmtzl}SKJ]bZfkk|ztll[[Ttslult}|}llkyle|utll||v{ztld\\{||yletlllriwlj]\uztldduztult{{{u{{{lekmttddc{||{||Ĩ|zu{{tsl||tsl}tll}tts{{t||[[T{|||ztll}mtt|fkkv{|ztlllrilddw|{{u{{lrillk{{tlksylelks{{tsl|lksv{{{}ztlztlbVZ}ztld\\}{u{}srelekedkJHF:97llklldj]\lek[[Ttslldd{||lekdc\dc\{ttb[Ulkstsl|u}}|{{sle{u{tts}lld}lddmtt|mtttll{{slef]cJHFlks|b[UJHF{{tD;9u{{|tts{||b[U]bZ[TT||dc\||ttstsllldllkztl{{lekbVZf]c||v{}|||ztfrg]VTLd\\lldllkttsf]cu|z|u}lld|utll}zllrg]j]\{{td\\|zztltt{uztv{lldlldmtt}{u{|mttllk\[[{{|z|{{lks||{{tuzt{u{||ultddcslerfk{u{{tt{{ttzl]bZmttlri{tt{tt\[[mtt{{}tt{fkk{{t}ztluzt{{uedk}{u{lriultn|{{lriut{{fkk|u{tttzl{{tv{{u{tsllddcbVSKJlddf]cJHF*)(\[[[TTSKJdc\}[TT{{tlddSKJtsliq]b[U{{tek]slelldlrittsultlld]bZddcttsf]cttsu{{ultUMR|ulddult}|z{ttyfl{|||utsltt{edkSKJlksuzt{{tJHFtll\[[kk]||lld}{zm{ttddcb[U{||zl{||b[Ud\\VTLf]c\[[b[UUMRj]\|u{tt|uredsre|{||uztkd\kd\}{{t|tsl{u{lritlllld{ttzllyle|tslttslldekd{{yl]cdultuztult{{{||tt{uztlrimtt||ċ}{{{u{{{|}{tt}||}{tt}|zmttddctzl{{ultf]c||UUYldd|rfkmttf]cd\\edk{u{||||lld|umttf]c}ttslri||llk|ttsred{{t}{{t|tll\[[{{tkd\ek]fkkFD;3+*VTLb[Ulrisreldd||[TTJHFd\\\[[||sre{zm|ztlutztlztllldult|uzt{u{uztult||tt{llklektlld\\[TT\[[[[TbVUztlb[Uttsf]cf]c{||}[[TVZT|ztzl|z{tt{u{{zmrg]ztfkd\dc\{{tultlrikk][TTtts|dc\ek]\[[mwiWUzlltsllldldd|lri|tslut}|srekk]kd\ekdv{bVZdc\}tygb[U||redlldlekult|ztts{{t{{t}{{{{]cd{{tt{{|||z{{tt{{{}|{||edkUUY{{tt{ultuztult{||{{tldd}{{tredztltsltts{tt{u{}tslu{{lksmtt}]cdttsut{{|zrfk|utt{{u{lksttstllultttsf]czllri{u{uttts|]cd{u{{{tllkSKJ*)(|zd\\\UZ[[TJHFultddc|zsleut|zv{ultlldzll|zkd\{{tv{}kk]f]czllddcnultulttt{kd\{{f]cult\[b{||\[[llktt{dkV]bZ{u{|zslesleztlekdlri{||[TT{zmslewl}}|{||wl||dc\~wl}n}kk]tsllriv|ztsl}}ztlcbV|zd\\utult}edk{{ttlltslb[Utlltll||mtt{{tuztkk]lld{{tlks{{}{{{{tt{||tll{{t{{mtt|{{}ztl{u{}ttstsl{tt|||z{||ztlultnv{||lri[[T{||{{f]c[[T{{tlritsltt{|u}|z{{||{||{||sle{u{{u{j]\j]\v{{{t}tll|uztuzt{||D;9*)(f]cVTLlriu{{sre{u{ztlVTLttsddc[TTuztlritzluztlriult|z{tt{{t{||d\\llklri|ttsv{{tt||ultult}uztJHF[[Tutlritlldc\tt{]bZkd\tsl{u{redslelddtsl}sle\[[{{tbVU{{tztfrfklddsre~r]g{|||{u{lri|lek[TTb[Utsl[[Tsledc\tllrg]|z|u{tt{u{kd\{zm[TT||ztltt{uztlri}tt{}{{||edk{{{{|}ќ}tzl{{lks{u{}tts{u{llkv{{u{tll{u{tll|{ttultllkttsu{{|{u{lks~edklks{{lksb[Uyle|{ttut|||ztt{|tlltts{{ttslu}}||{tt||tts{||{tttslfkkMRK*)(leksre]bZ{ttlddkd\d\\UTSUMR{{tuztmttdc\{zmvtllldd|SKJu{{|||uukk]\[blksedklddbVU{tt{zm{{{u{{u{tll|tzl|[[TbVUlriFD;ttsredkd\b[Ud\\{zmVTL|[TTllk||{||b[U{tt}|sle||kd\lldn{{tlld{|||}lri|ttsb[Uek]ztlrg]uztf[TTttsvzllkd\llkuztddc|u{tttt{tsl|ttsfkk}{u{{{{{}||}mtt|ttsęttsrfk{u{zll{||wl|zuztlkslri|zttsf]clekekd|z|lkslriultlksdc\tsl|}UUY{{}kd\sleult{{t{{||{u{{{{||f]crfk}|lriztltt{~|ddc}||{u{ttsultddc{ttultsre\[[||JHF*)(llklldkd\llduddcd\\UTS{u{ddcttszllddc{zmtll{||tts|u}lkssretsllrij]\j]\{||lek}}{||[[Tf]c|zzllkd\ttstsllri>EC|z{u{uztztl}{{t{{tslebVZu{{ldd{{tlld|zlriVTLVTLultkd\||j]\||]cdv{VTLdc\dc\tzl{ttuztyle{{tllkut||}llktsltllztl{{tek]sle|ut}ldd|lld}{||mtt{{{{lks|tt{{||{{|}}|zttslksnvmtt|z{{}|}mttztlult{u{|||{{t||llkddctts|v{lks{u{{{t{u{{{ultlksUMR|lri|z]bZUMRd\\b[Ullk|z{zm}ldd}|{ttsrev{||llkd\\{ttsre|}{{kd\ldd|||v}|ddc\[[d\\[TT\UZ[[T}74,74,lddVTLb[Uuztdc\ddc{u{u{{dc\d\\tsl]bZddcredlritllsle|ekd|leklekultu{{b[Utlllri{{tt{SKJUTS{u{{tttsllldtt{ylttsztltll|kk]\[[ddc}}ulttts}|zj]\|uztlu{{tll|ttsd\\fkk{ttult{|||{zm|lksdc\}|ztf{u{ttsutult[TTek]||ztl{ttkd\ztl{tt{zm|uultldduzt{{|{{tuztllkultf]c|nvfkk{||{{u{{|||}tts||{{mttdc\{{|{ttultzlltllllkttsu{{ekd}tzl}lldttsf]crfk\UZd\\\UZ|ztsluzt]cd|lks[[T{u{|uzt{tttts{||{tt}{u{bVU|v{|||uult}|zult{||}kd\|u|lrif]c|tt{JHF3+*bVZllkj]\tll]cdlld]cdult{{tUTS[[TlriVTL|ulksd\\j]\ttslddlddlddutd\\uztttsedklek{u{|v{|{{tslellkVZTlri|zzlddcttstll|u{{sreb[U{tt}sled\\tts{ttldd\[bldd{zmtt{vtzlf]cdc\lri|ukk]{yfd\\llkf]c{{t}tlltll{u{utj]\zll|sle{{tv{{{tsl{{|||z||lks{||red}{ttultă|lddtt{sleuzt|fkk}}lld{||{{{u{MSSf]cUTSf]cmtt{{|u{{edkedktsl||}}wl{||ult}bVU[[T}tts]bZ}|{||v{{tttsl{tt[[Ttsl}|slev||ultuztuzt|tllUUYddc\[[:97&&red{zmJHFVTLMRKu\[[[TTVTLJHFVTLtslsle[TTllddc\i\Vtslttslri\[bddc||ult{tt|||}{{lksSKJedk{{}lldsle]cdbVZUTSVTLdkVfkkFD;aWM]bZVTLSKJ||uztlrilddldd}tts{ttddctll||redf]c}zlld\\tzl{ttuztdkVVTL}JHFredf]cult{||tll{u{lek{tt{|||utll||ldd|z}ttsut{ttf]c|u{|||z}||v{}lks{u{|tt{}{||{{v{ult|rfk}|u{||{{}{tt{{||zd\\{{]bZ}lld}|{{JHFulttt{tzl{||{tt||lldldd||||zsre|{yff]c|}{{lriVTLek]}llkcbVldd[[Ttlledk\[buztztl[TTUTSedk:97&&\[[SKJVTLzlVZTek]FD;ultd\\|zlldsreslekd\jcV|llklld\[[}uzt{tttsl{||tllf]ctlllldut\[[ultSKJ{{{zm[[TVZTlddJHFu{{lddVTLtlllldd\\tsltslv{ztllrillkttsj]\lriUTSb[Uldd}ldd}ultzllf]ckd\lritzluztwllddtts|utreddc\uttts{{||}wl{{t{{tddctlllri}redddc{{tztltsluzt|u{{}{{{{u{{{{{{{{edk~|||tt{lrimttekd{u{rfklks\[buztu{{f]c[TT}ult{|||zttsult}|zb[Utts{||{tt}}|u|zldd\[[|u]bZkk]sle}ldd{||{{t{tt||ztlllek{||JHFJHF3+*edkek]lldb[Udc\lld\UZVTLVTL[TTlddlld{{ttllldd|}yle{||{{t|{u{{u{{{fkkr]Z{{s_qrfklekllduztv{uldd|MRK]bZVZ[llklldutekdddcztl]bZUMRztfdc\}JHF\[[f]c|}{||j]\tllkd\d\\||{ttttslks|}}|lldllkultlddlld{ttv{rg]{tt{ttlldf]c{{ttllllklddred|{{tu{{mtt{{lks{{{||lrisreu{{||z|zulttts}}}u{{ztl{{tttsj]\uzt|ubVZmttVZ[|ztts{{|uf]ctllekdUTSlks~[[T{{tlks{{ttll|lddtt{}ultedktt{{{t|u||{||lldlksultb[Ulld{{t[[Trfkult|lldekd[TTtslddcFD;*)(ultddcSKJD;9JHFcbVf]cSKJ[TTldd\[[tsl[[Trfk}|lld{zmuzt{{tlri{tt\[[{{f]c{||}ult}bVZbVU{{tult]bZultldd[[Tlddlld[TT|ub[Ulld|u{ttek]ddcddcVTLSKJFD;kk]ult{{tddcuztVTLtllbVZ{||[TTtsllddlritll}|{{t||bVUttsredredzll{{t|z{{tztl||zutkd\ztledk|zllduzt|{{}}}|{{{{|f]ctt{ult{||mtt~{{}|}||{tt{{d\\{||f]cv{r]g{{wl{|||z]cd|z|z{{|z{||f]ctsl||lld~||{{lld||}||tsllddrfk}ldd{u{|tt{||lri}{||{||d\\kd\tsl\UZlddultu{{uzt|z}|f]cVZT\UZUMRlddVTLFD;FD;[[Tut[TTfkk}[TT[[Tlek[[TztfVTLcbVdc\tslfkk|zmttek]||tzl{{tttstt{ddc}VTL\UZ|lriedkdc\|zztlttstllekdSKJttskk]|uztlldSKJ|utsltlld\\f]ckjV|SKJb[Uztluztulttsl|zsle{tt}lks[[Tkd\red|kk]u{{lddllk{{sledc\f]c}ulttllztl||llk{||{{}mtt}|{{nv}ult{{}|{{}|||tzl||zult||lks{tt{||ow|{ttsle|ultredekd|z]cd|mtttslmttedkuztcbV\[[|||f]c}|v{[TT{{tll}{{d\\}}{{t{||ddcddcrfktsluztddcultllkdc\|uUMR}tsl{||tsld\\ttsddcu{{{u{{ttlekVZTddcD;9*)(dc\VTLFD;D;9ek]kk]bVUult{{tlksd\\lrilriVTLlks|uj]\cbVlldVZTuztMRKu{{{ttlriu{{u{ttmtttts|mttf]ctslult}|ulttts]bZ{ttultztl{{tztl]bZ{zmlri\UZ}{u{}|d\\uzt}|}|sre}f]cv{{tlddSKJddcvek]VTL[TTdc\llkddc\[b||tsllldredUTSlldkd\redVTL{||[[TFD;llklddtsltsl{{f]cfkktsl||llkultlrifkkmtt||{{mk}|{{lks{tt||zlri|{u{}{{t||z]cdlks}{ttlek{{{u{mtt{||VTL|z]bZtslultdc\|v{{ult{u{||tsllek}{u{{tt}{u{slev{f]c{{t}||lriztledk{{|sle{u{d\\{||mtttslultdc\|z{{kd\ldd\[[tt{\[[SKJ&&j]\}f]cVTLJHF]bZzlltll]bZllklldtzlsleuztultVTLtll]bZ[[Tu{{tzlllk|z|z{{td\\{||ekdlld{{f]cedklldbVUlddult[[Ttt{SKJ{ttlddu{{lriUTSdc\rfk|tsl{{ttslzll|z||{ttttslldddcMRKf]clkstslekd|{{ldddc\{u{FD;Q?@ult}dc\||z{{t~mttlldult}|z{zmf]cuzt}{||UTSylerfk{ttdc\sle{||VTLtzlbVUlddllkdc\ldd||ztfllkldd}u{{mtttt{uztnvedklkstt{lks}}|u{{||{{u{{ultyltts\[[lkstslllklri{{{||{{ldd|zlks}mttlrirfk\UZd\\\[b{{tslmttlkslks{tt{tt|}||{||{{ultult{{|z|z{{t{{|||z||{||}{{tddc{tt{{kd\lri|lld{ttttsztlfkk]cdllkbVU-1+ldd{{tF=CsletllSKJ{zmzllldd\UZslelldddcd\\r]Z}}|JHF{zmfkku{{}lriuzt}|tt{kd\{||VZTlksllk[TT|uzt}lddtlllriUUYVZTVZTUTS{{tslettskd\VTLkd\tsl[[T\UZ|vkd\|{{tsle||SKJf]csre{tt{{ult|rg]}lddtslbVUlriv{d\\UTSslekk]||{{t}|{ttttsek]{||ztlttslddjV[\[[\UZ{ttult|{{{||fkk{{nv{||u{{{{}{{{{yl{{tts~tzllldlrimtttllztl}zll|{{bVZ|{tt{{[[Ttll|z[[Ttts|z]cduzt{{t{{UMR|d\\{zm}|sleldd}{u{{u{}|zddc{||{{ult|zkd\red}|tzlsle[[T|z]bZb[U[TT\[[UTSf]cFD;*)(f]c|uSKJ]bZlddJHFddclldddc\[[~tzlekd{||ulttzlu{{llklldtt{ekdlkszlltt{uztu}|tsltllVTL{ttztluztVTLlri|{tt]bZJHFb[U]cd]bZmtt{tt{zm[[Tlld{u{sreult{||]bZttslld[TTcbVVTLb[U[TT{zmi\VbVZtll}sletlledkUMRek]kk]VTLlddUTSutultkd\{||cbV{tt|ztllbVZuzttsl{|||lldvtsllksbVZ{||ulttll{{ultmttfkk{{lksmtt|~ekd}||{{{{ldd{{}|zztl{u{{||{{utf]clriUUYmttUTSdc\]cdtts{{ekdleklekttstzlwl~lks|{{tsl{{~u{{}}||u{||tt{fkk}|ultlri{{t|u}}||ztltslVTL{ttultfkkUTSMRK*)({tti\Vkd\FD;bVUPF=dc\UMRdc\sle}tsl{u{ttstlljcV|utyg|u{{d\\mttekd}}|}uzt||zb[Uddctll}}\[[{zmj]\[TTtllttsu{{lrillktllztld\\v{|ztlVTLttstzl{{{||[[Tb[U{{t}\[[VTLJHFlddiq]d\\VTLlld]bZSKJJHF||||f]c}}ddcd\\tll|ulld{u{|mtttsl{||mtt|mwtts[TTtll|z|ddcMSSleklks|}|{{{{nv{u{{{}|zNjlks\[b{tt]bZult{{t}ttsult{||{{{{tJHF\[[LKRMRKVTL\[bJHFu{{u{{red~|zttsv||ttstt{ult}||ekdddcedkldd{zmmttultdc\|llk{{sledc\{tt]bZ]bZVZTb[U*)(f]ckk]}|FD;UMR{tt[[TVTLSKJVTLj]\VTL{u{||tlllldkk]ztltslmtt\UZ{u{{{{||{{tutekdbVZUMR{u{{|||ulek{{uzt{{tekdJHFUMRldd|z|vf]c{||ztl{ttVZ[~{{ttll{tt[[Tkd\}FD;VZTd\\lddb[UtlllldlddJHFultekdudc\tsl||dc\{{tkk]{tt|ultredtt{|ztsl{{tzllLKRmtt}bVU{{lriuztmtt{{tt{}|{||{{|{{|Ѩ{{|}|zfkkf]clkszllvÚlldred|||lld|{tt{u{{||uzt|z{tttt{JHF~}zlluztlriVZTlrillk}|llk{u{|uztl}ult|}f]clld}{{ldd|llkttsekdvtll||{ttleksletll||JHF{||zllkd\JHFUTSlekutfkk\[[ddc}JHFSKJbVZkk]b[UPF=3+*FD;[TTD;9JHFlddtsldc\{ttdc\ut{u{{||||ttslddddcult[TT|è~iq]tllb[UddcUUYf]c{tt|zddc{u{dc\v{tslultrg]|zekd[TTlks{||lek||b[U[[TUTS{ttrfksreslej]\ttsUUYuzttllVTLleksreutwl\[b|ddcultlld||\[[{{{{t{{tlksredult{||tllmttrg]ttstt{{u{ult{u{{{u{{{{ǔtzlu{{ylMSSuzt{{t}}}tts||z\[bu{{{{t|[TTmtt\[[{{UTSult|zlddllk{{llk|uv{ttstt{ultztlv{|\UZ}rfkldd||llkmtt}mttu{{ulttts|v{{zllSKJd\\lriu{{ek]|zsleztl[TTVZTllk:97*)(u{{SKJJHFSKJ3+*SKJD;9F=Cf]crfkVTL|{tt~ddcsrejcVlldlldedk[TTmttulriek]lri|ztl{tt}|u{{[TTd\\VTL{{tultu{{u{{ttsfkkUMRb[Ulld{tt\UZ}VTLv{ult||redlksi\V[[Ttyglddult|uuf]c|ztlltslVZ[tzl[[T{u{ult|u|tts{{t{u{VTLlri{u{ddcultkd\u{{mtt{{||{{|{{t}~|\[[tt{{||}|ddc}}}UTSVTLb[Ulriuzttt{lri[TTultultult{{tlllrilks|zlksutf]c{{ult}tts{||{tt~||v{tzllkssreUTSddcnVZ[lks||ldd|||uzt{{{u{}{||sle[TT\[b]bZsletslVTLekdztlu[TTu{{llkUMR*)(\[[rg]bVUVTLVTLkd\tts|rfk~tzl|||[TTtt{kd\VTL{{tsl|uf]c[[T{{ttsmttek]{{tuztlriVTLlekttsslettsuztkk]r]Z}|kd\f]cJHFddcfkkf]cUMR{u{lldult[TT[TTrfk{{td\\|ultlks|u|tlllldkd\{u{|zuttslb[Uddctsluzt|u}v{{tlltts{||ttsutzll}{{ldd{u{}llk|u|}{{{{}|mtt}|ddcttsult|z|lkslks{{uuzttllmtt\[bmttmtttt{ultlks[TTuztVTLddcfkk{tt~lddyl{{ttslri{{|ztlult|z}|{{t{u{{u{tts{||lritt{ddcu{{\UZtsl{tt}ult}}{tt{{tt{llk{||ddcf]crfk||}|tslbVUf]c|u\UZ{zm|tts[[Ttsld\\|{||MRK:97{ttdc\D;9SKJVTLVTLf]c\UZbVZv{uzt{||slekd\ekdlkstzl}uztlrifkk||tts||\[[ekdtll\[[\[[mttv{ttVTLdc\rfklddtll{u{|tts|UTS{{tv{tllbVUVTL\[bttsult\[bllk}{{ttllddc|UTS|zVTL|zultrfkult}i\V|{{ttt{utlriztllriu{{lddlj|{||{tt{u{}}ldd}{{t}|uttskd\tts}tts|zlks{{|z|edklri||}||æ}lriultttsd\\{||f]c|tt{}u{{lks|mttlld[TTekd|||{{{{tekdek]ddckd\ult{u{ttsldd|tlllek|zuzt|sre{u{[TTtslultult{{t|||z}tt{lksmtt{{{{llk{{ttstsl{{t}rfkVTLtllVTL]bZ{||||tllf]c[[TddcMSS*)(tslb[U[[TaWMJHFSKJuztVTL[TTultddcdc\{zmlldcbVUTScbV}|\UZ{ttult}u{{tll|ttsztl{{tdc\tt{{tt{{tekd\[[srekd\||v{u{r]g|zddclkslldyld\\ttstlltll[[T[[T}|{ttlri|zVTLrfktllsreldd{ttUTSkd\UTS]bZu{{uzttlllld{{sle\[[|uztf]c|ttsddclek|{u{ttsttskd\edklld{||{{\[b|{{tt{{{{{lks}\UZ]cdldd|z|tt{||lriedk\UZttsttsmtt]bZlri|u{{\[[|zkd\lddu||SKJtt{u{{ultulttt{|{|||ult]bZ}UUY]cdldd{{{{t|zlek{{|lks|zuztulttt{tts}ut||dc\|urfkv{{||{tt|z]bZUTSsle[TTllkUTStt{LKRD;9lldkd\[TTVTLPF=VTLVTLf]cultf]cddc{{tdc\{u{kd\lrilldtslkd\VZTred{u{uztu{{|lddldd{tt]bZMSSlddkd\|{u{lks|zdc\}ldd}}lriUUY|z{{:97lksult|zult{{td\\mtt{{tllkrfk[[Tdc\}|}|{||u{{tsle||lek||}tll{{t|z|u{{tlld|zuztldd}lks|]bZUTS{u{{||tts{||mtt\[b||Ù|~|{u{{{||u{{ekd|tllmttd\\lksrfk}{{rfku{{llkekdlddztltt{ekd{{t}|tll|z|zmttrfk||fkk{||ddcultultrfk{{}{{}[[T{u{u{||edktzlult{tt|{{tts{{u{{|lld}|{{tddc|uJHFJHFlddttsult{{tlritsl[TTllkdc\ddcFD;:97UTS]bZd\\VTLSKJrg]lriyle{{tekdlrilldkk]]bZedktsluzt{||edk}{u{|{tttsl|lld{tt|mtt{{t{||[[Ttts\[[|z{{\[[ekdUTSf]cUTS|v[[Tlks{ttlks[[T}SKJr]gSKJUMRkd\}b[UultekdllkaWM}||{{}{u{zlluzt}|zlddtsllddlek||{ttuzt||uztllktt{|z{{{{tmtt|lks|Ī{{{{{{tts{{~ċ\[[tllf]cekd||}u{{tt{{u{{{tts{u{lrittstt{mtt{{mttlekrfku{{\[[|ztldc\lldkd\|lldu{{d\\||ult{{tllF=C}}z~}{tt|}{{llk|zuzt{u{|mtt|}llk{{|rg]VTLFD;[TTUTSekdlddztlllkllkdc\[[TUMRztlUTS:97:97sreb[UlddSKJsreD;9lddSKJldd{||lldsrezllf]csleutuultlld{tt||]bZlri||tsl|ut[[T[[T[[Ttsltsl{{tldd}ttstts~uzt|MSS\[[[TT]bZ[TTi\V|{u{{{t||{ttsrej]\leklddcbVrg]{{t{tttlltyg|uttslldmttdc\UTSf]cut|z{tt|u{||{||ddcultedk{{|zlks|}|||^fsх{{{{{{|ult}tsllksu{{mttmttlksddc{||}mttlkslrimtt}|lritsllri|{{tsre{{tredlld]bZ\[bUMR{{{{redv{}{u{||uzttsl|]bZ||tlltt{mttv{uzt}lksmttuztekdllktlltzlek][[Tlldslettsv{|ddcekdtslztlultdc\,55||FD;74,{{tlrif]c{zmlriFD;\[[VTL{|||zsle|zttsjV[tslrg]tslslej]\sle||lekllk{{ttzlllddc\|{||ek]b[U{ttlrivlri\[[ekduzt|utt{{{lri|kd\UTS\UZdc\[TTlldbVU{{t\[[lldVZTultyle}cbVkk]lri{zmzll[TTsreztlf]c]bZ|UTSlri]bZztl{||tsl||d\\{ttmtt{u{tt{}]cdtts{{lks||}{tt}|}{{|}}{{|zultmttttsuzt}edk|zmttUTS\[b]bZdc\tsl{{nv]cdd\\\[[|z{u{tllj]\|ldddc\|mtt|z}v{lks}v{{wltt{ylv{}ut}llktllulttt{~tzl}|}nvddcmttlksd\\lrilddd\\ekd{tt{{tddc{||}{tttzltts{zmj]\\UZUTSUTSJHF74,lridkVSKJVTLJHFbVZVTLbVUtllu{{d\\srelksztlkk]tslztlddclri{tt||ztlfkk{||tzl}]bZmtt{u{llk|zFD;MSSlrilri]bZ{{tlllkslddllkddctll\[bultuzt\[b}tsl}lks]bZUMR||b[Uultrg]LKR{ttkk]UTSlddVTL[TTUMRlriu{u{lld{||{tt|kd\tzl\[bek]tt{{{u{{|mttÙ}}{{|zulttt{tt{UTSultlksu{{}|lksekd]bZ]bZtsl}|mk\[b\[[kk]|zultztltlllri|zddcultttsek]]cdMRK}UMRv{~{{ultv{llk|zmttmttf]c|ek]\[bultllktts|{{}{{lksVZTJHF{ttultUTSu{{tlllld{{tedk||sletsl{||kk]SKJSKJaWM|ekd*)(kd\kk]bVUVTL:97D;9\UZbVUllk]bZtsl}f]ckd\mttcbVldd\[[ztlztllldmttcbV|dc\b[Ulld|]bZ]cdekdJHFu{{MRKVZ[llkkd\edk{||{{|lddldd{{lks|zllktslztlutUMRjcVj]\lddbVZ{|||z|uf]crfkrg]\[[ldddc\{||mtt|z{{t[TT\[[\[btsltts|||{||lek|redlldmttu{{uzt{u{{{lkstsl}{{u{{{{fkkmttu{{|mttmtt}~{||~~{u{|nv{u{|{|||u{{|ttsult{u{mtt}|mttfkk|mtt|z|ultmttleklldllk{||VTL}UTS[TTlldVTL{||utJHFtllJHFtslkd\lkstslu}JHFleksle}ttsuztlri\[blksu{{tsl\[b}f]c||~tt{{|||tts{tt{||mtt|uztlldf]clrilld{{tztl]cd\[[redVTL[[T|zrg]FD;[[Tdc\SKJ:97*)(UTSVTLaWMVTLSKJJHFf]ckk]llkSKJlrikd\zllrfkd\\lrilriVTL}yle|ubVUmtt{zm{{tkd\tts{{t{tt||z||lddlrilksekdmtttzlult||{{lrimtt}tt{|zredrg]lrifkk{{tlddsle|utsllri}|}|D;9||lldulttt{[[Tlddttslrid\\b[UJHFd\\lldtt{{ttuztkd\{{f]ctsl{{t{u{{ttult{{mtt||{{tt{]bZ]cd{{mttmttmtt{{nvmtt{{|lks{{}lrif]c{u{[TTedklekuztlks]bZlrimttmttmtt~u{{mtt{{{u{||ztllkk]lddb[U||{{tultlekdc\MRKllkrfkf]cf]cUMRtll{{||ultuzt||}mttlksVTL\[[u{{tslultttsult{{{{edk}mttVZ[tts{{uzt\[[tlltsl\[btts[TTztlVZTkd\VTLb[UyleUTS[TTJHF>ECSKJVTLJHF74,[TTrfk}b[U}f]cllklld{||UMR\[[VZTi\V]bZlriekdVTL|ztll|zfkktzlfkk[[Trg]ekd{{tll||{u{g\rUTSedkkd\u{{mttmttSKJult|z{u{ddcd\\{u{lddsleldd|z]cdred|cbVd\\f]c|zmttd\\\[[utttsu{{uztuztttsult|z{{t|||lri}mtt|zlkskd\{{Å|{{lks|}{{{{uzttsl|llktt{|z[[Tmttu{{|||u{{lek|lkslrimttu{{lld|z}lrib[Uekdr]g\[[VTLf]c}{||f]cmttult|{u{f]c||tyg{tt}lekrfk{tt}|z|z{||llkllk{u{tts{{{{lksttstll}uzt{{\[[d\\ek]d\\edkllklddtsllri[[TVTLb[Uultlddu{{UMR*)(aWMVTLd\\VTL[[TD;9[TTb[U{u{]bZ{{tttsztlSKJlld||tsltsluztddc|u{zmekdkd\ddc\[[lldttstygb[U}sle\[[|zlri|uzt]cdlri{{|z]bZf]c{{lrimttb[Ud\\\[[||lldlld{{lldtslsleekd|zldddc\tslj]\VTLv{u{{MRKVZT|uztsre}|z|z{||||{{ttsl|{{ultmttVZTtt{{{|}}}}~|lri|z}ultult|{{lldu{{uzttsl}|nv{{mtt{u{ttsekd}lddddckd\uzt{{SKJttsUMRdc\D;9{ttMRKsle{{}{{tll{{t}lrid\\kd\{tt|}}{{t{u{}|u{{mttu{{tlllks|{{f]c{||{tt{{{{lrilkstsl{ttlld{{tmttultkd\rfk{{]bZkk]tllVTLUTS]bZ]bZ:97}VTLtzli\VJHFi\VUMRVTL\[[\[[mttnv|uzttll}|bVUultlld]bZedk|sre{ttkd\bVUf]c}|z[TTtll[[Tllkd\\||}u{{edkVTL\[b\[bVTLdc\{||||ztlttsred]bZek]cbVllk]cdedkd\\lld]bZkk]tslUTS[[Tedk{||lriddcu{{mttsrei\V{||uzt{||{{{{UTS||||ttstt{tt{}tll|u{{}{{Ümtt]cd|~{||lri]cdu{{]cd~|u{{mtt}mtt{u{cbV]cdf]cSKJttstllztlddcttsekdlrilksSKJ]cd|[TTlriddc[[T{u{lksylttszll{|||ztsl{{{{|{tt}tt{lri|]bZmtttt{tllddcuztbVU\[[tsl|zsrecbVyfdlddred[[TJHF*)(kd\VTLek]VTLMRKD;9{{t[TTlddJHFVTL\[[tt{{u{{||zll}ekd|tts}tsllekkd\VZT\[[{ttSKJ{{tzll|u|ztsltlluzt{tt}u||\[bcbVnfkkbVZSKJzlttstllkd\}VTL|zlek[TTtsld\\]bZult[TTUMRultrfklri]bZUMR|lriVZT{tt{{|z|ztslult||[[Tfkkuzt}tts{||{{mtt{{nv|{{u{{f]c{u{}uztedk]cd|zVZ[mtt]cdddcuztfkklkslksUTSSKJtsl{{t]cd{{tuzt|ztts||fkktt{lrif]ctts[TT[[TVTL{u{ttsmtttzl{tt||}{u{{u{{||u{{{{lkslksttsf]c]cdlks|\[b|ttstsl{tt|tll{||uztlld|z[[TVTLJHFlld[[T]bZultUTS*)(dc\[[TJHFaWMD;9D;9jV[FD;JHF\[[b[Uf]cultd\\lek}tt{ultiq][[T}zl|ek]u{{}uttzl|}rg]j]\}zlllddek]mtt{{tttslri{u{|tll{{||lldMRKSKJF=C{{trfkr]ZtllbVU]bZekdsle{tttlluekdtlltllv{ult{u{\[[ultfkk>B9tll|cbVekdu{{||{{|ttszlllddmtttslttstt{{{ttts|{ttmttlriuzt|\[b}}{{~u{{lkskd\f]c|z|mttVZTnv|llku{{ult}f]c{|||zllk|z{{t]bZsle||dc\||\[[{tt\[b[TT}tzl|VTLek]JHF{u{{{{ttuzttsl}~tll|ztl|]bZ{|||u{{{{{ttu{{mtt]cd{{||b[Uekd{ttfkkZbN|z\UZekdSKJVTLldd[[Tdc\VTL:97*)(slejcVD;93+*JHF74,JHF[TTult}|ulldttsult||ult[[TttsUTS[[Tek]ddc{{|z|uultultultlksuzt\UZlritslek]{u{tsllri]cd?;C{tt[[Tsle{tt|ulriJHFddcdc\ddcd\\tlluVTL[TTttsd\\ultttsb[Uult[TTUMR[TTlri{||ttsekdfkk}|}}tllllkēmttuztztl{|||zu{{tslmtt{{|}|}}ã|vlks]cduztmttu{{{{tts|fkkmtt|{{edk]bZlks}|}rfk{{ttsl]bZ[[TUTS~u{{|uekd[[Tdc\u{{VZ[lrilekuztuzttsllrilriultd\\|tt{mwtslVTL{{{||}tslllklriult{{}tt{lks]bZ{{{u{{||f]cdc\SKJtsl|llk[TT[[TztlVTLsrett{d\\JHF*)(j]\cbVJHFSKJF=CF=C[[T[[TbVU}{{t||{u{tlllekllktll{zmdc\kd\{{t{{tlri]bZwl}||red|}sleSKJlektll~}\[bultleklritsld\\{ttddcv{mtttllb[Ud\\kd\b[UbVZdc\lddF=Cf]clekmttf]cmttttsu{{lri}|lldtsl{u{fkkuztf]c|{ttlld{{|{{}}|tt{{{tÜlkslek~mttlddmttUTS|mtt|ztt{{||{{lks{{ttllkk]uztVZTddclekbVZtslkd\lksVTL]bZtlluzt[TTtll]bZekdu{{{{{{|zlri{{{u{lld{u{v{ekd{{tzll||}|{{tts}f]cmttf]clri{{mtt]bZedkmtttt{dc\]cdu{{ttsllk{tt|zztl]cdlek[[T{{trg]VTL[[TSKJldd\[[*)(sleJHFbVZJHFJHFVTLVTLkd\[TT{{t||ttsrfk{{{{ttslllklrillkttsu{{f]c}}{{tek]lksfkk}ttstzld\\uzt]cdultttsd\\UUY|||zddcdc\UMRdc\mttrg]leklddlri{ttjcV[TTj]\ek][TT{tt}|llk{ttv{}|ztt{\[[]cd\[[||{||{||tsl|ztt{{||ekd}|zsle|ekd]bZ|zdc\}||{{{{{||{{|ultČlks]cdlksmttlri\[bmttmttult{{t{{{{t}tts{{t]bZ[[T|zuztllkf]c{{]bZek]tsl\[[JHFmttmtt|{||ddcztl[[T\[[}lld{{tllduzt}lkslld\[[tsl}uzt|{{lks{||VZ[{{||leklddlri{{[[T{{tsl{{t]bZ|{u{{zmedkddc[[Tdc\VTLztl\UZlddLKR*)(ztf{{t{ttUMRVTLj]\|zrg]v{f]ckd\tts{u{fkkv{tt{slekd\dc\ttsuztlks{u{tt{{||{tt\UZ|uf]ckk]{{t{{\[buzttslmttlkstsl{||SKJ\[[[TT|[[Tdc\tllkd\lkskd\uttzl|u{zmtsld\\kk]lld{{ultf]c||ult]cdlkslks{||lek}uċekd{||ult{{|ztts{||{||{ttlks}||}|{{|{u{\[bѣř{||u{{|mtt\[[tts}|mtt]cdfkkddc|ultlriv{||d\\[TTkd\kd\fkksre\UZJHFmtttts{{VTLb[Uutmtt\[b\[b|{||u{{|[[Tlld}}{{|u{tt{u{|{tt{ttmttunvmttmtttslvultmtttt{||uztu{{ultmttUUYult{{t{||]bZsle\[[UTS[[Tllkdc\VTLVTLVTLd\\jV[SKJ\[b74,red]bZlddekd[TTSKJ]bZSKJf]cb[Utslddcztl{{rfkvultdc\kk]{{tkk]dc\ult{{t|ud\\}[TTtzllri[[Tekdtsltlltts|z|zfkk}u{{{||uzt]cdJHFlksdc\[[TtllSKJtsl|zmtttllVTLsretll|{zmf]cllk{{t{ttUTSztl{ttllkf]ctllf]cSKJJHFultu{{JHFtt{}{tt{u{mttvdc\leklldkk]{||edk{{t||ult{{mtttts|ztt{uzt{{mk{{{{}lekd\\|}f]clks|z|z{{tfkkVZ[|{{^fs]cdmtt\[bult{{f]c||tslddcJHF|uutf]cult\[[lkstt{{ttultnv\[[]bZekd]bZJHFddcultkk]|{||tll||tslult\[[|SKJf]c|{||tslmttlks{{mtttslultyl\UZtsluztultuzt||ddcd\\kd\UTStslVTL[TTlld]bZrg]d\\LKR*)(bVUVTL74,JHFJHFf]clldUMR{tt|z|uztb[U}{u{ztl{{tkk]b[U[[T{{tdc\v{ut{{{tt{{tlricbV|zlek||tts{tttslult{u{{u{tts|zmttUTS\[bUMRd\\ekdVTL[[TbVZult{{srered[TTbVUf]cSKJsletsl{zmu{{}[TTSKJ||bVZlddllk{u{SKJf]clkstt{MSS{u{||uddclkstslult{{t{||{{{{\[btt{{{mtt}}lksmk~tts{{t}ttsu{{|tsl]cdu{{{ttlks]cdUTS}nvmttVZ[\[b\[b|}\[[|}|{{{u{MRK{{f]cllkkd\{{lkslksmtt|z^fs\[[mttu{{{{t|zVTLtsltslVTLfkk{{ultuj]\u{{|f]cultLKR}lddtts}lekuzt{u{|lksmttlri|lriuztlekultd\\dc\UMRek]sle[TT]bZSKJ\[b[TTMSS-1+VTL[TTPF=UTSddc\[[lldutred|z|z||u{{{ttbVZlek{zmj]\VTLmttdc\tzl|{||lek}{{t{{t\[[}UMR}tt{|z{{fkk{{|zwlVTLtsl[TTlksvSKJ|zddc{||}lddj]\tts|vJHF[TT|urfk{{tultslettstll{ttMSSf]cult\[bldd{ttultf]clek|z{||||}lld|uzt{||mttedk|z|{{mttuztllkult||zf]cf]c{{}mtt]cd\[[ldd|mtt{{VZ[lks{{lksmtt{{lek\[blks{u{{ttSKJ{u{tll{u{VZ[tt{llkddclddrfk|{{tt{edk|mtt]cd]cdlld{||{ttult{{]cd{{t{ttu{{u{{|z[TTtt{{{|u{{ekd{{t{||tllfkk{u{VZT|{||ddc|ultldd{tt|zekdddcUMRztlfkkSKJVTLdc\D;9JHFlldVTLlddJHF,55sled\\:97JHFredbVUlri{u{tllUTSVTLlriultf]cultult]bZ{{tsl]bZ|uf]clekultdc\llkVTLVZTlek{{UTSd\\{||tt{}ult{{tJHFf]cult{ttsleztlrfkredrr]sletts{||{{rfk{zm\UZJHFddc{{\UZLKR}{u{ldd|zmtt||lksut|u{||{tt[[Tmkuztlks{{Č}~mtt{{t{{t{{}]cd{||{{ult{{{{ttstt{{||]cdtts]cd|znmttlkslksultu{{}}}uztg\r}edk||f]c|{{|lks\[blksnv|z{{}|tlltsltslulttt{}mtt~mttfkk}ttsfkkttsu{{{{{{\[[mttmttUMRllk}mttuztUTSfkkUTSSKJ|ztsl[TTSKJ[[Trg]aWMlrilddcbVultLKR,55wl[TT\UZddcJHFtll[[Tultllk]bZtzl{ttult[TTtsl||SKJmtt|zttsek]lddllkd\\{||d\\mttJHFVZTbVZlksmtt|}}{{u{{lks{ttsle[[TUMR?;Cf]cSKJ}lekttstt{f]c|UMRkk]ztl}|VTLuztf]c||VTLlddldd[[Tekdd\\mttlks\[b{|||lksldd{{tts}|zu{{{{||||}tll}||tll{{{{љu{{b[Ulld{{||ult~|z|mttlkslddmtt|{{nv]cd|\[b|zlek\UZlkslek~}}lks}lks{||{{LKR{{\[b~|mttd\\lri}{{t||lks{u{|tllf]cfkklriu{{ultu{{{{|||mttlkslkslks]cddc\\[[dc\[TTultddcsre{ttlrikd\ztlVTLMSS:97tzl}ultSKJVTLVZTVTL[TT[[Tf]cutllkdc\lekb[Utts}tt{|||mtt|zuztlld|f]clksultult|zddc{ttJHFtsl|u|u{{|ttstt{}tlld\\iq]lriUMR|d\\llktlllri\UZ[TTsle}\[[ult}ztl\[[||]cdJHF[TTVZTVTL\[[ekdSKJ^fsmttSKJdc\lddult}|}{||uztllklldtll{||{{tzlltts\[b}ultu{{ulttt{lek{u{}{u{|v{}|lri{{|}mttlektt{v[TT{{t{{t{{tztl]bZ{{||tts{||JHFVZ[lksnMSSmttmtt{||fkk\[[|ldd}|nvultdc\tt{edkUUY{||{{mtt]cd\[b^fsmttmttmttf]cmtttslekduztUTS|utleklrid\\f]ccbVlddSKJlldUMRr]ZVTLOS`)+2|llkFD;[[TSKJFD;SKJVZTUMRJHFJHFtsllldredSKJ{||UTS\[bekd|z|tts{||mtt{||lri]cdvuztztl[TTztltts\[btsl{{{u{UTS|]bZ{{JHFddcult}|\[[d\\srelri{tt}|rfksrebVZdc\edksleddcu{{\[[ekdf]c\UZ|d\\|z[[T\[[\[bd\\{{td\\||lritts}{tt||||ttsUUY{{}Æ~uzttt{~{tt{||{tt}lks]cdlriddcult|uzt|Ìddcultult[TTtllekdiq]]bZekdkd\{{\[[ekdf]c{u{lksmtttt{||nek]|lksuztmtt{{lks{{~tll}|{{lksddc{u{{{tult|mtt|{{lksfkk\[b]cd\[b]cdfkkddcuzt]cdlri|z{||[TTb[Ukd\sleb[UyleyfdllkJHFaWMlriOS`*)(tts}{ttd\\sre{{tb[UVTL74,JHFFD;UTSVZTkd\redjV[{u{ekdmtt{{tult{{t|zu{{lkslri\UZuzt}[TTlri]cdddc{||UTStt{|tts{u{|uztultUTSlddztl|zek]{{:97f]c\[[{ttlld{u{|z{ttrfk{ttsref]cUMR[[TlriJHF||\[b{{ult]bZult}||mttekdtt{{||{||}{{t}u{{|{{ultmk}~ult|tll}|lks{ttVZ[{{]cdmttUUYultylf]cf]cwlddcJHF[[T|edkulttt{edkmtt}]cdMRK{{|OS`lri]bZLKR{{lksuztyl}edkttslekmttfkk{|||\[[f]c\[b]cd{{lks|}||lksVZTf]ckd\b[Uf]c[[Trg]red{{tekd]bZtslJHF,55mttlldbVUFD;b[Uzlekd[[TekdlriSKJlld}{u{{u{d\\UTSlks|zlrimttu{{mttllk\[[llk\[[ldd{tt{||lri{{ulttsl{{mtt|{||}}ult{{ttsdc\{{t{{t[[TlksJHFJHFd\\|z{{|utsl[TTrfkVTLrfkdc\FD;sleekd[TTkk]|lld}{u{JHF{{\[[UUY]bZ{u{SKJllkzlllek{||||}lldlri}ldd|z{{llklkslekmtt{{|{{ \ No newline at end of file diff --git a/libraries/ode-0.9/drawstuff/textures/sky.ppm b/libraries/ode-0.9/drawstuff/textures/sky.ppm deleted file mode 100644 index 8b541b10af..0000000000 --- a/libraries/ode-0.9/drawstuff/textures/sky.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -128 128 -255 -}}~~}}y{}}z~|zz~zz|~{y~~~~|{x|yz}~xvuwzzzzyw~{zz}wuttyzyxw{~~zy~||{xwvwvwz~|{~}}~|zwyxx|~~|{||zz~~~}y}~}z{~||}}~~||||yw|{{|wtz}||~~vsuz}xwvw}~~zxwz}}|{{}|}|z|~|wuux{{~zxvuw||}}}||yv||~z|||~~|{y~}}z{|~~|yz}~}||x{|}|}z}~ \ No newline at end of file diff --git a/libraries/ode-0.9/drawstuff/textures/wood.ppm b/libraries/ode-0.9/drawstuff/textures/wood.ppm deleted file mode 100644 index a53d2dca9a..0000000000 --- a/libraries/ode-0.9/drawstuff/textures/wood.ppm +++ /dev/null @@ -1,5 +0,0 @@ -P6 -# Created by Paint Shop Pro -256 256 -255 -ǿżŰ̻ÿǻʻǻŻÿ¸øŸۼƿ̼ÿÿʻõƼɿǾøشſ·ɻþǼƾŻǼʿƿÿǿٳſ̺ɿǼɿ»Ƽǿпƿпǵص̸Ǽǿ¾ſѾ׼ʾǸ¿ŵƻɿƿ̼¾׿Ƽ°»ºɺغǸۼſƿžؿ̼ƾ¿μſžÿúƸ¿¾žÿɻͿŸɿÿ»οüʿſ¿»ξǼſ¿μǸ¿¾ƾ׼δ¼ǻͻüп»ſŻžǼþÿþǿ¿ǿ¾þÿ¿¾úƿ¼̾źſº¼ƿѻŷ÷þþ׾ŷƵüſ¿¾ƸɵƼ¸ÿƺʵǼǻ¿ƾƼɺžžżƾƿſƾ÷ÿ̷ǻþ̿úƿÿԻżξþɸûпž̺Żí¾ǼʾʻŻñɼͿλпƻ¿ŻѼտúǾÿżԼԿʸѺǿÿſ̼;ͿռżԼƸǾſʼŵ¿ǺǺƾǿÿóοƾ»üѿǿƾÿƷҼƾü׻źþûѸܾҿûǿÿ·຺ƿÿ¾¸߾»żƻƸ߻þſҸмݺп̼Ƽ¼ſ¾;վÿٺԵλŵƾ¼¿ǷǸ¾»ܴѻǼúüʺ¼ưźžб׼Ƿ¼¾Ŵƾ¾ܵٿƼʼż´¾ƿº׾຺¾¾Ϳ;º̴¾ƺûɸžҸҿ;ƿǾ㸸Ե̸Żſ¸¼ÿ걱ƻ۾Ʊſ¼о»ǸµǷ߸ƿ¿Ǿؼ¿Ѻ¿¾ξûú侾ѵ¼¿ͺƿ¸Ƹ¾ƻǼվ¼üÿƴ۳һǼŻ¾¼ػƺɸ¿రưǸƸøſ·¼žõ¼ƿʿԾ÷·̼ƿ¿ƺ¿ƾ¸·̿Ʒ;ʼøſҾŵźҺǼͻþǿžտ±ŷɸžƿٳʼ̼ο¾¿÷þɸþſԷߴɼûþû÷żƸǺÿ¼ÿ¿»Я¾ſɼǻÿ¿üγɿƿɻǿÿɼż̼ſұǿ¿»ǺƵ¿ٸſɾſ¸ɾſǿºþغƾ̿¾¿λ¿¿Ǵƾſǵɼ»θƸ¿»ŵǾƿǿɻɺž¾żÿ¿úþµɺ¼¾ŵǻ¿ÿ¿Ǽɾ¼ÿƿ¿ſº¿ʺ¼źô俿ƺºŵžð¿Կúɻÿɿٻ»źƾξǾƻ⺺üξƻûǿƿÿǻÿ¾úµݵþǸ¿ǿ¼Ŵÿ¾ʨ¼¾ջƼƿÿɺþø¼¿ÿΰμ¾¿θѸ»º»¿´¿»ǿͼɼο¼ž¿üŷǸǼλ¿ÿŸ°Ƽ¾ø¿μ¿¿¾þɾžƿÿôŸ¼¿ż¼ÿ¿ƿſʼƿž¾ɸź¿ú¿ü¾û¿̿ʾ¾ø¾¿¾µǼſ¼µǼµƾƿÿ÷¿ƿƿ÷Żÿɺǿú÷¿¼ŷƿ¿ɼѾ¿¾üʿ¾üԱͿž¿Լ¼»¾ر¿÷Ÿüп¾ɿ̵þ¿Ǽҿ¿ʿ¸¿¿ɻɸþºҾ¿ż»Ǿпž¿¾¿ܿ̾·ÿƷǼɼ¿øƿþɻ¾㾾̼¼óɺú۷¼ñ뾾ɺǸ۷þɾ¾ų̺;¼̿謬ǾƼǿʺɿſżٺ¿ƿƼҾþżž̵¿ÿûʴݻǼ̼ü¿üƻƸݵÿǺ¾¸õƴٵɾ͸¾ͻƿپƻƾ»ƻƺ̼÷ѳǿ¾ſƸ¼һſƻ͸þѻʾξóοüƺͿ»۱̾Űеüʾíº¿ɾ㷷¾¾ƴ÷Ƽŭ¸ºŵ߷ɿƵ߼Ǹɼɵ¬ƿܷ̾´ݸºõ̻¿ŵ´üɷܺÿ;õžþƵƷƸαÿɻɷÿÿǸ¿»Ÿŭΰ¾Ŵʿþ໻ƿʸþǺſɾǷ͸ü̿Ƴ¿ⳳƿþþǴ俿ÿƺú´źźúǩÿźпʻ¾¾ſ¿ʼпʻ¿úÿкÿûþ¸ѻ;¸Żѱü۷ƿǿƿ´Իͺô¿ұÿþ¿̾ɸǿǺżͼºƴƸǿ߾ÿͻ³żûɾƳſ´ſհǺ״ſ̺¿¾ǿ¾̼ɿû³ÿץШǻƿøŻµ̻ɻôǿצɬúǾкþмѿŵ¾ըűþǾƻžźлƿѿǿêſõɱž̼¸ÿɻƿɾ׿ŭ¼μ¿̴¿¿οƻƼ¿ѺůǻоǬ̿¿ɻÿǿ̿ƻð¾ʼɵÿǻ¾Ϳþÿżűž¼ɾƯʿżôǰſüʿƯ躺Ǿ¯¸ÿüʼ绻žõ»Ŵͷɿ¼Ϳ̾ǿƺҿ¾λ¿»ЬɭʺǾ̿¾׾Ծ¿þ¸ҬƸƿ¿ƿׯŻɻž¼տ¾üҿٵ¸ÿ¿­翿DZ¼ʸܻÿŻÿ÷⼼ž¯¾ܼɷ¿ɸ¬»պǿ۷̿ǻǺñǺƸͿÿþ۱¼طÿǼǻۼѾ»Ǽ̯µ̷¿¿õʻ¿Ǽÿº̱¼ÿ¼ʿ¿Һ¿ʿͿǾʵŷǾƿ¼ú׻оſͰʼ¿ÿüظмʻͿ;еξ̾¼о¼Ǿ¿¿ǵƼʿοƿŻ¿;͵ۼŸտƺԸż̿ذƺſɾγŷݸ꿿ſɿ۵¼մоʼ󿿿ۼ¾ѿʿ¼¾үѻþվſǴǷоſƾ羾ʺʿ¾¿θƦοǾ྾ѾػǼŻ̼ûҨþͿûԾԴҺ¾߿СɾŻ»ÿº׻հһʻؼټШüǾɻƻǻݼ׺ŵü¿Һ¿ʨ¿ټźƿþغƵ̼ƺÿɾԻίɿǰǾžʼǺǺǿʿʸʼԩվƷ»ƻ྾ɿ̼ƾŷ̺似ŷ̿ſɳԸ̾»ǾŻµ¿ߵͿ»ø¾ҺƼŷǿŵǾ¾ܿǸɼǺſŴôξͿο¿̵ƸǾƿҾҿ뼼Һʴɿ¿þÿͷξóݻ۷̷ǿɻƺǸ¼Ǿƴ¾۸ε¿ÿþ̾ŻɷصʰǼиɻƺ̺ͬþûŸ±ƻƻͼ¢Ѵƿʸ㾾ƿ»̼üǸ¿̿ɰ»׻θ¸¼ŸкɼʰʿƯºƿԷǸշʱ·ͪ¿ǻƸþܸҴ¾¿лµͿ侾¾üſûҴл·»л俿ÿ¿þƻ׸ǷʿԿüþպ¾¾һͿԻ»»¿¿ɻƾžſżз̸Լ¼λ°¾÷տͿξŸ»оλúۿÿͿܸƾɰƳ¸Ƶ»ѾɼŸŵ⺺¿»ſվ¼ұƼ¼¿̷ƻ¿ݷþø㻻վ»ǵ¾ø¸ʸͿÿ׵ſٱѺƿǷžʰ¿̷ɻƺο¿̺üͼ·ǰ¾ԾƼDZÿƿƺ׵ÿԾſгԿ·þ׿õ¿źÿճɺſþű³»ü¾Ѻñп¿ɼ͵Ƽÿκ³Ƹû¿з·ſѺҺǾʿѷǴż»һ̼źԪžż¿¾һµõƾžþλ±þԯǼǻþѼҼ¼ÿǿμƾ¾Ԭÿ¿¿¿űʴ̾ƿſûܭɻѾ¿ѵǿúüƿ¿կпżƼƸ̻úƾ¾ñʻſ¼ðκºǺµҵ÷Ʒſÿʷ÷Ǹ̴ƾǾ¿¾ûþξ»Ϳܿ̿;ƿ¿ɾŸ״Ǿʵиſdzʼɼǵ׿»ÿξͼ̾Ѹʻż¿¿ѻƼ̾¿ſ¼¾̺øμεžſ̿ŻͻͼžżÿʻººþοøҼž»žͻɿű¾¿ž¾̿̿ۿŸżݼƺ͵¿ʿƴ¾ɳʹѸǸسǾǷ»¿ż¸ó̸¿ѿŻ绻ɿžǻʿ¸¿ʿú¸ŸžǾպ¼ƿǿ¿ɸ¿̼ƾѻƼþſүܾʾ̺ǿûԷƻԾ¼¼żƻÿɿø״ÿƷǭƿſ¿׼¿¿ƿ¿Ǿʺͼÿſżյþƿ¿ŵżһƿռξ»οžüбƾʿÿüκ¿Ƹ¼Żƿ¾ǿθŻûǵ¼ɳºǿ߾¼þüſ·μɻþѭѼɾʵþ·ǿž¿αͿɺ¼žŵžƿſ¼ÿƾǾ̷ʿοúɯ¾ÿҺؿǼǿſ⼼¼þôǷÿǾдźѾÿþüżſǾſɺſüа¿ſѿ;ÿǾÿƾ»¿иܴ̻»¿¾ʷƾſźºž¿ûºüǺóþſþŵºż¸ƿǼѴ³̾ÿþ»ôп¾žþǸüʵ¿¿̸þ̸¾üʼƻƵƸſƸ¿ôÿþžûмǻʿ;̻žɷƿƿ¿ʾøþɸƯ»ѸʻŻɵ»ſɼ±ǿλҼð̺Ƹžɻɼÿοÿ°¿žپ׼þɿ»۾žŻûƾƾ¿Ǽغ͸һǿ¿ۼú¾ʾ»ÿǿ·¸¾¾ԿżǷͻŷþ¿λ¸»ûÿÿξǿ̻ſ¾ô»Ƽɺɿ¾ƻƿ̿¾ɻ¾мɼǺؼ̼ɷɾÿɸŵÿ̾ſøźδ̷¸ûžƾױſ¾¾ɺʴɯɾǾ̴Ƽµ̷¼ƸÿƱ¼ƾÿɻƼ۴Ժ̼¿ɳƸͻ¿иźżû±ǵμ·¼¾¿¿ǾƼ¿ɻú¸͸ſô³Ʊǿûžûƻ¾¿»ɼʻԷŵ·ǼżüÿԿŻƿ±ƻɻǿŷξſ̿¾̸ͻҷøɼ»ʿ¿Ÿüٿſɼ¼Żͺ¿ż¸λƵƿʿŰƾ¾͸ƸɼžŴú׷żüʿҷ÷ŷǾͱɾ¿̷Ƹóż»ƺԸƿŵżƼηžʹоʿѼǴξøñǿ¿ѿɾ´¼żô¿ʺûƺƸп̺Ѱðűɿɴ¿͵õú»¸̺»ž¾Хƿǻ׾ʵ¾Ʊ̾¿ǼʿüǿDZ¼Żʷ¿þžûүǼɴ¿ƿο¾Ǫ¼µÿʾºƾǸ¼Կ¿ɺúɼͺɾѾǻþŪ´û¿ǾžøջóżǭƿʸǾͿþʿſ;ɿǾÿ¿ƺƼʿ¿̷ʻüؾ̱ƺɸ߿þ¬̿þ»Ǿíƻվ¾ʿÿ۾мͻɼ̺úſ÷°Ǽ¿þ»ŸͰµʺ¿пźº̾ʼ¿ǿ¿¬оʷʼ·ͼǿúεɿƾоÿż»þ̺ͿпøûƸžʾþʾտʸũտſðҸǼ¸žпƺÿüɺѿ;þƾλÿŸ·¾̿ƻþſξ»վ·¿ÿ⻻ſ¬ø¼̺̿ѿɼÿɻƾǾ»ⳳ¿ʻ¼κ¼þ̾з͸οſ´人ºðºƸ̸ûѴпºûżܿž㷷ǿ¼ʴ¾Ƽɺθ;ɾʷδξ̻Ǽʾ侾зƿɺγصѿаʸ̺¼̿໻͵žÿźſÿҷ̻ǿ¾þ似㿿̴̿¿ú̾ʾɷºɿƻøµ侾ʴɼüͿഴξǼ;ǿ°ɾƸ㾾ѿ̾ǻžѳ̺ɿ͸ǿƾƿǺǴſ÷Ǽ¼ߴοԺ¸ɿǿǿκ¾ʹÿûž糳Ǽü´ºŷ¾׿¾ź¾ɺؿ̱ \ No newline at end of file diff --git a/libraries/ode-0.9/include/Makefile.am b/libraries/ode-0.9/include/Makefile.am deleted file mode 100644 index 2f77d2edfa..0000000000 --- a/libraries/ode-0.9/include/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = ode \ No newline at end of file diff --git a/libraries/ode-0.9/include/Makefile.in b/libraries/ode-0.9/include/Makefile.in deleted file mode 100644 index a930324ce2..0000000000 --- a/libraries/ode-0.9/include/Makefile.in +++ /dev/null @@ -1,488 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = include -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = ode -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic ctags \ - ctags-recursive distclean distclean-generic distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-recursive uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/include/drawstuff/drawstuff.h b/libraries/ode-0.9/include/drawstuff/drawstuff.h deleted file mode 100644 index ffaae81ef2..0000000000 --- a/libraries/ode-0.9/include/drawstuff/drawstuff.h +++ /dev/null @@ -1,294 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/** @defgroup drawstuff DrawStuff - -DrawStuff is a library for rendering simple 3D objects in a virtual -environment, for the purposes of demonstrating the features of ODE. -It is provided for demonstration purposes and is not intended for -production use. - -@section Notes - -In the virtual world, the z axis is "up" and z=0 is the floor. - -The user is able to click+drag in the main window to move the camera: - * left button - pan and tilt. - * right button - forward and sideways. - * left + right button (or middle button) - sideways and up. -*/ - - -#ifndef __DRAWSTUFF_H__ -#define __DRAWSTUFF_H__ - -/* Define a DLL export symbol for those platforms that need it */ -#if defined(ODE_PLATFORM_WINDOWS) - #if defined(DS_DLL) - #define DS_API __declspec(dllexport) - #elif !defined(DS_LIB) - #define DS_DLL_API __declspec(dllimport) - #endif -#endif - -#if !defined(DS_API) - #define DS_API -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - -#include - - -/* texture numbers */ -#define DS_NONE 0 /* uses the current color instead of a texture */ -#define DS_WOOD 1 - - -/** - * @struct dsFunctions - * @brief Set of functions to be used as callbacks by the simulation loop. - * @ingroup drawstuff - */ -typedef struct dsFunctions { - int version; /* put DS_VERSION here */ - /* version 1 data */ - void (*start)(); /* called before sim loop starts */ - void (*step) (int pause); /* called before every frame */ - void (*command) (int cmd); /* called if a command key is pressed */ - void (*stop)(); /* called after sim loop exits */ - /* version 2 data */ - char *path_to_textures; /* if nonzero, path to texture files */ -} dsFunctions; - - -/** - * @brief Does the complete simulation. - * @ingroup drawstuff - * This function starts running the simulation, and only exits when the simulation is done. - * Function pointers should be provided for the callbacks. - * @param argv supports flags like '-notex' '-noshadow' '-pause' - * @param fn Callback functions. - */ -DS_API void dsSimulationLoop (int argc, char **argv, - int window_width, int window_height, - struct dsFunctions *fn); - -/** - * @brief exit with error message. - * @ingroup drawstuff - * This function displays an error message then exit. - * @param msg format strin, like printf, without the newline character. - */ -DS_API void dsError (char *msg, ...); - -/** - * @brief exit with error message and core dump. - * @ingroup drawstuff - * this functions tries to dump core or start the debugger. - * @param msg format strin, like printf, without the newline character. - */ -DS_API void dsDebug (char *msg, ...); - -/** - * @brief print log message - * @ingroup drawstuff - * @param msg format string, like printf, without the \n. - */ -DS_API void dsPrint (char *msg, ...); - -/** - * @brief Sets the viewpoint - * @ingroup drawstuff - * @param xyz camera position. - * @param hpr contains heading, pitch and roll numbers in degrees. heading=0 - * points along the x axis, pitch=0 is looking towards the horizon, and - * roll 0 is "unrotated". - */ -DS_API void dsSetViewpoint (float xyz[3], float hpr[3]); - - -/** - * @brief Gets the viewpoint - * @ingroup drawstuff - * @param xyz position - * @param hpr heading,pitch,roll. - */ -DS_API void dsGetViewpoint (float xyz[3], float hpr[3]); - -/** - * @brief Stop the simulation loop. - * @ingroup drawstuff - * Calling this from within dsSimulationLoop() - * will cause it to exit and return to the caller. it is the same as if the - * user used the exit command. using this outside the loop will have no - * effect. - */ -DS_API void dsStop(); - -/** - * @brief Get the elapsed time (on wall-clock) - * @ingroup drawstuff - * It returns the nr of seconds since the last call to this function. - */ -DS_API double dsElapsedTime(); - -/** - * @brief Toggle the rendering of textures. - * @ingroup drawstuff - * It changes the way objects are drawn. these changes will apply to all further - * dsDrawXXX() functions. - * @param the texture number must be a DS_xxx texture constant. - * The current texture is colored according to the current color. - * At the start of each frame, the texture is reset to none and the color is - * reset to white. - */ -DS_API void dsSetTexture (int texture_number); - -/** - * @brief Set the color with which geometry is drawn. - * @ingroup drawstuff - * @param red Red component from 0 to 1 - * @param green Green component from 0 to 1 - * @param blue Blue component from 0 to 1 - */ -DS_API void dsSetColor (float red, float green, float blue); - -/** - * @brief Set the color and transparency with which geometry is drawn. - * @ingroup drawstuff - * @param alpha Note that alpha transparency is a misnomer: it is alpha opacity. - * 1.0 means fully opaque, and 0.0 means fully transparent. - */ -DS_API void dsSetColorAlpha (float red, float green, float blue, float alpha); - -/** - * @brief Draw a box. - * @ingroup drawstuff - * @param pos is the x,y,z of the center of the object. - * @param R is a 3x3 rotation matrix for the object, stored by row like this: - * [ R11 R12 R13 0 ] - * [ R21 R22 R23 0 ] - * [ R31 R32 R33 0 ] - * @param sides[] is an array of x,y,z side lengths. - */ -DS_API void dsDrawBox (const float pos[3], const float R[12], const float sides[3]); - -/** - * @brief Draw a sphere. - * @ingroup drawstuff - * @param pos Position of center. - * @param R orientation. - * @param radius - */ -DS_API void dsDrawSphere (const float pos[3], const float R[12], float radius); - -/** - * @brief Draw a triangle. - * @ingroup drawstuff - * @param pos Position of center - * @param R orientation - * @param v0 first vertex - * @param v1 second - * @param v2 third vertex - * @param solid set to 0 for wireframe - */ -DS_API void dsDrawTriangle (const float pos[3], const float R[12], - const float *v0, const float *v1, const float *v2, int solid); - -/** - * @brief Draw a z-aligned cylinder - * @ingroup drawstuff - */ -DS_API void dsDrawCylinder (const float pos[3], const float R[12], - float length, float radius); - -/** - * @brief Draw a z-aligned capsule - * @ingroup drawstuff - */ -DS_API void dsDrawCapsule (const float pos[3], const float R[12], - float length, float radius); - -/** - * @brief Draw a line. - * @ingroup drawstuff - */ -DS_API void dsDrawLine (const float pos1[3], const float pos2[3]); - -/** - * @brief Draw a convex shape. - * @ingroup drawstuff - */ -DS_API void dsDrawConvex(const float pos[3], const float R[12], - float *_planes, - unsigned int _planecount, - float *_points, - unsigned int _pointcount, - unsigned int *_polygons); - - /* these drawing functions are identical to the ones above, except they take - * double arrays for `pos' and `R'. - */ -DS_API void dsDrawBoxD (const double pos[3], const double R[12], - const double sides[3]); -DS_API void dsDrawSphereD (const double pos[3], const double R[12], - const float radius); -DS_API void dsDrawTriangleD (const double pos[3], const double R[12], - const double *v0, const double *v1, const double *v2, int solid); -DS_API void dsDrawCylinderD (const double pos[3], const double R[12], - float length, float radius); -DS_API void dsDrawCapsuleD (const double pos[3], const double R[12], - float length, float radius); -DS_API void dsDrawLineD (const double pos1[3], const double pos2[3]); -DS_API void dsDrawConvexD(const double pos[3], const double R[12], - double *_planes, - unsigned int _planecount, - double *_points, - unsigned int _pointcount, - unsigned int *_polygons); - -/** - * @brief Set the quality with which curved objects are rendered. - * @ingroup drawstuff - * Higher numbers are higher quality, but slower to draw. - * This must be set before the first objects are drawn to be effective. - * Default sphere quality is 1, default capsule quality is 3. - */ -DS_API void dsSetSphereQuality (int n); /* default = 1 */ -DS_API void dsSetCapsuleQuality (int n); /* default = 3 */ - -// Backwards compatible API -#define dsDrawCappedCylinder dsDrawCapsule -#define dsDrawCappedCylinderD dsDrawCapsuleD -#define dsSetCappedCylinderQuality dsSetCapsuleQuality - -/* closing bracket for extern "C" */ -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/libraries/ode-0.9/include/drawstuff/version.h b/libraries/ode-0.9/include/drawstuff/version.h deleted file mode 100644 index 71d95f461d..0000000000 --- a/libraries/ode-0.9/include/drawstuff/version.h +++ /dev/null @@ -1,29 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef __VERSION_H -#define __VERSION_H - -/* high byte is major version, low byte is minor version */ -#define DS_VERSION 0x0002 - -#endif diff --git a/libraries/ode-0.9/include/ode/Makefile.am b/libraries/ode-0.9/include/ode/Makefile.am deleted file mode 100644 index 1cc6caac6f..0000000000 --- a/libraries/ode-0.9/include/ode/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -libglitch_includedir = $(includedir)/ode -libglitch_include_HEADERS = collision_trimesh.h \ - mass.h \ - odecpp.h \ - common.h \ - matrix.h \ - odecpp_collision.h \ - compatibility.h \ - memory.h \ - contact.h \ - misc.h \ - odemath.h \ - collision.h \ - error.h \ - objects.h \ - rotation.h \ - collision_space.h \ - export-dif.h \ - ode.h \ - timer.h \ - config.h - -EXTRA_DIST = config.h.in diff --git a/libraries/ode-0.9/include/ode/Makefile.in b/libraries/ode-0.9/include/ode/Makefile.in deleted file mode 100644 index 8458adbeea..0000000000 --- a/libraries/ode-0.9/include/ode/Makefile.in +++ /dev/null @@ -1,448 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = include/ode -DIST_COMMON = README $(libglitch_include_HEADERS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/config.h.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(libglitch_includedir)" -libglitch_includeHEADERS_INSTALL = $(INSTALL_HEADER) -HEADERS = $(libglitch_include_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -libglitch_includedir = $(includedir)/ode -libglitch_include_HEADERS = collision_trimesh.h \ - mass.h \ - odecpp.h \ - common.h \ - matrix.h \ - odecpp_collision.h \ - compatibility.h \ - memory.h \ - contact.h \ - misc.h \ - odemath.h \ - collision.h \ - error.h \ - objects.h \ - rotation.h \ - collision_space.h \ - export-dif.h \ - ode.h \ - timer.h \ - config.h - -EXTRA_DIST = config.h.in -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/ode/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/ode/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status include/ode/config.h -$(srcdir)/config.h.in: $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 -install-libglitch_includeHEADERS: $(libglitch_include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(libglitch_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libglitch_includedir)" - @list='$(libglitch_include_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(libglitch_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(libglitch_includedir)/$$f'"; \ - $(libglitch_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(libglitch_includedir)/$$f"; \ - done - -uninstall-libglitch_includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(libglitch_include_HEADERS)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(libglitch_includedir)/$$f'"; \ - rm -f "$(DESTDIR)$(libglitch_includedir)/$$f"; \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) config.h -installdirs: - for dir in "$(DESTDIR)$(libglitch_includedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-hdr distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-libglitch_includeHEADERS - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-libglitch_includeHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - ctags distclean distclean-generic distclean-hdr distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am \ - install-libglitch_includeHEADERS install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-libglitch_includeHEADERS - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/include/ode/README b/libraries/ode-0.9/include/ode/README deleted file mode 100644 index 9d7e99a8f8..0000000000 --- a/libraries/ode-0.9/include/ode/README +++ /dev/null @@ -1,18 +0,0 @@ - -this is the public C interface to the ODE library. - -all these files should be includable from C, i.e. they should not use any -C++ features. everything should be protected with - - #ifdef __cplusplus - extern "C" { - #endif - - ... - - #ifdef __cplusplus - } - #endif - -the only exceptions are the odecpp.h and odecpp_collisioh.h files, which define a C++ wrapper for -the C interface. remember to keep this in sync! diff --git a/libraries/ode-0.9/include/ode/collision.h b/libraries/ode-0.9/include/ode/collision.h deleted file mode 100644 index c40bc4a149..0000000000 --- a/libraries/ode-0.9/include/ode/collision.h +++ /dev/null @@ -1,1386 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COLLISION_H_ -#define _ODE_COLLISION_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup collide Collision Detection - * - * ODE has two main components: a dynamics simulation engine and a collision - * detection engine. The collision engine is given information about the - * shape of each body. At each time step it figures out which bodies touch - * each other and passes the resulting contact point information to the user. - * The user in turn creates contact joints between bodies. - * - * Using ODE's collision detection is optional - an alternative collision - * detection system can be used as long as it can supply the right kinds of - * contact information. - */ - - -/* ************************************************************************ */ -/* general functions */ - -/** - * @brief Destroy a geom, removing it from any space. - * - * Destroy a geom, removing it from any space it is in first. This one - * function destroys a geom of any type, but to create a geom you must call - * a creation function for that type. - * - * When a space is destroyed, if its cleanup mode is 1 (the default) then all - * the geoms in that space are automatically destroyed as well. - * - * @param geom the geom to be destroyed. - * @ingroup collide - */ -ODE_API void dGeomDestroy (dGeomID geom); - - -/** - * @brief Set the user-defined data pointer stored in the geom. - * - * @param geom the geom to hold the data - * @param data the data pointer to be stored - * @ingroup collide - */ -ODE_API void dGeomSetData (dGeomID geom, void* data); - - -/** - * @brief Get the user-defined data pointer stored in the geom. - * - * @param geom the geom containing the data - * @ingroup collide - */ -ODE_API void *dGeomGetData (dGeomID geom); - - -/** - * @brief Set the body associated with a placeable geom. - * - * Setting a body on a geom automatically combines the position vector and - * rotation matrix of the body and geom, so that setting the position or - * orientation of one will set the value for both objects. Setting a body - * ID of zero gives the geom its own position and rotation, independent - * from any body. If the geom was previously connected to a body then its - * new independent position/rotation is set to the current position/rotation - * of the body. - * - * Calling these functions on a non-placeable geom results in a runtime - * error in the debug build of ODE. - * - * @param geom the geom to connect - * @param body the body to attach to the geom - * @ingroup collide - */ -ODE_API void dGeomSetBody (dGeomID geom, dBodyID body); - - -/** - * @brief Get the body associated with a placeable geom. - * @param geom the geom to query. - * @sa dGeomSetBody - * @ingroup collide - */ -ODE_API dBodyID dGeomGetBody (dGeomID geom); - - -/** - * @brief Set the position vector of a placeable geom. - * - * If the geom is attached to a body, the body's position will also be changed. - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @sa dBodySetPosition - * @ingroup collide - */ -ODE_API void dGeomSetPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will also be changed. - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @sa dBodySetRotation - * @ingroup collide - */ -ODE_API void dGeomSetRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the rotation of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will also be changed. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @sa dBodySetQuaternion - * @ingroup collide - */ -ODE_API void dGeomSetQuaternion (dGeomID geom, const dQuaternion Q); - - -/** - * @brief Get the position vector of a placeable geom. - * - * If the geom is attached to a body, the body's position will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @returns A pointer to the geom's position vector. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @sa dBodyGetPosition - * @ingroup collide - */ -ODE_API const dReal * dGeomGetPosition (dGeomID geom); - - -/** - * @brief Copy the position of a geom into a vector. - * @ingroup collide - * @param geom the geom to query - * @param pos a copy of the geom position - * @sa dGeomGetPosition - */ -ODE_API void dGeomCopyPosition (dGeomID geom, dVector3 pos); - - -/** - * @brief Get the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @returns A pointer to the geom's rotation matrix. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @sa dBodyGetRotation - * @ingroup collide - */ -ODE_API const dReal * dGeomGetRotation (dGeomID geom); - - -/** - * @brief Get the rotation matrix of a placeable geom. - * - * If the geom is attached to a body, the body's rotation will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @param R a copy of the geom rotation - * @sa dGeomGetRotation - * @ingroup collide - */ -ODE_API void dGeomCopyRotation(dGeomID geom, dMatrix3 R); - - -/** - * @brief Get the rotation quaternion of a placeable geom. - * - * If the geom is attached to a body, the body's quaternion will be returned. - * - * Calling this function on a non-placeable geom results in a runtime error in - * the debug build of ODE. - * - * @param geom the geom to query. - * @param result a copy of the rotation quaternion. - * @sa dBodyGetQuaternion - * @ingroup collide - */ -ODE_API void dGeomGetQuaternion (dGeomID geom, dQuaternion result); - - -/** - * @brief Return the axis-aligned bounding box. - * - * Return in aabb an axis aligned bounding box that surrounds the given geom. - * The aabb array has elements (minx, maxx, miny, maxy, minz, maxz). If the - * geom is a space, a bounding box that surrounds all contained geoms is - * returned. - * - * This function may return a pre-computed cached bounding box, if it can - * determine that the geom has not moved since the last time the bounding - * box was computed. - * - * @param geom the geom to query - * @param aabb the returned bounding box - * @ingroup collide - */ -ODE_API void dGeomGetAABB (dGeomID geom, dReal aabb[6]); - - -/** - * @brief Determing if a geom is a space. - * @param geom the geom to query - * @returns Non-zero if the geom is a space, zero otherwise. - * @ingroup collide - */ -ODE_API int dGeomIsSpace (dGeomID geom); - - -/** - * @brief Query for the space containing a particular geom. - * @param geom the geom to query - * @returns The space that contains the geom, or NULL if the geom is - * not contained by a space. - * @ingroup collide - */ -ODE_API dSpaceID dGeomGetSpace (dGeomID); - - -/** - * @brief Given a geom, this returns its class. - * - * The ODE classes are: - * @li dSphereClass - * @li dBoxClass - * @li dCylinderClass - * @li dPlaneClass - * @li dRayClass - * @li dConvexClass - * @li dGeomTransformClass - * @li dTriMeshClass - * @li dSimpleSpaceClass - * @li dHashSpaceClass - * @li dQuadTreeSpaceClass - * @li dFirstUserClass - * @li dLastUserClass - * - * User-defined class will return their own number. - * - * @param geom the geom to query - * @returns The geom class ID. - * @ingroup collide - */ -ODE_API int dGeomGetClass (dGeomID geom); - - -/** - * @brief Set the "category" bitfield for the given geom. - * - * The category bitfield is used by spaces to govern which geoms will - * interact with each other. The bitfield is guaranteed to be at least - * 32 bits wide. The default category values for newly created geoms - * have all bits set. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @ingroup collide - */ -ODE_API void dGeomSetCategoryBits (dGeomID geom, unsigned long bits); - - -/** - * @brief Set the "collide" bitfield for the given geom. - * - * The collide bitfield is used by spaces to govern which geoms will - * interact with each other. The bitfield is guaranteed to be at least - * 32 bits wide. The default category values for newly created geoms - * have all bits set. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @ingroup collide - */ -ODE_API void dGeomSetCollideBits (dGeomID geom, unsigned long bits); - - -/** - * @brief Get the "category" bitfield for the given geom. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @sa dGeomSetCategoryBits - * @ingroup collide - */ -ODE_API unsigned long dGeomGetCategoryBits (dGeomID); - - -/** - * @brief Get the "collide" bitfield for the given geom. - * - * @param geom the geom to set - * @param bits the new bitfield value - * @sa dGeomSetCollideBits - * @ingroup collide - */ -ODE_API unsigned long dGeomGetCollideBits (dGeomID); - - -/** - * @brief Enable a geom. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to enable - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API void dGeomEnable (dGeomID geom); - - -/** - * @brief Disable a geom. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to disable - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API void dGeomDisable (dGeomID geom); - - -/** - * @brief Check to see if a geom is enabled. - * - * Disabled geoms are completely ignored by dSpaceCollide and dSpaceCollide2, - * although they can still be members of a space. New geoms are created in - * the enabled state. - * - * @param geom the geom to query - * @returns Non-zero if the geom is enabled, zero otherwise. - * @sa dGeomDisable - * @sa dGeomIsEnabled - * @ingroup collide - */ -ODE_API int dGeomIsEnabled (dGeomID geom); - -/* ************************************************************************ */ -/* geom offset from body */ - -/** - * @brief Set the local offset position of a geom from its body. - * - * Sets the geom's positional offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the local offset rotation matrix of a geom from its body. - * - * Sets the geom's rotational offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the local offset rotation of a geom from its body. - * - * Sets the geom's rotational offset in local coordinates. - * After this call, the geom will be at a new position determined from the - * body's position and the offset. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetQuaternion (dGeomID geom, const dQuaternion Q); - - -/** - * @brief Set the offset position of a geom from its body. - * - * Sets the geom's positional offset to move it to the new world - * coordinates. - * After this call, the geom will be at the world position passed in, - * and the offset will be the difference from the current body position. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param x the new X coordinate. - * @param y the new Y coordinate. - * @param z the new Z coordinate. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldPosition (dGeomID geom, dReal x, dReal y, dReal z); - - -/** - * @brief Set the offset rotation of a geom from its body. - * - * Sets the geom's rotational offset to orient it to the new world - * rotation matrix. - * After this call, the geom will be at the world orientation passed in, - * and the offset will be the difference from the current body orientation. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param R the new rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldRotation (dGeomID geom, const dMatrix3 R); - - -/** - * @brief Set the offset rotation of a geom from its body. - * - * Sets the geom's rotational offset to orient it to the new world - * rotation matrix. - * After this call, the geom will be at the world orientation passed in, - * and the offset will be the difference from the current body orientation. - * The geom must be attached to a body. - * If the geom did not have an offset, it is automatically created. - * - * @param geom the geom to set. - * @param Q the new rotation. - * @ingroup collide - */ -ODE_API void dGeomSetOffsetWorldQuaternion (dGeomID geom, const dQuaternion); - - -/** - * @brief Clear any offset from the geom. - * - * If the geom has an offset, it is eliminated and the geom is - * repositioned at the body's position. If the geom has no offset, - * this function does nothing. - * This is more efficient than calling dGeomSetOffsetPosition(zero) - * and dGeomSetOffsetRotation(identiy), because this function actually - * eliminates the offset, rather than leaving it as the identity transform. - * - * @param geom the geom to have its offset destroyed. - * @ingroup collide - */ -ODE_API void dGeomClearOffset(dGeomID geom); - - -/** - * @brief Check to see whether the geom has an offset. - * - * This function will return non-zero if the offset has been created. - * Note that there is a difference between a geom with no offset, - * and a geom with an offset that is the identity transform. - * In the latter case, although the observed behaviour is identical, - * there is a unnecessary computation involved because the geom will - * be applying the transform whenever it needs to recalculate its world - * position. - * - * @param geom the geom to query. - * @returns Non-zero if the geom has an offset, zero otherwise. - * @ingroup collide - */ -ODE_API int dGeomIsOffset(dGeomID geom); - - -/** - * @brief Get the offset position vector of a geom. - * - * Returns the positional offset of the geom in local coordinates. - * If the geom has no offset, this function returns the zero vector. - * - * @param geom the geom to query. - * @returns A pointer to the geom's offset vector. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @ingroup collide - */ -ODE_API const dReal * dGeomGetOffsetPosition (dGeomID geom); - - -/** - * @brief Copy the offset position vector of a geom. - * - * Returns the positional offset of the geom in local coordinates. - * If the geom has no offset, this function returns the zero vector. - * - * @param geom the geom to query. - * @param pos returns the offset position - * @ingroup collide - */ -ODE_API void dGeomCopyOffsetPosition (dGeomID geom, dVector3 pos); - - -/** - * @brief Get the offset rotation matrix of a geom. - * - * Returns the rotational offset of the geom in local coordinates. - * If the geom has no offset, this function returns the identity - * matrix. - * - * @param geom the geom to query. - * @returns A pointer to the geom's offset rotation matrix. - * @remarks The returned value is a pointer to the geom's internal - * data structure. It is valid until any changes are made - * to the geom. - * @ingroup collide - */ -ODE_API const dReal * dGeomGetOffsetRotation (dGeomID geom); - - -/** - * @brief Copy the offset rotation matrix of a geom. - * - * Returns the rotational offset of the geom in local coordinates. - * If the geom has no offset, this function returns the identity - * matrix. - * - * @param geom the geom to query. - * @param R returns the rotation matrix. - * @ingroup collide - */ -ODE_API void dGeomCopyOffsetRotation (dGeomID geom, dMatrix3 R); - - -/** - * @brief Get the offset rotation quaternion of a geom. - * - * Returns the rotation offset of the geom as a quaternion. - * If the geom has no offset, the identity quaternion is returned. - * - * @param geom the geom to query. - * @param result a copy of the rotation quaternion. - * @ingroup collide - */ -ODE_API void dGeomGetOffsetQuaternion (dGeomID geom, dQuaternion result); - - -/* ************************************************************************ */ -/* collision detection */ - -/* - * Just generate any contacts (disables any contact refining). - */ -#define CONTACTS_UNIMPORTANT 0x80000000 - -/** - * - * @brief Given two geoms o1 and o2 that potentially intersect, - * generate contact information for them. - * - * Internally, this just calls the correct class-specific collision - * functions for o1 and o2. - * - * @param o1 The first geom to test. - * @param o2 The second geom to test. - * - * @param flags The flags specify how contacts should be generated if - * the geoms touch. The lower 16 bits of flags is an integer that - * specifies the maximum number of contact points to generate. You must - * ask for at least one contact. - * Additionally, following bits may be set: - * CONTACTS_UNIMPORTANT -- just generate any contacts (skip contact refining). - * All other bits in flags must be set to zero. In the future the other bits - * may be used to select from different contact generation strategies. - * - * @param contact Points to an array of dContactGeom structures. The array - * must be able to hold at least the maximum number of contacts. These - * dContactGeom structures may be embedded within larger structures in the - * array -- the skip parameter is the byte offset from one dContactGeom to - * the next in the array. If skip is sizeof(dContactGeom) then contact - * points to a normal (C-style) array. It is an error for skip to be smaller - * than sizeof(dContactGeom). - * - * @returns If the geoms intersect, this function returns the number of contact - * points generated (and updates the contact array), otherwise it returns 0 - * (and the contact array is not touched). - * - * @remarks If a space is passed as o1 or o2 then this function will collide - * all objects contained in o1 with all objects contained in o2, and return - * the resulting contact points. This method for colliding spaces with geoms - * (or spaces with spaces) provides no user control over the individual - * collisions. To get that control, use dSpaceCollide or dSpaceCollide2 instead. - * - * @remarks If o1 and o2 are the same geom then this function will do nothing - * and return 0. Technically speaking an object intersects with itself, but it - * is not useful to find contact points in this case. - * - * @remarks This function does not care if o1 and o2 are in the same space or not - * (or indeed if they are in any space at all). - * - * @ingroup collide - */ -ODE_API int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, - int skip); - -/** - * @brief Determines which pairs of geoms in a space may potentially intersect, - * and calls the callback function for each candidate pair. - * - * @param space The space to test. - * - * @param data Passed from dSpaceCollide directly to the callback - * function. Its meaning is user defined. The o1 and o2 arguments are the - * geoms that may be near each other. - * - * @param callback A callback function is of type @ref dNearCallback. - * - * @remarks Other spaces that are contained within the colliding space are - * not treated specially, i.e. they are not recursed into. The callback - * function may be passed these contained spaces as one or both geom - * arguments. - * - * @remarks dSpaceCollide() is guaranteed to pass all intersecting geom - * pairs to the callback function, but may also pass close but - * non-intersecting pairs. The number of these calls depends on the - * internal algorithms used by the space. Thus you should not expect - * that dCollide will return contacts for every pair passed to the - * callback. - * - * @sa dSpaceCollide2 - * @ingroup collide - */ -ODE_API void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback); - - -/** - * @brief Determines which geoms from one space may potentially intersect with - * geoms from another space, and calls the callback function for each candidate - * pair. - * - * @param space1 The first space to test. - * - * @param space2 The second space to test. - * - * @param data Passed from dSpaceCollide directly to the callback - * function. Its meaning is user defined. The o1 and o2 arguments are the - * geoms that may be near each other. - * - * @param callback A callback function is of type @ref dNearCallback. - * - * @remarks This function can also test a single non-space geom against a - * space. This function is useful when there is a collision hierarchy, i.e. - * when there are spaces that contain other spaces. - * - * @remarks Other spaces that are contained within the colliding space are - * not treated specially, i.e. they are not recursed into. The callback - * function may be passed these contained spaces as one or both geom - * arguments. - * - * @remarks dSpaceCollide2() is guaranteed to pass all intersecting geom - * pairs to the callback function, but may also pass close but - * non-intersecting pairs. The number of these calls depends on the - * internal algorithms used by the space. Thus you should not expect - * that dCollide will return contacts for every pair passed to the - * callback. - * - * @sa dSpaceCollide - * @ingroup collide - */ -ODE_API void dSpaceCollide2 (dGeomID space1, dGeomID space2, void *data, dNearCallback *callback); - - -/* ************************************************************************ */ -/* standard classes */ - -/* the maximum number of user classes that are supported */ -enum { - dMaxUserClasses = 4 -}; - -/* class numbers - each geometry object needs a unique number */ -enum { - dSphereClass = 0, - dBoxClass, - dCapsuleClass, - dCylinderClass, - dPlaneClass, - dRayClass, - dConvexClass, - dGeomTransformClass, - dTriMeshClass, - dHeightfieldClass, - - dFirstSpaceClass, - dSimpleSpaceClass = dFirstSpaceClass, - dHashSpaceClass, - dQuadTreeSpaceClass, - dLastSpaceClass = dQuadTreeSpaceClass, - - dFirstUserClass, - dLastUserClass = dFirstUserClass + dMaxUserClasses - 1, - dGeomNumClasses -}; - - -/** - * @defgroup collide_sphere Sphere Class - * @ingroup collide - */ - -/** - * @brief Create a sphere geom of the given radius, and return its ID. - * - * @param space a space to contain the new geom. May be null. - * @param radius the radius of the sphere. - * - * @returns A new sphere geom. - * - * @remarks The point of reference for a sphere is its center. - * - * @sa dGeomDestroy - * @sa dGeomSphereSetRadius - * @ingroup collide_sphere - */ -ODE_API dGeomID dCreateSphere (dSpaceID space, dReal radius); - - -/** - * @brief Set the radius of a sphere geom. - * - * @param sphere the sphere to set. - * @param radius the new radius. - * - * @sa dGeomSphereGetRadius - * @ingroup collide_sphere - */ -ODE_API void dGeomSphereSetRadius (dGeomID sphere, dReal radius); - - -/** - * @brief Retrieves the radius of a sphere geom. - * - * @param sphere the sphere to query. - * - * @sa dGeomSphereSetRadius - * @ingroup collide_sphere - */ -ODE_API dReal dGeomSphereGetRadius (dGeomID sphere); - - -/** - * @brief Calculate the depth of the a given point within a sphere. - * - * @param sphere the sphere to query. - * @param x the X coordinate of the point. - * @param y the Y coordinate of the point. - * @param z the Z coordinate of the point. - * - * @returns The depth of the point. Points inside the sphere will have a - * positive depth, points outside it will have a negative depth, and points - * on the surface will have a depth of zero. - * - * @ingroup collide_sphere - */ -ODE_API dReal dGeomSpherePointDepth (dGeomID sphere, dReal x, dReal y, dReal z); - - -//--> Convex Functions -ODE_API dGeomID dCreateConvex (dSpaceID space, - dReal *_planes, - unsigned int _planecount, - dReal *_points, - unsigned int _pointcount,unsigned int *_polygons); - -ODE_API void dGeomSetConvex (dGeomID g, - dReal *_planes, - unsigned int _count, - dReal *_points, - unsigned int _pointcount,unsigned int *_polygons); -//<-- Convex Functions - -/** - * @defgroup collide_box Box Class - * @ingroup collide - */ - -/** - * @brief Create a box geom with the provided side lengths. - * - * @param space a space to contain the new geom. May be null. - * @param lx the length of the box along the X axis - * @param ly the length of the box along the Y axis - * @param lz the length of the box along the Z axis - * - * @returns A new box geom. - * - * @remarks The point of reference for a box is its center. - * - * @sa dGeomDestroy - * @sa dGeomBoxSetLengths - * @ingroup collide_box - */ -ODE_API dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz); - - -/** - * @brief Set the side lengths of the given box. - * - * @param box the box to set - * @param lx the length of the box along the X axis - * @param ly the length of the box along the Y axis - * @param lz the length of the box along the Z axis - * - * @sa dGeomBoxGetLengths - * @ingroup collide_box - */ -ODE_API void dGeomBoxSetLengths (dGeomID box, dReal lx, dReal ly, dReal lz); - - -/** - * @brief Get the side lengths of a box. - * - * @param box the box to query - * @param result the returned side lengths - * - * @sa dGeomBoxSetLengths - * @ingroup collide_box - */ -ODE_API void dGeomBoxGetLengths (dGeomID box, dVector3 result); - - -/** - * @brief Return the depth of a point in a box. - * - * @param box the box to query - * @param x the X coordinate of the point to test. - * @param y the Y coordinate of the point to test. - * @param z the Z coordinate of the point to test. - * - * @returns The depth of the point. Points inside the box will have a - * positive depth, points outside it will have a negative depth, and points - * on the surface will have a depth of zero. - */ -ODE_API dReal dGeomBoxPointDepth (dGeomID box, dReal x, dReal y, dReal z); - - -ODE_API dGeomID dCreatePlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d); -ODE_API void dGeomPlaneSetParams (dGeomID plane, dReal a, dReal b, dReal c, dReal d); -ODE_API void dGeomPlaneGetParams (dGeomID plane, dVector4 result); -ODE_API dReal dGeomPlanePointDepth (dGeomID plane, dReal x, dReal y, dReal z); - -ODE_API dGeomID dCreateCapsule (dSpaceID space, dReal radius, dReal length); -ODE_API void dGeomCapsuleSetParams (dGeomID ccylinder, dReal radius, dReal length); -ODE_API void dGeomCapsuleGetParams (dGeomID ccylinder, dReal *radius, dReal *length); -ODE_API dReal dGeomCapsulePointDepth (dGeomID ccylinder, dReal x, dReal y, dReal z); - -// For now we want to have a backwards compatible C-API, note: C++ API is not. -#define dCreateCCylinder dCreateCapsule -#define dGeomCCylinderSetParams dGeomCapsuleSetParams -#define dGeomCCylinderGetParams dGeomCapsuleGetParams -#define dGeomCCylinderPointDepth dGeomCapsulePointDepth -#define dCCylinderClass dCapsuleClass - -ODE_API dGeomID dCreateCylinder (dSpaceID space, dReal radius, dReal length); -ODE_API void dGeomCylinderSetParams (dGeomID cylinder, dReal radius, dReal length); -ODE_API void dGeomCylinderGetParams (dGeomID cylinder, dReal *radius, dReal *length); - -ODE_API dGeomID dCreateRay (dSpaceID space, dReal length); -ODE_API void dGeomRaySetLength (dGeomID ray, dReal length); -ODE_API dReal dGeomRayGetLength (dGeomID ray); -ODE_API void dGeomRaySet (dGeomID ray, dReal px, dReal py, dReal pz, - dReal dx, dReal dy, dReal dz); -ODE_API void dGeomRayGet (dGeomID ray, dVector3 start, dVector3 dir); - -/* - * Set/get ray flags that influence ray collision detection. - * These flags are currently only noticed by the trimesh collider, because - * they can make a major differences there. - */ -ODE_API void dGeomRaySetParams (dGeomID g, int FirstContact, int BackfaceCull); -ODE_API void dGeomRayGetParams (dGeomID g, int *FirstContact, int *BackfaceCull); -ODE_API void dGeomRaySetClosestHit (dGeomID g, int closestHit); -ODE_API int dGeomRayGetClosestHit (dGeomID g); - -#include "collision_trimesh.h" - -ODE_API dGeomID dCreateGeomTransform (dSpaceID space); -ODE_API void dGeomTransformSetGeom (dGeomID g, dGeomID obj); -ODE_API dGeomID dGeomTransformGetGeom (dGeomID g); -ODE_API void dGeomTransformSetCleanup (dGeomID g, int mode); -ODE_API int dGeomTransformGetCleanup (dGeomID g); -ODE_API void dGeomTransformSetInfo (dGeomID g, int mode); -ODE_API int dGeomTransformGetInfo (dGeomID g); - - -/* ************************************************************************ */ -/* heightfield functions */ - - -// Data storage for heightfield data. -struct dxHeightfieldData; -typedef struct dxHeightfieldData* dHeightfieldDataID; - - -/** - * @brief Callback prototype - * - * Used by the callback heightfield data type to sample a height for a - * given cell position. - * - * @param p_user_data User data specified when creating the dHeightfieldDataID - * @param x The index of a sample in the local x axis. It is a value - * in the range zero to ( nWidthSamples - 1 ). - * @param x The index of a sample in the local z axis. It is a value - * in the range zero to ( nDepthSamples - 1 ). - * - * @return The sample height which is then scaled and offset using the - * values specified when the heightfield data was created. - * - * @ingroup collide - */ -typedef dReal dHeightfieldGetHeight( void* p_user_data, int x, int z ); - - - -/** - * @brief Creates a heightfield geom. - * - * Uses the information in the given dHeightfieldDataID to construct - * a geom representing a heightfield in a collision space. - * - * @param space The space to add the geom to. - * @param data The dHeightfieldDataID created by dGeomHeightfieldDataCreate and - * setup by dGeomHeightfieldDataBuildCallback, dGeomHeightfieldDataBuildByte, - * dGeomHeightfieldDataBuildShort or dGeomHeightfieldDataBuildFloat. - * @param bPlaceable If non-zero this geom can be transformed in the world using the - * usual functions such as dGeomSetPosition and dGeomSetRotation. If the geom is - * not set as placeable, then it uses a fixed orientation where the global y axis - * represents the dynamic 'height' of the heightfield. - * - * @return A geom id to reference this geom in other calls. - * - * @ingroup collide - */ -ODE_API dGeomID dCreateHeightfield( dSpaceID space, - dHeightfieldDataID data, int bPlaceable ); - - -/** - * @brief Creates a new empty dHeightfieldDataID. - * - * Allocates a new dHeightfieldDataID and returns it. You must call - * dGeomHeightfieldDataDestroy to destroy it after the geom has been removed. - * The dHeightfieldDataID value is used when specifying a data format type. - * - * @return A dHeightfieldDataID for use with dGeomHeightfieldDataBuildCallback, - * dGeomHeightfieldDataBuildByte, dGeomHeightfieldDataBuildShort or - * dGeomHeightfieldDataBuildFloat. - * @ingroup collide - */ -ODE_API dHeightfieldDataID dGeomHeightfieldDataCreate(); - - -/** - * @brief Destroys a dHeightfieldDataID. - * - * Deallocates a given dHeightfieldDataID and all managed resources. - * - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataDestroy( dHeightfieldDataID d ); - - - -/** - * @brief Configures a dHeightfieldDataID to use a callback to - * retrieve height data. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is computed by - * the user and it should use the given callback when determining - * the height of a given element of it's shape. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildCallback( dHeightfieldDataID d, - void* pUserData, dHeightfieldGetHeight* pCallback, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in byte format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of bytes (8 bit unsigned) representing the height at each sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildByte( dHeightfieldDataID d, - const unsigned char* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in short format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of shorts (16 bit signed) representing the height at each sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildShort( dHeightfieldDataID d, - const short* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in - * single precision floating point format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of single precision floats representing the height at each - * sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildSingle( dHeightfieldDataID d, - const float* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Configures a dHeightfieldDataID to use height data in - * double precision floating point format. - * - * Before a dHeightfieldDataID can be used by a geom it must be - * configured to specify the format of the height data. - * This call specifies that the heightfield data is stored as a rectangular - * array of double precision floats representing the height at each - * sample point. - * - * @param d A new dHeightfieldDataID created by dGeomHeightfieldDataCreate - * - * @param pHeightData A pointer to the height data. - * @param bCopyHeightData When non-zero the height data is copied to an - * internal store. When zero the height data is accessed by reference and - * so must persist throughout the lifetime of the heightfield. - * - * @param width Specifies the total 'width' of the heightfield along - * the geom's local x axis. - * @param depth Specifies the total 'depth' of the heightfield along - * the geom's local z axis. - * - * @param widthSamples Specifies the number of vertices to sample - * along the width of the heightfield. Each vertex has a corresponding - * height value which forms the overall shape. - * Naturally this value must be at least two or more. - * @param depthSamples Specifies the number of vertices to sample - * along the depth of the heightfield. - * - * @param scale A uniform scale applied to all raw height data. - * @param offset An offset applied to the scaled height data. - * - * @param thickness A value subtracted from the lowest height - * value which in effect adds an additional cuboid to the base of the - * heightfield. This is used to prevent geoms from looping under the - * desired terrain and not registering as a collision. Note that the - * thickness is not affected by the scale or offset parameters. - * - * @param bWrap If non-zero the heightfield will infinitely tile in both - * directions along the local x and z axes. If zero the heightfield is - * bounded from zero to width in the local x axis, and zero to depth in - * the local z axis. - * - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataBuildDouble( dHeightfieldDataID d, - const double* pHeightData, int bCopyHeightData, - dReal width, dReal depth, int widthSamples, int depthSamples, - dReal scale, dReal offset, dReal thickness, int bWrap ); - -/** - * @brief Manually set the minimum and maximum height bounds. - * - * This call allows you to set explicit min / max values after initial - * creation typically for callback heightfields which default to +/- infinity, - * or those whose data has changed. This must be set prior to binding with a - * geom, as the the AABB is not recomputed after it's first generation. - * - * @remarks The minimum and maximum values are used to compute the AABB - * for the heightfield which is used for early rejection of collisions. - * A close fit will yield a more efficient collision check. - * - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @param min_height The new minimum height value. Scale, offset and thickness is then applied. - * @param max_height The new maximum height value. Scale and offset is then applied. - * @ingroup collide - */ -ODE_API void dGeomHeightfieldDataSetBounds( dHeightfieldDataID d, - dReal minHeight, dReal maxHeight ); - - -/** - * @brief Assigns a dHeightfieldDataID to a heightfield geom. - * - * Associates the given dHeightfieldDataID with a heightfield geom. - * This is done without affecting the GEOM_PLACEABLE flag. - * - * @param g A geom created by dCreateHeightfield - * @param d A dHeightfieldDataID created by dGeomHeightfieldDataCreate - * @ingroup collide - */ -ODE_API void dGeomHeightfieldSetHeightfieldData( dGeomID g, dHeightfieldDataID d ); - - -/** - * @brief Gets the dHeightfieldDataID bound to a heightfield geom. - * - * Returns the dHeightfieldDataID associated with a heightfield geom. - * - * @param g A geom created by dCreateHeightfield - * @return The dHeightfieldDataID which may be NULL if none was assigned. - * @ingroup collide - */ -ODE_API dHeightfieldDataID dGeomHeightfieldGetHeightfieldData( dGeomID g ); - - - -/* ************************************************************************ */ -/* utility functions */ - -ODE_API void dClosestLineSegmentPoints (const dVector3 a1, const dVector3 a2, - const dVector3 b1, const dVector3 b2, - dVector3 cp1, dVector3 cp2); - -ODE_API int dBoxTouchesBox (const dVector3 _p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 _p2, - const dMatrix3 R2, const dVector3 side2); - -// The meaning of flags parameter is the same as in dCollide() -ODE_API int dBoxBox (const dVector3 p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 p2, - const dMatrix3 R2, const dVector3 side2, - dVector3 normal, dReal *depth, int *return_code, - int flags, dContactGeom *contact, int skip); - -ODE_API void dInfiniteAABB (dGeomID geom, dReal aabb[6]); -ODE_API void dInitODE(void); -ODE_API void dCloseODE(void); - -/* ************************************************************************ */ -/* custom classes */ - -typedef void dGetAABBFn (dGeomID, dReal aabb[6]); -typedef int dColliderFn (dGeomID o1, dGeomID o2, - int flags, dContactGeom *contact, int skip); -typedef dColliderFn * dGetColliderFnFn (int num); -typedef void dGeomDtorFn (dGeomID o); -typedef int dAABBTestFn (dGeomID o1, dGeomID o2, dReal aabb[6]); - -typedef struct dGeomClass { - int bytes; - dGetColliderFnFn *collider; - dGetAABBFn *aabb; - dAABBTestFn *aabb_test; - dGeomDtorFn *dtor; -} dGeomClass; - -ODE_API int dCreateGeomClass (const dGeomClass *classptr); -ODE_API void * dGeomGetClassData (dGeomID); -ODE_API dGeomID dCreateGeom (int classnum); - -/* ************************************************************************ */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/collision_space.h b/libraries/ode-0.9/include/ode/collision_space.h deleted file mode 100644 index fb1f83f6dd..0000000000 --- a/libraries/ode-0.9/include/ode/collision_space.h +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COLLISION_SPACE_H_ -#define _ODE_COLLISION_SPACE_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct dContactGeom; - -/** - * @brief User callback for geom-geom collision testing. - * - * @param data The user data object, as passed to dSpaceCollide. - * @param o1 The first geom being tested. - * @param o2 The second geom being test. - * - * @remarks The callback function can call dCollide on o1 and o2 to generate - * contact points between each pair. Then these contact points may be added - * to the simulation as contact joints. The user's callback function can of - * course chose not to call dCollide for any pair, e.g. if the user decides - * that those pairs should not interact. - * - * @ingroup collide - */ -typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2); - - -ODE_API dSpaceID dSimpleSpaceCreate (dSpaceID space); -ODE_API dSpaceID dHashSpaceCreate (dSpaceID space); -ODE_API dSpaceID dQuadTreeSpaceCreate (dSpaceID space, dVector3 Center, dVector3 Extents, int Depth); - -ODE_API void dSpaceDestroy (dSpaceID); - -ODE_API void dHashSpaceSetLevels (dSpaceID space, int minlevel, int maxlevel); -ODE_API void dHashSpaceGetLevels (dSpaceID space, int *minlevel, int *maxlevel); - -ODE_API void dSpaceSetCleanup (dSpaceID space, int mode); -ODE_API int dSpaceGetCleanup (dSpaceID space); - -ODE_API void dSpaceAdd (dSpaceID, dGeomID); -ODE_API void dSpaceRemove (dSpaceID, dGeomID); -ODE_API int dSpaceQuery (dSpaceID, dGeomID); -ODE_API void dSpaceClean (dSpaceID); -ODE_API int dSpaceGetNumGeoms (dSpaceID); -ODE_API dGeomID dSpaceGetGeom (dSpaceID, int i); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/collision_trimesh.h b/libraries/ode-0.9/include/ode/collision_trimesh.h deleted file mode 100755 index ad85a6eb61..0000000000 --- a/libraries/ode-0.9/include/ode/collision_trimesh.h +++ /dev/null @@ -1,205 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - * TriMesh code by Erwin de Vries. - * - * Trimesh data. - * This is where the actual vertexdata (pointers), and BV tree is stored. - * Vertices should be single precision! - * This should be more sophisticated, so that the user can easyly implement - * another collision library, but this is a lot of work, and also costs some - * performance because some data has to be copied. - */ - -#ifndef _ODE_COLLISION_TRIMESH_H_ -#define _ODE_COLLISION_TRIMESH_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Data storage for triangle meshes. - */ -struct dxTriMeshData; -typedef struct dxTriMeshData* dTriMeshDataID; - -/* - * These dont make much sense now, but they will later when we add more - * features. - */ -ODE_API dTriMeshDataID dGeomTriMeshDataCreate(void); -ODE_API void dGeomTriMeshDataDestroy(dTriMeshDataID g); - - - -enum { TRIMESH_FACE_NORMALS }; -ODE_API void dGeomTriMeshDataSet(dTriMeshDataID g, int data_id, void* in_data); -ODE_API void* dGeomTriMeshDataGet(dTriMeshDataID g, int data_id); - - - -/** - * We need to set the last transform after each time step for - * accurate collision response. These functions get and set that transform. - * It is stored per geom instance, rather than per dTriMeshDataID. - */ -ODE_API void dGeomTriMeshSetLastTransform( dGeomID g, dMatrix4 last_trans ); -ODE_API dReal* dGeomTriMeshGetLastTransform( dGeomID g ); - -/* - * Build TriMesh data with single precision used in vertex data . - */ -ODE_API void dGeomTriMeshDataBuildSingle(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildSingle1(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride, - const void* Normals); -/* -* Build TriMesh data with double pricision used in vertex data . -*/ -ODE_API void dGeomTriMeshDataBuildDouble(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildDouble1(dTriMeshDataID g, - const void* Vertices, int VertexStride, int VertexCount, - const void* Indices, int IndexCount, int TriStride, - const void* Normals); - -/* - * Simple build. Single/double precision based on dSINGLE/dDOUBLE! - */ -ODE_API void dGeomTriMeshDataBuildSimple(dTriMeshDataID g, - const dReal* Vertices, int VertexCount, - const int* Indices, int IndexCount); -/* same again with a normals array (used as trimesh-trimesh optimization) */ -ODE_API void dGeomTriMeshDataBuildSimple1(dTriMeshDataID g, - const dReal* Vertices, int VertexCount, - const int* Indices, int IndexCount, - const int* Normals); - -/* Preprocess the trimesh data to remove mark unnecessary edges and vertices */ -ODE_API void dGeomTriMeshDataPreprocess(dTriMeshDataID g); -/* Get and set the internal preprocessed trimesh data buffer, for loading and saving */ -ODE_API void dGeomTriMeshDataGetBuffer(dTriMeshDataID g, unsigned char** buf, int* bufLen); -ODE_API void dGeomTriMeshDataSetBuffer(dTriMeshDataID g, unsigned char* buf); - - -/* - * Per triangle callback. Allows the user to say if he wants a collision with - * a particular triangle. - */ -typedef int dTriCallback(dGeomID TriMesh, dGeomID RefObject, int TriangleIndex); -ODE_API void dGeomTriMeshSetCallback(dGeomID g, dTriCallback* Callback); -ODE_API dTriCallback* dGeomTriMeshGetCallback(dGeomID g); - -/* - * Per object callback. Allows the user to get the list of triangles in 1 - * shot. Maybe we should remove this one. - */ -typedef void dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, const int* TriIndices, int TriCount); -ODE_API void dGeomTriMeshSetArrayCallback(dGeomID g, dTriArrayCallback* ArrayCallback); -ODE_API dTriArrayCallback* dGeomTriMeshGetArrayCallback(dGeomID g); - -/* - * Ray callback. - * Allows the user to say if a ray collides with a triangle on barycentric - * coords. The user can for example sample a texture with alpha transparency - * to determine if a collision should occur. - */ -typedef int dTriRayCallback(dGeomID TriMesh, dGeomID Ray, int TriangleIndex, dReal u, dReal v); -ODE_API void dGeomTriMeshSetRayCallback(dGeomID g, dTriRayCallback* Callback); -ODE_API dTriRayCallback* dGeomTriMeshGetRayCallback(dGeomID g); - -/* - * Trimesh class - * Construction. Callbacks are optional. - */ -ODE_API dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback); - -ODE_API void dGeomTriMeshSetData(dGeomID g, dTriMeshDataID Data); -ODE_API dTriMeshDataID dGeomTriMeshGetData(dGeomID g); - - -// enable/disable/check temporal coherence -ODE_API void dGeomTriMeshEnableTC(dGeomID g, int geomClass, int enable); -ODE_API int dGeomTriMeshIsTCEnabled(dGeomID g, int geomClass); - -/* - * Clears the internal temporal coherence caches. When a geom has its - * collision checked with a trimesh once, data is stored inside the trimesh. - * With large worlds with lots of seperate objects this list could get huge. - * We should be able to do this automagically. - */ -ODE_API void dGeomTriMeshClearTCCache(dGeomID g); - - -/* - * returns the TriMeshDataID - */ -ODE_API dTriMeshDataID dGeomTriMeshGetTriMeshDataID(dGeomID g); - -/* - * Gets a triangle. - */ -ODE_API void dGeomTriMeshGetTriangle(dGeomID g, int Index, dVector3* v0, dVector3* v1, dVector3* v2); - -/* - * Gets the point on the requested triangle and the given barycentric - * coordinates. - */ -ODE_API void dGeomTriMeshGetPoint(dGeomID g, int Index, dReal u, dReal v, dVector3 Out); - -/* - -This is how the strided data works: - -struct StridedVertex{ - dVector3 Vertex; - // Userdata -}; -int VertexStride = sizeof(StridedVertex); - -struct StridedTri{ - int Indices[3]; - // Userdata -}; -int TriStride = sizeof(StridedTri); - -*/ - - -ODE_API int dGeomTriMeshGetTriangleCount (dGeomID g); - -ODE_API void dGeomTriMeshDataUpdate(dTriMeshDataID g); - -#ifdef __cplusplus -} -#endif - -#endif /* _ODE_COLLISION_TRIMESH_H_ */ - diff --git a/libraries/ode-0.9/include/ode/common.h b/libraries/ode-0.9/include/ode/common.h deleted file mode 100644 index 7f0a12d3b2..0000000000 --- a/libraries/ode-0.9/include/ode/common.h +++ /dev/null @@ -1,388 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMMON_H_ -#define _ODE_COMMON_H_ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* configuration stuff */ - -/* the efficient alignment. most platforms align data structures to some - * number of bytes, but this is not always the most efficient alignment. - * for example, many x86 compilers align to 4 bytes, but on a pentium it - * is important to align doubles to 8 byte boundaries (for speed), and - * the 4 floats in a SIMD register to 16 byte boundaries. many other - * platforms have similar behavior. setting a larger alignment can waste - * a (very) small amount of memory. NOTE: this number must be a power of - * two. this is set to 16 by default. - */ -#define EFFICIENT_ALIGNMENT 16 - - -/* constants */ - -/* pi and 1/sqrt(2) are defined here if necessary because they don't get - * defined in on some platforms (like MS-Windows) - */ - -#ifndef M_PI -#define M_PI REAL(3.1415926535897932384626433832795029) -#endif -#ifndef M_SQRT1_2 -#define M_SQRT1_2 REAL(0.7071067811865475244008443621048490) -#endif - - -/* debugging: - * IASSERT is an internal assertion, i.e. a consistency check. if it fails - * we want to know where. - * UASSERT is a user assertion, i.e. if it fails a nice error message - * should be printed for the user. - * AASSERT is an arguments assertion, i.e. if it fails "bad argument(s)" - * is printed. - * DEBUGMSG just prints out a message - */ - -#ifndef dNODEBUG -#ifdef __GNUC__ -#define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s() [%s]",__FUNCTION__,__FILE__); -#define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \ - msg " in %s()", __FUNCTION__); -#define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \ -msg " in %s() File %s Line %d", __FUNCTION__, __FILE__,__LINE__); -#else -#define dIASSERT(a) if (!(a)) dDebug (d_ERR_IASSERT, \ - "assertion \"" #a "\" failed in %s:%d",__FILE__,__LINE__); -#define dUASSERT(a,msg) if (!(a)) dDebug (d_ERR_UASSERT, \ - msg " (%s:%d)", __FILE__,__LINE__); -#define dDEBUGMSG(msg) dMessage (d_ERR_UASSERT, \ - msg " (%s:%d)", __FILE__,__LINE__); -#endif -#else -#define dIASSERT(a) ; -#define dUASSERT(a,msg) ; -#define dDEBUGMSG(msg) ; -#endif -#define dAASSERT(a) dUASSERT(a,"Bad argument(s)") - -// Macro used to suppress unused variable warning -#define dVARIABLEUSED(a) ((void)a) - -/* floating point data type, vector, matrix and quaternion types */ - -#if defined(dSINGLE) -typedef float dReal; -#ifdef dDOUBLE -#error You can only #define dSINGLE or dDOUBLE, not both. -#endif // dDOUBLE -#elif defined(dDOUBLE) -typedef double dReal; -#else -#error You must #define dSINGLE or dDOUBLE -#endif - -// Detect if we've got both trimesh engines enabled. -#if dTRIMESH_ENABLED -#if dTRIMESH_OPCODE && dTRIMESH_GIMPACT -#error You can only #define dTRIMESH_OPCODE or dTRIMESH_GIMPACT, not both. -#endif -#endif // dTRIMESH_ENABLED - -/* round an integer up to a multiple of 4, except that 0 and 1 are unmodified - * (used to compute matrix leading dimensions) - */ -#define dPAD(a) (((a) > 1) ? ((((a)-1)|3)+1) : (a)) - -/* these types are mainly just used in headers */ -typedef dReal dVector3[4]; -typedef dReal dVector4[4]; -typedef dReal dMatrix3[4*3]; -typedef dReal dMatrix4[4*4]; -typedef dReal dMatrix6[8*6]; -typedef dReal dQuaternion[4]; - - -/* precision dependent scalar math functions */ - -#if defined(dSINGLE) - -#define REAL(x) (x ## f) /* form a constant */ -#define dRecip(x) ((1.0f/(x))) /* reciprocal */ -#define dSqrt(x) (sqrtf(x)) /* square root */ -#define dRecipSqrt(x) ((1.0f/sqrtf(x))) /* reciprocal square root */ -#define dSin(x) (sinf(x)) /* sine */ -#define dCos(x) (cosf(x)) /* cosine */ -#define dFabs(x) (fabsf(x)) /* absolute value */ -#define dAtan2(y,x) (atan2f(y,x)) /* arc tangent with 2 args */ -#define dFMod(a,b) (fmodf(a,b)) /* modulo */ -#define dFloor(x) floorf(x) /* floor */ - -#ifdef HAVE___ISNANF -#define dIsNan(x) (__isnanf(x)) -#elif defined(HAVE__ISNANF) -#define dIsNan(x) (_isnanf(x)) -#elif defined(HAVE_ISNANF) -#define dIsNan(x) (isnanf(x)) -#else - /* - fall back to _isnan which is the VC way, - this may seem redundant since we already checked - for _isnan before, but if isnan is detected by - configure but is not found during compilation - we should always make sure we check for __isnanf, - _isnanf and isnanf in that order before falling - back to a default - */ -#define dIsNan(x) (_isnan(x)) -#endif - -#define dCopySign(a,b) ((dReal)copysignf(a,b)) - -#elif defined(dDOUBLE) - -#define REAL(x) (x) -#define dRecip(x) (1.0/(x)) -#define dSqrt(x) sqrt(x) -#define dRecipSqrt(x) (1.0/sqrt(x)) -#define dSin(x) sin(x) -#define dCos(x) cos(x) -#define dFabs(x) fabs(x) -#define dAtan2(y,x) atan2((y),(x)) -#define dFMod(a,b) (fmod((a),(b))) -#define dFloor(x) floor(x) - -#ifdef HAVE___ISNAN -#define dIsNan(x) (__isnan(x)) -#elif defined(HAVE__ISNAN) -#define dIsNan(x) (_isnan(x)) -#elif defined(HAVE_ISNAN) -#define dIsNan(x) (isnan(x)) -#else -#define dIsNan(x) (_isnan(x)) -#endif - -#define dCopySign(a,b) (copysign((a),(b))) - -#else -#error You must #define dSINGLE or dDOUBLE -#endif - - -/* utility */ - - -/* round something up to be a multiple of the EFFICIENT_ALIGNMENT */ - -#define dEFFICIENT_SIZE(x) ((((x)-1)|(EFFICIENT_ALIGNMENT-1))+1) - - -/* alloca aligned to the EFFICIENT_ALIGNMENT. note that this can waste - * up to 15 bytes per allocation, depending on what alloca() returns. - */ - -#define dALLOCA16(n) \ - ((char*)dEFFICIENT_SIZE(((size_t)(alloca((n)+(EFFICIENT_ALIGNMENT-1)))))) - - -// Use the error-checking memory allocation system. Because this system uses heap -// (malloc) instead of stack (alloca), it is slower. However, it allows you to -// simulate larger scenes, as well as handle out-of-memory errors in a somewhat -// graceful manner - -// #define dUSE_MALLOC_FOR_ALLOCA - -#ifdef dUSE_MALLOC_FOR_ALLOCA -enum { - d_MEMORY_OK = 0, /* no memory errors */ - d_MEMORY_OUT_OF_MEMORY /* malloc failed due to out of memory error */ -}; - -#endif - - - -/* internal object types (all prefixed with `dx') */ - -struct dxWorld; /* dynamics world */ -struct dxSpace; /* collision space */ -struct dxBody; /* rigid body (dynamics object) */ -struct dxGeom; /* geometry (collision object) */ -struct dxJoint; -struct dxJointNode; -struct dxJointGroup; - -typedef struct dxWorld *dWorldID; -typedef struct dxSpace *dSpaceID; -typedef struct dxBody *dBodyID; -typedef struct dxGeom *dGeomID; -typedef struct dxJoint *dJointID; -typedef struct dxJointGroup *dJointGroupID; - - -/* error numbers */ - -enum { - d_ERR_UNKNOWN = 0, /* unknown error */ - d_ERR_IASSERT, /* internal assertion failed */ - d_ERR_UASSERT, /* user assertion failed */ - d_ERR_LCP /* user assertion failed */ -}; - - -/* joint type numbers */ - -enum { - dJointTypeNone = 0, /* or "unknown" */ - dJointTypeBall, - dJointTypeHinge, - dJointTypeSlider, - dJointTypeContact, - dJointTypeUniversal, - dJointTypeHinge2, - dJointTypeFixed, - dJointTypeNull, - dJointTypeAMotor, - dJointTypeLMotor, - dJointTypePlane2D, - dJointTypePR -}; - - -/* an alternative way of setting joint parameters, using joint parameter - * structures and member constants. we don't actually do this yet. - */ - -/* -typedef struct dLimot { - int mode; - dReal lostop, histop; - dReal vel, fmax; - dReal fudge_factor; - dReal bounce, soft; - dReal suspension_erp, suspension_cfm; -} dLimot; - -enum { - dLimotLoStop = 0x0001, - dLimotHiStop = 0x0002, - dLimotVel = 0x0004, - dLimotFMax = 0x0008, - dLimotFudgeFactor = 0x0010, - dLimotBounce = 0x0020, - dLimotSoft = 0x0040 -}; -*/ - - -/* standard joint parameter names. why are these here? - because we don't want - * to include all the joint function definitions in joint.cpp. hmmmm. - * MSVC complains if we call D_ALL_PARAM_NAMES_X with a blank second argument, - * which is why we have the D_ALL_PARAM_NAMES macro as well. please copy and - * paste between these two. - */ - -#define D_ALL_PARAM_NAMES(start) \ - /* parameters for limits and motors */ \ - dParamLoStop = start, \ - dParamHiStop, \ - dParamVel, \ - dParamFMax, \ - dParamFudgeFactor, \ - dParamBounce, \ - dParamCFM, \ - dParamStopERP, \ - dParamStopCFM, \ - /* parameters for suspension */ \ - dParamSuspensionERP, \ - dParamSuspensionCFM, \ - dParamERP, \ - -#define D_ALL_PARAM_NAMES_X(start,x) \ - /* parameters for limits and motors */ \ - dParamLoStop ## x = start, \ - dParamHiStop ## x, \ - dParamVel ## x, \ - dParamFMax ## x, \ - dParamFudgeFactor ## x, \ - dParamBounce ## x, \ - dParamCFM ## x, \ - dParamStopERP ## x, \ - dParamStopCFM ## x, \ - /* parameters for suspension */ \ - dParamSuspensionERP ## x, \ - dParamSuspensionCFM ## x, \ - dParamERP ## x, - -enum { - D_ALL_PARAM_NAMES(0) - D_ALL_PARAM_NAMES_X(0x100,2) - D_ALL_PARAM_NAMES_X(0x200,3) - - /* add a multiple of this constant to the basic parameter numbers to get - * the parameters for the second, third etc axes. - */ - dParamGroup=0x100 -}; - - -/* angular motor mode numbers */ - -enum{ - dAMotorUser = 0, - dAMotorEuler = 1 -}; - - -/* joint force feedback information */ - -typedef struct dJointFeedback { - dVector3 f1; /* force applied to body 1 */ - dVector3 t1; /* torque applied to body 1 */ - dVector3 f2; /* force applied to body 2 */ - dVector3 t2; /* torque applied to body 2 */ -} dJointFeedback; - - -/* private functions that must be implemented by the collision library: - * (1) indicate that a geom has moved, (2) get the next geom in a body list. - * these functions are called whenever the position of geoms connected to a - * body have changed, e.g. with dBodySetPosition(), dBodySetRotation(), or - * when the ODE step function updates the body state. - */ - -void dGeomMoved (dGeomID); -dGeomID dGeomGetBodyNext (dGeomID); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/compatibility.h b/libraries/ode-0.9/include/ode/compatibility.h deleted file mode 100644 index b3709866bc..0000000000 --- a/libraries/ode-0.9/include/ode/compatibility.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_COMPATIBILITY_H_ -#define _ODE_COMPATIBILITY_H_ - -/* - * ODE's backward compatibility system ensures that as ODE's API - * evolves, user code will not break. - */ - -/* - * These new rotation function names are more consistent with the - * rest of the API. - */ -#define dQtoR(q,R) dRfromQ((R),(q)) -#define dRtoQ(R,q) dQfromR((q),(R)) -#define dWtoDQ(w,q,dq) dDQfromW((dq),(w),(q)) - - -#endif diff --git a/libraries/ode-0.9/include/ode/config.h b/libraries/ode-0.9/include/ode/config.h deleted file mode 100644 index 9a74f0ef52..0000000000 --- a/libraries/ode-0.9/include/ode/config.h +++ /dev/null @@ -1,378 +0,0 @@ -/* include/ode/config.h. Generated from config.h.in by configure. */ -/* include/ode/config.h.in. Generated from configure.in by autoheader. */ - - -#ifndef ODE_CONFIG_H -#define ODE_CONFIG_H - - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -/* #undef CRAY_STACKSEG_END */ - -/* Define to 1 if using `alloca.c'. */ -/* #undef C_ALLOCA */ - -/* Define to 1 if you have `alloca', as a function or macro. */ -#define HAVE_ALLOCA 1 - -/* Define to 1 if you have and it should be used (not on Ultrix). - */ -#define HAVE_ALLOCA_H 1 - -/* Use the Apple OpenGL framework. */ -/* #undef HAVE_APPLE_OPENGL_FRAMEWORK */ - -/* Define to 1 if you have the `atan2f' function. */ -#define HAVE_ATAN2F 1 - -/* Define to 1 if you have the `copysign' function. */ -#define HAVE_COPYSIGN 1 - -/* Define to 1 if you have the `copysignf' function. */ -#define HAVE_COPYSIGNF 1 - -/* Define to 1 if you have the `cosf' function. */ -#define HAVE_COSF 1 - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -/* #undef HAVE_DOPRNT */ - -/* Define to 1 if you have the `fabsf' function. */ -#define HAVE_FABSF 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_FLOAT_H 1 - -/* Define to 1 if you have the `floor' function. */ -#define HAVE_FLOOR 1 - -/* Define to 1 if you have the `fmodf' function. */ -#define HAVE_FMODF 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_GL_GLEXT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_GL_GLU_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_GL_GL_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_IEEEFP_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the `isnan' function. */ -#define HAVE_ISNAN 1 - -/* Define to 1 if you have the `isnanf' function. */ -#define HAVE_ISNANF 1 - -/* Define to 1 if your system has a GNU libc compatible `malloc' function, and - to 0 otherwise. */ -#define HAVE_MALLOC 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MATH_H 1 - -/* Define to 1 if you have the `memmove' function. */ -#define HAVE_MEMMOVE 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `memset' function. */ -#define HAVE_MEMSET 1 - -/* Define to 1 if libc includes obstacks. */ -#define HAVE_OBSTACK 1 - -/* Define to 1 if your system has a GNU libc compatible `realloc' function, - and to 0 otherwise. */ -#define HAVE_REALLOC 1 - -/* Define to 1 if you have the `select' function. */ -#define HAVE_SELECT 1 - -/* Define to 1 if you have the `sinf' function. */ -#define HAVE_SINF 1 - -/* Define to 1 if you have the `snprintf' function. */ -#define HAVE_SNPRINTF 1 - -/* Define to 1 if you have the `sqrt' function. */ -#define HAVE_SQRT 1 - -/* Define to 1 if you have the `sqrtf' function. */ -#define HAVE_SQRTF 1 - -/* Use SSE Optimizations */ -/* #undef HAVE_SSE */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STDARG_H 1 - -/* Define to 1 if stdbool.h conforms to C99. */ -#define HAVE_STDBOOL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SELECT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_TIME_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_VALUES_H 1 - -/* Define to 1 if you have the `vprintf' function. */ -#define HAVE_VPRINTF 1 - -/* Define to 1 if you have the `vsnprintf' function. */ -#define HAVE_VSNPRINTF 1 - -/* Define to 1 if the system has the type `_Bool'. */ -#define HAVE__BOOL 1 - -/* Define to 1 if you have the `_isnan' function. */ -/* #undef HAVE__ISNAN */ - -/* Define to 1 if you have the `_isnanf' function. */ -/* #undef HAVE__ISNANF */ - -/* Define to 1 if you have the `__isnan' function. */ -#define HAVE___ISNAN 1 - -/* Define to 1 if you have the `__isnanf' function. */ -#define HAVE___ISNANF 1 - -/* Name of package */ -#define PACKAGE "ODE" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "ode@ode.org" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "ODE" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "ODE 0.9.0" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "ode" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "0.9.0" - -/* is this a pentium on a gcc-based platform? */ -#define PENTIUM 1 - -/* Define to the type of arg 1 for `select'. */ -#define SELECT_TYPE_ARG1 int - -/* Define to the type of args 2, 3 and 4 for `select'. */ -#define SELECT_TYPE_ARG234 (fd_set *) - -/* Define to the type of arg 5 for `select'. */ -#define SELECT_TYPE_ARG5 (struct timeval *) - -/* The size of `char', as computed by sizeof. */ -#define SIZEOF_CHAR 1 - -/* The size of `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of `long int', as computed by sizeof. */ -#define SIZEOF_LONG_INT 4 - -/* The size of `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* The size of `void*', as computed by sizeof. */ -#define SIZEOF_VOIDP 4 - -/* The extension for shared libraries. */ -#define SO_EXT ".so" - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at runtime. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -/* #undef STACK_DIRECTION */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "0.9.0" - -/* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). */ -/* #undef WORDS_BIGENDIAN */ - -/* is this a X86_64 system on a gcc-based platform? */ -/* #undef X86_64_SYSTEM */ - -/* Define to 1 if the X Window System is missing or not being used. */ -/* #undef X_DISPLAY_MISSING */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Use double precision */ -/* #undef dDOUBLE */ - -/* dEpsilon Constant */ -#define dEpsilon FLT_EPSILON - -/* Use gyroscopic terms */ -#define dGYROSCOPIC - -/* dInfinity Constant */ -#define dInfinity FLT_MAX - -/* Disable debug output */ -/* #undef dNODEBUG */ - -/* Use single precision */ -#define dSINGLE - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -/* #undef inline */ -#endif - -/* Define to rpl_malloc if the replacement function should be used. */ -/* #undef malloc */ - -/* Define to rpl_realloc if the replacement function should be used. */ -/* #undef realloc */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to empty if the keyword `volatile' does not work. Warning: valid - code using `volatile' can become incorrect without. Disable with care. */ -/* #undef volatile */ - - - -#ifdef HAVE_ALLOCA_H -#include -#endif -#if defined(HAVE_IEEEFP_H) && !defined(__CYGWIN__) -// This header creates conflicts with math.h in Cygwin. -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_MATH_H -#include -#endif -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_STDARG_H -#include -#endif -#ifdef HAVE_MALLOC_H -#include -#endif -#ifdef HAVE_VALUES_H -#include -#endif -#ifdef HAVE_FLOAT_H -#include -#endif -#if SIZEOF_CHAR == 1 -typedef char int8; -typedef unsigned char uint8; -#else -#error "expecting sizeof(char) == 1" -#endif -#if SIZEOF_SHORT == 2 -typedef short int16; -typedef unsigned short uint16; -#else -#error "can not find 2 byte integer type" -#endif -/* integer types (we assume int >= 32 bits) */ -#if SIZEOF_INT == 4 -typedef short int32; -typedef unsigned short uint32; -#else -#error "can not find 4 byte integer type" -#endif -/* an integer type that we can safely cast a pointer to and - * from without loss of bits. - */ -#if SIZEOF_SHORT == SIZEOF_VOIDP -typedef unsigned short intP; -#elif SIZEOF_INT == SIZEOF_VOIDP -typedef unsigned int intP; -#elif SIZEOF_LONG_INT == SIZEOF_VOIDP -typedef unsigned long int intP; -#endif - -/* -Handle Windows DLL odities -Its easier to export all symbols using the -shared flag -for MinGW than differentiating with declspec, -so only do it for MSVC -*/ -#if defined(ODE_DLL) && defined(WIN32) && defined(_MSC_VER) -#define ODE_API __declspec( dllexport ) -#elif !defined(ODE_DLL) && defined(WIN32) && defined(MSC_VER) -#define ODE_API __declspec( dllimport ) -#else -#define ODE_API -#endif - -#endif /* #define ODE_CONFIG_H */ - diff --git a/libraries/ode-0.9/include/ode/config.h.in b/libraries/ode-0.9/include/ode/config.h.in deleted file mode 100644 index 1b05c7d5ca..0000000000 --- a/libraries/ode-0.9/include/ode/config.h.in +++ /dev/null @@ -1,377 +0,0 @@ -/* include/ode/config.h.in. Generated from configure.in by autoheader. */ - - -#ifndef ODE_CONFIG_H -#define ODE_CONFIG_H - - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -#undef CRAY_STACKSEG_END - -/* Define to 1 if using `alloca.c'. */ -#undef C_ALLOCA - -/* Define to 1 if you have `alloca', as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define to 1 if you have and it should be used (not on Ultrix). - */ -#undef HAVE_ALLOCA_H - -/* Use the Apple OpenGL framework. */ -#undef HAVE_APPLE_OPENGL_FRAMEWORK - -/* Define to 1 if you have the `atan2f' function. */ -#undef HAVE_ATAN2F - -/* Define to 1 if you have the `copysign' function. */ -#undef HAVE_COPYSIGN - -/* Define to 1 if you have the `copysignf' function. */ -#undef HAVE_COPYSIGNF - -/* Define to 1 if you have the `cosf' function. */ -#undef HAVE_COSF - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -#undef HAVE_DOPRNT - -/* Define to 1 if you have the `fabsf' function. */ -#undef HAVE_FABSF - -/* Define to 1 if you have the header file. */ -#undef HAVE_FLOAT_H - -/* Define to 1 if you have the `floor' function. */ -#undef HAVE_FLOOR - -/* Define to 1 if you have the `fmodf' function. */ -#undef HAVE_FMODF - -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define to 1 if you have the header file. */ -#undef HAVE_GL_GLEXT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_GL_GLU_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_GL_GL_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_IEEEFP_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `isnan' function. */ -#undef HAVE_ISNAN - -/* Define to 1 if you have the `isnanf' function. */ -#undef HAVE_ISNANF - -/* Define to 1 if your system has a GNU libc compatible `malloc' function, and - to 0 otherwise. */ -#undef HAVE_MALLOC - -/* Define to 1 if you have the header file. */ -#undef HAVE_MALLOC_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MATH_H - -/* Define to 1 if you have the `memmove' function. */ -#undef HAVE_MEMMOVE - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `memset' function. */ -#undef HAVE_MEMSET - -/* Define to 1 if libc includes obstacks. */ -#undef HAVE_OBSTACK - -/* Define to 1 if your system has a GNU libc compatible `realloc' function, - and to 0 otherwise. */ -#undef HAVE_REALLOC - -/* Define to 1 if you have the `select' function. */ -#undef HAVE_SELECT - -/* Define to 1 if you have the `sinf' function. */ -#undef HAVE_SINF - -/* Define to 1 if you have the `snprintf' function. */ -#undef HAVE_SNPRINTF - -/* Define to 1 if you have the `sqrt' function. */ -#undef HAVE_SQRT - -/* Define to 1 if you have the `sqrtf' function. */ -#undef HAVE_SQRTF - -/* Use SSE Optimizations */ -#undef HAVE_SSE - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDARG_H - -/* Define to 1 if stdbool.h conforms to C99. */ -#undef HAVE_STDBOOL_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDIO_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SELECT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SOCKET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TIME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_TIME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_VALUES_H - -/* Define to 1 if you have the `vprintf' function. */ -#undef HAVE_VPRINTF - -/* Define to 1 if you have the `vsnprintf' function. */ -#undef HAVE_VSNPRINTF - -/* Define to 1 if the system has the type `_Bool'. */ -#undef HAVE__BOOL - -/* Define to 1 if you have the `_isnan' function. */ -#undef HAVE__ISNAN - -/* Define to 1 if you have the `_isnanf' function. */ -#undef HAVE__ISNANF - -/* Define to 1 if you have the `__isnan' function. */ -#undef HAVE___ISNAN - -/* Define to 1 if you have the `__isnanf' function. */ -#undef HAVE___ISNANF - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* is this a pentium on a gcc-based platform? */ -#undef PENTIUM - -/* Define to the type of arg 1 for `select'. */ -#undef SELECT_TYPE_ARG1 - -/* Define to the type of args 2, 3 and 4 for `select'. */ -#undef SELECT_TYPE_ARG234 - -/* Define to the type of arg 5 for `select'. */ -#undef SELECT_TYPE_ARG5 - -/* The size of `char', as computed by sizeof. */ -#undef SIZEOF_CHAR - -/* The size of `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of `long int', as computed by sizeof. */ -#undef SIZEOF_LONG_INT - -/* The size of `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - -/* The size of `void*', as computed by sizeof. */ -#undef SIZEOF_VOIDP - -/* The extension for shared libraries. */ -#undef SO_EXT - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at runtime. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -#undef STACK_DIRECTION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Version number of package */ -#undef VERSION - -/* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). */ -#undef WORDS_BIGENDIAN - -/* is this a X86_64 system on a gcc-based platform? */ -#undef X86_64_SYSTEM - -/* Define to 1 if the X Window System is missing or not being used. */ -#undef X_DISPLAY_MISSING - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Use double precision */ -#undef dDOUBLE - -/* dEpsilon Constant */ -#undef dEpsilon - -/* Use gyroscopic terms */ -#undef dGYROSCOPIC - -/* dInfinity Constant */ -#undef dInfinity - -/* Disable debug output */ -#undef dNODEBUG - -/* Use single precision */ -#undef dSINGLE - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -#undef inline -#endif - -/* Define to rpl_malloc if the replacement function should be used. */ -#undef malloc - -/* Define to rpl_realloc if the replacement function should be used. */ -#undef realloc - -/* Define to `unsigned int' if does not define. */ -#undef size_t - -/* Define to empty if the keyword `volatile' does not work. Warning: valid - code using `volatile' can become incorrect without. Disable with care. */ -#undef volatile - - - -#ifdef HAVE_ALLOCA_H -#include -#endif -#if defined(HAVE_IEEEFP_H) && !defined(__CYGWIN__) -// This header creates conflicts with math.h in Cygwin. -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_MATH_H -#include -#endif -#ifdef HAVE_STRING_H -#include -#endif -#ifdef HAVE_STDARG_H -#include -#endif -#ifdef HAVE_MALLOC_H -#include -#endif -#ifdef HAVE_VALUES_H -#include -#endif -#ifdef HAVE_FLOAT_H -#include -#endif -#if SIZEOF_CHAR == 1 -typedef char int8; -typedef unsigned char uint8; -#else -#error "expecting sizeof(char) == 1" -#endif -#if SIZEOF_SHORT == 2 -typedef short int16; -typedef unsigned short uint16; -#else -#error "can not find 2 byte integer type" -#endif -/* integer types (we assume int >= 32 bits) */ -#if SIZEOF_INT == 4 -typedef short int32; -typedef unsigned short uint32; -#else -#error "can not find 4 byte integer type" -#endif -/* an integer type that we can safely cast a pointer to and - * from without loss of bits. - */ -#if SIZEOF_SHORT == SIZEOF_VOIDP -typedef unsigned short intP; -#elif SIZEOF_INT == SIZEOF_VOIDP -typedef unsigned int intP; -#elif SIZEOF_LONG_INT == SIZEOF_VOIDP -typedef unsigned long int intP; -#endif - -/* -Handle Windows DLL odities -Its easier to export all symbols using the -shared flag -for MinGW than differentiating with declspec, -so only do it for MSVC -*/ -#if defined(ODE_DLL) && defined(WIN32) && defined(_MSC_VER) -#define ODE_API __declspec( dllexport ) -#elif !defined(ODE_DLL) && defined(WIN32) && defined(MSC_VER) -#define ODE_API __declspec( dllimport ) -#else -#define ODE_API -#endif - -#endif /* #define ODE_CONFIG_H */ - diff --git a/libraries/ode-0.9/include/ode/contact.h b/libraries/ode-0.9/include/ode/contact.h deleted file mode 100644 index fc634e7e0e..0000000000 --- a/libraries/ode-0.9/include/ode/contact.h +++ /dev/null @@ -1,103 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_CONTACT_H_ -#define _ODE_CONTACT_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -enum { - dContactMu2 = 0x001, - dContactFDir1 = 0x002, - dContactBounce = 0x004, - dContactSoftERP = 0x008, - dContactSoftCFM = 0x010, - dContactMotion1 = 0x020, - dContactMotion2 = 0x040, - dContactSlip1 = 0x080, - dContactSlip2 = 0x100, - - dContactApprox0 = 0x0000, - dContactApprox1_1 = 0x1000, - dContactApprox1_2 = 0x2000, - dContactApprox1 = 0x3000 -}; - - -typedef struct dSurfaceParameters { - /* must always be defined */ - int mode; - dReal mu; - - /* only defined if the corresponding flag is set in mode */ - dReal mu2; - dReal bounce; - dReal bounce_vel; - dReal soft_erp; - dReal soft_cfm; - dReal motion1,motion2; - dReal slip1,slip2; -} dSurfaceParameters; - - -/** - * @brief Describe the contact point between two geoms. - * - * If two bodies touch, or if a body touches a static feature in its - * environment, the contact is represented by one or more "contact - * points", described by dContactGeom. - * - * The convention is that if body 1 is moved along the normal vector by - * a distance depth (or equivalently if body 2 is moved the same distance - * in the opposite direction) then the contact depth will be reduced to - * zero. This means that the normal vector points "in" to body 1. - * - * @ingroup collide - */ -typedef struct dContactGeom { - dVector3 pos; ///< contact position - dVector3 normal; ///< normal vector - dReal depth; ///< penetration depth - dGeomID g1,g2; ///< the colliding geoms - int side1,side2; ///< (to be documented) -} dContactGeom; - - -/* contact info used by contact joint */ - -typedef struct dContact { - dSurfaceParameters surface; - dContactGeom geom; - dVector3 fdir1; -} dContact; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/error.h b/libraries/ode-0.9/include/ode/error.h deleted file mode 100644 index bdeec377f0..0000000000 --- a/libraries/ode-0.9/include/ode/error.h +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* this comes from the `reuse' library. copy any changes back to the source */ - -#ifndef _ODE_ERROR_H_ -#define _ODE_ERROR_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* all user defined error functions have this type. error and debug functions - * should not return. - */ -typedef void dMessageFunction (int errnum, const char *msg, va_list ap); - -/* set a new error, debug or warning handler. if fn is 0, the default handlers - * are used. - */ -ODE_API void dSetErrorHandler (dMessageFunction *fn); -ODE_API void dSetDebugHandler (dMessageFunction *fn); -ODE_API void dSetMessageHandler (dMessageFunction *fn); - -/* return the current error, debug or warning handler. if the return value is - * 0, the default handlers are in place. - */ -ODE_API dMessageFunction *dGetErrorHandler(void); -ODE_API dMessageFunction *dGetDebugHandler(void); -ODE_API dMessageFunction *dGetMessageHandler(void); - -/* generate a fatal error, debug trap or a message. */ -ODE_API void dError (int num, const char *msg, ...); -ODE_API void dDebug (int num, const char *msg, ...); -ODE_API void dMessage (int num, const char *msg, ...); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/export-dif.h b/libraries/ode-0.9/include/ode/export-dif.h deleted file mode 100644 index ca479adc71..0000000000 --- a/libraries/ode-0.9/include/ode/export-dif.h +++ /dev/null @@ -1,32 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_EXPORT_DIF_ -#define _ODE_EXPORT_DIF_ - -#include - - -ODE_API void dWorldExportDIF (dWorldID w, FILE *file, const char *world_name); - - -#endif diff --git a/libraries/ode-0.9/include/ode/mass.h b/libraries/ode-0.9/include/ode/mass.h deleted file mode 100644 index 19740fcbbd..0000000000 --- a/libraries/ode-0.9/include/ode/mass.h +++ /dev/null @@ -1,125 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_MASS_H_ -#define _ODE_MASS_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct dMass; -typedef struct dMass dMass; - -/** - * Check if a mass structure has valid value. - * The function check if the mass and innertia matrix are positive definits - * - * @param m A mass structure to check - * - * @return 1 if both codition are met - */ -ODE_API int dMassCheck(const dMass *m); - -ODE_API void dMassSetZero (dMass *); - -ODE_API void dMassSetParameters (dMass *, dReal themass, - dReal cgx, dReal cgy, dReal cgz, - dReal I11, dReal I22, dReal I33, - dReal I12, dReal I13, dReal I23); - -ODE_API void dMassSetSphere (dMass *, dReal density, dReal radius); -ODE_API void dMassSetSphereTotal (dMass *, dReal total_mass, dReal radius); - -ODE_API void dMassSetCapsule (dMass *, dReal density, int direction, - dReal radius, dReal length); -ODE_API void dMassSetCapsuleTotal (dMass *, dReal total_mass, int direction, - dReal radius, dReal length); - -ODE_API void dMassSetCylinder (dMass *, dReal density, int direction, - dReal radius, dReal length); -ODE_API void dMassSetCylinderTotal (dMass *, dReal total_mass, int direction, - dReal radius, dReal length); - -ODE_API void dMassSetBox (dMass *, dReal density, - dReal lx, dReal ly, dReal lz); -ODE_API void dMassSetBoxTotal (dMass *, dReal total_mass, - dReal lx, dReal ly, dReal lz); - -ODE_API void dMassSetTrimesh (dMass *, dReal density, dGeomID g); - -ODE_API void dMassSetTrimeshTotal (dMass *m, dReal total_mass, dGeomID g); - -ODE_API void dMassAdjust (dMass *, dReal newmass); - -ODE_API void dMassTranslate (dMass *, dReal x, dReal y, dReal z); - -ODE_API void dMassRotate (dMass *, const dMatrix3 R); - -ODE_API void dMassAdd (dMass *a, const dMass *b); - -// Backwards compatible API -#define dMassSetCappedCylinder dMassSetCapsule -#define dMassSetCappedCylinderTotal dMassSetCapsuleTotal - - -struct dMass { - dReal mass; - dVector4 c; - dMatrix3 I; - -#ifdef __cplusplus - dMass() - { dMassSetZero (this); } - void setZero() - { dMassSetZero (this); } - void setParameters (dReal themass, dReal cgx, dReal cgy, dReal cgz, - dReal I11, dReal I22, dReal I33, - dReal I12, dReal I13, dReal I23) - { dMassSetParameters (this,themass,cgx,cgy,cgz,I11,I22,I33,I12,I13,I23); } - void setSphere (dReal density, dReal radius) - { dMassSetSphere (this,density,radius); } - void setCapsule (dReal density, int direction, dReal a, dReal b) - { dMassSetCappedCylinder (this,density,direction,a,b); } - void setCappedCylinder (dReal density, int direction, dReal a, dReal b) - { setCapsule(density, direction, a, b); } - void setBox (dReal density, dReal lx, dReal ly, dReal lz) - { dMassSetBox (this,density,lx,ly,lz); } - void adjust (dReal newmass) - { dMassAdjust (this,newmass); } - void translate (dReal x, dReal y, dReal z) - { dMassTranslate (this,x,y,z); } - void rotate (const dMatrix3 R) - { dMassRotate (this,R); } - void add (const dMass *b) - { dMassAdd (this,b); } -#endif -}; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/matrix.h b/libraries/ode-0.9/include/ode/matrix.h deleted file mode 100644 index eeb004d8eb..0000000000 --- a/libraries/ode-0.9/include/ode/matrix.h +++ /dev/null @@ -1,194 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* optimized and unoptimized vector and matrix functions */ - -#ifndef _ODE_MATRIX_H_ -#define _ODE_MATRIX_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* set a vector/matrix of size n to all zeros, or to a specific value. */ - -ODE_API void dSetZero (dReal *a, int n); -ODE_API void dSetValue (dReal *a, int n, dReal value); - - -/* get the dot product of two n*1 vectors. if n <= 0 then - * zero will be returned (in which case a and b need not be valid). - */ - -ODE_API dReal dDot (const dReal *a, const dReal *b, int n); - - -/* get the dot products of (a0,b), (a1,b), etc and return them in outsum. - * all vectors are n*1. if n <= 0 then zeroes will be returned (in which case - * the input vectors need not be valid). this function is somewhat faster - * than calling dDot() for all of the combinations separately. - */ - -/* NOT INCLUDED in the library for now. -void dMultidot2 (const dReal *a0, const dReal *a1, - const dReal *b, dReal *outsum, int n); -*/ - - -/* matrix multiplication. all matrices are stored in standard row format. - * the digit refers to the argument that is transposed: - * 0: A = B * C (sizes: A:p*r B:p*q C:q*r) - * 1: A = B' * C (sizes: A:p*r B:q*p C:q*r) - * 2: A = B * C' (sizes: A:p*r B:p*q C:r*q) - * case 1,2 are equivalent to saying that the operation is A=B*C but - * B or C are stored in standard column format. - */ - -ODE_API void dMultiply0 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -ODE_API void dMultiply1 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); -ODE_API void dMultiply2 (dReal *A, const dReal *B, const dReal *C, int p,int q,int r); - - -/* do an in-place cholesky decomposition on the lower triangle of the n*n - * symmetric matrix A (which is stored by rows). the resulting lower triangle - * will be such that L*L'=A. return 1 on success and 0 on failure (on failure - * the matrix is not positive definite). - */ - -ODE_API int dFactorCholesky (dReal *A, int n); - - -/* solve for x: L*L'*x = b, and put the result back into x. - * L is size n*n, b is size n*1. only the lower triangle of L is considered. - */ - -ODE_API void dSolveCholesky (const dReal *L, dReal *b, int n); - - -/* compute the inverse of the n*n positive definite matrix A and put it in - * Ainv. this is not especially fast. this returns 1 on success (A was - * positive definite) or 0 on failure (not PD). - */ - -ODE_API int dInvertPDMatrix (const dReal *A, dReal *Ainv, int n); - - -/* check whether an n*n matrix A is positive definite, return 1/0 (yes/no). - * positive definite means that x'*A*x > 0 for any x. this performs a - * cholesky decomposition of A. if the decomposition fails then the matrix - * is not positive definite. A is stored by rows. A is not altered. - */ - -ODE_API int dIsPositiveDefinite (const dReal *A, int n); - - -/* factorize a matrix A into L*D*L', where L is lower triangular with ones on - * the diagonal, and D is diagonal. - * A is an n*n matrix stored by rows, with a leading dimension of n rounded - * up to 4. L is written into the strict lower triangle of A (the ones are not - * written) and the reciprocal of the diagonal elements of D are written into - * d. - */ -ODE_API void dFactorLDLT (dReal *A, dReal *d, int n, int nskip); - - -/* solve L*x=b, where L is n*n lower triangular with ones on the diagonal, - * and x,b are n*1. b is overwritten with x. - * the leading dimension of L is `nskip'. - */ -ODE_API void dSolveL1 (const dReal *L, dReal *b, int n, int nskip); - - -/* solve L'*x=b, where L is n*n lower triangular with ones on the diagonal, - * and x,b are n*1. b is overwritten with x. - * the leading dimension of L is `nskip'. - */ -ODE_API void dSolveL1T (const dReal *L, dReal *b, int n, int nskip); - - -/* in matlab syntax: a(1:n) = a(1:n) .* d(1:n) */ - -ODE_API void dVectorScale (dReal *a, const dReal *d, int n); - - -/* given `L', a n*n lower triangular matrix with ones on the diagonal, - * and `d', a n*1 vector of the reciprocal diagonal elements of an n*n matrix - * D, solve L*D*L'*x=b where x,b are n*1. x overwrites b. - * the leading dimension of L is `nskip'. - */ - -ODE_API void dSolveLDLT (const dReal *L, const dReal *d, dReal *b, int n, int nskip); - - -/* given an L*D*L' factorization of an n*n matrix A, return the updated - * factorization L2*D2*L2' of A plus the following "top left" matrix: - * - * [ b a' ] <-- b is a[0] - * [ a 0 ] <-- a is a[1..n-1] - * - * - L has size n*n, its leading dimension is nskip. L is lower triangular - * with ones on the diagonal. only the lower triangle of L is referenced. - * - d has size n. d contains the reciprocal diagonal elements of D. - * - a has size n. - * the result is written into L, except that the left column of L and d[0] - * are not actually modified. see ldltaddTL.m for further comments. - */ -ODE_API void dLDLTAddTL (dReal *L, dReal *d, const dReal *a, int n, int nskip); - - -/* given an L*D*L' factorization of a permuted matrix A, produce a new - * factorization for row and column `r' removed. - * - A has size n1*n1, its leading dimension in nskip. A is symmetric and - * positive definite. only the lower triangle of A is referenced. - * A itself may actually be an array of row pointers. - * - L has size n2*n2, its leading dimension in nskip. L is lower triangular - * with ones on the diagonal. only the lower triangle of L is referenced. - * - d has size n2. d contains the reciprocal diagonal elements of D. - * - p is a permutation vector. it contains n2 indexes into A. each index - * must be in the range 0..n1-1. - * - r is the row/column of L to remove. - * the new L will be written within the old L, i.e. will have the same leading - * dimension. the last row and column of L, and the last element of d, are - * undefined on exit. - * - * a fast O(n^2) algorithm is used. see ldltremove.m for further comments. - */ -ODE_API void dLDLTRemove (dReal **A, const int *p, dReal *L, dReal *d, - int n1, int n2, int r, int nskip); - - -/* given an n*n matrix A (with leading dimension nskip), remove the r'th row - * and column by moving elements. the new matrix will have the same leading - * dimension. the last row and column of A are untouched on exit. - */ -ODE_API void dRemoveRowCol (dReal *A, int n, int nskip, int r); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/memory.h b/libraries/ode-0.9/include/ode/memory.h deleted file mode 100644 index c1af051a98..0000000000 --- a/libraries/ode-0.9/include/ode/memory.h +++ /dev/null @@ -1,59 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* this comes from the `reuse' library. copy any changes back to the source */ - -#ifndef _ODE_MEMORY_H_ -#define _ODE_MEMORY_H_ - -#include "ode/config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* function types to allocate and free memory */ -typedef void * dAllocFunction (size_t size); -typedef void * dReallocFunction (void *ptr, size_t oldsize, size_t newsize); -typedef void dFreeFunction (void *ptr, size_t size); - -/* set new memory management functions. if fn is 0, the default handlers are - * used. */ -ODE_API void dSetAllocHandler (dAllocFunction *fn); -ODE_API void dSetReallocHandler (dReallocFunction *fn); -ODE_API void dSetFreeHandler (dFreeFunction *fn); - -/* get current memory management functions */ -ODE_API dAllocFunction *dGetAllocHandler (void); -ODE_API dReallocFunction *dGetReallocHandler (void); -ODE_API dFreeFunction *dGetFreeHandler (void); - -/* allocate and free memory. */ -ODE_API void * dAlloc (size_t size); -ODE_API void * dRealloc (void *ptr, size_t oldsize, size_t newsize); -ODE_API void dFree (void *ptr, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/misc.h b/libraries/ode-0.9/include/ode/misc.h deleted file mode 100644 index 0c55fc5ba0..0000000000 --- a/libraries/ode-0.9/include/ode/misc.h +++ /dev/null @@ -1,85 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* miscellaneous math functions. these are mostly useful for testing */ - -#ifndef _ODE_MISC_H_ -#define _ODE_MISC_H_ - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* return 1 if the random number generator is working. */ -ODE_API int dTestRand(void); - -/* return next 32 bit random number. this uses a not-very-random linear - * congruential method. - */ -ODE_API unsigned long dRand(void); - -/* get and set the current random number seed. */ -ODE_API unsigned long dRandGetSeed(void); -ODE_API void dRandSetSeed (unsigned long s); - -/* return a random integer between 0..n-1. the distribution will get worse - * as n approaches 2^32. - */ -ODE_API int dRandInt (int n); - -/* return a random real number between 0..1 */ -ODE_API dReal dRandReal(void); - -/* print out a matrix */ -#ifdef __cplusplus -ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt = "%10.4f ", - FILE *f=stdout); -#else -ODE_API void dPrintMatrix (const dReal *A, int n, int m, char *fmt, FILE *f); -#endif - -/* make a random vector with entries between +/- range. A has n elements. */ -ODE_API void dMakeRandomVector (dReal *A, int n, dReal range); - -/* make a random matrix with entries between +/- range. A has size n*m. */ -ODE_API void dMakeRandomMatrix (dReal *A, int n, int m, dReal range); - -/* clear the upper triangle of a square matrix */ -ODE_API void dClearUpperTriangle (dReal *A, int n); - -/* return the maximum element difference between the two n*m matrices */ -ODE_API dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m); - -/* return the maximum element difference between the lower triangle of two - * n*n matrices */ -ODE_API dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/objects.h b/libraries/ode-0.9/include/ode/objects.h deleted file mode 100644 index 3e24036098..0000000000 --- a/libraries/ode-0.9/include/ode/objects.h +++ /dev/null @@ -1,1966 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_OBJECTS_H_ -#define _ODE_OBJECTS_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup world World - * - * The world object is a container for rigid bodies and joints. Objects in - * different worlds can not interact, for example rigid bodies from two - * different worlds can not collide. - * - * All the objects in a world exist at the same point in time, thus one - * reason to use separate worlds is to simulate systems at different rates. - * Most applications will only need one world. - */ - - -/** - * @brief Create a new, empty world and return its ID number. - * @return an identifier - * @ingroup world - */ -ODE_API dWorldID dWorldCreate(void); - - -/** - * @brief Destroy a world and everything in it. - * - * This includes all bodies, and all joints that are not part of a joint - * group. Joints that are part of a joint group will be deactivated, and - * can be destroyed by calling, for example, dJointGroupEmpty(). - * @ingroup world - * @param world the identifier for the world the be destroyed. - */ -ODE_API void dWorldDestroy (dWorldID world); - - -/** - * @brief Set the world's global gravity vector. - * - * The units are m/s^2, so Earth's gravity vector would be (0,0,-9.81), - * assuming that +z is up. The default is no gravity, i.e. (0,0,0). - * - * @ingroup world - */ -ODE_API void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z); - - -/** - * @brief Get the gravity vector for a given world. - * @ingroup world - */ -ODE_API void dWorldGetGravity (dWorldID, dVector3 gravity); - - -/** - * @brief Set the global ERP value, that controls how much error - * correction is performed in each time step. - * @ingroup world - * @param dWorldID the identifier of the world. - * @param erp Typical values are in the range 0.1--0.8. The default is 0.2. - */ -ODE_API void dWorldSetERP (dWorldID, dReal erp); - -/** - * @brief Get the error reduction parameter. - * @ingroup world - * @return ERP value - */ -ODE_API dReal dWorldGetERP (dWorldID); - - -/** - * @brief Set the global CFM (constraint force mixing) value. - * @ingroup world - * @param cfm Typical values are in the range @m{10^{-9}} -- 1. - * The default is 10^-5 if single precision is being used, or 10^-10 - * if double precision is being used. - */ -ODE_API void dWorldSetCFM (dWorldID, dReal cfm); - -/** - * @brief Get the constraint force mixing value. - * @ingroup world - * @return CFM value - */ -ODE_API dReal dWorldGetCFM (dWorldID); - - -/** - * @brief Step the world. - * - * This uses a "big matrix" method that takes time on the order of m^3 - * and memory on the order of m^2, where m is the total number of constraint - * rows. For large systems this will use a lot of memory and can be very slow, - * but this is currently the most accurate method. - * @ingroup world - * @param stepsize The number of seconds that the simulation has to advance. - */ -ODE_API void dWorldStep (dWorldID, dReal stepsize); - - -/** - * @brief Converts an impulse to a force. - * @ingroup world - * @remarks - * If you want to apply a linear or angular impulse to a rigid body, - * instead of a force or a torque, then you can use this function to convert - * the desired impulse into a force/torque vector before calling the - * BodyAdd... function. - * The current algorithm simply scales the impulse by 1/stepsize, - * where stepsize is the step size for the next step that will be taken. - * This function is given a dWorldID because, in the future, the force - * computation may depend on integrator parameters that are set as - * properties of the world. - */ -ODE_API void dWorldImpulseToForce -( - dWorldID, dReal stepsize, - dReal ix, dReal iy, dReal iz, dVector3 force -); - - -/** - * @brief Step the world. - * @ingroup world - * @remarks - * This uses an iterative method that takes time on the order of m*N - * and memory on the order of m, where m is the total number of constraint - * rows N is the number of iterations. - * For large systems this is a lot faster than dWorldStep(), - * but it is less accurate. - * @remarks - * QuickStep is great for stacks of objects especially when the - * auto-disable feature is used as well. - * However, it has poor accuracy for near-singular systems. - * Near-singular systems can occur when using high-friction contacts, motors, - * or certain articulated structures. For example, a robot with multiple legs - * sitting on the ground may be near-singular. - * @remarks - * There are ways to help overcome QuickStep's inaccuracy problems: - * \li Increase CFM. - * \li Reduce the number of contacts in your system (e.g. use the minimum - * number of contacts for the feet of a robot or creature). - * \li Don't use excessive friction in the contacts. - * \li Use contact slip if appropriate - * \li Avoid kinematic loops (however, kinematic loops are inevitable in - * legged creatures). - * \li Don't use excessive motor strength. - * \liUse force-based motors instead of velocity-based motors. - * - * Increasing the number of QuickStep iterations may help a little bit, but - * it is not going to help much if your system is really near singular. - */ -ODE_API void dWorldQuickStep (dWorldID w, dReal stepsize); - - -/** - * @brief Set the number of iterations that the QuickStep method performs per - * step. - * @ingroup world - * @remarks - * More iterations will give a more accurate solution, but will take - * longer to compute. - * @param num The default is 20 iterations. - */ -ODE_API void dWorldSetQuickStepNumIterations (dWorldID, int num); - - -/** - * @brief Get the number of iterations that the QuickStep method performs per - * step. - * @ingroup world - * @return nr of iterations - */ -ODE_API int dWorldGetQuickStepNumIterations (dWorldID); - -/** - * @brief Set the SOR over-relaxation parameter - * @ingroup world - * @param over_relaxation value to use by SOR - */ -ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation); - -/** - * @brief Get the SOR over-relaxation parameter - * @ingroup world - * @returns the over-relaxation setting - */ -ODE_API dReal dWorldGetQuickStepW (dWorldID); - -/* World contact parameter functions */ - -/** - * @brief Set the maximum correcting velocity that contacts are allowed - * to generate. - * @ingroup world - * @param vel The default value is infinity (i.e. no limit). - * @remarks - * Reducing this value can help prevent "popping" of deeply embedded objects. - */ -ODE_API void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel); - -/** - * @brief Get the maximum correcting velocity that contacts are allowed - * to generated. - * @ingroup world - */ -ODE_API dReal dWorldGetContactMaxCorrectingVel (dWorldID); - -/** - * @brief Set the depth of the surface layer around all geometry objects. - * @ingroup world - * @remarks - * Contacts are allowed to sink into the surface layer up to the given - * depth before coming to rest. - * @param depth The default value is zero. - * @remarks - * Increasing this to some small value (e.g. 0.001) can help prevent - * jittering problems due to contacts being repeatedly made and broken. - */ -ODE_API void dWorldSetContactSurfaceLayer (dWorldID, dReal depth); - -/** - * @brief Get the depth of the surface layer around all geometry objects. - * @ingroup world - * @returns the depth - */ -ODE_API dReal dWorldGetContactSurfaceLayer (dWorldID); - -/* StepFast1 functions */ - -/** - * @brief Step the world using the StepFast1 algorithm. - * @param stepsize the nr of seconds to advance the simulation. - * @param maxiterations The number of iterations to perform. - * @ingroup world - */ -ODE_API void dWorldStepFast1(dWorldID, dReal stepsize, int maxiterations); - - -/** - * @defgroup disable Automatic Enabling and Disabling - * - * Every body can be enabled or disabled. Enabled bodies participate in the - * simulation, while disabled bodies are turned off and do not get updated - * during a simulation step. New bodies are always created in the enabled state. - * - * A disabled body that is connected through a joint to an enabled body will be - * automatically re-enabled at the next simulation step. - * - * Disabled bodies do not consume CPU time, therefore to speed up the simulation - * bodies should be disabled when they come to rest. This can be done automatically - * with the auto-disable feature. - * - * If a body has its auto-disable flag turned on, it will automatically disable - * itself when - * @li It has been idle for a given number of simulation steps. - * @li It has also been idle for a given amount of simulation time. - * - * A body is considered to be idle when the magnitudes of both its - * linear average velocity and angular average velocity are below given thresholds. - * The sample size for the average defaults to one and can be disabled by setting - * to zero with - * - * Thus, every body has six auto-disable parameters: an enabled flag, a idle step - * count, an idle time, linear/angular average velocity thresholds, and the - * average samples count. - * - * Newly created bodies get these parameters from world. - */ - -/** - * @brief Set the AutoEnableDepth parameter used by the StepFast1 algorithm. - * @ingroup disable - */ -ODE_API void dWorldSetAutoEnableDepthSF1(dWorldID, int autoEnableDepth); - -/** - * @brief Get the AutoEnableDepth parameter used by the StepFast1 algorithm. - * @ingroup disable - */ -ODE_API int dWorldGetAutoEnableDepthSF1(dWorldID); - -/** - * @brief Get auto disable linear threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableLinearThreshold (dWorldID); - -/** - * @brief Set auto disable linear threshold for newly created bodies. - * @param linear_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold); - -/** - * @brief Get auto disable angular threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableAngularThreshold (dWorldID); - -/** - * @brief Set auto disable angular threshold for newly created bodies. - * @param linear_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold); - -/** - * @brief Get auto disable linear average threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableLinearAverageThreshold (dWorldID); - -/** - * @brief Set auto disable linear average threshold for newly created bodies. - * @param linear_average_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableLinearAverageThreshold (dWorldID, dReal linear_average_threshold); - -/** - * @brief Get auto disable angular average threshold for newly created bodies. - * @ingroup disable - * @return the threshold - */ -ODE_API dReal dWorldGetAutoDisableAngularAverageThreshold (dWorldID); - -/** - * @brief Set auto disable angular average threshold for newly created bodies. - * @param linear_average_threshold default is 0.01 - * @ingroup disable - */ -ODE_API void dWorldSetAutoDisableAngularAverageThreshold (dWorldID, dReal angular_average_threshold); - -/** - * @brief Get auto disable sample count for newly created bodies. - * @ingroup disable - * @return number of samples used - */ -ODE_API int dWorldGetAutoDisableAverageSamplesCount (dWorldID); - -/** - * @brief Set auto disable average sample count for newly created bodies. - * @ingroup disable - * @param average_samples_count Default is 1, meaning only instantaneous velocity is used. - * Set to zero to disable sampling and thus prevent any body from auto-disabling. - */ -ODE_API void dWorldSetAutoDisableAverageSamplesCount (dWorldID, unsigned int average_samples_count ); - -/** - * @brief Get auto disable steps for newly created bodies. - * @ingroup disable - * @return nr of steps - */ -ODE_API int dWorldGetAutoDisableSteps (dWorldID); - -/** - * @brief Set auto disable steps for newly created bodies. - * @ingroup disable - * @param steps default is 10 - */ -ODE_API void dWorldSetAutoDisableSteps (dWorldID, int steps); - -/** - * @brief Get auto disable time for newly created bodies. - * @ingroup disable - * @return nr of seconds - */ -ODE_API dReal dWorldGetAutoDisableTime (dWorldID); - -/** - * @brief Set auto disable time for newly created bodies. - * @ingroup disable - * @param time default is 0 seconds - */ -ODE_API void dWorldSetAutoDisableTime (dWorldID, dReal time); - -/** - * @brief Get auto disable flag for newly created bodies. - * @ingroup disable - * @return 0 or 1 - */ -ODE_API int dWorldGetAutoDisableFlag (dWorldID); - -/** - * @brief Set auto disable flag for newly created bodies. - * @ingroup disable - * @param do_auto_disable default is false. - */ -ODE_API void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable); - - - -/** - * @defgroup bodies Rigid Bodies - * - * A rigid body has various properties from the point of view of the - * simulation. Some properties change over time: - * - * @li Position vector (x,y,z) of the body's point of reference. - * Currently the point of reference must correspond to the body's center of mass. - * @li Linear velocity of the point of reference, a vector (vx,vy,vz). - * @li Orientation of a body, represented by a quaternion (qs,qx,qy,qz) or - * a 3x3 rotation matrix. - * @li Angular velocity vector (wx,wy,wz) which describes how the orientation - * changes over time. - * - * Other body properties are usually constant over time: - * - * @li Mass of the body. - * @li Position of the center of mass with respect to the point of reference. - * In the current implementation the center of mass and the point of - * reference must coincide. - * @li Inertia matrix. This is a 3x3 matrix that describes how the body's mass - * is distributed around the center of mass. Conceptually each body has an - * x-y-z coordinate frame embedded in it that moves and rotates with the body. - * - * The origin of this coordinate frame is the body's point of reference. Some values - * in ODE (vectors, matrices etc) are relative to the body coordinate frame, and others - * are relative to the global coordinate frame. - * - * Note that the shape of a rigid body is not a dynamical property (except insofar as - * it influences the various mass properties). It is only collision detection that cares - * about the detailed shape of the body. - */ - - -/** - * @brief Get auto disable linear average threshold. - * @ingroup bodies - * @return the threshold - */ -ODE_API dReal dBodyGetAutoDisableLinearThreshold (dBodyID); - -/** - * @brief Set auto disable linear average threshold. - * @ingroup bodies - * @return the threshold - */ -ODE_API void dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_average_threshold); - -/** - * @brief Get auto disable angular average threshold. - * @ingroup bodies - * @return the threshold - */ -ODE_API dReal dBodyGetAutoDisableAngularThreshold (dBodyID); - -/** - * @brief Set auto disable angular average threshold. - * @ingroup bodies - * @return the threshold - */ -ODE_API void dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_average_threshold); - -/** - * @brief Get auto disable average size (samples count). - * @ingroup bodies - * @return the nr of steps/size. - */ -ODE_API int dBodyGetAutoDisableAverageSamplesCount (dBodyID); - -/** - * @brief Set auto disable average buffer size (average steps). - * @ingroup bodies - * @param average_samples_count the nr of samples to review. - */ -ODE_API void dBodySetAutoDisableAverageSamplesCount (dBodyID, unsigned int average_samples_count); - - -/** - * @brief Get auto steps a body must be thought of as idle to disable - * @ingroup bodies - * @return the nr of steps - */ -ODE_API int dBodyGetAutoDisableSteps (dBodyID); - -/** - * @brief Set auto disable steps. - * @ingroup bodies - * @param steps the nr of steps. - */ -ODE_API void dBodySetAutoDisableSteps (dBodyID, int steps); - -/** - * @brief Get auto disable time. - * @ingroup bodies - * @return nr of seconds - */ -ODE_API dReal dBodyGetAutoDisableTime (dBodyID); - -/** - * @brief Set auto disable time. - * @ingroup bodies - * @param time nr of seconds. - */ -ODE_API void dBodySetAutoDisableTime (dBodyID, dReal time); - -/** - * @brief Get auto disable flag. - * @ingroup bodies - * @return 0 or 1 - */ -ODE_API int dBodyGetAutoDisableFlag (dBodyID); - -/** - * @brief Set auto disable flag. - * @ingroup bodies - * @param do_auto_disable 0 or 1 - */ -ODE_API void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable); - -/** - * @brief Set auto disable defaults. - * @remarks - * Set the values for the body to those set as default for the world. - * @ingroup bodies - */ -ODE_API void dBodySetAutoDisableDefaults (dBodyID); - - -/** - * @brief Retrives the world attached to te given body. - * @remarks - * - * @ingroup bodies - */ -ODE_API dWorldID dBodyGetWorld (dBodyID); - -/** - * @brief Create a body in given world. - * @remarks - * Default mass parameters are at position (0,0,0). - * @ingroup bodies - */ -ODE_API dBodyID dBodyCreate (dWorldID); - -/** - * @brief Destroy a body. - * @remarks - * All joints that are attached to this body will be put into limbo: - * i.e. unattached and not affecting the simulation, but they will NOT be - * deleted. - * @ingroup bodies - */ -ODE_API void dBodyDestroy (dBodyID); - -/** - * @brief Set the body's user-data pointer. - * @ingroup bodies - * @param data arbitraty pointer - */ -ODE_API void dBodySetData (dBodyID, void *data); - -/** - * @brief Get the body's user-data pointer. - * @ingroup bodies - * @return a pointer to the user's data. - */ -ODE_API void *dBodyGetData (dBodyID); - -/** - * @brief Set position of a body. - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - * @ingroup bodies - */ -ODE_API void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Set the orientation of a body. - * @ingroup bodies - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - */ -ODE_API void dBodySetRotation (dBodyID, const dMatrix3 R); - -/** - * @brief Set the orientation of a body. - * @ingroup bodies - * @remarks - * After setting, the outcome of the simulation is undefined - * if the new configuration is inconsistent with the joints/constraints - * that are present. - */ -ODE_API void dBodySetQuaternion (dBodyID, const dQuaternion q); - -/** - * @brief Set the linear velocity of a body. - * @ingroup bodies - */ -ODE_API void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Set the angular velocity of a body. - * @ingroup bodies - */ -ODE_API void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Get the position of a body. - * @ingroup bodies - * @remarks - * When getting, the returned values are pointers to internal data structures, - * so the vectors are valid until any changes are made to the rigid body - * system structure. - * @sa dBodyCopyPosition - */ -ODE_API const dReal * dBodyGetPosition (dBodyID); - - -/** - * @brief Copy the position of a body into a vector. - * @ingroup bodies - * @param body the body to query - * @param pos a copy of the body position - * @sa dBodyGetPosition - */ -ODE_API void dBodyCopyPosition (dBodyID body, dVector3 pos); - - -/** - * @brief Get the rotation of a body. - * @ingroup bodies - * @return pointer to a 4x3 rotation matrix. - */ -ODE_API const dReal * dBodyGetRotation (dBodyID); - - -/** - * @brief Copy the rotation of a body. - * @ingroup bodies - * @param body the body to query - * @param R a copy of the rotation matrix - * @sa dBodyGetRotation - */ -ODE_API void dBodyCopyRotation (dBodyID, dMatrix3 R); - - -/** - * @brief Get the rotation of a body. - * @ingroup bodies - * @return pointer to 4 scalars that represent the quaternion. - */ -ODE_API const dReal * dBodyGetQuaternion (dBodyID); - - -/** - * @brief Copy the orientation of a body into a quaternion. - * @ingroup bodies - * @param body the body to query - * @param quat a copy of the orientation quaternion - * @sa dBodyGetQuaternion - */ -ODE_API void dBodyCopyQuaternion(dBodyID body, dQuaternion quat); - - -/** - * @brief Get the linear velocity of a body. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetLinearVel (dBodyID); - -/** - * @brief Get the angular velocity of a body. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetAngularVel (dBodyID); - -/** - * @brief Set the mass of a body. - * @ingroup bodies - */ -ODE_API void dBodySetMass (dBodyID, const dMass *mass); - -/** - * @brief Get the mass of a body. - * @ingroup bodies - */ -ODE_API void dBodyGetMass (dBodyID, dMass *mass); - -/** - * @brief Add force at centre of mass of body in absolute coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add torque at centre of mass of body in absolute coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add force at centre of mass of body in coordinates relative to body. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add torque at centre of mass of body in coordinates relative to body. - * @ingroup bodies - */ -ODE_API void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz); - -/** - * @brief Add force at specified point in body in global coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in local coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in global coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); -/** - * @brief Add force at specified point in body in local coordinates. - * @ingroup bodies - */ -ODE_API void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz); - -/** - * @brief Return the current accumulated force vector. - * @return points to an array of 3 reals. - * @remarks - * The returned values are pointers to internal data structures, so - * the vectors are only valid until any changes are made to the rigid - * body system. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetForce (dBodyID); - -/** - * @brief Return the current accumulated torque vector. - * @return points to an array of 3 reals. - * @remarks - * The returned values are pointers to internal data structures, so - * the vectors are only valid until any changes are made to the rigid - * body system. - * @ingroup bodies - */ -ODE_API const dReal * dBodyGetTorque (dBodyID); - -/** - * @brief Set the body force accumulation vector. - * @remarks - * This is mostly useful to zero the force and torque for deactivated bodies - * before they are reactivated, in the case where the force-adding functions - * were called on them while they were deactivated. - * @ingroup bodies - */ -ODE_API void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z); - -/** - * @brief Set the body torque accumulation vector. - * @remarks - * This is mostly useful to zero the force and torque for deactivated bodies - * before they are reactivated, in the case where the force-adding functions - * were called on them while they were deactivated. - * @ingroup bodies - */ -ODE_API void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z); - -/** - * @brief Get world position of a relative point on body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetRelPointPos -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Get velocity vector in global coords of a relative point on body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetRelPointVel -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Get velocity vector in global coords of a globally - * specified point on a body. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetPointVel -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief takes a point in global coordinates and returns - * the point's position in body-relative coordinates. - * @remarks - * This is the inverse of dBodyGetRelPointPos() - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyGetPosRelPoint -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from local to world coordinates. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyVectorToWorld -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief Convert from world to local coordinates. - * @ingroup bodies - * @param result will contain the result. - */ -ODE_API void dBodyVectorFromWorld -( - dBodyID, dReal px, dReal py, dReal pz, - dVector3 result -); - -/** - * @brief controls the way a body's orientation is updated at each timestep. - * @ingroup bodies - * @param mode can be 0 or 1: - * \li 0: An ``infinitesimal'' orientation update is used. - * This is fast to compute, but it can occasionally cause inaccuracies - * for bodies that are rotating at high speed, especially when those - * bodies are joined to other bodies. - * This is the default for every new body that is created. - * \li 1: A ``finite'' orientation update is used. - * This is more costly to compute, but will be more accurate for high - * speed rotations. - * @remarks - * Note however that high speed rotations can result in many types of - * error in a simulation, and the finite mode will only fix one of those - * sources of error. - */ -ODE_API void dBodySetFiniteRotationMode (dBodyID, int mode); - -/** - * @brief sets the finite rotation axis for a body. - * @ingroup bodies - * @remarks - * This is axis only has meaning when the finite rotation mode is set - * If this axis is zero (0,0,0), full finite rotations are performed on - * the body. - * If this axis is nonzero, the body is rotated by performing a partial finite - * rotation along the axis direction followed by an infinitesimal rotation - * along an orthogonal direction. - * @remarks - * This can be useful to alleviate certain sources of error caused by quickly - * spinning bodies. For example, if a car wheel is rotating at high speed - * you can call this function with the wheel's hinge axis as the argument to - * try and improve its behavior. - */ -ODE_API void dBodySetFiniteRotationAxis (dBodyID, dReal x, dReal y, dReal z); - -/** - * @brief Get the way a body's orientation is updated each timestep. - * @ingroup bodies - * @return the mode 0 (infitesimal) or 1 (finite). - */ -ODE_API int dBodyGetFiniteRotationMode (dBodyID); - -/** - * @brief Get the finite rotation axis. - * @param result will contain the axis. - * @ingroup bodies - */ -ODE_API void dBodyGetFiniteRotationAxis (dBodyID, dVector3 result); - -/** - * @brief Get the number of joints that are attached to this body. - * @ingroup bodies - * @return nr of joints - */ -ODE_API int dBodyGetNumJoints (dBodyID b); - -/** - * @brief Return a joint attached to this body, given by index. - * @ingroup bodies - * @param index valid range is 0 to n-1 where n is the value returned by - * dBodyGetNumJoints(). - */ -ODE_API dJointID dBodyGetJoint (dBodyID, int index); - -/** - * @brief Manually enable a body. - * @param dBodyID identification of body. - * @ingroup bodies - */ -ODE_API void dBodyEnable (dBodyID); - -/** - * @brief Manually disable a body. - * @ingroup bodies - * @remarks - * A disabled body that is connected through a joint to an enabled body will - * be automatically re-enabled at the next simulation step. - */ -ODE_API void dBodyDisable (dBodyID); - -/** - * @brief Check wether a body is enabled. - * @ingroup bodies - * @return 1 if a body is currently enabled or 0 if it is disabled. - */ -ODE_API int dBodyIsEnabled (dBodyID); - -/** - * @brief Set whether the body is influenced by the world's gravity or not. - * @ingroup bodies - * @param mode when nonzero gravity affects this body. - * @remarks - * Newly created bodies are always influenced by the world's gravity. - */ -ODE_API void dBodySetGravityMode (dBodyID b, int mode); - -/** - * @brief Get whether the body is influenced by the world's gravity or not. - * @ingroup bodies - * @return nonzero means gravity affects this body. - */ -ODE_API int dBodyGetGravityMode (dBodyID b); - - - -/** - * @defgroup joints Joints - * - * In real life a joint is something like a hinge, that is used to connect two - * objects. - * In ODE a joint is very similar: It is a relationship that is enforced between - * two bodies so that they can only have certain positions and orientations - * relative to each other. - * This relationship is called a constraint -- the words joint and - * constraint are often used interchangeably. - * - * A joint has a set of parameters that can be set. These include: - * - * - * \li dParamLoStop Low stop angle or position. Setting this to - * -dInfinity (the default value) turns off the low stop. - * For rotational joints, this stop must be greater than -pi to be - * effective. - * \li dParamHiStop High stop angle or position. Setting this to - * dInfinity (the default value) turns off the high stop. - * For rotational joints, this stop must be less than pi to be - * effective. - * If the high stop is less than the low stop then both stops will - * be ineffective. - * \li dParamVel Desired motor velocity (this will be an angular or - * linear velocity). - * \li dParamFMax The maximum force or torque that the motor will use to - * achieve the desired velocity. - * This must always be greater than or equal to zero. - * Setting this to zero (the default value) turns off the motor. - * \li dParamFudgeFactor The current joint stop/motor implementation has - * a small problem: - * when the joint is at one stop and the motor is set to move it away - * from the stop, too much force may be applied for one time step, - * causing a ``jumping'' motion. - * This fudge factor is used to scale this excess force. - * It should have a value between zero and one (the default value). - * If the jumping motion is too visible in a joint, the value can be - * reduced. - * Making this value too small can prevent the motor from being able to - * move the joint away from a stop. - * \li dParamBounce The bouncyness of the stops. - * This is a restitution parameter in the range 0..1. - * 0 means the stops are not bouncy at all, 1 means maximum bouncyness. - * \li dParamCFM The constraint force mixing (CFM) value used when not - * at a stop. - * \li dParamStopERP The error reduction parameter (ERP) used by the - * stops. - * \li dParamStopCFM The constraint force mixing (CFM) value used by the - * stops. Together with the ERP value this can be used to get spongy or - * soft stops. - * Note that this is intended for unpowered joints, it does not really - * work as expected when a powered joint reaches its limit. - * \li dParamSuspensionERP Suspension error reduction parameter (ERP). - * Currently this is only implemented on the hinge-2 joint. - * \li dParamSuspensionCFM Suspension constraint force mixing (CFM) value. - * Currently this is only implemented on the hinge-2 joint. - * - * If a particular parameter is not implemented by a given joint, setting it - * will have no effect. - * These parameter names can be optionally followed by a digit (2 or 3) - * to indicate the second or third set of parameters, e.g. for the second axis - * in a hinge-2 joint, or the third axis in an AMotor joint. - */ - - -/** - * @brief Create a new joint of the ball type. - * @ingroup joints - * @remarks - * The joint is initially in "limbo" (i.e. it has no effect on the simulation) - * because it does not connect to any bodies. - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the hinge type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the slider type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateSlider (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the contact type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *); - -/** - * @brief Create a new joint of the hinge2 type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateHinge2 (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the universal type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateUniversal (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the PR (Prismatic and Rotoide) type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreatePR (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the fixed type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateFixed (dWorldID, dJointGroupID); - -ODE_API dJointID dJointCreateNull (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the A-motor type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateAMotor (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the L-motor type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID); - -/** - * @brief Create a new joint of the plane-2d type. - * @ingroup joints - * @param dJointGroupID set to 0 to allocate the joint normally. - * If it is nonzero the joint is allocated in the given joint group. - */ -ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID); - -/** - * @brief Destroy a joint. - * @ingroup joints - * - * disconnects it from its attached bodies and removing it from the world. - * However, if the joint is a member of a group then this function has no - * effect - to destroy that joint the group must be emptied or destroyed. - */ -ODE_API void dJointDestroy (dJointID); - - -/** - * @brief Create a joint group - * @ingroup joints - * @param max_size deprecated. Set to 0. - */ -ODE_API dJointGroupID dJointGroupCreate (int max_size); - -/** - * @brief Destroy a joint group. - * @ingroup joints - * - * All joints in the joint group will be destroyed. - */ -ODE_API void dJointGroupDestroy (dJointGroupID); - -/** - * @brief Empty a joint group. - * @ingroup joints - * - * All joints in the joint group will be destroyed, - * but the joint group itself will not be destroyed. - */ -ODE_API void dJointGroupEmpty (dJointGroupID); - -/** - * @brief Attach the joint to some new bodies. - * @ingroup joints - * - * If the joint is already attached, it will be detached from the old bodies - * first. - * To attach this joint to only one body, set body1 or body2 to zero - a zero - * body refers to the static environment. - * Setting both bodies to zero puts the joint into "limbo", i.e. it will - * have no effect on the simulation. - * @remarks - * Some joints, like hinge-2 need to be attached to two bodies to work. - */ -ODE_API void dJointAttach (dJointID, dBodyID body1, dBodyID body2); - -/** - * @brief Set the user-data pointer - * @ingroup joints - */ -ODE_API void dJointSetData (dJointID, void *data); - -/** - * @brief Get the user-data pointer - * @ingroup joints - */ -ODE_API void *dJointGetData (dJointID); - -/** - * @brief Get the type of the joint - * @ingroup joints - * @return the type, being one of these: - * \li JointTypeBall - * \li JointTypeHinge - * \li JointTypeSlider - * \li JointTypeContact - * \li JointTypeUniversal - * \li JointTypeHinge2 - * \li JointTypeFixed - * \li JointTypeAMotor - * \li JointTypeLMotor - */ -ODE_API int dJointGetType (dJointID); - -/** - * @brief Return the bodies that this joint connects. - * @ingroup joints - * @param index return the first (0) or second (1) body. - * @remarks - * If one of these returned body IDs is zero, the joint connects the other body - * to the static environment. - * If both body IDs are zero, the joint is in ``limbo'' and has no effect on - * the simulation. - */ -ODE_API dBodyID dJointGetBody (dJointID, int index); - -/** - * @brief Sets the datastructure that is to receive the feedback. - * - * The feedback can be used by the user, so that it is known how - * much force an individual joint exerts. - * @ingroup joints - */ -ODE_API void dJointSetFeedback (dJointID, dJointFeedback *); - -/** - * @brief Gets the datastructure that is to receive the feedback. - * @ingroup joints - */ -ODE_API dJointFeedback *dJointGetFeedback (dJointID); - -/** - * @brief Set the joint anchor point. - * @ingroup joints - * - * The joint will try to keep this point on each body - * together. The input is specified in world coordinates. - */ -ODE_API void dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Set the joint anchor point. - * @ingroup joints - */ -ODE_API void dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief Param setting for Ball joints - * @ingroup joints - */ -ODE_API void dJointSetBallParam (dJointID, int parameter, dReal value); - -/** - * @brief Set hinge anchor parameter. - * @ingroup joints - */ -ODE_API void dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z); - -ODE_API void dJointSetHingeAnchorDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - -/** - * @brief Set hinge axis. - * @ingroup joints - */ -ODE_API void dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetHingeParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the torque about the hinge axis. - * - * That is, it applies a torque with specified magnitude in the direction - * of the hinge axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ -ODE_API void dJointAddHingeTorque(dJointID joint, dReal torque); - -/** - * @brief set the joint axis - * @ingroup joints - */ -ODE_API void dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z); - -/** - * @ingroup joints - */ -ODE_API void dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetSliderParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the given force in the slider's direction. - * - * That is, it applies a force with specified magnitude, in the direction of - * slider's axis, to body1, and with the same magnitude but opposite - * direction to body2. This function is just a wrapper for dBodyAddForce(). - * @ingroup joints - */ -ODE_API void dJointAddSliderForce(dJointID joint, dReal force); - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetHinge2Param (dJointID, int parameter, dReal value); - -/** - * @brief Applies torque1 about the hinge2's axis 1, torque2 about the - * hinge2's axis 2. - * @remarks This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddHinge2Torques(dJointID joint, dReal torque1, dReal torque2); - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetUniversalParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies torque1 about the universal's axis 1, torque2 about the - * universal's axis 2. - * @remarks This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddUniversalTorques(dJointID joint, dReal torque1, dReal torque2); - - -/** - * @brief set anchor - * @ingroup joints - */ -ODE_API void dJointSetPRAnchor (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set the axis for the prismatic articulation - * @ingroup joints - */ -ODE_API void dJointSetPRAxis1 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set the axis for the rotoide articulation - * @ingroup joints - */ -ODE_API void dJointSetPRAxis2 (dJointID, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - * - * @note parameterX where X equal 2 refer to parameter for the rotoide articulation - */ -ODE_API void dJointSetPRParam (dJointID, int parameter, dReal value); - -/** - * @brief Applies the torque about the rotoide axis of the PR joint - * - * That is, it applies a torque with specified magnitude in the direction - * of the rotoide axis, to body 1, and with the same magnitude but in opposite - * direction to body 2. This function is just a wrapper for dBodyAddTorque()} - * @ingroup joints - */ -ODE_API void dJointAddPRTorque (dJointID j, dReal torque); - - -/** - * @brief Call this on the fixed joint after it has been attached to - * remember the current desired relative offset and desired relative - * rotation between the bodies. - * @ingroup joints - */ -ODE_API void dJointSetFixed (dJointID); - -/* - * @brief Sets joint parameter - * - * @ingroup joints - */ -ODE_API void dJointSetFixedParam (dJointID, int parameter, dReal value); - -/** - * @brief set the nr of axes - * @param num 0..3 - * @ingroup joints - */ -ODE_API void dJointSetAMotorNumAxes (dJointID, int num); - -/** - * @brief set axis - * @ingroup joints - */ -ODE_API void dJointSetAMotorAxis (dJointID, int anum, int rel, - dReal x, dReal y, dReal z); - -/** - * @brief Tell the AMotor what the current angle is along axis anum. - * - * This function should only be called in dAMotorUser mode, because in this - * mode the AMotor has no other way of knowing the joint angles. - * The angle information is needed if stops have been set along the axis, - * but it is not needed for axis motors. - * @ingroup joints - */ -ODE_API void dJointSetAMotorAngle (dJointID, int anum, dReal angle); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetAMotorParam (dJointID, int parameter, dReal value); - -/** - * @brief set mode - * @ingroup joints - */ -ODE_API void dJointSetAMotorMode (dJointID, int mode); - -/** - * @brief Applies torque0 about the AMotor's axis 0, torque1 about the - * AMotor's axis 1, and torque2 about the AMotor's axis 2. - * @remarks - * If the motor has fewer than three axes, the higher torques are ignored. - * This function is just a wrapper for dBodyAddTorque(). - * @ingroup joints - */ -ODE_API void dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3); - -/** - * @brief Set the number of axes that will be controlled by the LMotor. - * @param num can range from 0 (which effectively deactivates the joint) to 3. - * @ingroup joints - */ -ODE_API void dJointSetLMotorNumAxes (dJointID, int num); - -/** - * @brief Set the AMotor axes. - * @param anum selects the axis to change (0,1 or 2). - * @param rel Each axis can have one of three ``relative orientation'' modes - * \li 0: The axis is anchored to the global frame. - * \li 1: The axis is anchored to the first body. - * \li 2: The axis is anchored to the second body. - * @remarks The axis vector is always specified in global coordinates - * regardless of the setting of rel. - * @ingroup joints - */ -ODE_API void dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z); - -/** - * @brief set joint parameter - * @ingroup joints - */ -ODE_API void dJointSetLMotorParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ -ODE_API void dJointSetPlane2DXParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ - -ODE_API void dJointSetPlane2DYParam (dJointID, int parameter, dReal value); - -/** - * @ingroup joints - */ -ODE_API void dJointSetPlane2DAngleParam (dJointID, int parameter, dReal value); - -/** - * @brief Get the joint anchor point, in world coordinates. - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - */ -ODE_API void dJointGetBallAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * - * This returns the point on body 2. You can think of a ball and socket - * joint as trying to keep the result of dJointGetBallAnchor() and - * dJointGetBallAnchor2() the same. If the joint is perfectly satisfied, - * this function will return the same value as dJointGetBallAnchor() to - * within roundoff errors. dJointGetBallAnchor2() can be used, along with - * dJointGetBallAnchor(), to see how far the joint has come apart. - */ -ODE_API void dJointGetBallAnchor2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetBallParam (dJointID, int parameter); - -/** - * @brief Get the hinge anchor point, in world coordinates. - * - * This returns the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetHingeAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return The point on body 2. If the joint is perfectly satisfied, - * this will return the same value as dJointGetHingeAnchor(). - * If not, this value will be slightly different. - * This can be used, for example, to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetHingeAnchor2 (dJointID, dVector3 result); - -/** - * @brief get axis - * @ingroup joints - */ -ODE_API void dJointGetHingeAxis (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetHingeParam (dJointID, int parameter); - -/** - * @brief Get the hinge angle. - * - * The angle is measured between the two bodies, or between the body and - * the static environment. - * The angle will be between -pi..pi. - * When the hinge anchor or axis is set, the current position of the attached - * bodies is examined and that position will be the zero angle. - * @ingroup joints - */ -ODE_API dReal dJointGetHingeAngle (dJointID); - -/** - * @brief Get the hinge angle time derivative. - * @ingroup joints - */ -ODE_API dReal dJointGetHingeAngleRate (dJointID); - -/** - * @brief Get the slider linear position (i.e. the slider's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * @ingroup joints - */ -ODE_API dReal dJointGetSliderPosition (dJointID); - -/** - * @brief Get the slider linear position's time derivative. - * @ingroup joints - */ -ODE_API dReal dJointGetSliderPositionRate (dJointID); - -/** - * @brief Get the slider axis - * @ingroup joints - */ -ODE_API void dJointGetSliderAxis (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetSliderParam (dJointID, int parameter); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetHinge2Anchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * This returns the point on body 2. If the joint is perfectly satisfied, - * this will return the same value as dJointGetHinge2Anchor. - * If not, this value will be slightly different. - * This can be used, for example, to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetHinge2Anchor2 (dJointID, dVector3 result); - -/** - * @brief Get joint axis - * @ingroup joints - */ -ODE_API void dJointGetHinge2Axis1 (dJointID, dVector3 result); - -/** - * @brief Get joint axis - * @ingroup joints - */ -ODE_API void dJointGetHinge2Axis2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Param (dJointID, int parameter); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle1 (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle1Rate (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetHinge2Angle2Rate (dJointID); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetUniversalAnchor (dJointID, dVector3 result); - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return This returns the point on body 2. - * @remarks - * You can think of the ball and socket part of a universal joint as - * trying to keep the result of dJointGetBallAnchor() and - * dJointGetBallAnchor2() the same. If the joint is - * perfectly satisfied, this function will return the same value - * as dJointGetUniversalAnchor() to within roundoff errors. - * dJointGetUniversalAnchor2() can be used, along with - * dJointGetUniversalAnchor(), to see how far the joint has come apart. - * @ingroup joints - */ -ODE_API void dJointGetUniversalAnchor2 (dJointID, dVector3 result); - -/** - * @brief Get axis - * @ingroup joints - */ -ODE_API void dJointGetUniversalAxis1 (dJointID, dVector3 result); - -/** - * @brief Get axis - * @ingroup joints - */ -ODE_API void dJointGetUniversalAxis2 (dJointID, dVector3 result); - - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalParam (dJointID, int parameter); - -/** - * @brief Get both angles at the same time. - * @ingroup joints - * - * @param joint The universal joint for which we want to calculate the angles - * @param angle1 The angle between the body1 and the axis 1 - * @param angle2 The angle between the body2 and the axis 2 - * - * @note This function combine getUniversalAngle1 and getUniversalAngle2 together - * and try to avoid redundant calculation - */ -ODE_API void dJointGetUniversalAngles (dJointID, dReal *angle1, dReal *angle2); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle1 (dJointID); - -/** - * @brief Get angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle2 (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle1Rate (dJointID); - -/** - * @brief Get time derivative of angle - * @ingroup joints - */ -ODE_API dReal dJointGetUniversalAngle2Rate (dJointID); - - - -/** - * @brief Get the joint anchor point, in world coordinates. - * @return the point on body 1. If the joint is perfectly satisfied, - * this will be the same as the point on body 2. - * @ingroup joints - */ -ODE_API void dJointGetPRAnchor (dJointID, dVector3 result); - -/** - * @brief Get the PR linear position (i.e. the prismatic's extension) - * - * When the axis is set, the current position of the attached bodies is - * examined and that position will be the zero position. - * - * The position is the "oriented" length between the - * position = (Prismatic axis) dot_product [(body1 + offset) - (body2 + anchor2)] - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRPosition (dJointID); - -/** - * @brief Get the PR linear position's time derivative - * - * @ingroup joints - */ -ODE_API dReal dJointGetPRPositionRate (dJointID); - - -/** - * @brief Get the prismatic axis - * @ingroup joints - */ -ODE_API void dJointGetPRAxis1 (dJointID, dVector3 result); - -/** - * @brief Get the Rotoide axis - * @ingroup joints - */ -ODE_API void dJointGetPRAxis2 (dJointID, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetPRParam (dJointID, int parameter); - - - -/** - * @brief Get the number of angular axes that will be controlled by the - * AMotor. - * @param num can range from 0 (which effectively deactivates the - * joint) to 3. - * This is automatically set to 3 in dAMotorEuler mode. - * @ingroup joints - */ -ODE_API int dJointGetAMotorNumAxes (dJointID); - -/** - * @brief Get the AMotor axes. - * @param anum selects the axis to change (0,1 or 2). - * @param rel Each axis can have one of three ``relative orientation'' modes. - * \li 0: The axis is anchored to the global frame. - * \li 1: The axis is anchored to the first body. - * \li 2: The axis is anchored to the second body. - * @ingroup joints - */ -ODE_API void dJointGetAMotorAxis (dJointID, int anum, dVector3 result); - -/** - * @brief Get axis - * @remarks - * The axis vector is always specified in global coordinates regardless - * of the setting of rel. - * There are two GetAMotorAxis functions, one to return the axis and one to - * return the relative mode. - * - * For dAMotorEuler mode: - * \li Only axes 0 and 2 need to be set. Axis 1 will be determined - automatically at each time step. - * \li Axes 0 and 2 must be perpendicular to each other. - * \li Axis 0 must be anchored to the first body, axis 2 must be anchored - to the second body. - * @ingroup joints - */ -ODE_API int dJointGetAMotorAxisRel (dJointID, int anum); - -/** - * @brief Get the current angle for axis. - * @remarks - * In dAMotorUser mode this is simply the value that was set with - * dJointSetAMotorAngle(). - * In dAMotorEuler mode this is the corresponding euler angle. - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorAngle (dJointID, int anum); - -/** - * @brief Get the current angle rate for axis anum. - * @remarks - * In dAMotorUser mode this is always zero, as not enough information is - * available. - * In dAMotorEuler mode this is the corresponding euler angle rate. - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorAngleRate (dJointID, int anum); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetAMotorParam (dJointID, int parameter); - -/** - * @brief Get the angular motor mode. - * @param mode must be one of the following constants: - * \li dAMotorUser The AMotor axes and joint angle settings are entirely - * controlled by the user. This is the default mode. - * \li dAMotorEuler Euler angles are automatically computed. - * The axis a1 is also automatically computed. - * The AMotor axes must be set correctly when in this mode, - * as described below. - * When this mode is initially set the current relative orientations - * of the bodies will correspond to all euler angles at zero. - * @ingroup joints - */ -ODE_API int dJointGetAMotorMode (dJointID); - -/** - * @brief Get nr of axes. - * @ingroup joints - */ -ODE_API int dJointGetLMotorNumAxes (dJointID); - -/** - * @brief Get axis. - * @ingroup joints - */ -ODE_API void dJointGetLMotorAxis (dJointID, int anum, dVector3 result); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetLMotorParam (dJointID, int parameter); - -/** - * @brief get joint parameter - * @ingroup joints - */ -ODE_API dReal dJointGetFixedParam (dJointID, int parameter); - - -/** - * @ingroup joints - */ -ODE_API dJointID dConnectingJoint (dBodyID, dBodyID); - -/** - * @ingroup joints - */ -ODE_API int dConnectingJointList (dBodyID, dBodyID, dJointID*); - -/** - * @brief Utility function - * @return 1 if the two bodies are connected together by - * a joint, otherwise return 0. - * @ingroup joints - */ -ODE_API int dAreConnected (dBodyID, dBodyID); - -/** - * @brief Utility function - * @return 1 if the two bodies are connected together by - * a joint that does not have type @arg{joint_type}, otherwise return 0. - * @param body1 A body to check. - * @param body2 A body to check. - * @param joint_type is a dJointTypeXXX constant. - * This is useful for deciding whether to add contact joints between two bodies: - * if they are already connected by non-contact joints then it may not be - * appropriate to add contacts, however it is okay to add more contact between- - * bodies that already have contacts. - * @ingroup joints - */ -ODE_API int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/ode.h b/libraries/ode-0.9/include/ode/ode.h deleted file mode 100644 index 00cd500b3a..0000000000 --- a/libraries/ode-0.9/include/ode/ode.h +++ /dev/null @@ -1,47 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODE_H_ -#define _ODE_ODE_H_ - -/* include *everything* here */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/libraries/ode-0.9/include/ode/odecpp.h b/libraries/ode-0.9/include/ode/odecpp.h deleted file mode 100644 index 62161fd57d..0000000000 --- a/libraries/ode-0.9/include/ode/odecpp.h +++ /dev/null @@ -1,712 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* C++ interface for non-collision stuff */ - - -#ifndef _ODE_ODECPP_H_ -#define _ODE_ODECPP_H_ -#ifdef __cplusplus - -#include - - -class dWorld { - dWorldID _id; - - // intentionally undefined, don't use these - dWorld (const dWorld &); - void operator= (const dWorld &); - -public: - dWorld() - { _id = dWorldCreate(); } - ~dWorld() - { dWorldDestroy (_id); } - - dWorldID id() const - { return _id; } - operator dWorldID() const - { return _id; } - - void setGravity (dReal x, dReal y, dReal z) - { dWorldSetGravity (_id,x,y,z); } - void getGravity (dVector3 g) const - { dWorldGetGravity (_id,g); } - - void setERP (dReal erp) - { dWorldSetERP(_id, erp); } - dReal getERP() const - { return dWorldGetERP(_id); } - - void setCFM (dReal cfm) - { dWorldSetCFM(_id, cfm); } - dReal getCFM() const - { return dWorldGetCFM(_id); } - - void step (dReal stepsize) - { dWorldStep (_id,stepsize); } - - void stepFast1 (dReal stepsize, int maxiterations) - { dWorldStepFast1 (_id,stepsize,maxiterations); } - void setAutoEnableDepthSF1(dWorldID, int depth) - { dWorldSetAutoEnableDepthSF1 (_id, depth); } - int getAutoEnableDepthSF1(dWorldID) - { return dWorldGetAutoEnableDepthSF1 (_id); } - - void setAutoDisableLinearThreshold (dReal threshold) - { dWorldSetAutoDisableLinearThreshold (_id,threshold); } - dReal getAutoDisableLinearThreshold() - { return dWorldGetAutoDisableLinearThreshold (_id); } - void setAutoDisableAngularThreshold (dReal threshold) - { dWorldSetAutoDisableAngularThreshold (_id,threshold); } - dReal getAutoDisableAngularThreshold() - { return dWorldGetAutoDisableAngularThreshold (_id); } - void setAutoDisableSteps (int steps) - { dWorldSetAutoDisableSteps (_id,steps); } - int getAutoDisableSteps() - { return dWorldGetAutoDisableSteps (_id); } - void setAutoDisableTime (dReal time) - { dWorldSetAutoDisableTime (_id,time); } - dReal getAutoDisableTime() - { return dWorldGetAutoDisableTime (_id); } - void setAutoDisableFlag (int do_auto_disable) - { dWorldSetAutoDisableFlag (_id,do_auto_disable); } - int getAutoDisableFlag() - { return dWorldGetAutoDisableFlag (_id); } - - void impulseToForce (dReal stepsize, dReal ix, dReal iy, dReal iz, - dVector3 force) - { dWorldImpulseToForce (_id,stepsize,ix,iy,iz,force); } -}; - - -class dBody { - dBodyID _id; - - // intentionally undefined, don't use these - dBody (const dBody &); - void operator= (const dBody &); - -public: - dBody() - { _id = 0; } - dBody (dWorldID world) - { _id = dBodyCreate (world); } - ~dBody() - { if (_id) dBodyDestroy (_id); } - - void create (dWorldID world) { - if (_id) dBodyDestroy (_id); - _id = dBodyCreate (world); - } - - dBodyID id() const - { return _id; } - operator dBodyID() const - { return _id; } - - void setData (void *data) - { dBodySetData (_id,data); } - void *getData() const - { return dBodyGetData (_id); } - - void setPosition (dReal x, dReal y, dReal z) - { dBodySetPosition (_id,x,y,z); } - void setRotation (const dMatrix3 R) - { dBodySetRotation (_id,R); } - void setQuaternion (const dQuaternion q) - { dBodySetQuaternion (_id,q); } - void setLinearVel (dReal x, dReal y, dReal z) - { dBodySetLinearVel (_id,x,y,z); } - void setAngularVel (dReal x, dReal y, dReal z) - { dBodySetAngularVel (_id,x,y,z); } - - const dReal * getPosition() const - { return dBodyGetPosition (_id); } - const dReal * getRotation() const - { return dBodyGetRotation (_id); } - const dReal * getQuaternion() const - { return dBodyGetQuaternion (_id); } - const dReal * getLinearVel() const - { return dBodyGetLinearVel (_id); } - const dReal * getAngularVel() const - { return dBodyGetAngularVel (_id); } - - void setMass (const dMass *mass) - { dBodySetMass (_id,mass); } - void getMass (dMass *mass) const - { dBodyGetMass (_id,mass); } - - void addForce (dReal fx, dReal fy, dReal fz) - { dBodyAddForce (_id, fx, fy, fz); } - void addTorque (dReal fx, dReal fy, dReal fz) - { dBodyAddTorque (_id, fx, fy, fz); } - void addRelForce (dReal fx, dReal fy, dReal fz) - { dBodyAddRelForce (_id, fx, fy, fz); } - void addRelTorque (dReal fx, dReal fy, dReal fz) - { dBodyAddRelTorque (_id, fx, fy, fz); } - void addForceAtPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddForceAtPos (_id, fx, fy, fz, px, py, pz); } - void addForceAtRelPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddForceAtRelPos (_id, fx, fy, fz, px, py, pz); } - void addRelForceAtPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddRelForceAtPos (_id, fx, fy, fz, px, py, pz); } - void addRelForceAtRelPos (dReal fx, dReal fy, dReal fz, - dReal px, dReal py, dReal pz) - { dBodyAddRelForceAtRelPos (_id, fx, fy, fz, px, py, pz); } - - const dReal * getForce() const - { return dBodyGetForce(_id); } - const dReal * getTorque() const - { return dBodyGetTorque(_id); } - void setForce (dReal x, dReal y, dReal z) - { dBodySetForce (_id,x,y,z); } - void setTorque (dReal x, dReal y, dReal z) - { dBodySetTorque (_id,x,y,z); } - - void enable() - { dBodyEnable (_id); } - void disable() - { dBodyDisable (_id); } - int isEnabled() const - { return dBodyIsEnabled (_id); } - - void getRelPointPos (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetRelPointPos (_id, px, py, pz, result); } - void getRelPointVel (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetRelPointVel (_id, px, py, pz, result); } - void getPointVel (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetPointVel (_id,px,py,pz,result); } - void getPosRelPoint (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyGetPosRelPoint (_id,px,py,pz,result); } - void vectorToWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyVectorToWorld (_id,px,py,pz,result); } - void vectorFromWorld (dReal px, dReal py, dReal pz, dVector3 result) const - { dBodyVectorFromWorld (_id,px,py,pz,result); } - - void setFiniteRotationMode (int mode) - { dBodySetFiniteRotationMode (_id, mode); } - void setFiniteRotationAxis (dReal x, dReal y, dReal z) - { dBodySetFiniteRotationAxis (_id, x, y, z); } - - int getFiniteRotationMode() const - { return dBodyGetFiniteRotationMode (_id); } - void getFiniteRotationAxis (dVector3 result) const - { dBodyGetFiniteRotationAxis (_id, result); } - - int getNumJoints() const - { return dBodyGetNumJoints (_id); } - dJointID getJoint (int index) const - { return dBodyGetJoint (_id, index); } - - void setGravityMode (int mode) - { dBodySetGravityMode (_id,mode); } - int getGravityMode() const - { return dBodyGetGravityMode (_id); } - - int isConnectedTo (dBodyID body) const - { return dAreConnected (_id, body); } - - void setAutoDisableLinearThreshold (dReal threshold) - { dBodySetAutoDisableLinearThreshold (_id,threshold); } - dReal getAutoDisableLinearThreshold() - { return dBodyGetAutoDisableLinearThreshold (_id); } - void setAutoDisableAngularThreshold (dReal threshold) - { dBodySetAutoDisableAngularThreshold (_id,threshold); } - dReal getAutoDisableAngularThreshold() - { return dBodyGetAutoDisableAngularThreshold (_id); } - void setAutoDisableSteps (int steps) - { dBodySetAutoDisableSteps (_id,steps); } - int getAutoDisableSteps() - { return dBodyGetAutoDisableSteps (_id); } - void setAutoDisableTime (dReal time) - { dBodySetAutoDisableTime (_id,time); } - dReal getAutoDisableTime() - { return dBodyGetAutoDisableTime (_id); } - void setAutoDisableFlag (int do_auto_disable) - { dBodySetAutoDisableFlag (_id,do_auto_disable); } - int getAutoDisableFlag() - { return dBodyGetAutoDisableFlag (_id); } -}; - - -class dJointGroup { - dJointGroupID _id; - - // intentionally undefined, don't use these - dJointGroup (const dJointGroup &); - void operator= (const dJointGroup &); - -public: - dJointGroup (int dummy_arg=0) - { _id = dJointGroupCreate (0); } - ~dJointGroup() - { dJointGroupDestroy (_id); } - void create (int dummy_arg=0) { - if (_id) dJointGroupDestroy (_id); - _id = dJointGroupCreate (0); - } - - dJointGroupID id() const - { return _id; } - operator dJointGroupID() const - { return _id; } - - void empty() - { dJointGroupEmpty (_id); } -}; - - -class dJoint { -private: - // intentionally undefined, don't use these - dJoint (const dJoint &) ; - void operator= (const dJoint &); - -protected: - dJointID _id; - -public: - dJoint() - { _id = 0; } - ~dJoint() - { if (_id) dJointDestroy (_id); } - - dJointID id() const - { return _id; } - operator dJointID() const - { return _id; } - - void attach (dBodyID body1, dBodyID body2) - { dJointAttach (_id, body1, body2); } - - void setData (void *data) - { dJointSetData (_id, data); } - void *getData() const - { return dJointGetData (_id); } - - int getType() const - { return dJointGetType (_id); } - - dBodyID getBody (int index) const - { return dJointGetBody (_id, index); } - - void setFeedback(dJointFeedback *fb) - { dJointSetFeedback(_id, fb); } - dJointFeedback *getFeedback() const - { return dJointGetFeedback(_id); } -}; - - -class dBallJoint : public dJoint { -private: - // intentionally undefined, don't use these - dBallJoint (const dBallJoint &); - void operator= (const dBallJoint &); - -public: - dBallJoint() { } - dBallJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateBall (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateBall (world, group); - } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetBallAnchor (_id, x, y, z); } - void getAnchor (dVector3 result) const - { dJointGetBallAnchor (_id, result); } - void getAnchor2 (dVector3 result) const - { dJointGetBallAnchor2 (_id, result); } - void setParam (int parameter, dReal value) - { dJointSetBallParam (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetBallParam (_id, parameter); } -} ; - - -class dHingeJoint : public dJoint { - // intentionally undefined, don't use these - dHingeJoint (const dHingeJoint &); - void operator = (const dHingeJoint &); - -public: - dHingeJoint() { } - dHingeJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateHinge (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateHinge (world, group); - } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetHingeAnchor (_id, x, y, z); } - void getAnchor (dVector3 result) const - { dJointGetHingeAnchor (_id, result); } - void getAnchor2 (dVector3 result) const - { dJointGetHingeAnchor2 (_id, result); } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetHingeAxis (_id, x, y, z); } - void getAxis (dVector3 result) const - { dJointGetHingeAxis (_id, result); } - - dReal getAngle() const - { return dJointGetHingeAngle (_id); } - dReal getAngleRate() const - { return dJointGetHingeAngleRate (_id); } - - void setParam (int parameter, dReal value) - { dJointSetHingeParam (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetHingeParam (_id, parameter); } - - void addTorque (dReal torque) - { dJointAddHingeTorque(_id, torque); } -}; - - -class dSliderJoint : public dJoint { - // intentionally undefined, don't use these - dSliderJoint (const dSliderJoint &); - void operator = (const dSliderJoint &); - -public: - dSliderJoint() { } - dSliderJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateSlider (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateSlider (world, group); - } - - void setAxis (dReal x, dReal y, dReal z) - { dJointSetSliderAxis (_id, x, y, z); } - void getAxis (dVector3 result) const - { dJointGetSliderAxis (_id, result); } - - dReal getPosition() const - { return dJointGetSliderPosition (_id); } - dReal getPositionRate() const - { return dJointGetSliderPositionRate (_id); } - - void setParam (int parameter, dReal value) - { dJointSetSliderParam (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetSliderParam (_id, parameter); } - - void addForce (dReal force) - { dJointAddSliderForce(_id, force); } -}; - - -class dUniversalJoint : public dJoint { - // intentionally undefined, don't use these - dUniversalJoint (const dUniversalJoint &); - void operator = (const dUniversalJoint &); - -public: - dUniversalJoint() { } - dUniversalJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateUniversal (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateUniversal (world, group); - } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetUniversalAnchor (_id, x, y, z); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetUniversalAxis1 (_id, x, y, z); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetUniversalAxis2 (_id, x, y, z); } - void setParam (int parameter, dReal value) - { dJointSetUniversalParam (_id, parameter, value); } - - void getAnchor (dVector3 result) const - { dJointGetUniversalAnchor (_id, result); } - void getAnchor2 (dVector3 result) const - { dJointGetUniversalAnchor2 (_id, result); } - void getAxis1 (dVector3 result) const - { dJointGetUniversalAxis1 (_id, result); } - void getAxis2 (dVector3 result) const - { dJointGetUniversalAxis2 (_id, result); } - dReal getParam (int parameter) const - { return dJointGetUniversalParam (_id, parameter); } - void getAngles(dReal *angle1, dReal *angle2) const - { dJointGetUniversalAngles (_id, angle1, angle2); } - - dReal getAngle1() const - { return dJointGetUniversalAngle1 (_id); } - dReal getAngle1Rate() const - { return dJointGetUniversalAngle1Rate (_id); } - dReal getAngle2() const - { return dJointGetUniversalAngle2 (_id); } - dReal getAngle2Rate() const - { return dJointGetUniversalAngle2Rate (_id); } - - void addTorques (dReal torque1, dReal torque2) - { dJointAddUniversalTorques(_id, torque1, torque2); } -}; - - -class dHinge2Joint : public dJoint { - // intentionally undefined, don't use these - dHinge2Joint (const dHinge2Joint &); - void operator = (const dHinge2Joint &); - -public: - dHinge2Joint() { } - dHinge2Joint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateHinge2 (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateHinge2 (world, group); - } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetHinge2Anchor (_id, x, y, z); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetHinge2Axis1 (_id, x, y, z); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetHinge2Axis2 (_id, x, y, z); } - - void getAnchor (dVector3 result) const - { dJointGetHinge2Anchor (_id, result); } - void getAnchor2 (dVector3 result) const - { dJointGetHinge2Anchor2 (_id, result); } - void getAxis1 (dVector3 result) const - { dJointGetHinge2Axis1 (_id, result); } - void getAxis2 (dVector3 result) const - { dJointGetHinge2Axis2 (_id, result); } - - dReal getAngle1() const - { return dJointGetHinge2Angle1 (_id); } - dReal getAngle1Rate() const - { return dJointGetHinge2Angle1Rate (_id); } - dReal getAngle2Rate() const - { return dJointGetHinge2Angle2Rate (_id); } - - void setParam (int parameter, dReal value) - { dJointSetHinge2Param (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetHinge2Param (_id, parameter); } - - void addTorques(dReal torque1, dReal torque2) - { dJointAddHinge2Torques(_id, torque1, torque2); } -}; - - -class dPRJoint : public dJoint { - dPRJoint (const dPRJoint &); - void operator = (const dPRJoint &); - -public: - dPRJoint() { } - dPRJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreatePR (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreatePR (world, group); - } - - void setAnchor (dReal x, dReal y, dReal z) - { dJointSetPRAnchor (_id, x, y, z); } - void setAxis1 (dReal x, dReal y, dReal z) - { dJointSetPRAxis1 (_id, x, y, z); } - void setAxis2 (dReal x, dReal y, dReal z) - { dJointSetPRAxis2 (_id, x, y, z); } - - void getAnchor (dVector3 result) const - { dJointGetPRAnchor (_id, result); } - void getAxis1 (dVector3 result) const - { dJointGetPRAxis1 (_id, result); } - void getAxis2 (dVector3 result) const - { dJointGetPRAxis2 (_id, result); } - - dReal getPosition() const - { return dJointGetPRPosition (_id); } - dReal getPositionRate() const - { return dJointGetPRPositionRate (_id); } - - void setParam (int parameter, dReal value) - { dJointSetPRParam (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetPRParam (_id, parameter); } -}; - - -class dFixedJoint : public dJoint { - // intentionally undefined, don't use these - dFixedJoint (const dFixedJoint &); - void operator = (const dFixedJoint &); - -public: - dFixedJoint() { } - dFixedJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateFixed (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateFixed (world, group); - } - - void set() - { dJointSetFixed (_id); } - - void setParam (int parameter, dReal value) - { dJointSetFixedParam (_id, parameter, value); } - - dReal getParam (int parameter) const - { return dJointGetFixedParam (_id, parameter); } -}; - - -class dContactJoint : public dJoint { - // intentionally undefined, don't use these - dContactJoint (const dContactJoint &); - void operator = (const dContactJoint &); - -public: - dContactJoint() { } - dContactJoint (dWorldID world, dJointGroupID group, dContact *contact) - { _id = dJointCreateContact (world, group, contact); } - - void create (dWorldID world, dJointGroupID group, dContact *contact) { - if (_id) dJointDestroy (_id); - _id = dJointCreateContact (world, group, contact); - } -}; - - -class dNullJoint : public dJoint { - // intentionally undefined, don't use these - dNullJoint (const dNullJoint &); - void operator = (const dNullJoint &); - -public: - dNullJoint() { } - dNullJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateNull (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateNull (world, group); - } -}; - - -class dAMotorJoint : public dJoint { - // intentionally undefined, don't use these - dAMotorJoint (const dAMotorJoint &); - void operator = (const dAMotorJoint &); - -public: - dAMotorJoint() { } - dAMotorJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateAMotor (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateAMotor (world, group); - } - - void setMode (int mode) - { dJointSetAMotorMode (_id, mode); } - int getMode() const - { return dJointGetAMotorMode (_id); } - - void setNumAxes (int num) - { dJointSetAMotorNumAxes (_id, num); } - int getNumAxes() const - { return dJointGetAMotorNumAxes (_id); } - - void setAxis (int anum, int rel, dReal x, dReal y, dReal z) - { dJointSetAMotorAxis (_id, anum, rel, x, y, z); } - void getAxis (int anum, dVector3 result) const - { dJointGetAMotorAxis (_id, anum, result); } - int getAxisRel (int anum) const - { return dJointGetAMotorAxisRel (_id, anum); } - - void setAngle (int anum, dReal angle) - { dJointSetAMotorAngle (_id, anum, angle); } - dReal getAngle (int anum) const - { return dJointGetAMotorAngle (_id, anum); } - dReal getAngleRate (int anum) - { return dJointGetAMotorAngleRate (_id,anum); } - - void setParam (int parameter, dReal value) - { dJointSetAMotorParam (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetAMotorParam (_id, parameter); } - - void addTorques(dReal torque1, dReal torque2, dReal torque3) - { dJointAddAMotorTorques(_id, torque1, torque2, torque3); } -}; - - -class dLMotorJoint : public dJoint { - // intentionally undefined, don't use these - dLMotorJoint (const dLMotorJoint &); - void operator = (const dLMotorJoint &); - -public: - dLMotorJoint() { } - dLMotorJoint (dWorldID world, dJointGroupID group=0) - { _id = dJointCreateLMotor (world, group); } - - void create (dWorldID world, dJointGroupID group=0) { - if (_id) dJointDestroy (_id); - _id = dJointCreateLMotor (world, group); - } - - void setNumAxes (int num) - { dJointSetLMotorNumAxes (_id, num); } - int getNumAxes() const - { return dJointGetLMotorNumAxes (_id); } - - void setAxis (int anum, int rel, dReal x, dReal y, dReal z) - { dJointSetLMotorAxis (_id, anum, rel, x, y, z); } - void getAxis (int anum, dVector3 result) const - { dJointGetLMotorAxis (_id, anum, result); } - - void setParam (int parameter, dReal value) - { dJointSetLMotorParam (_id, parameter, value); } - dReal getParam (int parameter) const - { return dJointGetLMotorParam (_id, parameter); } -}; - - - -#endif -#endif diff --git a/libraries/ode-0.9/include/ode/odecpp_collision.h b/libraries/ode-0.9/include/ode/odecpp_collision.h deleted file mode 100644 index 16ca78f7fb..0000000000 --- a/libraries/ode-0.9/include/ode/odecpp_collision.h +++ /dev/null @@ -1,346 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* C++ interface for new collision API */ - - -#ifndef _ODE_ODECPP_COLLISION_H_ -#define _ODE_ODECPP_COLLISION_H_ -#ifdef __cplusplus - -#include - - -class dGeom { - // intentionally undefined, don't use these - dGeom (dGeom &); - void operator= (dGeom &); - -protected: - dGeomID _id; - -public: - dGeom() - { _id = 0; } - ~dGeom() - { if (_id) dGeomDestroy (_id); } - - dGeomID id() const - { return _id; } - operator dGeomID() const - { return _id; } - - void destroy() { - if (_id) dGeomDestroy (_id); - _id = 0; - } - - int getClass() const - { return dGeomGetClass (_id); } - - dSpaceID getSpace() const - { return dGeomGetSpace (_id); } - - void setData (void *data) - { dGeomSetData (_id,data); } - void *getData() const - { return dGeomGetData (_id); } - - void setBody (dBodyID b) - { dGeomSetBody (_id,b); } - dBodyID getBody() const - { return dGeomGetBody (_id); } - - void setPosition (dReal x, dReal y, dReal z) - { dGeomSetPosition (_id,x,y,z); } - const dReal * getPosition() const - { return dGeomGetPosition (_id); } - - void setRotation (const dMatrix3 R) - { dGeomSetRotation (_id,R); } - const dReal * getRotation() const - { return dGeomGetRotation (_id); } - - void setQuaternion (const dQuaternion quat) - { dGeomSetQuaternion (_id,quat); } - void getQuaternion (dQuaternion quat) const - { dGeomGetQuaternion (_id,quat); } - - void getAABB (dReal aabb[6]) const - { dGeomGetAABB (_id, aabb); } - - int isSpace() - { return dGeomIsSpace (_id); } - - void setCategoryBits (unsigned long bits) - { dGeomSetCategoryBits (_id, bits); } - void setCollideBits (unsigned long bits) - { dGeomSetCollideBits (_id, bits); } - unsigned long getCategoryBits() - { return dGeomGetCategoryBits (_id); } - unsigned long getCollideBits() - { return dGeomGetCollideBits (_id); } - - void enable() - { dGeomEnable (_id); } - void disable() - { dGeomDisable (_id); } - int isEnabled() - { return dGeomIsEnabled (_id); } - - void collide2 (dGeomID g, void *data, dNearCallback *callback) - { dSpaceCollide2 (_id,g,data,callback); } -}; - - -class dSpace : public dGeom { - // intentionally undefined, don't use these - dSpace (dSpace &); - void operator= (dSpace &); - -protected: - // the default constructor is protected so that you - // can't instance this class. you must instance one - // of its subclasses instead. - dSpace () { _id = 0; } - -public: - dSpaceID id() const - { return (dSpaceID) _id; } - operator dSpaceID() const - { return (dSpaceID) _id; } - - void setCleanup (int mode) - { dSpaceSetCleanup (id(), mode); } - int getCleanup() - { return dSpaceGetCleanup (id()); } - - void add (dGeomID x) - { dSpaceAdd (id(), x); } - void remove (dGeomID x) - { dSpaceRemove (id(), x); } - int query (dGeomID x) - { return dSpaceQuery (id(),x); } - - int getNumGeoms() - { return dSpaceGetNumGeoms (id()); } - dGeomID getGeom (int i) - { return dSpaceGetGeom (id(),i); } - - void collide (void *data, dNearCallback *callback) - { dSpaceCollide (id(),data,callback); } -}; - - -class dSimpleSpace : public dSpace { - // intentionally undefined, don't use these - dSimpleSpace (dSimpleSpace &); - void operator= (dSimpleSpace &); - -public: - dSimpleSpace (dSpaceID space) - { _id = (dGeomID) dSimpleSpaceCreate (space); } -}; - - -class dHashSpace : public dSpace { - // intentionally undefined, don't use these - dHashSpace (dHashSpace &); - void operator= (dHashSpace &); - -public: - dHashSpace (dSpaceID space) - { _id = (dGeomID) dHashSpaceCreate (space); } - void setLevels (int minlevel, int maxlevel) - { dHashSpaceSetLevels (id(),minlevel,maxlevel); } -}; - - -class dQuadTreeSpace : public dSpace { - // intentionally undefined, don't use these - dQuadTreeSpace (dQuadTreeSpace &); - void operator= (dQuadTreeSpace &); - -public: - dQuadTreeSpace (dSpaceID space, dVector3 center, dVector3 extents, int depth) - { _id = (dGeomID) dQuadTreeSpaceCreate (space,center,extents,depth); } -}; - - -class dSphere : public dGeom { - // intentionally undefined, don't use these - dSphere (dSphere &); - void operator= (dSphere &); - -public: - dSphere () { } - dSphere (dSpaceID space, dReal radius) - { _id = dCreateSphere (space, radius); } - - void create (dSpaceID space, dReal radius) { - if (_id) dGeomDestroy (_id); - _id = dCreateSphere (space, radius); - } - - void setRadius (dReal radius) - { dGeomSphereSetRadius (_id, radius); } - dReal getRadius() const - { return dGeomSphereGetRadius (_id); } -}; - - -class dBox : public dGeom { - // intentionally undefined, don't use these - dBox (dBox &); - void operator= (dBox &); - -public: - dBox () { } - dBox (dSpaceID space, dReal lx, dReal ly, dReal lz) - { _id = dCreateBox (space,lx,ly,lz); } - - void create (dSpaceID space, dReal lx, dReal ly, dReal lz) { - if (_id) dGeomDestroy (_id); - _id = dCreateBox (space,lx,ly,lz); - } - - void setLengths (dReal lx, dReal ly, dReal lz) - { dGeomBoxSetLengths (_id, lx, ly, lz); } - void getLengths (dVector3 result) const - { dGeomBoxGetLengths (_id,result); } -}; - - -class dPlane : public dGeom { - // intentionally undefined, don't use these - dPlane (dPlane &); - void operator= (dPlane &); - -public: - dPlane() { } - dPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d) - { _id = dCreatePlane (space,a,b,c,d); } - - void create (dSpaceID space, dReal a, dReal b, dReal c, dReal d) { - if (_id) dGeomDestroy (_id); - _id = dCreatePlane (space,a,b,c,d); - } - - void setParams (dReal a, dReal b, dReal c, dReal d) - { dGeomPlaneSetParams (_id, a, b, c, d); } - void getParams (dVector4 result) const - { dGeomPlaneGetParams (_id,result); } -}; - - -class dCapsule : public dGeom { - // intentionally undefined, don't use these - dCapsule (dCapsule &); - void operator= (dCapsule &); - -public: - dCapsule() { } - dCapsule (dSpaceID space, dReal radius, dReal length) - { _id = dCreateCapsule (space,radius,length); } - - void create (dSpaceID space, dReal radius, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateCapsule (space,radius,length); - } - - void setParams (dReal radius, dReal length) - { dGeomCapsuleSetParams (_id, radius, length); } - void getParams (dReal *radius, dReal *length) const - { dGeomCapsuleGetParams (_id,radius,length); } -}; - - -class dRay : public dGeom { - // intentionally undefined, don't use these - dRay (dRay &); - void operator= (dRay &); - -public: - dRay() { } - dRay (dSpaceID space, dReal length) - { _id = dCreateRay (space,length); } - - void create (dSpaceID space, dReal length) { - if (_id) dGeomDestroy (_id); - _id = dCreateRay (space,length); - } - - void setLength (dReal length) - { dGeomRaySetLength (_id, length); } - dReal getLength() - { return dGeomRayGetLength (_id); } - - void set (dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz) - { dGeomRaySet (_id, px, py, pz, dx, dy, dz); } - void get (dVector3 start, dVector3 dir) - { dGeomRayGet (_id, start, dir); } - - void setParams (int firstContact, int backfaceCull) - { dGeomRaySetParams (_id, firstContact, backfaceCull); } - void getParams (int *firstContact, int *backfaceCull) - { dGeomRayGetParams (_id, firstContact, backfaceCull); } - void setClosestHit (int closestHit) - { dGeomRaySetClosestHit (_id, closestHit); } - int getClosestHit() - { return dGeomRayGetClosestHit (_id); } -}; - - -class dGeomTransform : public dGeom { - // intentionally undefined, don't use these - dGeomTransform (dGeomTransform &); - void operator= (dGeomTransform &); - -public: - dGeomTransform() { } - dGeomTransform (dSpaceID space) - { _id = dCreateGeomTransform (space); } - - void create (dSpaceID space=0) { - if (_id) dGeomDestroy (_id); - _id = dCreateGeomTransform (space); - } - - void setGeom (dGeomID geom) - { dGeomTransformSetGeom (_id, geom); } - dGeomID getGeom() const - { return dGeomTransformGetGeom (_id); } - - void setCleanup (int mode) - { dGeomTransformSetCleanup (_id,mode); } - int getCleanup () - { return dGeomTransformGetCleanup (_id); } - - void setInfo (int mode) - { dGeomTransformSetInfo (_id,mode); } - int getInfo() - { return dGeomTransformGetInfo (_id); } -}; - - -#endif -#endif diff --git a/libraries/ode-0.9/include/ode/odemath.h b/libraries/ode-0.9/include/ode/odemath.h deleted file mode 100644 index f8fa3c7c4e..0000000000 --- a/libraries/ode-0.9/include/ode/odemath.h +++ /dev/null @@ -1,330 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ODEMATH_H_ -#define _ODE_ODEMATH_H_ - -#include - -#ifdef __GNUC__ -#define PURE_INLINE extern inline -#else -#define PURE_INLINE inline -#endif - -/* - * macro to access elements i,j in an NxM matrix A, independent of the - * matrix storage convention. - */ -#define dACCESS33(A,i,j) ((A)[(i)*4+(j)]) - -/* - * Macro to test for valid floating point values - */ -#define dVALIDVEC3(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]))) -#define dVALIDVEC4(v) (!(dIsNan(v[0]) || dIsNan(v[1]) || dIsNan(v[2]) || dIsNan(v[3]))) -#define dVALIDMAT3(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]))) -#define dVALIDMAT4(m) (!(dIsNan(m[0]) || dIsNan(m[1]) || dIsNan(m[2]) || dIsNan(m[3]) || dIsNan(m[4]) || dIsNan(m[5]) || dIsNan(m[6]) || dIsNan(m[7]) || dIsNan(m[8]) || dIsNan(m[9]) || dIsNan(m[10]) || dIsNan(m[11]) || dIsNan(m[12]) || dIsNan(m[13]) || dIsNan(m[14]) || dIsNan(m[15]) )) - - - -/* - * General purpose vector operations with other vectors or constants. - */ - -#define dOP(a,op,b,c) \ - (a)[0] = ((b)[0]) op ((c)[0]); \ - (a)[1] = ((b)[1]) op ((c)[1]); \ - (a)[2] = ((b)[2]) op ((c)[2]); -#define dOPC(a,op,b,c) \ - (a)[0] = ((b)[0]) op (c); \ - (a)[1] = ((b)[1]) op (c); \ - (a)[2] = ((b)[2]) op (c); -#define dOPE(a,op,b) \ - (a)[0] op ((b)[0]); \ - (a)[1] op ((b)[1]); \ - (a)[2] op ((b)[2]); -#define dOPEC(a,op,c) \ - (a)[0] op (c); \ - (a)[1] op (c); \ - (a)[2] op (c); - - -/* - * Length, and squared length helpers. dLENGTH returns the length of a dVector3. - * dLENGTHSQUARED return the squared length of a dVector3. - */ - -#define dLENGTHSQUARED(a) (((a)[0])*((a)[0]) + ((a)[1])*((a)[1]) + ((a)[2])*((a)[2])) - -#ifdef __cplusplus - -PURE_INLINE dReal dLENGTH (const dReal *a) { return dSqrt(dLENGTHSQUARED(a)); } - -#else - -#define dLENGTH(a) ( dSqrt( ((a)[0])*((a)[0]) + ((a)[1])*((a)[1]) + ((a)[2])*((a)[2]) ) ) - -#endif /* __cplusplus */ - - - - - -/* - * 3-way dot product. dDOTpq means that elements of `a' and `b' are spaced - * p and q indexes apart respectively. dDOT() means dDOT11. - * in C++ we could use function templates to get all the versions of these - * functions - but on some compilers this will result in sub-optimal code. - */ - -#define dDOTpq(a,b,p,q) ((a)[0]*(b)[0] + (a)[p]*(b)[q] + (a)[2*(p)]*(b)[2*(q)]) - -#ifdef __cplusplus - -PURE_INLINE dReal dDOT (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,1); } -PURE_INLINE dReal dDOT13 (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,3); } -PURE_INLINE dReal dDOT31 (const dReal *a, const dReal *b) { return dDOTpq(a,b,3,1); } -PURE_INLINE dReal dDOT33 (const dReal *a, const dReal *b) { return dDOTpq(a,b,3,3); } -PURE_INLINE dReal dDOT14 (const dReal *a, const dReal *b) { return dDOTpq(a,b,1,4); } -PURE_INLINE dReal dDOT41 (const dReal *a, const dReal *b) { return dDOTpq(a,b,4,1); } -PURE_INLINE dReal dDOT44 (const dReal *a, const dReal *b) { return dDOTpq(a,b,4,4); } - -#else - -#define dDOT(a,b) dDOTpq(a,b,1,1) -#define dDOT13(a,b) dDOTpq(a,b,1,3) -#define dDOT31(a,b) dDOTpq(a,b,3,1) -#define dDOT33(a,b) dDOTpq(a,b,3,3) -#define dDOT14(a,b) dDOTpq(a,b,1,4) -#define dDOT41(a,b) dDOTpq(a,b,4,1) -#define dDOT44(a,b) dDOTpq(a,b,4,4) - -#endif /* __cplusplus */ - - -/* - * cross product, set a = b x c. dCROSSpqr means that elements of `a', `b' - * and `c' are spaced p, q and r indexes apart respectively. - * dCROSS() means dCROSS111. `op' is normally `=', but you can set it to - * +=, -= etc to get other effects. - */ - -#define dCROSS(a,op,b,c) \ -do { \ - (a)[0] op ((b)[1]*(c)[2] - (b)[2]*(c)[1]); \ - (a)[1] op ((b)[2]*(c)[0] - (b)[0]*(c)[2]); \ - (a)[2] op ((b)[0]*(c)[1] - (b)[1]*(c)[0]); \ -} while(0) -#define dCROSSpqr(a,op,b,c,p,q,r) \ -do { \ - (a)[ 0] op ((b)[ q]*(c)[2*r] - (b)[2*q]*(c)[ r]); \ - (a)[ p] op ((b)[2*q]*(c)[ 0] - (b)[ 0]*(c)[2*r]); \ - (a)[2*p] op ((b)[ 0]*(c)[ r] - (b)[ q]*(c)[ 0]); \ -} while(0) -#define dCROSS114(a,op,b,c) dCROSSpqr(a,op,b,c,1,1,4) -#define dCROSS141(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,1) -#define dCROSS144(a,op,b,c) dCROSSpqr(a,op,b,c,1,4,4) -#define dCROSS411(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,1) -#define dCROSS414(a,op,b,c) dCROSSpqr(a,op,b,c,4,1,4) -#define dCROSS441(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,1) -#define dCROSS444(a,op,b,c) dCROSSpqr(a,op,b,c,4,4,4) - - -/* - * set a 3x3 submatrix of A to a matrix such that submatrix(A)*b = a x b. - * A is stored by rows, and has `skip' elements per row. the matrix is - * assumed to be already zero, so this does not write zero elements! - * if (plus,minus) is (+,-) then a positive version will be written. - * if (plus,minus) is (-,+) then a negative version will be written. - */ - -#define dCROSSMAT(A,a,skip,plus,minus) \ -do { \ - (A)[1] = minus (a)[2]; \ - (A)[2] = plus (a)[1]; \ - (A)[(skip)+0] = plus (a)[2]; \ - (A)[(skip)+2] = minus (a)[0]; \ - (A)[2*(skip)+0] = minus (a)[1]; \ - (A)[2*(skip)+1] = plus (a)[0]; \ -} while(0) - - -/* - * compute the distance between two 3D-vectors - */ - -#ifdef __cplusplus -PURE_INLINE dReal dDISTANCE (const dVector3 a, const dVector3 b) - { return dSqrt( (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]) + (a[2]-b[2])*(a[2]-b[2]) ); } -#else -#define dDISTANCE(a,b) \ - (dSqrt( ((a)[0]-(b)[0])*((a)[0]-(b)[0]) + ((a)[1]-(b)[1])*((a)[1]-(b)[1]) + ((a)[2]-(b)[2])*((a)[2]-(b)[2]) )) -#endif - - -/* - * special case matrix multipication, with operator selection - */ - -#define dMULTIPLYOP0_331(A,op,B,C) \ -do { \ - (A)[0] op dDOT((B),(C)); \ - (A)[1] op dDOT((B+4),(C)); \ - (A)[2] op dDOT((B+8),(C)); \ -} while(0) -#define dMULTIPLYOP1_331(A,op,B,C) \ -do { \ - (A)[0] op dDOT41((B),(C)); \ - (A)[1] op dDOT41((B+1),(C)); \ - (A)[2] op dDOT41((B+2),(C)); \ -} while(0) -#define dMULTIPLYOP0_133(A,op,B,C) \ -do { \ - (A)[0] op dDOT14((B),(C)); \ - (A)[1] op dDOT14((B),(C+1)); \ - (A)[2] op dDOT14((B),(C+2)); \ -} while(0) -#define dMULTIPLYOP0_333(A,op,B,C) \ -do { \ - (A)[0] op dDOT14((B),(C)); \ - (A)[1] op dDOT14((B),(C+1)); \ - (A)[2] op dDOT14((B),(C+2)); \ - (A)[4] op dDOT14((B+4),(C)); \ - (A)[5] op dDOT14((B+4),(C+1)); \ - (A)[6] op dDOT14((B+4),(C+2)); \ - (A)[8] op dDOT14((B+8),(C)); \ - (A)[9] op dDOT14((B+8),(C+1)); \ - (A)[10] op dDOT14((B+8),(C+2)); \ -} while(0) -#define dMULTIPLYOP1_333(A,op,B,C) \ -do { \ - (A)[0] op dDOT44((B),(C)); \ - (A)[1] op dDOT44((B),(C+1)); \ - (A)[2] op dDOT44((B),(C+2)); \ - (A)[4] op dDOT44((B+1),(C)); \ - (A)[5] op dDOT44((B+1),(C+1)); \ - (A)[6] op dDOT44((B+1),(C+2)); \ - (A)[8] op dDOT44((B+2),(C)); \ - (A)[9] op dDOT44((B+2),(C+1)); \ - (A)[10] op dDOT44((B+2),(C+2)); \ -} while(0) -#define dMULTIPLYOP2_333(A,op,B,C) \ -do { \ - (A)[0] op dDOT((B),(C)); \ - (A)[1] op dDOT((B),(C+4)); \ - (A)[2] op dDOT((B),(C+8)); \ - (A)[4] op dDOT((B+4),(C)); \ - (A)[5] op dDOT((B+4),(C+4)); \ - (A)[6] op dDOT((B+4),(C+8)); \ - (A)[8] op dDOT((B+8),(C)); \ - (A)[9] op dDOT((B+8),(C+4)); \ - (A)[10] op dDOT((B+8),(C+8)); \ -} while(0) - -#ifdef __cplusplus - -#define DECL template PURE_INLINE void - -DECL dMULTIPLY0_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_331(A,=,B,C); } -DECL dMULTIPLY1_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_331(A,=,B,C); } -DECL dMULTIPLY0_133(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_133(A,=,B,C); } -DECL dMULTIPLY0_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_333(A,=,B,C); } -DECL dMULTIPLY1_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_333(A,=,B,C); } -DECL dMULTIPLY2_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP2_333(A,=,B,C); } - -DECL dMULTIPLYADD0_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_331(A,+=,B,C); } -DECL dMULTIPLYADD1_331(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_331(A,+=,B,C); } -DECL dMULTIPLYADD0_133(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_133(A,+=,B,C); } -DECL dMULTIPLYADD0_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP0_333(A,+=,B,C); } -DECL dMULTIPLYADD1_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP1_333(A,+=,B,C); } -DECL dMULTIPLYADD2_333(TA *A, const TB *B, const TC *C) { dMULTIPLYOP2_333(A,+=,B,C); } - -#undef DECL - -#else - -#define dMULTIPLY0_331(A,B,C) dMULTIPLYOP0_331(A,=,B,C) -#define dMULTIPLY1_331(A,B,C) dMULTIPLYOP1_331(A,=,B,C) -#define dMULTIPLY0_133(A,B,C) dMULTIPLYOP0_133(A,=,B,C) -#define dMULTIPLY0_333(A,B,C) dMULTIPLYOP0_333(A,=,B,C) -#define dMULTIPLY1_333(A,B,C) dMULTIPLYOP1_333(A,=,B,C) -#define dMULTIPLY2_333(A,B,C) dMULTIPLYOP2_333(A,=,B,C) - -#define dMULTIPLYADD0_331(A,B,C) dMULTIPLYOP0_331(A,+=,B,C) -#define dMULTIPLYADD1_331(A,B,C) dMULTIPLYOP1_331(A,+=,B,C) -#define dMULTIPLYADD0_133(A,B,C) dMULTIPLYOP0_133(A,+=,B,C) -#define dMULTIPLYADD0_333(A,B,C) dMULTIPLYOP0_333(A,+=,B,C) -#define dMULTIPLYADD1_333(A,B,C) dMULTIPLYOP1_333(A,+=,B,C) -#define dMULTIPLYADD2_333(A,B,C) dMULTIPLYOP2_333(A,+=,B,C) - -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * normalize 3x1 and 4x1 vectors (i.e. scale them to unit length) - */ -ODE_API int dSafeNormalize3 (dVector3 a); -ODE_API int dSafeNormalize4 (dVector4 a); - -// For some reason demo_chain1.c does not understand "inline" keyword. -static __inline void _dNormalize3(dVector3 a) -{ - int bNormalizationResult = dSafeNormalize3(a); - dIASSERT(bNormalizationResult); - dVARIABLEUSED(bNormalizationResult); -} - -static __inline void _dNormalize4(dVector4 a) -{ - int bNormalizationResult = dSafeNormalize4(a); - dIASSERT(bNormalizationResult); - dVARIABLEUSED(bNormalizationResult); -} - -// For DLL export -ODE_API void dNormalize3 (dVector3 a); // Potentially asserts on zero vec -ODE_API void dNormalize4 (dVector4 a); // Potentially asserts on zero vec - -// For internal use -#define dNormalize3(a) _dNormalize3(a) -#define dNormalize4(a) _dNormalize4(a) - -/* - * given a unit length "normal" vector n, generate vectors p and q vectors - * that are an orthonormal basis for the plane space perpendicular to n. - * i.e. this makes p,q such that n,p,q are all perpendicular to each other. - * q will equal n x p. if n is not unit length then p will be unit length but - * q wont be. - */ - -ODE_API void dPlaneSpace (const dVector3 n, dVector3 p, dVector3 q); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/rotation.h b/libraries/ode-0.9/include/ode/rotation.h deleted file mode 100644 index a72be27f1d..0000000000 --- a/libraries/ode-0.9/include/ode/rotation.h +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_ROTATION_H_ -#define _ODE_ROTATION_H_ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -ODE_API void dRSetIdentity (dMatrix3 R); - -ODE_API void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az, - dReal angle); - -ODE_API void dRFromEulerAngles (dMatrix3 R, dReal phi, dReal theta, dReal psi); - -ODE_API void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az, - dReal bx, dReal by, dReal bz); - -ODE_API void dRFromZAxis (dMatrix3 R, dReal ax, dReal ay, dReal az); - -ODE_API void dQSetIdentity (dQuaternion q); - -ODE_API void dQFromAxisAndAngle (dQuaternion q, dReal ax, dReal ay, dReal az, - dReal angle); - -/* Quaternion multiplication, analogous to the matrix multiplication routines. */ -/* qa = rotate by qc, then qb */ -ODE_API void dQMultiply0 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by qc, then by inverse of qb */ -ODE_API void dQMultiply1 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by inverse of qc, then by qb */ -ODE_API void dQMultiply2 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); -/* qa = rotate by inverse of qc, then by inverse of qb */ -ODE_API void dQMultiply3 (dQuaternion qa, const dQuaternion qb, const dQuaternion qc); - -ODE_API void dRfromQ (dMatrix3 R, const dQuaternion q); -ODE_API void dQfromR (dQuaternion q, const dMatrix3 R); -ODE_API void dDQfromW (dReal dq[4], const dVector3 w, const dQuaternion q); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/include/ode/timer.h b/libraries/ode-0.9/include/ode/timer.h deleted file mode 100644 index c3f42a7ada..0000000000 --- a/libraries/ode-0.9/include/ode/timer.h +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#ifndef _ODE_TIMER_H_ -#define _ODE_TIMER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* stop watch objects */ - -typedef struct dStopwatch { - double time; /* total clock count */ - unsigned long cc[2]; /* clock count since last `start' */ -} dStopwatch; - -ODE_API void dStopwatchReset (dStopwatch *); -ODE_API void dStopwatchStart (dStopwatch *); -ODE_API void dStopwatchStop (dStopwatch *); -ODE_API double dStopwatchTime (dStopwatch *); /* returns total time in secs */ - - -/* code timers */ - -ODE_API void dTimerStart (const char *description); /* pass a static string here */ -ODE_API void dTimerNow (const char *description); /* pass a static string here */ -ODE_API void dTimerEnd(void); - -/* print out a timer report. if `average' is nonzero, print out the average - * time for each slot (this is only meaningful if the same start-now-end - * calls are being made repeatedly. - */ -ODE_API void dTimerReport (FILE *fout, int average); - - -/* resolution */ - -/* returns the timer ticks per second implied by the timing hardware or API. - * the actual timer resolution may not be this great. - */ -ODE_API double dTimerTicksPerSecond(void); - -/* returns an estimate of the actual timer resolution, in seconds. this may - * be greater than 1/ticks_per_second. - */ -ODE_API double dTimerResolution(void); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libraries/ode-0.9/install-sh b/libraries/ode-0.9/install-sh deleted file mode 100755 index 4fbbae7b7f..0000000000 --- a/libraries/ode-0.9/install-sh +++ /dev/null @@ -1,507 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2006-10-14.15 - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -posix_glob= -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chmodcmd=$chmodprog -chowncmd= -chgrpcmd= -stripcmd= -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src= -dst= -dir_arg= -dstarg= -no_target_directory= - -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: --c (ignored) --d create directories instead of installing files. --g GROUP $chgrpprog installed files to GROUP. --m MODE $chmodprog installed files to MODE. --o USER $chownprog installed files to USER. --s $stripprog installed files. --t DIRECTORY install into DIRECTORY. --T report an error if DSTFILE is a directory. ---help display this help and exit. ---version display version info and exit. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - shift - shift - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -s) stripcmd=$stripprog - shift - continue;; - - -t) dstarg=$2 - shift - shift - continue;; - - -T) no_target_directory=true - shift - continue;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac -done - -if test $# -ne 0 && test -z "$dir_arg$dstarg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src ;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dstarg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dstarg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst ;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dstarg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix=/ ;; - -*) prefix=./ ;; - *) prefix= ;; - esac - - case $posix_glob in - '') - if (set -f) 2>/dev/null; then - posix_glob=true - else - posix_glob=false - fi ;; - esac - - oIFS=$IFS - IFS=/ - $posix_glob && set -f - set fnord $dstdir - shift - $posix_glob && set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ - || { - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - if test -f "$dst"; then - $doit $rmcmd -f "$dst" 2>/dev/null \ - || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ - && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ - || { - echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - else - : - fi - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - } || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/libraries/ode-0.9/missing b/libraries/ode-0.9/missing deleted file mode 100755 index 1c8ff7049d..0000000000 --- a/libraries/ode-0.9/missing +++ /dev/null @@ -1,367 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2006-05-10.23 - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 -# Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). -case $1 in - lex|yacc) - # Not GNU programs, they don't have --version. - ;; - - tar) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $1 in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit 1 - fi - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - tar) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/libraries/ode-0.9/ode-config.in b/libraries/ode-0.9/ode-config.in deleted file mode 100644 index d04bd01f52..0000000000 --- a/libraries/ode-0.9/ode-config.in +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -exec_prefix_set=no - -usage="\ -Usage: ode-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--shared-libs]" - -if test $# -eq 0; then - echo "${usage}" 1>&2 - exit 1 -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo @ODE_RELEASE@ - ;; - --cflags) - echo -I@includedir@ - ;; - --libs) - echo -L@libdir@ -lode - ;; - --shared-libs) - echo -L@prefix@/lib -lode@so_ext@ - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/libraries/ode-0.9/ode/Makefile.am b/libraries/ode-0.9/ode/Makefile.am deleted file mode 100644 index 5c9708e313..0000000000 --- a/libraries/ode-0.9/ode/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -SUBDIRS = src -if ENABLE_DEMOS - SUBDIRS += demo -endif diff --git a/libraries/ode-0.9/ode/Makefile.in b/libraries/ode-0.9/ode/Makefile.in deleted file mode 100644 index d89db18513..0000000000 --- a/libraries/ode-0.9/ode/Makefile.in +++ /dev/null @@ -1,489 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -@ENABLE_DEMOS_TRUE@am__append_1 = demo -subdir = ode -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = src demo -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = src $(am__append_1) -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ode/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign ode/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic ctags \ - ctags-recursive distclean distclean-generic distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-recursive uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/ode/README b/libraries/ode-0.9/ode/README deleted file mode 100644 index dd4596f993..0000000000 --- a/libraries/ode-0.9/ode/README +++ /dev/null @@ -1,158 +0,0 @@ -Dynamics Library. -================= - -CONVENTIONS ------------ - -matrix storage --------------- - -matrix operations like factorization are expensive, so we must store the data -in a way that is most useful to the matrix code. we want the ability to update -the dynamics library without recompiling applications, e.g. so users can take -advantage of new floating point hardware. so we must settle on a single -format. because of the prevalence of 4-way SIMD, the format is this: store -the matrix by rows or columns, and each column is rounded up to a multiple of -4 elements. the extra "padding" elements at the end of each row/column are set -to 0. this is called the "standard format". to indicate if the data is stored -by rows or columns, we will say "standard row format" or "standard column -format". hopefully this decision will remain good in the future, as more and -more processors have 4-way SIMD, and 3D graphics always needs fast 4x4 -matrices. - -exception: matrices that have only one column or row (vectors), are always -stored as consecutive elements in standard row format, i.e. there is no -interior padding, only padding at the end. - -thus: all 3x1 floating point vectors are stored as 4x1 vectors: (x,x,x,0). -also: all 6x1 spatial velocities and accelerations are split into 3x1 position - and angular components, which are stored as contiguous 4x1 vectors. - -ALL matrices are stored by in standard row format. - - -arguments ---------- - -3x1 vector arguments to set() functions are supplied as x,y,z. -3x1 vector result arguments to get() function are pointers to arrays. -larger vectors are always supplied and returned as pointers. -all coordinates are in the global frame except where otherwise specified. -output-only arguments are usually supplied at the end. - - -memory allocation ------------------ - -with many C/C++ libraries memory allocation is a difficult problem to solve. -who allocates the memory? who frees it? must objects go on the heap or can -they go on the stack or in static storage? to provide the maximum flexibility, -the dynamics and collision libraries do not do their own memory allocation. -you must pass in pointers to externally allocated chunks of the right sizes. -the body, joint and colllision object structures are all exported, so you -can make instances of those structure and pass pointers to them. - -there are helper functions which allocate objects out of areans, in case you -need loots of dynamic creation and deletion. - -BUT!!! this ties us down to the body/joint/collision representation. - -a better approach is to supply custom memory allocation functions -(e.g. dlAlloc() etc). - - -C versus C++ ... ? ------------------- - -everything should be C linkable, and there should be C header files for -everything. but we want to develop in C++. so do this: - * all comments are "//". automatically convert to /**/ for distribution. - * structures derived from other structures --> automatically convert? - - -WORLDS ------- - -might want better terminology here. - -the dynamics world (DWorld) is a list of systems. each system corresponds to -one or more bodies, or perhaps some other kinds of physical object. -each system corresponds to one or more objects in the collision world -(there does not have to be a one-to-one correspondence between bodies and -collision objects). - -systems are simulated separately, perhaps using completely different -techniques. we must do something special when systems collide. -systems collide when collision objects belonging to system A touch -collision objects belonging to system B. - -for each collision point, the system must provide matrix equation data -that is used to compute collision forces. once those forces are computed, -the system must incorporate the forces into its timestep. -PROBLEM: what if we intertwine the LCP problems of the two systems - then -this simple approach wont work. - -the dynamics world contains two kinds of objects: bodies and joints. -joints connect two bodies together. - -the world contains one of more partitions. each partition is a collection of -bodies and joints such that each body is attached (through one or more joints) -to every other body. - -Joints ------- - -a joint can be connected to one or two bodies. -if the joint is only connected to one body, joint.node[1].body == 0. -joint.node[0].body is always valid. - - -Linkage -------- - -this library will always be statically linked with the app, for these reasons: - * collision space is selected at compile time, it adds data to the geom - objects. - - -Optimization ------------- - -doubles must be aligned on 8 byte boundaries! - - -MinGW on Windows issues ------------------------ - -* the .rc file for drawstuff needs a different include, try winresrc.h. - -* it seems we can't have both main() and WinMain() without the entry point - defaulting to main() and having resource loading problems. this screws up - what i was trying to do in the drawstuff library. perhaps main2() ? - -* remember to compile resources to COFF format RES files. - - - -Collision ---------- - -to plug in your own collision handling, replace (some of?) these functions -with your own. collision should be a separate library that you can link in -or not. your own library can call components in this collision library, e.g. -if you want polymorphic spaces instead of a single statically called space. - -creating an object will automatically register the appropriate -class (if necessary). how can we ensure that the minimum amount of code is -linked in? e.g. only one space handler, and sphere-sphere and sphere-box and -box-box collision code (if spheres and boxes instanced). - -the user creates a collision space, and for each dynamics object that is -created a collision object is inserted into the space. the collision -object's pos and R pointers are set to the corresponding dynamics -variables. - -there should be utility functions which create the dynamics and collision -objects at the same time, e.g. dMakeSphere(). - -collision objects and dynamics objects keep pointers to each other. diff --git a/libraries/ode-0.9/ode/TODO b/libraries/ode-0.9/ode/TODO deleted file mode 100644 index cf6cdaac5a..0000000000 --- a/libraries/ode-0.9/ode/TODO +++ /dev/null @@ -1,698 +0,0 @@ - -@@@'s - - -TODO for COLLISION ------------------- - -box-box collision: adjust generated face-face contact points by depth/2 to -be more fair. - -what happens when a GeomTransform's encapsulated object is manipulated, -e.g. position changed. should this be disallowed? should a GeomTransform -behave like a space and propagate dirtyness upwards? - -make sure that when we are using a large space for static environmental geoms, -that there is not excessive AABB computation when geoms are added/removed from -the space. the space AABB is pretty much guaranteed to cover everything, so -there's no need to compute/test the AABB in this case. - -hash space: implement collide2() efficiently instead of the current -simple-space-like brute-force approach. - -hash space: incremental scheme, so we dont have to rebuild the data structures -for geoms that don't move. - -disabled geoms (remove from all collision considerations) ... isn't this the -same as just taking it out of its enclosing group/space? - -integrate: - dRay - triangle collider - get latest tri collider code from erwin - erwin's quadtree space - -tests: - all aspects of collision API - - dGeomSetBody(0) maintains body-geom linked list properly. - - simple space: instantiate lots of non-moving geoms (i.e. environmental - geoms and make sure that we're still able to collide efficiently. - make sure AABB computation is efficient, or can be made efficient - through proper use of the API. - - test C interface support for making new classes. - make sure the dxGeom::aabbTest() function behaves as advertised. - - testing for contact point consistency: test for things that - would cause the dynamics to fail or become unstable - - test for: small adjustment in geom position causes a big jump in the - contact point set (bad for dynamics). - - test for: if contact constraints observed then it's impossible - (or hard) to move the objects so that the penetration is - increased. relax this when only a subset of the contact points are - returned. - - test for consistency, e.g. the boundary of geoms X and Y can - be defined by intersecting with a point, so test the intersection of X - and Y by comparing with the point tests. - - check that contact points are in the collision volume - - all existing space tests, and more. - -demos: - test_buggy: make a terrain out of non-moving geoms. use heirarchical - groups to get efficient collision, even with the simple space. - -go though the new collision docs and make sure the behavior that is described -there is actually implemented. - -multi-resolution hash table: - the current implementation rebuilds a new hash table each time - collide() is called. we don't keep any state between calls. this is - wasteful if there are unmoving objects in the space. - - make sure we prevent multiple collision callbacks for the same pair - - better virtual address function. - - the collision search can perhaps be optimized - as we search - chains we can come across other candidate intersections at - other levels, perhaps we should do the intersection check - straight away? --> save on list searching time only, which is - not too significant. - -collision docs: - optimization guide: whenever a single geom changes in a simple space, - the space AABB has to be recomputed by examining EVERY geom. - document this, or find a better behavior. - - - -TODO BEFORE NEXT RELEASE ------------------------- - -g++ needed for compiling tests using gcc 3.2 ? what is the problem? - -add joint feedback info from lambda, so that we can get motor forces etc. -need a way to map constraint indexes to what they mean. - -track down and fix the occasional popping/jumping problem in test_boxstack, -especially when boxes are piled on top of each other. find out if this is -caused by a configuration singularity or whether there is a bug in LCP. -i need to add some kind of diagnostic tool to help resolve these kinds of -problems. - -fixup ground plane jitter and shadow jumping in drawstuff. - -the inertias/COMs don't appear to be totally correct for the boxstack demo. -fix up, and add a mode that shows the effective mass box (for a given density). - -Improve box-box collision, especially for face-face contact (3 contact points). -Improve cylinder-box collision (2 contact points). - -windows DLL building and unix shared libs. libtool? -also MSVC project files. - -dBodyGetPointVel() - -contrib directory - all stuff in ~/3/ode - -functions to allow systems to be copied/cloned - dBodyTransplant (b, world) - dTransplantIsland (b, world) - dBodyCopy (bdest, bsrc) - dJointCopy (jdest, jsrc) -- what about body connections? - dCloneBody() - dCloneJoint() - dCloseBodyAndJointList() - dCloneIsland() - -this collision rule: - // no contacts if both geoms on the same body, and the body is not 0 - if (g1->body == g2->body && g1->body) return 0; -needs to be replaced. sometimes we want no collision when both bodies are 0, -but this wont work for geomgroup-to-environment. avoid stupid stuff like - dGeomSetBody (geom_group, (dBodyID) 1); -this also causes "failed-to-report" errors in the space test. - -Expose type-specific collision functions? - -Automatic code optimization process. - -joint limit spongyness: interacts with powered joints badly, because when the -limit is reached full power is applied. fix or doc. - -various hinge2 functions may not function correctly if axis1 and axis2 are not -perpendicular. in particular the getAngle() and getAngleRate() functions -probably will give bogus answers. - -slow step function will not respect the joint getinfo2 functions calling -addTorque() because it reads the force/torque accumulators before the -getinfo2 functions are called. - -spaces need multiple lists of objects that can never overlap. objects in these -lists are never tested against each other. - -deleting a body a joint is attached to should adjust the joint to only have -one body attached. currently the connected joints have *both* their body -attachments removed. BUT, dont do this if the dJOINT_TWOBODIES flag is set -on the joint. - -document error, mem and math functions. - -Web pages - credits section - projects using ODE - -update C++ interface? use SWIG? - -collision exclusion groups - exclude if obj1.n == obj2.n ? - -make sure the amotor joint can be used with just one body. at the moment it -only allows two-body attachments. - -implement dJointGetAMotorAngleRate() - -erwin says: Should the GeomGroup have a cleanupmode as the GeomTransform has? - -erwin says: http://q12.org/pipermail/ode/2002-January/000766.html - and http://q12.org/pipermail/ode/2001-December/000753.html - -rename duplicate filenames (object.h?) - some environments can't handle this. - -naming inconsistency: dCreateSphere() should be dSphereCreate() (etc...) to -match the rest of the API. - - -TODO ----- - -joint allocation in joint groups. allocation size should be rounded up using -dEFFICIENT_SIZE, to properly align all the data members. - -all dAlloc() allocations should be aligned using dEFFICIENT_SIZE() ??? - -automatic body & joint disabling / enabling. - -sometimes getting LCP infinite loops. - -function to get the entire island of bodies/joints - -joints: - hinge2 joint - implement trail, i.e. non-convergent steering and wheel - axes. - - erp individually settable for each joint? - - more joints: - angular3 (constrian full angle not position) - fixed path 1 (point must follow fixed path, etc etc) - - other fixed path joints. - linear a (point in 1 body fixed to plane of other) - linear b (point in 1 body fixed to line on other) - linear c (line in 1 body fixed to plane on other) - linear d (line in 1 body fixed to line on other) - like - prismatic but orientation along line can change - Relative-Path-Relative-Oriention Joint (set all dofs of 2 - bodies relative to each other) - spring (with natural length) - universal (2 kinds) - various angular relationships - - when attaching joints to static env, provision to move attachment - point (e.g. give it a linear/angular velocity). this can be used - instead of a FPFO joint on a body in many cases. - also do this with contacts to static env, to allow for contacts to - *moving* objects in the static env. - - interpretation of erp: is it (1) the error reduction per timestep, - (2) or a time constant independent of timestep?? if it's (2) then - perhaps this should be universal - this is already the meaning for - the suspension. - - hinge2 suspension: - suspension limits - suspension limit restitution and spongyness?? - -use autoconf? set paths in makefile? - -no-arg init functions, for andy - -explore: do joint parameters need to be set for the joint to be setup -correctly, or should set some proper body-dependent params when it is -attached? this is only really an issue for joints that have no parameters to -set, such as the fixed joint. - -dAlloc() should take an arena parameters which is stored in dWorld. - -debugging mode should use dASSERT2 that prints a descriptive error message -on error, not just the file:line or function. use dASSERT for internal -consistency checking. - -when vectors and matrices are initialized, we must ensure that the padding -elements are set to 0. this is going to be a problem everywhere! - -don't use 3-vectors anywhere. use SIMD friendly 4-vectors. - -make sure all data in body/joint etc objects is aligned well for single -precision SIMD (i.e. all vectors start on a 16 byte boundary). - -think about more complicated uses of collision, e.g. a single geom representing -an articulated structure. - -bodyGroup? (like joint group but for bodies). systemGroup? - -check the overhead of resizing Array<>s as elements are pushed on to them. - -replace alloca() with dPushFrame(), dPopFrame(), and dAlloca() ? allow for -the possibility of allocating in non-stack memory ? - -make sure that we can set mass parameters with non-zero center of mass. -if this is done after the body position is set, the position is adjusted. -if this is done before the body position is set, what do we do when the -pos is set? does the pos always refer to the center of mass from the user's -point of view? - -consider splitting solver into functions, which can be optimized separately. -might make things go faster. - -faster code for islands with a single body? faster code for dynamically -symmetric bodies? - -rotation.cpp functions that set matrices should also set padding elements. - -lcp solver must return (L,d) and some other information, so we can re-solve -for other right hand sides later on, but using the same complimentarity -solution so there are no integrator discontinuities. - -dSetZero() - make fast inline functions for fixed n e.g. (1-4). - -need proper `sticky' friction, i.e. compensation for numerical slip. - -on windows, make sure gcc-compiles libs can be linked with VC++ apps. need -to make sure some C++ runtime bits are present? - -kill all references to dArray<> (in geom.cpp). - -need testing code to test all joints with body-to-static-env - -copy stack.cpp, memory.cpp stuff to reuse - -dFactorLDLT() is not so efficient for matrix sizes < block size, e.g. -redundant calls, zero loads, adds etc - -contacts: cheaper friction: viscous friction? one step delay friction force. - -in geom.cpp, for objects that are never meant to collide, dCollide() will -always try to find the collider functions, which wastes a bit of time. - -geom.cpp:dCollideG() - handle special case of colliding 2 groups more -efficiently. - -timer reporting function: - void timerReport (void (*printFunction)(char *, ...)); - -disabled bodies stored in a separate list, so they are never traversed at all, -for speed when there are many disabled bodies. - - -MAYBE ------ - -new implementation for joint groups that is not so system dependent. -maybe individual contacts are reusable? in this case contact information -should be settable in the contact joints. max_size arg is really annoying. - -consider making anchor,axis, (everything) into a joint parameter and setting -them with a consistent interface. also consider overload the joint functions -so they are not distinguished by joint type?? - -collision memory optimizations? - -collision: support for persistent contact information? - -multiply reference tri list data so that it can be cloned - if the tri-list geoms could support rot/pos - transformations then we could have several tri-lists pointing to the - same vertex information. - -height fields - -pre-converted collision data -- Creating a hash space and associated -opcode tree structures may take significant amounts of time for a -large world with many 10s of thousands of triangles. Any chance of -pre-building that off-line and passing a memory block pointer to the -collision system? - -putting objects in multiple spaces -- If it was possible to add -objects to more than one space, you could do collision queries other -than 1vsN and NvsN. That flexibility might be useful when you want to -only collide against a subset of the space. For example, a camera -system may want to collide some rays with occlusion walls but the -occlusion walls may also need to be in the game-level space to bounce -against. - - -ALWAYS ------- - -make sure functions check their arguments in debug mode (e.g. using dASSERT). -make sure joint/geom functions check for the specific object type. - -vectors alloca()ed on the stack must have the correct alignment, use ALLOCA16. - -library should have no global constructors, as it might be used with C linkage. - -use `const' in function arguments. blah. - - - -DON'T BOTHER ------------- - -warning if user tries to set mass params with nonzero center of mass. - - - -DONE ----- - -check: when contact attached with (body1,0) and (0,body1), check that polarity -on depth and error info is okay for the two cases. - -set a better convention for which is the 1st and 2nd body in a joint, because -sometimes we get things swapped (because of the way the joint nodes are used). - -hinge and prismatic, attachment to static environment. - -turn macros into C++ inline functions? what about C users? - -remove `space' argument to geom creation functions? make user add it? -or just remove it from dCreateGeom() ? <-- did this one. - -test_chain should be in C, not C++. but first must remove global constructors. - -add more functionality to C++ interface - dMass, dSpace, dGeom - -there should be functions to delete groups of bodies/joints in one go - this -will be more efficient than deleting them one at a time, because less -partitioning tests will be needed. - -should we expose body and joint object structures so that the user can -explicitly allocate them locally, or e.g. on the stack? makes allocating -temporary contact constraints easier. NO --> helps data hiding and therefore -library binary compatability. - -joints: - hinge & slider - DONE - measure angle, rate - DONE - power - DONE - joint limits - DONE - mixed powered+limited joints, powering away from limit - DONE - - hinge2 - DONE - steering angle and rate measurement - DONE - steering limits - DONE - steering motor - DONE - wheel motor - DONE - wheel angle rate measurement - DONE - - optional hinge2 suspension: - DONE - alignment of B&S part to given axis - DONE - global framework for giving epsilon and gamma - DONE - - toss away r-motor, make power & stuff specific to joint - DONE - it's just easier that way - - joint code reuse: - DONE - use standard functions to set velocity (c), limits (lo,hi), - spongyness (epsilon) etc, this prevents these functions from - proliferating - - implicit spring framework - actually allow joints to return a value `k' - such that J*vnew = c + k*f, where f = force needed to achieve - vnew - DONE - - contact slip - DONE - contact erp & cfm parameters (not just "softness") - DONE - - hinge2: when we lock back wheels along the steering axis, there is no - error correction if they get out of alignment - DONE, just use high - and low limits. - - joint limit spongyness: erp and cfm for joint set from world (global) - values when joint created. - DONE - - joint limit restitution - DONE - -check inertia transformations, e.g. by applying steering torque to a thin -wheel --> actually, i made test_I - -more comprehensive random number comparisons between slow and fast methods. - - random PD inertia (not just diagonal). - - random velocity - - random joint error (make joints then move bodies a bit) - -check that J*vnew=c (slow step already does this, but it doesn't equal zero -for some reason! - actually, when LCP constraint limits are reached, it wont!) - -tons of things in lcp.cpp (@@@), especially speed optimizations. also, we -wanted to do index block switching and index block updates to take advantage -of the outer product trick ... but this is not worth the effort i think. - -lcp.cpp: if lo=hi=0, check operation. can we switch from NL <-> NH without -going through C? --> done. - -andy says: still having trouble with those resource files.. -drawstuff.res doesn't seem to build or be found under cygwin gcc. - -DOC how bodies and geoms associated then resolved in contact callback ... not -really necessary. - -fix the "memory leak" in geom.cpp - -library should have no global constructors, as it might be used with C linkage. - --> as long as test_chain1 works, there are none. - -DOC cfm, the derivation and what it means. - --> partially done, could be better - -joint "get type" function - -andy says: in ode/src/error.cpp _snprintf() and _vsnprintf() are missing -in testode: finite and isnan are missing. copysign is missing - russ: okay here's the problem: i have Makefile.platform files for - VC++, MinGW, but not Cygwin. Cygwin uses the unix-like functions - for everything, but the VC++/MinGW configs assumes the MS C-runtime - functions. this is easy to fix, except i need to install Cygwin - which is a pain to do over MinGW. argh. - -build on linux - assumptions made about location of X11 lib, opengl etc. - -implement: dBodyAddForceAtPos,dBodyAddRelForceAtPos,dBodyAddRelForceAtRelPos, - dBodyGetPointPos,dBodyGetPointVel,dBodyGetPointRelVel - -dJointAttach(), allow both bodies to be 0 to put the joint into limbo. - -space near-callback should be given potentially intersecting objects 100 at a -time instead of 1 at a time, to save on calling costs ... which are trivial, -so we don't bother to do this. - -doccer: @func{} also refs second etc function in function *list*. - -make sure joints can return 0 from GetInfo1, i.e. no constraints or "inactive" -joint, and the step functions will handle it. - -when attaching contact with (0,body), instead of setting the reverse flag -on the joint and checking it in getInfo2(), we should just reverse the normal -straight away ... ? - --> trouble is, dJointAttach() knows nothing about what kind of joint - it is attaching. - -hinge2 needs to be attached to two bodies for it to work, make sure this is -always the case. --> assertion added in dJointAttach(). - -if two joints connect to the same two bodies, check that the fast solver -works! -> it should. - -functions to get all the joints/bodies a body/joint is connected to. - -If I don't have the GCC libraries installed, HUGE_VALF is undefined. - -fix capped cylinder - capped cylinder collision so that two contacts can -be generated. - -transformation geometry object. - -joint groups should also be destroyed by destroying the world --> naaahhh. - -DONT DO THIS: body/joint creators with world = 0 --> not inserted into any -world. allow bodies/joints to be detached from a world (this is what happens -to grouped joints when a world is destroyed). - can bodies and joints be linked together when not attached to world?? - what happens when we have an island of b/j, some of which are not in - world? soln: dont keep lists of b/j in the world, just infer it from - the islands? - -body & joint disabling / enabling - -start a change log. - -collision flags - 0xffff mask. - -dBodyGetFiniteRotationMode() / ...Axis() - -dBodyAddForceAtRelPos() - -ball & socket joint limits and motors. - -auto-build env on windows: 3 compilers, debug/release, short/double = -12 combinations --> auto logs. - -handle infinities better: HUGE_VALF is not commanly defined, it seems. -get rid of the __USE_ISOC9X macro in common.h -perhaps just use a "big" number instead of the actual IEEE infinity, it's -more portable anyway. - --> new config system - -dCloseODE() - tidy up *all* allocated memory, esp in geom.cpp. used to keep -leak detectors happy. - -extra API to get lambda and J'*lambda from last timestep. - -better stack implementation that is not so system dependent. but how will -we do dynamic page allocation? do we even need to? - - -all collision files will now be collision_*, not geom_* - -check exported global symbols - no C++ mangling. - -rename dSphere etc to dxSphere etc. - -C interface support for making new classes. - -make sure DLL-ized stuff preserved ... but class numbers should no longer be -exported. - -point geom ( = sphere of radius 0 ) - -geoms stored in doubly linked lists in space (fast removal). - -bodies need to keep geoms pointers and call dGeomMoved() in dBodySetPosition() -etc and world step. PROBLEM: links dynamics and collision together too much, -makes it hard to extract ODE collision ... unless we say: dGeomMoved() and -dGeomID must be supplied by the new collision library! - -dCollide() should take spaces as arguments - it should call dSpaceCollide2() -with its own callback that puts all found contacts in the array, stopping -when there is no more space left in the array. - -dxSpace::getGeom() - the geom numbers will change as geoms are dirtied - find -some other numbering scheme, or document this behavior. - -the 'placeable' property - objects that should not ever be attached to bodies -should flag an error when setBody etc are called. - -dGeomSetBody(0) - DOC: the position and orientation of the body will be -preserved. in this case the geom should NOT be dirtied (dGeomMoved() should -not be called). - -DOC: dGeomGetBodyNext() as part of dynamics/collision interface - -groups/spaces are subclasses of geom. - -groups/spaces can contain other groups/spaces. geom can be owned by a -group/space. collision handling: - geom-geom : standard collision function - geom-group : special space code - group-group : n^2 tests (or n space tests) - hard to optimize because - of disjoint space representations. - group internal : normal space internal-collision code - -groups/spaces can be told that some objects never move, i.e. that the objects -are locked. should we lock the whole space? - locking: the AABB for the object is not recalculated - -groups/spaces can be told that the internal contents self-intersect or not. -actually an old ODE group is the equivalent of an old ODE simple space. - - just call dCollide() or not. - -the group doesn't get passed to the space callback any more ... only the -intersecting geoms get passed? maybe the callback can initiate the extra -intersection tests itself? (because we want programmable flexibility to -determine what gets intersected and what doesn't) - - NO - -infrastructure to indicate when an object has moved (and thus its AABB needs -to be recalculated) - -space enumeration functions. make sure that there are no additions or deletions -while enumeration is taking place. - - documented the behavior, didn't disallow it - -cache the AABB in the dxGeom? (for non-moving objects) - perhaps keep a -pointer to separately allocated space? ... no - -DOC: dGeomGetClass() is a first-class geom function, not in the "User -defined classes" section. it returns a constant that can be checked -against dSphereClass etc. - -remove dxGeom dependence on dBodyID? ... not yet - -dBase -> dxBase - -allow a geom to be inserted into multiple spaces? need this to optimize some -kinds of tests ... no - -update docs. - -make CHECK_NOT_LOCKED an assert. - -DOC: "Calling these functions on a non-placeable geom results in a -runtime error." ...in the debug build only? - -non-placeable geoms should not allocate dxPosR. perhaps pass a dGeom -constructor arg that says 'placeable' or not - this also sets the -GEOM_PLACEABLE flag. - -GeomTransform: - final_pos and final_R valid if no GEOM_AABB_BAD flag!!! - fix up this code, esp use of ComputeTX(). - -Space incompatibilities: no dSpaceDestroy(), dGeomDestroy() does not -take a dSpaceID ... dSpaceDestroy() added. - -GeomGroup incompatibilities: - dCollide() used to take a GeomGroup and would return all the contact - points for all the intersecting objects. now you have to call - dSpaceCollide2() and get a callback for each one. - need to provide old behavior. - -simple space optimization: we should keep the precomputed AABB for the -non-moving geoms around, so that when the other geoms move we can just -compute the AABBs for those geoms and then combine it with the non-moving AABB. - --> too hard! - -collision build options: old and new - -tidyups for collision: - * rationalize what stuff goes in what source files, and file names - * minimize set of header files that all collision* sources use - after - all changes. - * update ode-cpp stuff (C++ interface header files). - -porting guide: - ODE list email - - dGeomGetSpaceAABB() deleted - - dGeomGetClass (geom_group); used to return a unique type for - GeomGroups, but now it returns dSimpleSpaceID. - -tidyups: update DLL declarations. - diff --git a/libraries/ode-0.9/ode/demo/Makefile.am b/libraries/ode-0.9/ode/demo/Makefile.am deleted file mode 100644 index 361ad53f9c..0000000000 --- a/libraries/ode-0.9/ode/demo/Makefile.am +++ /dev/null @@ -1,254 +0,0 @@ -AM_CXXFLAGS = @ARCHFLAGS@ @CXXFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include -AM_CFLAGS = @ARCHFLAGS@ @CXXFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include - -noinst_PROGRAMS=demo_collision \ - demo_slider \ - demo_feedback \ - demo_crash \ - demo_space \ - demo_I \ - demo_friction \ - demo_space_stress \ - demo_boxstack demo_hinge \ - demo_step \ - demo_buggy \ - demo_joints \ - demo_motor \ - demo_chain1 \ - demo_chain2 \ - demo_cylvssphere \ - demo_ode \ - demo_plane2d \ - demo_heightfield \ - demo_convex_cd \ - demo_jointPR -if TRIMESH -noinst_PROGRAMS+= demo_trimesh demo_moving_trimesh demo_basket demo_cyl -endif -demo_collision_SOURCES= demo_collision.cpp -demo_slider_SOURCES= demo_slider.cpp -demo_feedback_SOURCES= demo_feedback.cpp -demo_crash_SOURCES= demo_crash.cpp -demo_space_SOURCES= demo_space.cpp -demo_I_SOURCES= demo_I.cpp -demo_friction_SOURCES= demo_friction.cpp -demo_space_stress_SOURCES= demo_space_stress.cpp -demo_boxstack_SOURCES= demo_boxstack.cpp -demo_hinge_SOURCES= demo_hinge.cpp -demo_step_SOURCES= demo_step.cpp -demo_buggy_SOURCES= demo_buggy.cpp -demo_cyl_SOURCES= demo_cyl.cpp world_geom3.h -demo_cylvssphere_SOURCES= demo_cylvssphere.cpp -demo_joints_SOURCES= demo_joints.cpp -demo_jointPR_SOURCES= demo_jointPR.cpp -demo_motor_SOURCES= demo_motor.cpp -demo_chain1_SOURCES= demo_chain1.c -demo_chain2_SOURCES= demo_chain2.cpp -demo_ode_SOURCES= demo_ode.cpp -demo_plane2d_SOURCES= demo_plane2d.cpp -demo_heightfield_SOURCES= demo_heightfield.cpp -demo_convex_cd_SOURCES= demo_convex_cd.cpp -demo_collision_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_slider_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_feedback_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_crash_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_space_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_I_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_friction_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_space_stress_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_boxstack_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_hinge_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_step_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_buggy_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_cyl_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_cylvssphere_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_joints_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_jointPR_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_motor_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_chain1_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_chain2_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_ode_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_plane2d_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_heightfield_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ -demo_convex_cd_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_collision_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_slider_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_feedback_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_crash_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_space_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_I_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_friction_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_space_stress_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_boxstack_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_hinge_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_step_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_buggy_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_cyl_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_cylvssphere_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_joints_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_jointPR_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_motor_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_chain1_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_chain2_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_ode_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_plane2d_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_heightfield_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_convex_cd_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a - -if TRIMESH -demo_trimesh_SOURCES= demo_trimesh.cpp -demo_moving_trimesh_SOURCES= demo_moving_trimesh.cpp -demo_basket_SOURCES= demo_basket.cpp -demo_trimesh_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ \ - @GL_LIBS@ @LIBS@ -demo_moving_trimesh_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ \ - @GL_LIBS@ @LIBS@ -demo_basket_LDFLAGS= -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ \ - @GL_LIBS@ @LIBS@ -demo_trimesh_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a -demo_moving_trimesh_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a - -demo_basket_DEPENDENCIES= $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a - -endif - -demo_ode_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_plane2d_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_heightfield_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_chain2_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_chain1_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_joints_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_jointPR_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_motor_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_buggy_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_cyl_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_cylvssphere_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_step_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_hinge_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_boxstack_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_space_stress_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_friction_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_I_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_space_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_crash_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_slider_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_feedback_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_collision_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_convex_cd_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ - - -if TRIMESH -demo_trimesh_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_moving_trimesh_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_basket_LDADD= -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -endif - - -if WIN32 -resources.o: ../../drawstuff/src/resources.rc ../../drawstuff/src/resource.h - @WINDRES@ ../../drawstuff/src/resources.rc -o resources.o -demo_ode_LDADD+= resources.o -demo_heightfield_LDADD+= resources.o -demo_chain2_LDADD+= resources.o -demo_chain1_LDADD+= resources.o -demo_joints_LDADD+= resources.o -demo_jointPR_LDADD+= resources.o -demo_motor_LDADD+= resources.o -demo_buggy_LDADD+= resources.o -demo_cyl_LDADD+= resources.o -demo_cylvssphere_LDADD+= resources.o -demo_step_LDADD+= resources.o -demo_hinge_LDADD+= resources.o -demo_boxstack_LDADD+= resources.o -demo_space_stress_LDADD+= resources.o -demo_friction_LDADD+= resources.o -demo_I_LDADD+= resources.o -demo_space_LDADD+= resources.o -demo_crash_LDADD+= resources.o -demo_slider_LDADD+= resources.o -demo_feedback_LDADD+= resources.o -demo_collision_LDADD+= resources.o -demo_convex_cd_LDADD+= resources.o -demo_ode_DEPENDENCIES+= resources.o -demo_chain2_DEPENDENCIES+= resources.o -demo_chain1_DEPENDENCIES+= resources.o -demo_joints_DEPENDENCIES+= resources.o -demo_jointPR_DEPENDENCIES+= resources.o -demo_motor_DEPENDENCIES+= resources.o -demo_buggy_DEPENDENCIES+= resources.o -demo_cyl_DEPENDENCIES+= resources.o -demo_cylvssphere_DEPENDENCIES+= resources.o -demo_step_DEPENDENCIES+= resources.o -demo_hinge_DEPENDENCIES+= resources.o -demo_boxstack_DEPENDENCIES+= resources.o -demo_space_stress_DEPENDENCIES+= resources.o -demo_friction_DEPENDENCIES+= resources.o -demo_I_DEPENDENCIES+= resources.o -demo_space_DEPENDENCIES+= resources.o -demo_crash_DEPENDENCIES+= resources.o -demo_slider_DEPENDENCIES+= resources.o -demo_feedback_DEPENDENCIES+= resources.o -demo_collision_DEPENDENCIES+= resources.o -demo_convex_cd_DEPENDENCIES+= resources.o - -if TRIMESH -demo_trimesh_LDADD+= resources.o -demo_moving_trimesh_LDADD+= resources.o -demo_trimesh_DEPENDENCIES+= resources.o -demo_moving_trimesh_DEPENDENCIES+= resources.o -demo_basket_DEPENDENCIES+= resources.o -endif -endif diff --git a/libraries/ode-0.9/ode/demo/Makefile.in b/libraries/ode-0.9/ode/demo/Makefile.in deleted file mode 100644 index 8e73f18424..0000000000 --- a/libraries/ode-0.9/ode/demo/Makefile.in +++ /dev/null @@ -1,953 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -noinst_PROGRAMS = demo_collision$(EXEEXT) demo_slider$(EXEEXT) \ - demo_feedback$(EXEEXT) demo_crash$(EXEEXT) demo_space$(EXEEXT) \ - demo_I$(EXEEXT) demo_friction$(EXEEXT) \ - demo_space_stress$(EXEEXT) demo_boxstack$(EXEEXT) \ - demo_hinge$(EXEEXT) demo_step$(EXEEXT) demo_buggy$(EXEEXT) \ - demo_joints$(EXEEXT) demo_motor$(EXEEXT) demo_chain1$(EXEEXT) \ - demo_chain2$(EXEEXT) demo_cylvssphere$(EXEEXT) \ - demo_ode$(EXEEXT) demo_plane2d$(EXEEXT) \ - demo_heightfield$(EXEEXT) demo_convex_cd$(EXEEXT) \ - demo_jointPR$(EXEEXT) $(am__EXEEXT_1) -@TRIMESH_TRUE@am__append_1 = demo_trimesh demo_moving_trimesh demo_basket demo_cyl -@WIN32_TRUE@am__append_2 = resources.o -@WIN32_TRUE@am__append_3 = resources.o -@WIN32_TRUE@am__append_4 = resources.o -@WIN32_TRUE@am__append_5 = resources.o -@WIN32_TRUE@am__append_6 = resources.o -@WIN32_TRUE@am__append_7 = resources.o -@WIN32_TRUE@am__append_8 = resources.o -@WIN32_TRUE@am__append_9 = resources.o -@WIN32_TRUE@am__append_10 = resources.o -@WIN32_TRUE@am__append_11 = resources.o -@WIN32_TRUE@am__append_12 = resources.o -@WIN32_TRUE@am__append_13 = resources.o -@WIN32_TRUE@am__append_14 = resources.o -@WIN32_TRUE@am__append_15 = resources.o -@WIN32_TRUE@am__append_16 = resources.o -@WIN32_TRUE@am__append_17 = resources.o -@WIN32_TRUE@am__append_18 = resources.o -@WIN32_TRUE@am__append_19 = resources.o -@WIN32_TRUE@am__append_20 = resources.o -@WIN32_TRUE@am__append_21 = resources.o -@WIN32_TRUE@am__append_22 = resources.o -@WIN32_TRUE@am__append_23 = resources.o -@WIN32_TRUE@am__append_24 = resources.o -@WIN32_TRUE@am__append_25 = resources.o -@WIN32_TRUE@am__append_26 = resources.o -@WIN32_TRUE@am__append_27 = resources.o -@WIN32_TRUE@am__append_28 = resources.o -@WIN32_TRUE@am__append_29 = resources.o -@WIN32_TRUE@am__append_30 = resources.o -@WIN32_TRUE@am__append_31 = resources.o -@WIN32_TRUE@am__append_32 = resources.o -@WIN32_TRUE@am__append_33 = resources.o -@WIN32_TRUE@am__append_34 = resources.o -@WIN32_TRUE@am__append_35 = resources.o -@WIN32_TRUE@am__append_36 = resources.o -@WIN32_TRUE@am__append_37 = resources.o -@WIN32_TRUE@am__append_38 = resources.o -@WIN32_TRUE@am__append_39 = resources.o -@WIN32_TRUE@am__append_40 = resources.o -@WIN32_TRUE@am__append_41 = resources.o -@WIN32_TRUE@am__append_42 = resources.o -@WIN32_TRUE@am__append_43 = resources.o -@WIN32_TRUE@am__append_44 = resources.o -@TRIMESH_TRUE@@WIN32_TRUE@am__append_45 = resources.o -@TRIMESH_TRUE@@WIN32_TRUE@am__append_46 = resources.o -@TRIMESH_TRUE@@WIN32_TRUE@am__append_47 = resources.o -@TRIMESH_TRUE@@WIN32_TRUE@am__append_48 = resources.o -@TRIMESH_TRUE@@WIN32_TRUE@am__append_49 = resources.o -subdir = ode/demo -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/ode/config.h -CONFIG_CLEAN_FILES = -@TRIMESH_TRUE@am__EXEEXT_1 = demo_trimesh$(EXEEXT) \ -@TRIMESH_TRUE@ demo_moving_trimesh$(EXEEXT) \ -@TRIMESH_TRUE@ demo_basket$(EXEEXT) demo_cyl$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) -am_demo_I_OBJECTS = demo_I.$(OBJEXT) -demo_I_OBJECTS = $(am_demo_I_OBJECTS) -demo_I_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(demo_I_LDFLAGS) \ - $(LDFLAGS) -o $@ -am__demo_basket_SOURCES_DIST = demo_basket.cpp -@TRIMESH_TRUE@am_demo_basket_OBJECTS = demo_basket.$(OBJEXT) -demo_basket_OBJECTS = $(am_demo_basket_OBJECTS) -demo_basket_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_basket_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_boxstack_OBJECTS = demo_boxstack.$(OBJEXT) -demo_boxstack_OBJECTS = $(am_demo_boxstack_OBJECTS) -demo_boxstack_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_boxstack_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_buggy_OBJECTS = demo_buggy.$(OBJEXT) -demo_buggy_OBJECTS = $(am_demo_buggy_OBJECTS) -demo_buggy_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_buggy_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_chain1_OBJECTS = demo_chain1.$(OBJEXT) -demo_chain1_OBJECTS = $(am_demo_chain1_OBJECTS) -demo_chain1_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(demo_chain1_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_chain2_OBJECTS = demo_chain2.$(OBJEXT) -demo_chain2_OBJECTS = $(am_demo_chain2_OBJECTS) -demo_chain2_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_chain2_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_collision_OBJECTS = demo_collision.$(OBJEXT) -demo_collision_OBJECTS = $(am_demo_collision_OBJECTS) -demo_collision_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_collision_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_convex_cd_OBJECTS = demo_convex_cd.$(OBJEXT) -demo_convex_cd_OBJECTS = $(am_demo_convex_cd_OBJECTS) -demo_convex_cd_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_convex_cd_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_crash_OBJECTS = demo_crash.$(OBJEXT) -demo_crash_OBJECTS = $(am_demo_crash_OBJECTS) -demo_crash_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_crash_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_cyl_OBJECTS = demo_cyl.$(OBJEXT) -demo_cyl_OBJECTS = $(am_demo_cyl_OBJECTS) -demo_cyl_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_cyl_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_cylvssphere_OBJECTS = demo_cylvssphere.$(OBJEXT) -demo_cylvssphere_OBJECTS = $(am_demo_cylvssphere_OBJECTS) -demo_cylvssphere_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_cylvssphere_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_feedback_OBJECTS = demo_feedback.$(OBJEXT) -demo_feedback_OBJECTS = $(am_demo_feedback_OBJECTS) -demo_feedback_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_feedback_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_friction_OBJECTS = demo_friction.$(OBJEXT) -demo_friction_OBJECTS = $(am_demo_friction_OBJECTS) -demo_friction_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_friction_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_heightfield_OBJECTS = demo_heightfield.$(OBJEXT) -demo_heightfield_OBJECTS = $(am_demo_heightfield_OBJECTS) -demo_heightfield_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_heightfield_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_hinge_OBJECTS = demo_hinge.$(OBJEXT) -demo_hinge_OBJECTS = $(am_demo_hinge_OBJECTS) -demo_hinge_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_hinge_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_jointPR_OBJECTS = demo_jointPR.$(OBJEXT) -demo_jointPR_OBJECTS = $(am_demo_jointPR_OBJECTS) -demo_jointPR_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_jointPR_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_joints_OBJECTS = demo_joints.$(OBJEXT) -demo_joints_OBJECTS = $(am_demo_joints_OBJECTS) -demo_joints_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_joints_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_motor_OBJECTS = demo_motor.$(OBJEXT) -demo_motor_OBJECTS = $(am_demo_motor_OBJECTS) -demo_motor_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_motor_LDFLAGS) $(LDFLAGS) -o $@ -am__demo_moving_trimesh_SOURCES_DIST = demo_moving_trimesh.cpp -@TRIMESH_TRUE@am_demo_moving_trimesh_OBJECTS = \ -@TRIMESH_TRUE@ demo_moving_trimesh.$(OBJEXT) -demo_moving_trimesh_OBJECTS = $(am_demo_moving_trimesh_OBJECTS) -demo_moving_trimesh_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_moving_trimesh_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_ode_OBJECTS = demo_ode.$(OBJEXT) -demo_ode_OBJECTS = $(am_demo_ode_OBJECTS) -demo_ode_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_ode_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_plane2d_OBJECTS = demo_plane2d.$(OBJEXT) -demo_plane2d_OBJECTS = $(am_demo_plane2d_OBJECTS) -demo_plane2d_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_plane2d_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_slider_OBJECTS = demo_slider.$(OBJEXT) -demo_slider_OBJECTS = $(am_demo_slider_OBJECTS) -demo_slider_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_slider_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_space_OBJECTS = demo_space.$(OBJEXT) -demo_space_OBJECTS = $(am_demo_space_OBJECTS) -demo_space_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_space_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_space_stress_OBJECTS = demo_space_stress.$(OBJEXT) -demo_space_stress_OBJECTS = $(am_demo_space_stress_OBJECTS) -demo_space_stress_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_space_stress_LDFLAGS) $(LDFLAGS) -o $@ -am_demo_step_OBJECTS = demo_step.$(OBJEXT) -demo_step_OBJECTS = $(am_demo_step_OBJECTS) -demo_step_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_step_LDFLAGS) $(LDFLAGS) -o $@ -am__demo_trimesh_SOURCES_DIST = demo_trimesh.cpp -@TRIMESH_TRUE@am_demo_trimesh_OBJECTS = demo_trimesh.$(OBJEXT) -demo_trimesh_OBJECTS = $(am_demo_trimesh_OBJECTS) -demo_trimesh_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ - $(demo_trimesh_LDFLAGS) $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I. -I$(top_builddir)/include/ode@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ - -o $@ -SOURCES = $(demo_I_SOURCES) $(demo_basket_SOURCES) \ - $(demo_boxstack_SOURCES) $(demo_buggy_SOURCES) \ - $(demo_chain1_SOURCES) $(demo_chain2_SOURCES) \ - $(demo_collision_SOURCES) $(demo_convex_cd_SOURCES) \ - $(demo_crash_SOURCES) $(demo_cyl_SOURCES) \ - $(demo_cylvssphere_SOURCES) $(demo_feedback_SOURCES) \ - $(demo_friction_SOURCES) $(demo_heightfield_SOURCES) \ - $(demo_hinge_SOURCES) $(demo_jointPR_SOURCES) \ - $(demo_joints_SOURCES) $(demo_motor_SOURCES) \ - $(demo_moving_trimesh_SOURCES) $(demo_ode_SOURCES) \ - $(demo_plane2d_SOURCES) $(demo_slider_SOURCES) \ - $(demo_space_SOURCES) $(demo_space_stress_SOURCES) \ - $(demo_step_SOURCES) $(demo_trimesh_SOURCES) -DIST_SOURCES = $(demo_I_SOURCES) $(am__demo_basket_SOURCES_DIST) \ - $(demo_boxstack_SOURCES) $(demo_buggy_SOURCES) \ - $(demo_chain1_SOURCES) $(demo_chain2_SOURCES) \ - $(demo_collision_SOURCES) $(demo_convex_cd_SOURCES) \ - $(demo_crash_SOURCES) $(demo_cyl_SOURCES) \ - $(demo_cylvssphere_SOURCES) $(demo_feedback_SOURCES) \ - $(demo_friction_SOURCES) $(demo_heightfield_SOURCES) \ - $(demo_hinge_SOURCES) $(demo_jointPR_SOURCES) \ - $(demo_joints_SOURCES) $(demo_motor_SOURCES) \ - $(am__demo_moving_trimesh_SOURCES_DIST) $(demo_ode_SOURCES) \ - $(demo_plane2d_SOURCES) $(demo_slider_SOURCES) \ - $(demo_space_SOURCES) $(demo_space_stress_SOURCES) \ - $(demo_step_SOURCES) $(am__demo_trimesh_SOURCES_DIST) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -ARCHFLAGS = @ARCHFLAGS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DRAWSTUFF = @DRAWSTUFF@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GL_LIBS = @GL_LIBS@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -ODE_AGE = @ODE_AGE@ -ODE_CURRENT = @ODE_CURRENT@ -ODE_RELEASE = @ODE_RELEASE@ -ODE_REVISION = @ODE_REVISION@ -ODE_SONAME = @ODE_SONAME@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHARED_LDFLAGS = @SHARED_LDFLAGS@ -SHELL = @SHELL@ -STRIP = @STRIP@ -TOPDIR = @TOPDIR@ -VERSION = @VERSION@ -WINDRES = @WINDRES@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_WINDRES = @ac_ct_WINDRES@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -so_ext = @so_ext@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AM_CXXFLAGS = @ARCHFLAGS@ @CXXFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include -AM_CFLAGS = @ARCHFLAGS@ @CXXFLAGS@ -I$(top_srcdir)/include -I$(top_builddir)/include -demo_collision_SOURCES = demo_collision.cpp -demo_slider_SOURCES = demo_slider.cpp -demo_feedback_SOURCES = demo_feedback.cpp -demo_crash_SOURCES = demo_crash.cpp -demo_space_SOURCES = demo_space.cpp -demo_I_SOURCES = demo_I.cpp -demo_friction_SOURCES = demo_friction.cpp -demo_space_stress_SOURCES = demo_space_stress.cpp -demo_boxstack_SOURCES = demo_boxstack.cpp -demo_hinge_SOURCES = demo_hinge.cpp -demo_step_SOURCES = demo_step.cpp -demo_buggy_SOURCES = demo_buggy.cpp -demo_cyl_SOURCES = demo_cyl.cpp world_geom3.h -demo_cylvssphere_SOURCES = demo_cylvssphere.cpp -demo_joints_SOURCES = demo_joints.cpp -demo_jointPR_SOURCES = demo_jointPR.cpp -demo_motor_SOURCES = demo_motor.cpp -demo_chain1_SOURCES = demo_chain1.c -demo_chain2_SOURCES = demo_chain2.cpp -demo_ode_SOURCES = demo_ode.cpp -demo_plane2d_SOURCES = demo_plane2d.cpp -demo_heightfield_SOURCES = demo_heightfield.cpp -demo_convex_cd_SOURCES = demo_convex_cd.cpp -demo_collision_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_slider_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_feedback_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_crash_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_space_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_I_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_friction_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_space_stress_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_boxstack_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_hinge_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_step_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_buggy_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_cyl_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_cylvssphere_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_joints_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_jointPR_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_motor_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_chain1_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_chain2_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_ode_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_plane2d_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_heightfield_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_convex_cd_LDFLAGS = -L$(top_builddir)/drawstuff/src \ - -L$(top_builddir)/ode/src @LDFLAGS@ - -demo_collision_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_43) -demo_slider_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_41) -demo_feedback_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_42) -demo_crash_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_40) -demo_space_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_39) -demo_I_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_38) -demo_friction_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_37) -demo_space_stress_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_36) -demo_boxstack_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_35) -demo_hinge_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_34) -demo_step_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_33) -demo_buggy_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_30) -demo_cyl_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_31) -demo_cylvssphere_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_32) -demo_joints_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_27) -demo_jointPR_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_28) -demo_motor_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_29) -demo_chain1_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_26) -demo_chain2_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_25) -demo_ode_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_24) -demo_plane2d_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a - -demo_heightfield_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a - -demo_convex_cd_DEPENDENCIES = $(top_builddir)/ode/src/libode.a \ - $(top_builddir)/drawstuff/src/libdrawstuff.a $(am__append_44) -@TRIMESH_TRUE@demo_trimesh_SOURCES = demo_trimesh.cpp -@TRIMESH_TRUE@demo_moving_trimesh_SOURCES = demo_moving_trimesh.cpp -@TRIMESH_TRUE@demo_basket_SOURCES = demo_basket.cpp -@TRIMESH_TRUE@demo_trimesh_LDFLAGS = -L$(top_builddir)/drawstuff/src \ -@TRIMESH_TRUE@ -L$(top_builddir)/ode/src @LDFLAGS@ \ -@TRIMESH_TRUE@ @GL_LIBS@ @LIBS@ - -@TRIMESH_TRUE@demo_moving_trimesh_LDFLAGS = -L$(top_builddir)/drawstuff/src \ -@TRIMESH_TRUE@ -L$(top_builddir)/ode/src @LDFLAGS@ \ -@TRIMESH_TRUE@ @GL_LIBS@ @LIBS@ - -@TRIMESH_TRUE@demo_basket_LDFLAGS = -L$(top_builddir)/drawstuff/src \ -@TRIMESH_TRUE@ -L$(top_builddir)/ode/src @LDFLAGS@ \ -@TRIMESH_TRUE@ @GL_LIBS@ @LIBS@ - -@TRIMESH_TRUE@demo_trimesh_DEPENDENCIES = \ -@TRIMESH_TRUE@ $(top_builddir)/ode/src/libode.a \ -@TRIMESH_TRUE@ $(top_builddir)/drawstuff/src/libdrawstuff.a \ -@TRIMESH_TRUE@ $(am__append_47) -@TRIMESH_TRUE@demo_moving_trimesh_DEPENDENCIES = \ -@TRIMESH_TRUE@ $(top_builddir)/ode/src/libode.a \ -@TRIMESH_TRUE@ $(top_builddir)/drawstuff/src/libdrawstuff.a \ -@TRIMESH_TRUE@ $(am__append_48) -@TRIMESH_TRUE@demo_basket_DEPENDENCIES = \ -@TRIMESH_TRUE@ $(top_builddir)/ode/src/libode.a \ -@TRIMESH_TRUE@ $(top_builddir)/drawstuff/src/libdrawstuff.a \ -@TRIMESH_TRUE@ $(am__append_49) -demo_ode_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_2) -demo_plane2d_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -demo_heightfield_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_3) -demo_chain2_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_4) -demo_chain1_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_5) -demo_joints_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_6) -demo_jointPR_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_7) -demo_motor_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_8) -demo_buggy_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_9) -demo_cyl_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_10) -demo_cylvssphere_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_11) -demo_step_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_12) -demo_hinge_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_13) -demo_boxstack_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_14) -demo_space_stress_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_15) -demo_friction_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_16) -demo_I_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ \ - @LIBS@ $(am__append_17) -demo_space_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_18) -demo_crash_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_19) -demo_slider_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_20) -demo_feedback_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_21) -demo_collision_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_22) -demo_convex_cd_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a \ - @GL_LIBS@ @LIBS@ $(am__append_23) -@TRIMESH_TRUE@demo_trimesh_LDADD = -ldrawstuff \ -@TRIMESH_TRUE@ $(top_builddir)/ode/src/libode.a @GL_LIBS@ \ -@TRIMESH_TRUE@ @LIBS@ $(am__append_45) -@TRIMESH_TRUE@demo_moving_trimesh_LDADD = -ldrawstuff \ -@TRIMESH_TRUE@ $(top_builddir)/ode/src/libode.a @GL_LIBS@ \ -@TRIMESH_TRUE@ @LIBS@ $(am__append_46) -@TRIMESH_TRUE@demo_basket_LDADD = -ldrawstuff $(top_builddir)/ode/src/libode.a @GL_LIBS@ @LIBS@ -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .cpp .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ode/demo/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign ode/demo/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -demo_I$(EXEEXT): $(demo_I_OBJECTS) $(demo_I_DEPENDENCIES) - @rm -f demo_I$(EXEEXT) - $(demo_I_LINK) $(demo_I_OBJECTS) $(demo_I_LDADD) $(LIBS) -demo_basket$(EXEEXT): $(demo_basket_OBJECTS) $(demo_basket_DEPENDENCIES) - @rm -f demo_basket$(EXEEXT) - $(demo_basket_LINK) $(demo_basket_OBJECTS) $(demo_basket_LDADD) $(LIBS) -demo_boxstack$(EXEEXT): $(demo_boxstack_OBJECTS) $(demo_boxstack_DEPENDENCIES) - @rm -f demo_boxstack$(EXEEXT) - $(demo_boxstack_LINK) $(demo_boxstack_OBJECTS) $(demo_boxstack_LDADD) $(LIBS) -demo_buggy$(EXEEXT): $(demo_buggy_OBJECTS) $(demo_buggy_DEPENDENCIES) - @rm -f demo_buggy$(EXEEXT) - $(demo_buggy_LINK) $(demo_buggy_OBJECTS) $(demo_buggy_LDADD) $(LIBS) -demo_chain1$(EXEEXT): $(demo_chain1_OBJECTS) $(demo_chain1_DEPENDENCIES) - @rm -f demo_chain1$(EXEEXT) - $(demo_chain1_LINK) $(demo_chain1_OBJECTS) $(demo_chain1_LDADD) $(LIBS) -demo_chain2$(EXEEXT): $(demo_chain2_OBJECTS) $(demo_chain2_DEPENDENCIES) - @rm -f demo_chain2$(EXEEXT) - $(demo_chain2_LINK) $(demo_chain2_OBJECTS) $(demo_chain2_LDADD) $(LIBS) -demo_collision$(EXEEXT): $(demo_collision_OBJECTS) $(demo_collision_DEPENDENCIES) - @rm -f demo_collision$(EXEEXT) - $(demo_collision_LINK) $(demo_collision_OBJECTS) $(demo_collision_LDADD) $(LIBS) -demo_convex_cd$(EXEEXT): $(demo_convex_cd_OBJECTS) $(demo_convex_cd_DEPENDENCIES) - @rm -f demo_convex_cd$(EXEEXT) - $(demo_convex_cd_LINK) $(demo_convex_cd_OBJECTS) $(demo_convex_cd_LDADD) $(LIBS) -demo_crash$(EXEEXT): $(demo_crash_OBJECTS) $(demo_crash_DEPENDENCIES) - @rm -f demo_crash$(EXEEXT) - $(demo_crash_LINK) $(demo_crash_OBJECTS) $(demo_crash_LDADD) $(LIBS) -demo_cyl$(EXEEXT): $(demo_cyl_OBJECTS) $(demo_cyl_DEPENDENCIES) - @rm -f demo_cyl$(EXEEXT) - $(demo_cyl_LINK) $(demo_cyl_OBJECTS) $(demo_cyl_LDADD) $(LIBS) -demo_cylvssphere$(EXEEXT): $(demo_cylvssphere_OBJECTS) $(demo_cylvssphere_DEPENDENCIES) - @rm -f demo_cylvssphere$(EXEEXT) - $(demo_cylvssphere_LINK) $(demo_cylvssphere_OBJECTS) $(demo_cylvssphere_LDADD) $(LIBS) -demo_feedback$(EXEEXT): $(demo_feedback_OBJECTS) $(demo_feedback_DEPENDENCIES) - @rm -f demo_feedback$(EXEEXT) - $(demo_feedback_LINK) $(demo_feedback_OBJECTS) $(demo_feedback_LDADD) $(LIBS) -demo_friction$(EXEEXT): $(demo_friction_OBJECTS) $(demo_friction_DEPENDENCIES) - @rm -f demo_friction$(EXEEXT) - $(demo_friction_LINK) $(demo_friction_OBJECTS) $(demo_friction_LDADD) $(LIBS) -demo_heightfield$(EXEEXT): $(demo_heightfield_OBJECTS) $(demo_heightfield_DEPENDENCIES) - @rm -f demo_heightfield$(EXEEXT) - $(demo_heightfield_LINK) $(demo_heightfield_OBJECTS) $(demo_heightfield_LDADD) $(LIBS) -demo_hinge$(EXEEXT): $(demo_hinge_OBJECTS) $(demo_hinge_DEPENDENCIES) - @rm -f demo_hinge$(EXEEXT) - $(demo_hinge_LINK) $(demo_hinge_OBJECTS) $(demo_hinge_LDADD) $(LIBS) -demo_jointPR$(EXEEXT): $(demo_jointPR_OBJECTS) $(demo_jointPR_DEPENDENCIES) - @rm -f demo_jointPR$(EXEEXT) - $(demo_jointPR_LINK) $(demo_jointPR_OBJECTS) $(demo_jointPR_LDADD) $(LIBS) -demo_joints$(EXEEXT): $(demo_joints_OBJECTS) $(demo_joints_DEPENDENCIES) - @rm -f demo_joints$(EXEEXT) - $(demo_joints_LINK) $(demo_joints_OBJECTS) $(demo_joints_LDADD) $(LIBS) -demo_motor$(EXEEXT): $(demo_motor_OBJECTS) $(demo_motor_DEPENDENCIES) - @rm -f demo_motor$(EXEEXT) - $(demo_motor_LINK) $(demo_motor_OBJECTS) $(demo_motor_LDADD) $(LIBS) -demo_moving_trimesh$(EXEEXT): $(demo_moving_trimesh_OBJECTS) $(demo_moving_trimesh_DEPENDENCIES) - @rm -f demo_moving_trimesh$(EXEEXT) - $(demo_moving_trimesh_LINK) $(demo_moving_trimesh_OBJECTS) $(demo_moving_trimesh_LDADD) $(LIBS) -demo_ode$(EXEEXT): $(demo_ode_OBJECTS) $(demo_ode_DEPENDENCIES) - @rm -f demo_ode$(EXEEXT) - $(demo_ode_LINK) $(demo_ode_OBJECTS) $(demo_ode_LDADD) $(LIBS) -demo_plane2d$(EXEEXT): $(demo_plane2d_OBJECTS) $(demo_plane2d_DEPENDENCIES) - @rm -f demo_plane2d$(EXEEXT) - $(demo_plane2d_LINK) $(demo_plane2d_OBJECTS) $(demo_plane2d_LDADD) $(LIBS) -demo_slider$(EXEEXT): $(demo_slider_OBJECTS) $(demo_slider_DEPENDENCIES) - @rm -f demo_slider$(EXEEXT) - $(demo_slider_LINK) $(demo_slider_OBJECTS) $(demo_slider_LDADD) $(LIBS) -demo_space$(EXEEXT): $(demo_space_OBJECTS) $(demo_space_DEPENDENCIES) - @rm -f demo_space$(EXEEXT) - $(demo_space_LINK) $(demo_space_OBJECTS) $(demo_space_LDADD) $(LIBS) -demo_space_stress$(EXEEXT): $(demo_space_stress_OBJECTS) $(demo_space_stress_DEPENDENCIES) - @rm -f demo_space_stress$(EXEEXT) - $(demo_space_stress_LINK) $(demo_space_stress_OBJECTS) $(demo_space_stress_LDADD) $(LIBS) -demo_step$(EXEEXT): $(demo_step_OBJECTS) $(demo_step_DEPENDENCIES) - @rm -f demo_step$(EXEEXT) - $(demo_step_LINK) $(demo_step_OBJECTS) $(demo_step_LDADD) $(LIBS) -demo_trimesh$(EXEEXT): $(demo_trimesh_OBJECTS) $(demo_trimesh_DEPENDENCIES) - @rm -f demo_trimesh$(EXEEXT) - $(demo_trimesh_LINK) $(demo_trimesh_OBJECTS) $(demo_trimesh_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_I.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_basket.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_boxstack.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_buggy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_chain1.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_chain2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_collision.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_convex_cd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_crash.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_cyl.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_cylvssphere.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_feedback.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_friction.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_heightfield.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_hinge.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_jointPR.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_joints.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_motor.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_moving_trimesh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_ode.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_plane2d.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_slider.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_space.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_space_stress.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_step.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_trimesh.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.cpp.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-noinstPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am - - -@WIN32_TRUE@resources.o: ../../drawstuff/src/resources.rc ../../drawstuff/src/resource.h -@WIN32_TRUE@ @WINDRES@ ../../drawstuff/src/resources.rc -o resources.o -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/libraries/ode-0.9/ode/demo/basket_geom.h b/libraries/ode-0.9/ode/demo/basket_geom.h deleted file mode 100644 index 7796ca8131..0000000000 --- a/libraries/ode-0.9/ode/demo/basket_geom.h +++ /dev/null @@ -1,13 +0,0 @@ - -static float world_normals[] = { -0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,-0.948064f,0.318080f,0,-0.989482f,0.144655f,0,-0.983494f,0.180939f,0,-0.983494f,0.180939f,0,-0.908999f,0.416798f,0,-0.948064f,0.318080f,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-1,0,-0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-0.132460f,0.991188f,0,0.264920f,0.964270f,0,0.132460f,0.991188f,0,0.132460f,0.991188f,0,-0.264920f,0.964270f,0,-0.132460f,0.991188f,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-0.687592f,-0.726097f,-0,-0.881727f,-0.471761f,0,-0.687592f,-0.726097f,-0,-0.881727f,-0.471761f,0,-0.881727f,-0.471761f,0,-0.687592f,-0.726097f,-0,0.687592f,-0.726097f,0,0.928375f,-0.371644f,0,0.824321f,-0.566123f,0,0.687592f,-0.726097f,0,0.824321f,-0.566123f,0,0.687592f,-0.726097f,0,-0.881727f,-0.471761f,0,-0.985594f,-0.169128f,0,-0.985594f,-0.169128f,0,-0.985594f,-0.169128f,0,-0.881727f,-0.471761f,0,-0.881727f,-0.471761f,0,0.928375f,-0.371644f,0,0.985594f,-0.169128f,0,0.985594f,-0.169128f,0,0.928375f,-0.371644f,0,0.985594f,-0.169128f,0,0.824321f,-0.566123f,0,-0.870167f,0.492758f,0,-0.870167f,0.492758f,0,-0.870167f,0.492758f,0,-0.870167f,0.492758f,0,-0.870167f,0.492758f,0,-0.870167f,0.492758f,0,0.870167f,0.492758f,0,0.870167f,0.492758f,0,0.870167f,0.492758f,0,0.870167f,0.492758f,0,0.870167f,0.492758f,0,0.870167f,0.492758f,-0,-0.390313f,0.920682f,0,-0.132460f,0.991188f,0,-0.264920f,0.964270f,0,-0.264920f,0.964270f,0,-0.390313f,0.920682f,0,-0.390313f,0.920682f,0,0.390313f,0.920682f,0,0.132460f,0.991188f,0,0.264920f,0.964270f,0,0.390313f,0.920682f,0,0.264920f,0.964270f,0,0.390313f,0.920682f,-0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0.985594f,0.169128f,0,0.824321f,0.566123f,0,0.928375f,0.371644f,0,0.928375f,0.371644f,0,0.985594f,0.169128f,0,0.985594f,0.169128f,0,0.824321f,0.566123f,0,0.687592f,0.726097f,0,0.687592f,0.726097f,0,0.687592f,0.726097f,0,0.928375f,0.371644f,0,0.824321f,0.566123f,0,0,1,0,-0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.687592f,0.726097f,0,-0.687592f,0.726097f,0,-0.881727f,0.471761f,0,-0.881727f,0.471761f,0,-0.881727f,0.471761f,0,-0.687592f,0.726097f,0,-0.881727f,0.471761f,0,-0.985594f,0.169128f,0,-0.985594f,0.169128f,0,-0.985594f,0.169128f,0,-0.881727f,0.471761f,0,-0.881727f,0.471761f,0,-0.870166f,-0.492758f,0,-0.870166f,-0.492758f,0,-0.870166f,-0.492758f,0,-0.870166f,-0.492758f,0,-0.870166f,-0.492758f,0,-0.870166f,-0.492758f,0,-0.390314f,-0.920682f,0,-0.132460f,-0.991188f,0,-0.264921f,-0.964270f,0,-0.264921f,-0.964270f,0,-0.390314f,-0.920682f,0,-0.390314f,-0.920682f,0,-0.132460f,-0.991188f,0,0.264921f,-0.964270f,0,0.132460f,-0.991188f,0,0.132460f,-0.991188f,0,-0.264921f,-0.964270f,0,-0.132460f,-0.991188f,0,0.264921f,-0.964270f,0,0.390314f,-0.920682f,0,0.390314f,-0.920682f,0,0.390314f,-0.920682f,0,0.132460f,-0.991188f,0,0.264921f,-0.964270f,0,0.870166f,-0.492758f,0,0.870166f,-0.492758f,0,0.870166f,-0.492758f,0,0.870166f,-0.492758f,0,0.870166f,-0.492758f,0,0.870166f,-0.492758f,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.527606f,0.849489f,0,-0.793893f,0.608057f,0,-0.715135f,0.698986f,0,-0.715135f,0.698986f,0,-0.418249f,0.908332f,0,-0.527606f,0.849489f,0,-0.075284f,0.997162f,0,-0.253577f,0.967315f,0,-0.202069f,0.979371f,0,-0.202069f,0.979371f,0,-0.075284f,0.997162f,0,-0.075284f,0.997162f,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0.160137f,0.987095f,0,0.049305f,0.998784f,0,0.049305f,0.998784f,0,0.049305f,0.998784f,0,0.221401f,0.975183f,0,0.160137f,0.987095f,0,0.696124f,0.717921f,0,0.696124f,0.717921f,0,0.433340f,0.901230f,0,0.433340f,0.901230f,0,0.433340f,0.901230f,0,0.696124f,0.717921f,0,0.696124f,0.717921f,0,0.696124f,0.717921f,0,0.838308f,0.545197f,0,0.696124f,0.717921f,0,0.872167f,0.489208f,0,0.838308f,0.545197f,0,-0.994126f,0.108225f,0,-0.983494f,0.180939f,0,-0.989482f,0.144655f,0,-0.994126f,0.108225f,0,-0.989482f,0.144655f,0,-0.994126f,0.108225f,0,-0.948064f,0.318080f,0,-0.908999f,0.416798f,0,-0.793893f,0.608057f,0,-0.908999f,0.416798f,0,-0.715135f,0.698986f,0,-0.793893f,0.608057f,0,-0.527606f,0.849489f,0,-0.418249f,0.908332f,0,-0.253577f,0.967315f,0,-0.418249f,0.908332f,0,-0.202069f,0.979371f,0,-0.253577f,0.967315f,0,-0.075284f,0.997162f,0,-0.075284f,0.997162f,0,0,1,0,-0.075284f,0.997162f,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0.049305f,0.998784f,0,0,1,0,0.049305f,0.998784f,0,0.049305f,0.998784f,0,0.160137f,0.987095f,0,0.221401f,0.975183f,0,0.433340f,0.901230f,0,0.221401f,0.975183f,0,0.433340f,0.901230f,0,0.433340f,0.901230f,0,0.902172f,0.431376f,0,0.838308f,0.545197f,0,0.872167f,0.489208f,0,0.872167f,0.489208f,0,0.902172f,0.431376f,0,0.902172f,0.431376f, -}; - -static float world_vertices[] = { --4,-4,-0.100000f,4,-4,-0.100000f,4,-4,0.100000f,-4,-4,-0.100000f,4,-4,0.100000f,-4,-4,0.100000f,4,0,0.100000f,4,-4,-0.100000f,4,4,-0.100000f,4,0,0.100000f,4,4,-0.100000f,4,4,0.100000f,4,0,0.100000f,4,-4,0.100000f,4,-4,-0.100000f,-4,-4,-0.100000f,-4,4,-0.100000f,4,4,-0.100000f,-4,-4,-0.100000f,4,4,-0.100000f,4,-4,-0.100000f,0.066000f,-2.060000f,2,0.066000f,-1.940000f,2,-0.066000f,-2.060000f,2,0.066000f,-1.940000f,2,-0.066000f,-1.940000f,2,-0.066000f,-2.060000f,2,-4,4,0.100000f,4,4,0.100000f,4,4,-0.100000f,4,4,-0.100000f,-4,4,-0.100000f,-4,4,0.100000f,-4,-4,0.100000f,-4,0,0.100000f,-4,-4,-0.100000f,-4,0,0.100000f,-4,4,0.100000f,-4,4,-0.100000f,-4,0,0.100000f,-4,4,-0.100000f,-4,-4,-0.100000f,0.360000f,3.244444f,1.466974f,0.360000f,3.422222f,2.266974f,-0.360000f,3.422222f,2.266974f,-0.360000f,3.422222f,2.266974f,-0.360000f,3.244444f,1.466974f,0.360000f,3.244444f,1.466974f,4,-4,0.100000f,0.066000f,-2.060000f,0.100000f,-0.066000f,-2.060000f,0.100000f,-0.066000f,-2.060000f,0.100000f,-4,-4,0.100000f,4,-4,0.100000f,4,0,0.100000f,0.066000f,-1.940000f,0.100000f,4,-4,0.100000f,0.066000f,-1.940000f,0.100000f,0.066000f,-2.060000f,0.100000f,4,-4,0.100000f,-0.066000f,-1.940000f,0.100000f,0.066000f,-1.940000f,0.100000f,4,0,0.100000f,4,0,0.100000f,-4,0,0.100000f,-0.066000f,-1.940000f,0.100000f,-0.066000f,-2.060000f,0.100000f,-0.066000f,-1.940000f,0.100000f,-4,0,0.100000f,-4,0,0.100000f,-4,-4,0.100000f,-0.066000f,-2.060000f,0.100000f,0.066000f,-2.060000f,2,-0.066000f,-2.060000f,2,-0.066000f,-2.060000f,0.100000f,-0.066000f,-2.060000f,0.100000f,0.066000f,-2.060000f,0.100000f,0.066000f,-2.060000f,2,0.066000f,-1.940000f,1.950000f,0.066000f,-1.940000f,2,0.066000f,-2.060000f,2,0.066000f,-2.060000f,2,0.066000f,-2.060000f,0.100000f,0.066000f,-1.940000f,1.950000f,0.066000f,-2.060000f,0.100000f,0.066000f,-1.940000f,0.100000f,0.066000f,-1.940000f,1.950000f,-0.052853f,-1.506390f,2,0.052853f,-1.506390f,2,0.052853f,-1.506390f,1.950000f,0.052853f,-1.506390f,1.950000f,-0.052853f,-1.506390f,1.950000f,-0.052853f,-1.506390f,2,-0.066000f,-2.060000f,0.100000f,-0.066000f,-2.060000f,2,-0.066000f,-1.940000f,1.950000f,-0.066000f,-2.060000f,0.100000f,-0.066000f,-1.940000f,1.950000f,-0.066000f,-1.940000f,0.100000f,-0.066000f,-2.060000f,2,-0.066000f,-1.940000f,2,-0.066000f,-1.940000f,1.950000f,-0.066000f,-1.940000f,0.100000f,-0.066000f,-1.940000f,1.950000f,0.066000f,-1.940000f,1.950000f,-0.066000f,-1.940000f,0.100000f,0.066000f,-1.940000f,1.950000f,0.066000f,-1.940000f,0.100000f,-0.066000f,-1.940000f,1.950000f,-0.066000f,-1.840000f,1.950000f,0.066000f,-1.940000f,1.950000f,-0.066000f,-1.840000f,1.950000f,0.066000f,-1.840000f,1.950000f,0.066000f,-1.940000f,1.950000f,-0.066000f,-1.940000f,2,-0.066000f,-1.840000f,2,-0.066000f,-1.840000f,1.950000f,-0.066000f,-1.840000f,1.950000f,-0.066000f,-1.940000f,1.950000f,-0.066000f,-1.940000f,2,0.066000f,-1.940000f,2,0.066000f,-1.840000f,2,-0.066000f,-1.940000f,2,0.066000f,-1.840000f,2,-0.066000f,-1.840000f,2,-0.066000f,-1.940000f,2,0.066000f,-1.940000f,1.950000f,0.066000f,-1.840000f,1.950000f,0.066000f,-1.840000f,2,0.066000f,-1.940000f,1.950000f,0.066000f,-1.840000f,2,0.066000f,-1.940000f,2,-0.066000f,-1.840000f,2,-0.171600f,-1.740000f,2,-0.066000f,-1.840000f,1.950000f,-0.171600f,-1.740000f,2,-0.171600f,-1.740000f,1.950000f,-0.066000f,-1.840000f,1.950000f,0.066000f,-1.840000f,1.950000f,0.171600f,-1.740000f,1.950000f,0.171600f,-1.740000f,2,0.066000f,-1.840000f,1.950000f,0.171600f,-1.740000f,2,0.066000f,-1.840000f,2,-0.171600f,-1.740000f,2,-0.188760f,-1.640000f,2,-0.188760f,-1.640000f,1.950000f,-0.188760f,-1.640000f,1.950000f,-0.171600f,-1.740000f,1.950000f,-0.171600f,-1.740000f,2,0.171600f,-1.740000f,1.950000f,0.188760f,-1.640000f,1.950000f,0.188760f,-1.640000f,2,0.171600f,-1.740000f,1.950000f,0.188760f,-1.640000f,2,0.171600f,-1.740000f,2,-0.188760f,-1.640000f,2,-0.132132f,-1.540000f,2,-0.132132f,-1.540000f,1.950000f,-0.132132f,-1.540000f,1.950000f,-0.188760f,-1.640000f,1.950000f,-0.188760f,-1.640000f,2,0.188760f,-1.640000f,1.950000f,0.132132f,-1.540000f,1.950000f,0.132132f,-1.540000f,2,0.188760f,-1.640000f,1.950000f,0.132132f,-1.540000f,2,0.188760f,-1.640000f,2,-0.132132f,-1.540000f,2,-0.052853f,-1.506390f,2,-0.052853f,-1.506390f,1.950000f,-0.052853f,-1.506390f,1.950000f,-0.132132f,-1.540000f,1.950000f,-0.132132f,-1.540000f,2,0.132132f,-1.540000f,1.950000f,0.052853f,-1.506390f,1.950000f,0.052853f,-1.506390f,2,0.132132f,-1.540000f,1.950000f,0.052853f,-1.506390f,2,0.132132f,-1.540000f,2,0.188760f,-1.640000f,1.950000f,0.173397f,-1.642679f,1.950000f,0.121808f,-1.551577f,1.950000f,0.121808f,-1.551577f,1.950000f,0.132132f,-1.540000f,1.950000f,0.188760f,-1.640000f,1.950000f,0.171600f,-1.740000f,1.950000f,0.157950f,-1.732697f,1.950000f,0.173397f,-1.642679f,1.950000f,0.171600f,-1.740000f,1.950000f,0.173397f,-1.642679f,1.950000f,0.188760f,-1.640000f,1.950000f,0.171600f,-1.740000f,1.950000f,0.066000f,-1.840000f,1.950000f,0.060149f,-1.825311f,1.950000f,0.171600f,-1.740000f,1.950000f,0.060149f,-1.825311f,1.950000f,0.157950f,-1.732697f,1.950000f,-0.066000f,-1.840000f,1.950000f,-0.060149f,-1.825311f,1.950000f,0.066000f,-1.840000f,1.950000f,-0.060149f,-1.825311f,1.950000f,0.060149f,-1.825311f,1.950000f,0.066000f,-1.840000f,1.950000f,-0.171600f,-1.740000f,1.950000f,-0.157950f,-1.732697f,1.950000f,-0.060149f,-1.825311f,1.950000f,-0.171600f,-1.740000f,1.950000f,-0.060149f,-1.825311f,1.950000f,-0.066000f,-1.840000f,1.950000f,-0.173397f,-1.642679f,1.950000f,-0.157950f,-1.732697f,1.950000f,-0.171600f,-1.740000f,1.950000f,-0.171600f,-1.740000f,1.950000f,-0.188760f,-1.640000f,1.950000f,-0.173397f,-1.642679f,1.950000f,-0.121808f,-1.551577f,1.950000f,-0.173397f,-1.642679f,1.950000f,-0.188760f,-1.640000f,1.950000f,-0.188760f,-1.640000f,1.950000f,-0.132132f,-1.540000f,1.950000f,-0.121808f,-1.551577f,1.950000f,-0.052853f,-1.506390f,1.950000f,-0.049868f,-1.521079f,1.950000f,-0.121808f,-1.551577f,1.950000f,-0.052853f,-1.506390f,1.950000f,-0.121808f,-1.551577f,1.950000f,-0.132132f,-1.540000f,1.950000f,0.049868f,-1.521079f,1.950000f,-0.049868f,-1.521079f,1.950000f,-0.052853f,-1.506390f,1.950000f,-0.052853f,-1.506390f,1.950000f,0.052853f,-1.506390f,1.950000f,0.049868f,-1.521079f,1.950000f,0.052853f,-1.506390f,1.950000f,0.132132f,-1.540000f,1.950000f,0.121808f,-1.551577f,1.950000f,0.052853f,-1.506390f,1.950000f,0.121808f,-1.551577f,1.950000f,0.049868f,-1.521079f,1.950000f,-0.188760f,-1.640000f,2,-0.173397f,-1.642679f,2,-0.121808f,-1.551577f,2,-0.121808f,-1.551577f,2,-0.132132f,-1.540000f,2,-0.188760f,-1.640000f,2,-0.171600f,-1.740000f,2,-0.157950f,-1.732697f,2,-0.173397f,-1.642679f,2,-0.173397f,-1.642679f,2,-0.188760f,-1.640000f,2,-0.171600f,-1.740000f,2,-0.066000f,-1.840000f,2,-0.060149f,-1.825311f,2,-0.171600f,-1.740000f,2,-0.060149f,-1.825311f,2,-0.157950f,-1.732697f,2,-0.171600f,-1.740000f,2,0.066000f,-1.840000f,2,0.060149f,-1.825311f,2,-0.066000f,-1.840000f,2,0.060149f,-1.825311f,2,-0.060149f,-1.825311f,2,-0.066000f,-1.840000f,2,0.171600f,-1.740000f,2,0.157950f,-1.732697f,2,0.060149f,-1.825311f,2,0.171600f,-1.740000f,2,0.060149f,-1.825311f,2,0.066000f,-1.840000f,2,0.173397f,-1.642679f,2,0.157950f,-1.732697f,2,0.171600f,-1.740000f,2,0.171600f,-1.740000f,2,0.188760f,-1.640000f,2,0.173397f,-1.642679f,2,0.121808f,-1.551577f,2,0.173397f,-1.642679f,2,0.188760f,-1.640000f,2,0.188760f,-1.640000f,2,0.132132f,-1.540000f,2,0.121808f,-1.551577f,2,0.052853f,-1.506390f,2,0.049868f,-1.521079f,2,0.121808f,-1.551577f,2,0.052853f,-1.506390f,2,0.121808f,-1.551577f,2,0.132132f,-1.540000f,2,-0.049868f,-1.521079f,2,0.049868f,-1.521079f,2,0.052853f,-1.506390f,2,0.052853f,-1.506390f,2,-0.052853f,-1.506390f,2,-0.049868f,-1.521079f,2,-0.121808f,-1.551577f,2,-0.049868f,-1.521079f,2,-0.052853f,-1.506390f,2,-0.052853f,-1.506390f,2,-0.132132f,-1.540000f,2,-0.121808f,-1.551577f,2,-0.173397f,-1.642679f,2,-0.157950f,-1.732697f,2,-0.157950f,-1.732697f,1.950000f,-0.157950f,-1.732697f,1.950000f,-0.173397f,-1.642679f,1.950000f,-0.173397f,-1.642679f,2,-0.157950f,-1.732697f,2,-0.060149f,-1.825311f,2,-0.060149f,-1.825311f,1.950000f,-0.060149f,-1.825311f,1.950000f,-0.157950f,-1.732697f,1.950000f,-0.157950f,-1.732697f,2,-0.060149f,-1.825311f,2,0.060149f,-1.825311f,2,0.060149f,-1.825311f,1.950000f,0.060149f,-1.825311f,1.950000f,-0.060149f,-1.825311f,1.950000f,-0.060149f,-1.825311f,2,0.060149f,-1.825311f,1.950000f,0.060149f,-1.825311f,2,0.157950f,-1.732697f,2,0.157950f,-1.732697f,2,0.157950f,-1.732697f,1.950000f,0.060149f,-1.825311f,1.950000f,0.157950f,-1.732697f,2,0.173397f,-1.642679f,2,0.173397f,-1.642679f,1.950000f,0.173397f,-1.642679f,1.950000f,0.157950f,-1.732697f,1.950000f,0.157950f,-1.732697f,2,0.173397f,-1.642679f,2,0.121808f,-1.551577f,2,0.121808f,-1.551577f,1.950000f,0.121808f,-1.551577f,1.950000f,0.173397f,-1.642679f,1.950000f,0.173397f,-1.642679f,2,0.121808f,-1.551577f,2,0.049868f,-1.521079f,2,0.049868f,-1.521079f,1.950000f,0.049868f,-1.521079f,1.950000f,0.121808f,-1.551577f,1.950000f,0.121808f,-1.551577f,2,0.049868f,-1.521079f,2,-0.049868f,-1.521079f,2,-0.049868f,-1.521079f,1.950000f,-0.049868f,-1.521079f,1.950000f,0.049868f,-1.521079f,1.950000f,0.049868f,-1.521079f,2,-0.049868f,-1.521079f,2,-0.121808f,-1.551577f,2,-0.121808f,-1.551577f,1.950000f,-0.121808f,-1.551577f,1.950000f,-0.049868f,-1.521079f,1.950000f,-0.049868f,-1.521079f,2,-0.121808f,-1.551577f,2,-0.173397f,-1.642679f,2,-0.173397f,-1.642679f,1.950000f,-0.173397f,-1.642679f,1.950000f,-0.121808f,-1.551577f,1.950000f,-0.121808f,-1.551577f,2,-0.360000f,3.600000f,0.100000f,0.360000f,3.600000f,0.100000f,4,4,0.100000f,4,4,0.100000f,-4,4,0.100000f,-0.360000f,3.600000f,0.100000f,-0.360000f,0.400000f,0.100000f,-0.360000f,3.600000f,0.100000f,-4,4,0.100000f,-4,4,0.100000f,-4,0,0.100000f,-0.360000f,0.400000f,0.100000f,4,0,0.100000f,0.360000f,0.400000f,0.100000f,-0.360000f,0.400000f,0.100000f,-0.360000f,0.400000f,0.100000f,-4,0,0.100000f,4,0,0.100000f,4,4,0.100000f,0.360000f,3.600000f,0.100000f,4,0,0.100000f,0.360000f,3.600000f,0.100000f,0.360000f,0.400000f,0.100000f,4,0,0.100000f,0.360000f,2.888889f,1.023752f,0.360000f,3.066667f,1.166974f,-0.360000f,3.066667f,1.166974f,-0.360000f,3.066667f,1.166974f,-0.360000f,2.888889f,1.023752f,0.360000f,2.888889f,1.023752f,0.360000f,2.533333f,0.939976f,0.360000f,2.711111f,0.966974f,-0.360000f,2.711111f,0.966974f,-0.360000f,2.711111f,0.966974f,-0.360000f,2.533333f,0.939976f,0.360000f,2.533333f,0.939976f,-0.360000f,2.177778f,0.939976f,0.360000f,2.177778f,0.939976f,0.360000f,2.355556f,0.939976f,0.360000f,2.355556f,0.939976f,-0.360000f,2.355556f,0.939976f,-0.360000f,2.177778f,0.939976f,-0.360000f,1.822222f,0.939976f,0.360000f,1.822222f,0.939976f,0.360000f,2,0.939976f,0.360000f,2,0.939976f,-0.360000f,2,0.939976f,-0.360000f,1.822222f,0.939976f,-0.360000f,1.466667f,0.939976f,0.360000f,1.466667f,0.939976f,0.360000f,1.644444f,0.939976f,0.360000f,1.644444f,0.939976f,-0.360000f,1.644444f,0.939976f,-0.360000f,1.466667f,0.939976f,0.360000f,1.111111f,0.957571f,0.360000f,1.288889f,0.939976f,-0.360000f,1.288889f,0.939976f,-0.360000f,1.288889f,0.939976f,-0.360000f,1.111111f,0.957571f,0.360000f,1.111111f,0.957571f,-0.360000f,0.755556f,1.134246f,0.360000f,0.755556f,1.134246f,0.360000f,0.933333f,1.009739f,0.360000f,0.933333f,1.009739f,-0.360000f,0.933333f,1.009739f,-0.360000f,0.755556f,1.134246f,0.360000f,0.755556f,1.134246f,-0.360000f,0.755556f,1.134246f,0.360000f,0.577778f,1.372130f,-0.360000f,0.755556f,1.134246f,-0.360000f,0.577778f,1.372130f,0.360000f,0.577778f,1.372130f,-0.360000f,3.600000f,3.900000f,-0.360000f,3.422222f,2.266974f,0.360000f,3.422222f,2.266974f,-0.360000f,3.600000f,3.900000f,0.360000f,3.422222f,2.266974f,0.360000f,3.600000f,3.900000f,0.360000f,3.244444f,1.466974f,-0.360000f,3.244444f,1.466974f,0.360000f,3.066667f,1.166974f,-0.360000f,3.244444f,1.466974f,-0.360000f,3.066667f,1.166974f,0.360000f,3.066667f,1.166974f,0.360000f,2.888889f,1.023752f,-0.360000f,2.888889f,1.023752f,0.360000f,2.711111f,0.966974f,-0.360000f,2.888889f,1.023752f,-0.360000f,2.711111f,0.966974f,0.360000f,2.711111f,0.966974f,0.360000f,2.533333f,0.939976f,-0.360000f,2.533333f,0.939976f,-0.360000f,2.355556f,0.939976f,0.360000f,2.533333f,0.939976f,-0.360000f,2.355556f,0.939976f,0.360000f,2.355556f,0.939976f,0.360000f,2.177778f,0.939976f,-0.360000f,2.177778f,0.939976f,-0.360000f,2,0.939976f,0.360000f,2.177778f,0.939976f,-0.360000f,2,0.939976f,0.360000f,2,0.939976f,0.360000f,1.822222f,0.939976f,-0.360000f,1.822222f,0.939976f,-0.360000f,1.644444f,0.939976f,0.360000f,1.822222f,0.939976f,-0.360000f,1.644444f,0.939976f,0.360000f,1.644444f,0.939976f,0.360000f,1.466667f,0.939976f,-0.360000f,1.466667f,0.939976f,-0.360000f,1.288889f,0.939976f,0.360000f,1.466667f,0.939976f,-0.360000f,1.288889f,0.939976f,0.360000f,1.288889f,0.939976f,0.360000f,1.111111f,0.957571f,-0.360000f,1.111111f,0.957571f,0.360000f,0.933333f,1.009739f,-0.360000f,1.111111f,0.957571f,-0.360000f,0.933333f,1.009739f,0.360000f,0.933333f,1.009739f,0.360000f,0.400000f,1.743932f,0.360000f,0.577778f,1.372130f,-0.360000f,0.577778f,1.372130f,-0.360000f,0.577778f,1.372130f,-0.360000f,0.400000f,1.743932f,0.360000f,0.400000f,1.743932f, -}; - -static int world_indices[] = { -0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485, -}; - diff --git a/libraries/ode-0.9/ode/demo/demo_I.cpp b/libraries/ode-0.9/ode/demo/demo_I.cpp deleted file mode 100644 index b4f8d6e486..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_I.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -test that the rotational physics is correct. - -an "anchor body" has a number of other randomly positioned bodies -("particles") attached to it by ball-and-socket joints, giving it some -random effective inertia tensor. the effective inertia matrix is calculated, -and then this inertia is assigned to another "test" body. a random torque is -applied to both bodies and the difference in angular velocity and orientation -is observed after a number of iterations. - -typical errors for each test cycle are about 1e-5 ... 1e-4. - -*/ - - -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define NUM 10 // number of particles -#define SIDE 0.1 // visual size of the particles - - -// dynamics objects an globals - -static dWorldID world=0; -static dBodyID anchor_body,particle[NUM],test_body; -static dJointID particle_joint[NUM]; -static dReal torque[3]; -static int iteration; - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {1.5572f,-1.8886f,1.5700f}; - static float hpr[3] = {118.5000f,-17.0000f,0.0000f}; - dsSetViewpoint (xyz,hpr); -} - - -// compute the mass parameters of a particle set. q = particle positions, -// pm = particle masses - -#define _I(i,j) I[(i)*4+(j)] - -void computeMassParams (dMass *m, dReal q[NUM][3], dReal pm[NUM]) -{ - int i,j; - dMassSetZero (m); - for (i=0; imass += pm[i]; - for (j=0; j<3; j++) m->c[j] += pm[i]*q[i][j]; - m->_I(0,0) += pm[i]*(q[i][1]*q[i][1] + q[i][2]*q[i][2]); - m->_I(1,1) += pm[i]*(q[i][0]*q[i][0] + q[i][2]*q[i][2]); - m->_I(2,2) += pm[i]*(q[i][0]*q[i][0] + q[i][1]*q[i][1]); - m->_I(0,1) -= pm[i]*(q[i][0]*q[i][1]); - m->_I(0,2) -= pm[i]*(q[i][0]*q[i][2]); - m->_I(1,2) -= pm[i]*(q[i][1]*q[i][2]); - } - for (j=0; j<3; j++) m->c[j] /= m->mass; - m->_I(1,0) = m->_I(0,1); - m->_I(2,0) = m->_I(0,2); - m->_I(2,1) = m->_I(1,2); -} - - -void reset_test() -{ - int i; - dMass m,anchor_m; - dReal q[NUM][3], pm[NUM]; // particle positions and masses - dReal pos1[3] = {1,0,1}; // point of reference (POR) - dReal pos2[3] = {-1,0,1}; // point of reference (POR) - - // make random particle positions (relative to POR) and masses - for (i=0; i= 100) { - // measure the difference between the anchor and test bodies - const dReal *w1 = dBodyGetAngularVel (anchor_body); - const dReal *w2 = dBodyGetAngularVel (test_body); - const dReal *q1 = dBodyGetQuaternion (anchor_body); - const dReal *q2 = dBodyGetQuaternion (test_body); - dReal maxdiff = dMaxDifference (w1,w2,1,3); - printf ("w-error = %.4e (%.2f,%.2f,%.2f) and (%.2f,%.2f,%.2f)\n", - maxdiff,w1[0],w1[1],w1[2],w2[0],w2[1],w2[2]); - maxdiff = dMaxDifference (q1,q2,1,4); - printf ("q-error = %.4e\n",maxdiff); - reset_test(); - } - } - - dReal sides[3] = {SIDE,SIDE,SIDE}; - dReal sides2[3] = {6*SIDE,6*SIDE,6*SIDE}; - dReal sides3[3] = {3*SIDE,3*SIDE,3*SIDE}; - dsSetColor (1,1,1); - dsDrawBox (dBodyGetPosition(anchor_body), dBodyGetRotation(anchor_body), - sides3); - dsSetColor (1,0,0); - dsDrawBox (dBodyGetPosition(test_body), dBodyGetRotation(test_body), sides2); - dsSetColor (1,1,0); - for (int i=0; i -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include - -#include "basket_geom.h" // this is our world mesh - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// some constants - -#define RADIUS 0.14 - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; - -static dBodyID sphbody; -static dGeomID sphgeom; - -static dJointGroupID contactgroup; -static dGeomID world_mesh; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - assert(o1); - assert(o2); - - if (dGeomIsSpace(o1) || dGeomIsSpace(o2)) - { - fprintf(stderr,"testing space %p %p\n", o1,o2); - // colliding a space with something - dSpaceCollide2(o1,o2,data,&nearCallback); - // Note we do not want to test intersections within a space, - // only between spaces. - return; - } - -// fprintf(stderr,"testing geoms %p %p\n", o1, o2); - - const int N = 32; - dContact contact[N]; - int n = dCollide (o1,o2,N,&(contact[0].geom),sizeof(dContact)); - if (n > 0) - { - for (int i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - - -//<---- Convex Object -dReal planes[]= // planes for a cube, these should coincide with the face array - { - 1.0f ,0.0f ,0.0f ,0.25f, - 0.0f ,1.0f ,0.0f ,0.25f, - 0.0f ,0.0f ,1.0f ,0.25f, - -1.0f,0.0f ,0.0f ,0.25f, - 0.0f ,-1.0f,0.0f ,0.25f, - 0.0f ,0.0f ,-1.0f,0.25f - /* - 1.0f ,0.0f ,0.0f ,2.0f, - 0.0f ,1.0f ,0.0f ,1.0f, - 0.0f ,0.0f ,1.0f ,1.0f, - 0.0f ,0.0f ,-1.0f,1.0f, - 0.0f ,-1.0f,0.0f ,1.0f, - -1.0f,0.0f ,0.0f ,0.0f - */ - }; -const unsigned int planecount=6; - -dReal points[]= // points for a cube - { - 0.25f,0.25f,0.25f, // point 0 - -0.25f,0.25f,0.25f, // point 1 - - 0.25f,-0.25f,0.25f, // point 2 - -0.25f,-0.25f,0.25f,// point 3 - - 0.25f,0.25f,-0.25f, // point 4 - -0.25f,0.25f,-0.25f,// point 5 - - 0.25f,-0.25f,-0.25f,// point 6 - -0.25f,-0.25f,-0.25f,// point 7 - }; -const unsigned int pointcount=8; -unsigned int polygons[] = //Polygons for a cube (6 squares) - { - 4,0,2,6,4, // positive X - 4,1,0,4,5, // positive Y - 4,0,1,3,2, // positive Z - 4,3,1,5,7, // negative X - 4,2,3,7,6, // negative Y - 4,5,4,6,7, // negative Z - }; -//----> Convex Object - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#define dsDrawConvex dsDrawConvexD -#endif - - -// some constants - -#define NUM 100 // max number of objects -#define DENSITY (5.0) // density of all objects -#define GPB 3 // maximum number of geometries per body -#define MAX_CONTACTS 8 // maximum number of contact points per body -#define USE_GEOM_OFFSET 1 - -// dynamics and collision objects - -struct MyObject { - dBodyID body; // the body - dGeomID geom[GPB]; // geometries representing this body -}; - -static int num=0; // number of objects in simulation -static int nextobj=0; // next object to recycle if num==NUM -static dWorldID world; -static dSpaceID space; -static MyObject obj[NUM]; -static dJointGroupID contactgroup; -static int selected = -1; // selected object -static int show_aabb = 0; // show geom AABBs? -static int show_contacts = 0; // show contact points? -static int random_pos = 1; // drop objects from random position? -static int write_world = 0; -static int show_body = 1; - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - // if (o1->body && o2->body) return; - - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - - dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - else return c; -} - - -// called when a key pressed - -static void command (int cmd) -{ - size_t i; - int j,k; - dReal sides[3]; - dMass m; - int setBody; - - cmd = locase (cmd); - if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' || cmd == 'y' || cmd == 'v') - { - setBody = 0; - if (num < NUM) { - i = num; - num++; - } - else { - i = nextobj; - nextobj++; - if (nextobj >= num) nextobj = 0; - - // destroy the body and geoms for slot i - dBodyDestroy (obj[i].body); - for (k=0; k < GPB; k++) { - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - } - memset (&obj[i],0,sizeof(obj[i])); - } - - obj[i].body = dBodyCreate (world); - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - dMatrix3 R; - if (random_pos) - { - dBodySetPosition (obj[i].body, - dRandReal()*2-1,dRandReal()*2-1,dRandReal()+2); - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - } - else - { - dReal maxheight = 0; - for (k=0; k maxheight) maxheight = pos[2]; - } - dBodySetPosition (obj[i].body, 0,0,maxheight+1); - dRSetIdentity (R); - //dRFromAxisAndAngle (R,0,0,1,/*dRandReal()*10.0-5.0*/0); - } - dBodySetRotation (obj[i].body,R); - dBodySetData (obj[i].body,(void*) i); - - if (cmd == 'b') { - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - } - else if (cmd == 'c') { - sides[0] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCapsule (space,sides[0],sides[1]); - } - //<---- Convex Object - else if (cmd == 'v') - { - dMassSetBox (&m,DENSITY,0.25,0.25,0.25); - obj[i].geom[0] = dCreateConvex (space, - planes, - planecount, - points, - pointcount, - polygons); - } - //----> Convex Object - else if (cmd == 'y') { - dMassSetCylinder (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); - } - else if (cmd == 's') { - sides[0] *= 0.5; - dMassSetSphere (&m,DENSITY,sides[0]); - obj[i].geom[0] = dCreateSphere (space,sides[0]); - } - else if (cmd == 'x' && USE_GEOM_OFFSET) { - setBody = 1; - // start accumulating masses for the encapsulated geometries - dMass m2; - dMassSetZero (&m); - - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - dMatrix3 drot[GPB]; - - // set random delta positions - for (j=0; j= num) selected = 0; - if (selected < 0) selected = 0; - } - else if (cmd == 'd' && selected >= 0 && selected < num) { - dBodyDisable (obj[selected].body); - } - else if (cmd == 'e' && selected >= 0 && selected < num) { - dBodyEnable (obj[selected].body); - } - else if (cmd == 'a') { - show_aabb ^= 1; - } - else if (cmd == 't') { - show_contacts ^= 1; - } - else if (cmd == 'r') { - random_pos ^= 1; - } - else if (cmd == '1') { - write_world = 1; - } -} - - -// draw a geom - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) -{ - int i; - - if (!g) return; - if (!pos) pos = dGeomGetPosition (g); - if (!R) R = dGeomGetRotation (g); - - int type = dGeomGetClass (g); - if (type == dBoxClass) { - dVector3 sides; - dGeomBoxGetLengths (g,sides); - dsDrawBox (pos,R,sides); - } - else if (type == dSphereClass) { - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - } - else if (type == dCapsuleClass) { - dReal radius,length; - dGeomCapsuleGetParams (g,&radius,&length); - dsDrawCapsule (pos,R,length,radius); - } - //<---- Convex Object - else if (type == dConvexClass) - { - //dVector3 sides={0.50,0.50,0.50}; - dsDrawConvex(pos,R,planes, - planecount, - points, - pointcount, - polygons); - } - //----> Convex Object - else if (type == dCylinderClass) { - dReal radius,length; - dGeomCylinderGetParams (g,&radius,&length); - dsDrawCylinder (pos,R,length,radius); - } - else if (type == dGeomTransformClass) { - dGeomID g2 = dGeomTransformGetGeom (g); - const dReal *pos2 = dGeomGetPosition (g2); - const dReal *R2 = dGeomGetRotation (g2); - dVector3 actual_pos; - dMatrix3 actual_R; - dMULTIPLY0_331 (actual_pos,R,pos2); - actual_pos[0] += pos[0]; - actual_pos[1] += pos[1]; - actual_pos[2] += pos[2]; - dMULTIPLY0_333 (actual_R,R,R2); - drawGeom (g2,actual_pos,actual_R,0); - } - if (show_body) { - dBodyID body = dGeomGetBody(g); - if (body) { - const dReal *bodypos = dBodyGetPosition (body); - const dReal *bodyr = dBodyGetRotation (body); - dReal bodySides[3] = { 0.1, 0.1, 0.1 }; - dsSetColorAlpha(0,1,0,1); - dsDrawBox(bodypos,bodyr,bodySides); - } - } - if (show_aabb) { - // draw the bounding box for this geom - dReal aabb[6]; - dGeomGetAABB (g,aabb); - dVector3 bbpos; - for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - dVector3 bbsides; - for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; - dMatrix3 RI; - dRSetIdentity (RI); - dsSetColorAlpha (1,0,0,0.5); - dsDrawBox (bbpos,RI,bbsides); - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - dsSetColor (0,0,2); - dSpaceCollide (space,0,&nearCallback); - if (!pause) dWorldQuickStep (world,0.02); - - if (write_world) { - FILE *f = fopen ("state.dif","wt"); - if (f) { - dWorldExportDIF (world,f,"X"); - fclose (f); - } - write_world = 0; - } - - // remove all contact joints - dJointGroupEmpty (contactgroup); - - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - for (int i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define LENGTH 0.7 // chassis length -#define WIDTH 0.5 // chassis width -#define HEIGHT 0.2 // chassis height -#define RADIUS 0.18 // wheel radius -#define STARTZ 0.5 // starting height of chassis -#define CMASS 1 // chassis mass -#define WMASS 0.2 // wheel mass - - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; -static dBodyID body[4]; -static dJointID joint[3]; // joint[0] is the front wheel -static dJointGroupID contactgroup; -static dGeomID ground; -static dSpaceID car_space; -static dGeomID box[1]; -static dGeomID sphere[3]; -static dGeomID ground_box; - - -// things that the user controls - -static dReal speed=0,steer=0; // user commands - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i,n; - - // only collide things with the ground - int g1 = (o1 == ground || o1 == ground_box); - int g2 = (o2 == ground || o2 == ground_box); - if (!(g1 ^ g2)) return; - - const int N = 10; - dContact contact[N]; - n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); - if (n > 0) { - for (i=0; i 0.1) v = 0.1; - if (v < -0.1) v = -0.1; - v *= 10.0; - dJointSetHinge2Param (joint[0],dParamVel,v); - dJointSetHinge2Param (joint[0],dParamFMax,0.2); - dJointSetHinge2Param (joint[0],dParamLoStop,-0.75); - dJointSetHinge2Param (joint[0],dParamHiStop,0.75); - dJointSetHinge2Param (joint[0],dParamFudgeFactor,0.1); - - dSpaceCollide (space,0,&nearCallback); - dWorldStep (world,0.05); - - // remove all contact joints - dJointGroupEmpty (contactgroup); - } - - dsSetColor (0,1,1); - dsSetTexture (DS_WOOD); - dReal sides[3] = {LENGTH,WIDTH,HEIGHT}; - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides); - dsSetColor (1,1,1); - for (i=1; i<=3; i++) dsDrawCylinder (dBodyGetPosition(body[i]), - dBodyGetRotation(body[i]),0.02f,RADIUS); - - dVector3 ss; - dGeomBoxGetLengths (ground_box,ss); - dsDrawBox (dGeomGetPosition(ground_box),dGeomGetRotation(ground_box),ss); - - /* - printf ("%.10f %.10f %.10f %.10f\n", - dJointGetHingeAngle (joint[1]), - dJointGetHingeAngle (joint[2]), - dJointGetHingeAngleRate (joint[1]), - dJointGetHingeAngleRate (joint[2])); - */ -} - - -int main (int argc, char **argv) -{ - int i; - dMass m; - - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - // create world - dInitODE(); - world = dWorldCreate(); - space = dHashSpaceCreate (0); - contactgroup = dJointGroupCreate (0); - dWorldSetGravity (world,0,0,-0.5); - ground = dCreatePlane (space,0,0,1,0); - - // chassis body - body[0] = dBodyCreate (world); - dBodySetPosition (body[0],0,0,STARTZ); - dMassSetBox (&m,1,LENGTH,WIDTH,HEIGHT); - dMassAdjust (&m,CMASS); - dBodySetMass (body[0],&m); - box[0] = dCreateBox (0,LENGTH,WIDTH,HEIGHT); - dGeomSetBody (box[0],body[0]); - - // wheel bodies - for (i=1; i<=3; i++) { - body[i] = dBodyCreate (world); - dQuaternion q; - dQFromAxisAndAngle (q,1,0,0,M_PI*0.5); - dBodySetQuaternion (body[i],q); - dMassSetSphere (&m,1,RADIUS); - dMassAdjust (&m,WMASS); - dBodySetMass (body[i],&m); - sphere[i-1] = dCreateSphere (0,RADIUS); - dGeomSetBody (sphere[i-1],body[i]); - } - dBodySetPosition (body[1],0.5*LENGTH,0,STARTZ-HEIGHT*0.5); - dBodySetPosition (body[2],-0.5*LENGTH, WIDTH*0.5,STARTZ-HEIGHT*0.5); - dBodySetPosition (body[3],-0.5*LENGTH,-WIDTH*0.5,STARTZ-HEIGHT*0.5); - - // front wheel hinge - /* - joint[0] = dJointCreateHinge2 (world,0); - dJointAttach (joint[0],body[0],body[1]); - const dReal *a = dBodyGetPosition (body[1]); - dJointSetHinge2Anchor (joint[0],a[0],a[1],a[2]); - dJointSetHinge2Axis1 (joint[0],0,0,1); - dJointSetHinge2Axis2 (joint[0],0,1,0); - */ - - // front and back wheel hinges - for (i=0; i<3; i++) { - joint[i] = dJointCreateHinge2 (world,0); - dJointAttach (joint[i],body[0],body[i+1]); - const dReal *a = dBodyGetPosition (body[i+1]); - dJointSetHinge2Anchor (joint[i],a[0],a[1],a[2]); - dJointSetHinge2Axis1 (joint[i],0,0,1); - dJointSetHinge2Axis2 (joint[i],0,1,0); - } - - // set joint suspension - for (i=0; i<3; i++) { - dJointSetHinge2Param (joint[i],dParamSuspensionERP,0.4); - dJointSetHinge2Param (joint[i],dParamSuspensionCFM,0.8); - } - - // lock back wheels along the steering axis - for (i=1; i<3; i++) { - // set stops to make sure wheels always stay in alignment - dJointSetHinge2Param (joint[i],dParamLoStop,0); - dJointSetHinge2Param (joint[i],dParamHiStop,0); - // the following alternative method is no good as the wheels may get out - // of alignment: - // dJointSetHinge2Param (joint[i],dParamVel,0); - // dJointSetHinge2Param (joint[i],dParamFMax,dInfinity); - } - - // create car space and add it to the top level space - car_space = dSimpleSpaceCreate (space); - dSpaceSetCleanup (car_space,0); - dSpaceAdd (car_space,box[0]); - dSpaceAdd (car_space,sphere[0]); - dSpaceAdd (car_space,sphere[1]); - dSpaceAdd (car_space,sphere[2]); - - // environment - ground_box = dCreateBox (space,2,1.5,1); - dMatrix3 R; - dRFromAxisAndAngle (R,0,1,0,-0.15); - dGeomSetPosition (ground_box,2,0,-0.34); - dGeomSetRotation (ground_box,R); - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dGeomDestroy (box[0]); - dGeomDestroy (sphere[0]); - dGeomDestroy (sphere[1]); - dGeomDestroy (sphere[2]); - dJointGroupDestroy (contactgroup); - dSpaceDestroy (space); - dWorldDestroy (world); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_chain1.c b/libraries/ode-0.9/ode/demo/demo_chain1.c deleted file mode 100644 index e20c5dc892..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_chain1.c +++ /dev/null @@ -1,171 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* exercise the C interface */ - -#include -#include "ode/ode.h" -#include "drawstuff/drawstuff.h" - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -/* select correct drawing functions */ - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -/* some constants */ - -#define NUM 10 /* number of boxes */ -#define SIDE (0.2) /* side length of a box */ -#define MASS (1.0) /* mass of a box */ -#define RADIUS (0.1732f) /* sphere radius */ - - -/* dynamics and collision objects */ - -static dWorldID world; -static dSpaceID space; -static dBodyID body[NUM]; -static dJointID joint[NUM-1]; -static dJointGroupID contactgroup; -static dGeomID sphere[NUM]; - - -/* this is called by dSpaceCollide when two objects in space are - * potentially colliding. - */ - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - /* exit without doing anything if the two bodies are connected by a joint */ - dBodyID b1,b2; - dContact contact; - - b1 = dGeomGetBody(o1); - b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnected (b1,b2)) return; - - contact.surface.mode = 0; - contact.surface.mu = 0.1; - contact.surface.mu2 = 0; - if (dCollide (o1,o2,1,&contact.geom,sizeof(dContactGeom))) { - dJointID c = dJointCreateContact (world,contactgroup,&contact); - dJointAttach (c,b1,b2); - } -} - - -/* start simulation - set viewpoint */ - -static void start() -{ - static float xyz[3] = {2.1640f,-1.3079f,1.7600f}; - static float hpr[3] = {125.5000f,-17.0000f,0.0000f}; - dsSetViewpoint (xyz,hpr); -} - - -/* simulation loop */ - -static void simLoop (int pause) -{ - int i; - if (!pause) { - static double angle = 0; - angle += 0.05; - dBodyAddForce (body[NUM-1],0,0,1.5*(sin(angle)+1.0)); - - dSpaceCollide (space,0,&nearCallback); - dWorldStep (world,0.05); - - /* remove all contact joints */ - dJointGroupEmpty (contactgroup); - } - - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - for (i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define NUM 10 // number of boxes -#define SIDE (0.2) // side length of a box -#define MASS (1.0) // mass of a box -#define RADIUS (0.1732f) // sphere radius - - -// dynamics and collision objects - -static dWorld world; -static dSimpleSpace space (0); -static dBody body[NUM]; -static dBallJoint joint[NUM-1]; -static dJointGroup contactgroup; -static dBox box[NUM]; - - -// this is called by space.collide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnected (b1,b2)) return; - - // @@@ it's still more convenient to use the C interface here. - - dContact contact; - contact.surface.mode = 0; - contact.surface.mu = dInfinity; - if (dCollide (o1,o2,1,&contact.geom,sizeof(dContactGeom))) { - dJointID c = dJointCreateContact (world.id(),contactgroup.id(),&contact); - dJointAttach (c,b1,b2); - } -} - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {2.1640f,-1.3079f,1.7600f}; - static float hpr[3] = {125.5000f,-17.0000f,0.0000f}; - dsSetViewpoint (xyz,hpr); -} - - -// simulation loop - -static void simLoop (int pause) -{ - if (!pause) { - static double angle = 0; - angle += 0.05; - body[NUM-1].addForce (0,0,1.5*(sin(angle)+1.0)); - - space.collide (0,&nearCallback); - world.step (0.05); - - // remove all contact joints - contactgroup.empty(); - } - - dReal sides[3] = {SIDE,SIDE,SIDE}; - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - for (int i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions -#ifdef dDOUBLE -#define dsDrawSphere dsDrawSphereD -#define dsDrawBox dsDrawBoxD -#define dsDrawLine dsDrawLineD -#define dsDrawCapsule dsDrawCapsuleD -#endif - -//**************************************************************************** -// test infrastructure, including constants and macros - -#define TEST_REPS1 1000 // run each test this many times (first batch) -#define TEST_REPS2 10000 // run each test this many times (second batch) -const dReal tol = 1e-8; // tolerance used for numerical checks -#define MAX_TESTS 1000 // maximum number of test slots -#define Z_OFFSET 2 // z offset for drawing (to get above ground) - - -// test function. returns 1 if the test passed or 0 if it failed -typedef int test_function_t(); - -struct TestSlot { - int number; // number of test - char *name; // name of test - int failcount; - test_function_t *test_fn; - int last_failed_line; -}; -TestSlot testslot[MAX_TESTS]; - - -// globals used by the test functions -int graphical_test=0; // show graphical results of this test, 0=none -int current_test; // currently execiting test -int draw_all_objects_called; - - -#define MAKE_TEST(number,function) \ - if (testslot[number].name) dDebug (0,"test number already used"); \ - if (number <= 0 || number >= MAX_TESTS) dDebug (0,"bad test number"); \ - testslot[number].name = # function; \ - testslot[number].test_fn = function; - -#define FAILED() { if (graphical_test==0) { \ - testslot[current_test].last_failed_line=__LINE__; return 0; } } -#define PASSED() { return 1; } - -//**************************************************************************** -// globals - -/* int dBoxBox (const dVector3 p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 p2, - const dMatrix3 R2, const dVector3 side2, - dVector3 normal, dReal *depth, int *code, - int maxc, dContactGeom *contact, int skip); */ - -void dLineClosestApproach (const dVector3 pa, const dVector3 ua, - const dVector3 pb, const dVector3 ub, - dReal *alpha, dReal *beta); - -//**************************************************************************** -// draw all objects in a space, and draw all the collision contact points - -void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i,j,n; - const int N = 100; - dContactGeom contact[N]; - - if (dGeomGetClass (o2) == dRayClass) { - n = dCollide (o2,o1,N,&contact[0],sizeof(dContactGeom)); - } - else { - n = dCollide (o1,o2,N,&contact[0],sizeof(dContactGeom)); - } - if (n > 0) { - dMatrix3 RI; - dRSetIdentity (RI); - const dReal ss[3] = {0.01,0.01,0.01}; - for (i=0; i tol) FAILED(); - - // ********** test point on surface has depth 0 - - for (j=0; j<3; j++) q[j] = dRandReal()-0.5; - dNormalize3 (q); - for (j=0; j<3; j++) q[j] = q[j]*r + p[j]; - if (dFabs(dGeomSpherePointDepth (sphere,q[0],q[1],q[2])) > tol) FAILED(); - - // ********** test point at random depth - - d = (dRandReal()*2-1) * r; - for (j=0; j<3; j++) q[j] = dRandReal()-0.5; - dNormalize3 (q); - for (j=0; j<3; j++) q[j] = q[j]*(r-d) + p[j]; - if (dFabs(dGeomSpherePointDepth (sphere,q[0],q[1],q[2])-d) > tol) FAILED(); - - PASSED(); -} - - -int test_box_point_depth() -{ - int i,j; - dVector3 s,p,q,q2; // s = box sides - dMatrix3 R; - dReal ss,d; // ss = smallest side - - dSimpleSpace space(0); - dGeomID box = dCreateBox (0,1,1,1); - dSpaceAdd (space,box); - - // ********** make a random box - - for (j=0; j<3; j++) s[j] = dRandReal() + 0.1; - dGeomBoxSetLengths (box,s[0],s[1],s[2]); - dMakeRandomVector (p,3,1.0); - dGeomSetPosition (box,p[0],p[1],p[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (box,R); - - // ********** test center point has depth of smallest side - - ss = 1e9; - for (j=0; j<3; j++) if (s[j] < ss) ss = s[j]; - if (dFabs(dGeomBoxPointDepth (box,p[0],p[1],p[2]) - 0.5*ss) > tol) - FAILED(); - - // ********** test point on surface has depth 0 - - for (j=0; j<3; j++) q[j] = (dRandReal()-0.5)*s[j]; - i = dRandInt (3); - if (dRandReal() > 0.5) q[i] = 0.5*s[i]; else q[i] = -0.5*s[i]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - if (dFabs(dGeomBoxPointDepth (box,q2[0],q2[1],q2[2])) > tol) FAILED(); - - // ********** test points outside box have -ve depth - - for (j=0; j<3; j++) { - q[j] = 0.5*s[j] + dRandReal() + 0.01; - if (dRandReal() > 0.5) q[j] = -q[j]; - } - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - if (dGeomBoxPointDepth (box,q2[0],q2[1],q2[2]) >= 0) FAILED(); - - // ********** test points inside box have +ve depth - - for (j=0; j<3; j++) q[j] = s[j] * 0.99 * (dRandReal()-0.5); - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - if (dGeomBoxPointDepth (box,q2[0],q2[1],q2[2]) <= 0) FAILED(); - - // ********** test random depth of point aligned along axis (up to ss deep) - - i = dRandInt (3); - for (j=0; j<3; j++) q[j] = 0; - d = (dRandReal()*(ss*0.5+1)-1); - q[i] = s[i]*0.5 - d; - if (dRandReal() > 0.5) q[i] = -q[i]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - if (dFabs(dGeomBoxPointDepth (box,q2[0],q2[1],q2[2]) - d) >= tol) FAILED(); - - PASSED(); -} - - -int test_ccylinder_point_depth() -{ - int j; - dVector3 p,a; - dMatrix3 R; - dReal r,l,beta,x,y,d; - - dSimpleSpace space(0); - dGeomID ccyl = dCreateCapsule (0,1,1); - dSpaceAdd (space,ccyl); - - // ********** make a random ccyl - - r = dRandReal()*0.5 + 0.01; - l = dRandReal()*1 + 0.01; - dGeomCapsuleSetParams (ccyl,r,l); - dMakeRandomVector (p,3,1.0); - dGeomSetPosition (ccyl,p[0],p[1],p[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ccyl,R); - - // ********** test point on axis has depth of 'radius' - - beta = dRandReal()-0.5; - for (j=0; j<3; j++) a[j] = p[j] + l*beta*R[j*4+2]; - if (dFabs(dGeomCapsulePointDepth (ccyl,a[0],a[1],a[2]) - r) >= tol) - FAILED(); - - // ********** test point on surface (excluding caps) has depth 0 - - beta = dRandReal()*2*M_PI; - x = r*sin(beta); - y = r*cos(beta); - beta = dRandReal()-0.5; - for (j=0; j<3; j++) a[j] = p[j] + x*R[j*4+0] + y*R[j*4+1] + l*beta*R[j*4+2]; - if (dFabs(dGeomCapsulePointDepth (ccyl,a[0],a[1],a[2])) >= tol) FAILED(); - - // ********** test point on surface of caps has depth 0 - - for (j=0; j<3; j++) a[j] = dRandReal()-0.5; - dNormalize3 (a); - if (dDOT14(a,R+2) > 0) { - for (j=0; j<3; j++) a[j] = p[j] + a[j]*r + l*0.5*R[j*4+2]; - } - else { - for (j=0; j<3; j++) a[j] = p[j] + a[j]*r - l*0.5*R[j*4+2]; - } - if (dFabs(dGeomCapsulePointDepth (ccyl,a[0],a[1],a[2])) >= tol) FAILED(); - - // ********** test point inside ccyl has positive depth - - for (j=0; j<3; j++) a[j] = dRandReal()-0.5; - dNormalize3 (a); - beta = dRandReal()-0.5; - for (j=0; j<3; j++) a[j] = p[j] + a[j]*r*0.99 + l*beta*R[j*4+2]; - if (dGeomCapsulePointDepth (ccyl,a[0],a[1],a[2]) < 0) FAILED(); - - // ********** test point depth (1) - - d = (dRandReal()*2-1) * r; - beta = dRandReal()*2*M_PI; - x = (r-d)*sin(beta); - y = (r-d)*cos(beta); - beta = dRandReal()-0.5; - for (j=0; j<3; j++) a[j] = p[j] + x*R[j*4+0] + y*R[j*4+1] + l*beta*R[j*4+2]; - if (dFabs(dGeomCapsulePointDepth (ccyl,a[0],a[1],a[2]) - d) >= tol) - FAILED(); - - // ********** test point depth (2) - - d = (dRandReal()*2-1) * r; - for (j=0; j<3; j++) a[j] = dRandReal()-0.5; - dNormalize3 (a); - if (dDOT14(a,R+2) > 0) { - for (j=0; j<3; j++) a[j] = p[j] + a[j]*(r-d) + l*0.5*R[j*4+2]; - } - else { - for (j=0; j<3; j++) a[j] = p[j] + a[j]*(r-d) - l*0.5*R[j*4+2]; - } - if (dFabs(dGeomCapsulePointDepth (ccyl,a[0],a[1],a[2]) - d) >= tol) - FAILED(); - - PASSED(); -} - - -int test_plane_point_depth() -{ - int j; - dVector3 n,p,q,a,b; // n = plane normal - dReal d; - - dSimpleSpace space(0); - dGeomID plane = dCreatePlane (0,0,0,1,0); - dSpaceAdd (space,plane); - - // ********** make a random plane - - for (j=0; j<3; j++) n[j] = dRandReal() - 0.5; - dNormalize3 (n); - d = dRandReal() - 0.5; - dGeomPlaneSetParams (plane,n[0],n[1],n[2],d); - dPlaneSpace (n,p,q); - - // ********** test point on plane has depth 0 - - a[0] = dRandReal() - 0.5; - a[1] = dRandReal() - 0.5; - a[2] = 0; - for (j=0; j<3; j++) b[j] = a[0]*p[j] + a[1]*q[j] + (a[2]+d)*n[j]; - if (dFabs(dGeomPlanePointDepth (plane,b[0],b[1],b[2])) >= tol) FAILED(); - - // ********** test arbitrary depth point - - a[0] = dRandReal() - 0.5; - a[1] = dRandReal() - 0.5; - a[2] = dRandReal() - 0.5; - for (j=0; j<3; j++) b[j] = a[0]*p[j] + a[1]*q[j] + (a[2]+d)*n[j]; - if (dFabs(dGeomPlanePointDepth (plane,b[0],b[1],b[2]) + a[2]) >= tol) - FAILED(); - - // ********** test depth-1 point - - a[0] = dRandReal() - 0.5; - a[1] = dRandReal() - 0.5; - a[2] = -1; - for (j=0; j<3; j++) b[j] = a[0]*p[j] + a[1]*q[j] + (a[2]+d)*n[j]; - if (dFabs(dGeomPlanePointDepth (plane,b[0],b[1],b[2]) - 1) >= tol) FAILED(); - - PASSED(); -} - -//**************************************************************************** -// ray tests - -int test_ray_and_sphere() -{ - int j; - dContactGeom contact; - dVector3 p,q,q2,n,v1; - dMatrix3 R; - dReal r,k; - - dSimpleSpace space(0); - dGeomID ray = dCreateRay (0,0); - dGeomID sphere = dCreateSphere (0,1); - dSpaceAdd (space,ray); - dSpaceAdd (space,sphere); - - // ********** make a random sphere of radius r at position p - - r = dRandReal()+0.1; - dGeomSphereSetRadius (sphere,r); - dMakeRandomVector (p,3,1.0); - dGeomSetPosition (sphere,p[0],p[1],p[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (sphere,R); - - // ********** test zero length ray just inside sphere - - dGeomRaySetLength (ray,0); - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - for (j=0; j<3; j++) q[j] = 0.99*r * q[j] + p[j]; - dGeomSetPosition (ray,q[0],q[1],q[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ray,R); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test zero length ray just outside that sphere - - dGeomRaySetLength (ray,0); - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - for (j=0; j<3; j++) q[j] = 1.01*r * q[j] + p[j]; - dGeomSetPosition (ray,q[0],q[1],q[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ray,R); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test finite length ray totally contained inside the sphere - - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - k = dRandReal(); - for (j=0; j<3; j++) q[j] = k*r*0.99 * q[j] + p[j]; - dMakeRandomVector (q2,3,1.0); - dNormalize3 (q2); - k = dRandReal(); - for (j=0; j<3; j++) q2[j] = k*r*0.99 * q2[j] + p[j]; - for (j=0; j<3; j++) n[j] = q2[j] - q[j]; - dNormalize3 (n); - dGeomRaySet (ray,q[0],q[1],q[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,dDISTANCE (q,q2)); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test finite length ray totally outside the sphere - - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - do { - dMakeRandomVector (n,3,1.0); - dNormalize3 (n); - } - while (dDOT(n,q) < 0); // make sure normal goes away from sphere - for (j=0; j<3; j++) q[j] = 1.01*r * q[j] + p[j]; - dGeomRaySet (ray,q[0],q[1],q[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,100); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray from outside to just above surface - - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - for (j=0; j<3; j++) n[j] = -q[j]; - for (j=0; j<3; j++) q2[j] = 2*r * q[j] + p[j]; - dGeomRaySet (ray,q2[0],q2[1],q2[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,0.99*r); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray from outside to just below surface - - dGeomRaySetLength (ray,1.01*r); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - for (j=0; j<3; j++) q2[j] = r * q[j] + p[j]; - if (dDISTANCE (contact.pos,q2) > tol) FAILED(); - - // ********** test contact point distance for random rays - - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - k = dRandReal()+0.5; - for (j=0; j<3; j++) q[j] = k*r * q[j] + p[j]; - dMakeRandomVector (n,3,1.0); - dNormalize3 (n); - dGeomRaySet (ray,q[0],q[1],q[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,100); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom))) { - k = dDISTANCE (contact.pos,dGeomGetPosition(sphere)); - if (dFabs(k - r) > tol) FAILED(); - // also check normal signs - if (dDOT (n,contact.normal) > 0) FAILED(); - // also check depth of contact point - if (dFabs (dGeomSpherePointDepth - (sphere,contact.pos[0],contact.pos[1],contact.pos[2])) > tol) - FAILED(); - - draw_all_objects (space); - } - - // ********** test tangential grazing - miss - - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - dPlaneSpace (q,n,v1); - for (j=0; j<3; j++) q[j] = 1.01*r * q[j] + p[j]; - for (j=0; j<3; j++) q[j] -= n[j]; - dGeomRaySet (ray,q[0],q[1],q[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,2); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test tangential grazing - hit - - dMakeRandomVector (q,3,1.0); - dNormalize3 (q); - dPlaneSpace (q,n,v1); - for (j=0; j<3; j++) q[j] = 0.99*r * q[j] + p[j]; - for (j=0; j<3; j++) q[j] -= n[j]; - dGeomRaySet (ray,q[0],q[1],q[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,2); - if (dCollide (ray,sphere,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - - PASSED(); -} - - -int test_ray_and_box() -{ - int i,j; - dContactGeom contact; - dVector3 s,p,q,n,q2,q3,q4; // s = box sides - dMatrix3 R; - dReal k; - - dSimpleSpace space(0); - dGeomID ray = dCreateRay (0,0); - dGeomID box = dCreateBox (0,1,1,1); - dSpaceAdd (space,ray); - dSpaceAdd (space,box); - - // ********** make a random box - - for (j=0; j<3; j++) s[j] = dRandReal() + 0.1; - dGeomBoxSetLengths (box,s[0],s[1],s[2]); - dMakeRandomVector (p,3,1.0); - dGeomSetPosition (box,p[0],p[1],p[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (box,R); - - // ********** test zero length ray just inside box - - dGeomRaySetLength (ray,0); - for (j=0; j<3; j++) q[j] = (dRandReal()-0.5)*s[j]; - i = dRandInt (3); - if (dRandReal() > 0.5) q[i] = 0.99*0.5*s[i]; else q[i] = -0.99*0.5*s[i]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - dGeomSetPosition (ray,q2[0],q2[1],q2[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ray,R); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test zero length ray just outside box - - dGeomRaySetLength (ray,0); - for (j=0; j<3; j++) q[j] = (dRandReal()-0.5)*s[j]; - i = dRandInt (3); - if (dRandReal() > 0.5) q[i] = 1.01*0.5*s[i]; else q[i] = -1.01*0.5*s[i]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - dGeomSetPosition (ray,q2[0],q2[1],q2[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ray,R); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test finite length ray totally contained inside the box - - for (j=0; j<3; j++) q[j] = (dRandReal()-0.5)*0.99*s[j]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - for (j=0; j<3; j++) q3[j] = (dRandReal()-0.5)*0.99*s[j]; - dMultiply0 (q4,dGeomGetRotation(box),q3,3,3,1); - for (j=0; j<3; j++) q4[j] += p[j]; - for (j=0; j<3; j++) n[j] = q4[j] - q2[j]; - dNormalize3 (n); - dGeomRaySet (ray,q2[0],q2[1],q2[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,dDISTANCE(q2,q4)); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test finite length ray totally outside the box - - for (j=0; j<3; j++) q[j] = (dRandReal()-0.5)*s[j]; - i = dRandInt (3); - if (dRandReal() > 0.5) q[i] = 1.01*0.5*s[i]; else q[i] = -1.01*0.5*s[i]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q3[j] = q2[j] + p[j]; - dNormalize3 (q2); - dGeomRaySet (ray,q3[0],q3[1],q3[2],q2[0],q2[1],q2[2]); - dGeomRaySetLength (ray,10); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray from outside to just above surface - - for (j=0; j<3; j++) q[j] = (dRandReal()-0.5)*s[j]; - i = dRandInt (3); - if (dRandReal() > 0.5) q[i] = 1.01*0.5*s[i]; else q[i] = -1.01*0.5*s[i]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q3[j] = 2*q2[j] + p[j]; - k = dSqrt(q2[0]*q2[0] + q2[1]*q2[1] + q2[2]*q2[2]); - for (j=0; j<3; j++) q2[j] = -q2[j]; - dGeomRaySet (ray,q3[0],q3[1],q3[2],q2[0],q2[1],q2[2]); - dGeomRaySetLength (ray,k*0.99); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray from outside to just below surface - - dGeomRaySetLength (ray,k*1.01); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - - // ********** test contact point position for random rays - - for (j=0; j<3; j++) q[j] = dRandReal()*s[j]; - dMultiply0 (q2,dGeomGetRotation(box),q,3,3,1); - for (j=0; j<3; j++) q2[j] += p[j]; - for (j=0; j<3; j++) q3[j] = dRandReal()-0.5; - dNormalize3 (q3); - dGeomRaySet (ray,q2[0],q2[1],q2[2],q3[0],q3[1],q3[2]); - dGeomRaySetLength (ray,10); - if (dCollide (ray,box,1,&contact,sizeof(dContactGeom))) { - // check depth of contact point - if (dFabs (dGeomBoxPointDepth - (box,contact.pos[0],contact.pos[1],contact.pos[2])) > tol) - FAILED(); - // check position of contact point - for (j=0; j<3; j++) contact.pos[j] -= p[j]; - dMultiply1 (q,dGeomGetRotation(box),contact.pos,3,3,1); - if ( dFabs(dFabs (q[0]) - 0.5*s[0]) > tol && - dFabs(dFabs (q[1]) - 0.5*s[1]) > tol && - dFabs(dFabs (q[2]) - 0.5*s[2]) > tol) { - FAILED(); - } - // also check normal signs - if (dDOT (q3,contact.normal) > 0) FAILED(); - - draw_all_objects (space); - } - - PASSED(); -} - - -int test_ray_and_ccylinder() -{ - int j; - dContactGeom contact; - dVector3 p,a,b,n; - dMatrix3 R; - dReal r,l,k,x,y; - - dSimpleSpace space(0); - dGeomID ray = dCreateRay (0,0); - dGeomID ccyl = dCreateCapsule (0,1,1); - dSpaceAdd (space,ray); - dSpaceAdd (space,ccyl); - - // ********** make a random capped cylinder - - r = dRandReal()*0.5 + 0.01; - l = dRandReal()*1 + 0.01; - dGeomCapsuleSetParams (ccyl,r,l); - dMakeRandomVector (p,3,1.0); - dGeomSetPosition (ccyl,p[0],p[1],p[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ccyl,R); - - // ********** test ray completely within ccyl - - for (j=0; j<3; j++) a[j] = dRandReal()-0.5; - dNormalize3 (a); - k = (dRandReal()-0.5)*l; - for (j=0; j<3; j++) a[j] = p[j] + r*0.99*a[j] + k*0.99*R[j*4+2]; - for (j=0; j<3; j++) b[j] = dRandReal()-0.5; - dNormalize3 (b); - k = (dRandReal()-0.5)*l; - for (j=0; j<3; j++) b[j] = p[j] + r*0.99*b[j] + k*0.99*R[j*4+2]; - dGeomRaySetLength (ray,dDISTANCE(a,b)); - for (j=0; j<3; j++) b[j] -= a[j]; - dNormalize3 (b); - dGeomRaySet (ray,a[0],a[1],a[2],b[0],b[1],b[2]); - if (dCollide (ray,ccyl,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray outside ccyl that just misses (between caps) - - k = dRandReal()*2*M_PI; - x = sin(k); - y = cos(k); - for (j=0; j<3; j++) a[j] = x*R[j*4+0] + y*R[j*4+1]; - k = (dRandReal()-0.5)*l; - for (j=0; j<3; j++) b[j] = -a[j]*r*2 + k*R[j*4+2] + p[j]; - dGeomRaySet (ray,b[0],b[1],b[2],a[0],a[1],a[2]); - dGeomRaySetLength (ray,r*0.99); - if (dCollide (ray,ccyl,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray outside ccyl that just hits (between caps) - - dGeomRaySetLength (ray,r*1.01); - if (dCollide (ray,ccyl,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - // check depth of contact point - if (dFabs (dGeomCapsulePointDepth - (ccyl,contact.pos[0],contact.pos[1],contact.pos[2])) > tol) - FAILED(); - - // ********** test ray outside ccyl that just misses (caps) - - for (j=0; j<3; j++) a[j] = dRandReal()-0.5; - dNormalize3 (a); - if (dDOT14(a,R+2) < 0) { - for (j=0; j<3; j++) b[j] = p[j] - a[j]*2*r + l*0.5*R[j*4+2]; - } - else { - for (j=0; j<3; j++) b[j] = p[j] - a[j]*2*r - l*0.5*R[j*4+2]; - } - dGeomRaySet (ray,b[0],b[1],b[2],a[0],a[1],a[2]); - dGeomRaySetLength (ray,r*0.99); - if (dCollide (ray,ccyl,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray outside ccyl that just hits (caps) - - dGeomRaySetLength (ray,r*1.01); - if (dCollide (ray,ccyl,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - // check depth of contact point - if (dFabs (dGeomCapsulePointDepth - (ccyl,contact.pos[0],contact.pos[1],contact.pos[2])) > tol) - FAILED(); - - // ********** test random rays - - for (j=0; j<3; j++) a[j] = dRandReal()-0.5; - for (j=0; j<3; j++) n[j] = dRandReal()-0.5; - dNormalize3 (n); - dGeomRaySet (ray,a[0],a[1],a[2],n[0],n[1],n[2]); - dGeomRaySetLength (ray,10); - - if (dCollide (ray,ccyl,1,&contact,sizeof(dContactGeom))) { - // check depth of contact point - if (dFabs (dGeomCapsulePointDepth - (ccyl,contact.pos[0],contact.pos[1],contact.pos[2])) > tol) - FAILED(); - - // check normal signs - if (dDOT (n,contact.normal) > 0) FAILED(); - - draw_all_objects (space); - } - - PASSED(); -} - - -int test_ray_and_plane() -{ - int j; - dContactGeom contact; - dVector3 n,p,q,a,b,g,h; // n,d = plane parameters - dMatrix3 R; - dReal d; - - dSimpleSpace space(0); - dGeomID ray = dCreateRay (0,0); - dGeomID plane = dCreatePlane (0,0,0,1,0); - dSpaceAdd (space,ray); - dSpaceAdd (space,plane); - - // ********** make a random plane - - for (j=0; j<3; j++) n[j] = dRandReal() - 0.5; - dNormalize3 (n); - d = dRandReal() - 0.5; - dGeomPlaneSetParams (plane,n[0],n[1],n[2],d); - dPlaneSpace (n,p,q); - - // ********** test finite length ray below plane - - dGeomRaySetLength (ray,0.09); - a[0] = dRandReal()-0.5; - a[1] = dRandReal()-0.5; - a[2] = -dRandReal()*0.5 - 0.1; - for (j=0; j<3; j++) b[j] = a[0]*p[j] + a[1]*q[j] + (a[2]+d)*n[j]; - dGeomSetPosition (ray,b[0],b[1],b[2]); - dRFromAxisAndAngle (R,dRandReal()*2-1,dRandReal()*2-1, - dRandReal()*2-1,dRandReal()*10-5); - dGeomSetRotation (ray,R); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test finite length ray above plane - - a[0] = dRandReal()-0.5; - a[1] = dRandReal()-0.5; - a[2] = dRandReal()*0.5 + 0.01; - for (j=0; j<3; j++) b[j] = a[0]*p[j] + a[1]*q[j] + (a[2]+d)*n[j]; - g[0] = dRandReal()-0.5; - g[1] = dRandReal()-0.5; - g[2] = dRandReal() + 0.01; - for (j=0; j<3; j++) h[j] = g[0]*p[j] + g[1]*q[j] + g[2]*n[j]; - dNormalize3 (h); - dGeomRaySet (ray,b[0],b[1],b[2],h[0],h[1],h[2]); - dGeomRaySetLength (ray,10); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test finite length ray that intersects plane - - a[0] = dRandReal()-0.5; - a[1] = dRandReal()-0.5; - a[2] = dRandReal()-0.5; - for (j=0; j<3; j++) b[j] = a[0]*p[j] + a[1]*q[j] + (a[2]+d)*n[j]; - g[0] = dRandReal()-0.5; - g[1] = dRandReal()-0.5; - g[2] = dRandReal()-0.5; - for (j=0; j<3; j++) h[j] = g[0]*p[j] + g[1]*q[j] + g[2]*n[j]; - dNormalize3 (h); - dGeomRaySet (ray,b[0],b[1],b[2],h[0],h[1],h[2]); - dGeomRaySetLength (ray,10); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom))) { - // test that contact is on plane surface - if (dFabs (dDOT(contact.pos,n) - d) > tol) FAILED(); - // also check normal signs - if (dDOT (h,contact.normal) > 0) FAILED(); - // also check contact point depth - if (dFabs (dGeomPlanePointDepth - (plane,contact.pos[0],contact.pos[1],contact.pos[2])) > tol) - FAILED(); - - draw_all_objects (space); - } - - // ********** test ray that just misses - - for (j=0; j<3; j++) b[j] = (1+d)*n[j]; - for (j=0; j<3; j++) h[j] = -n[j]; - dGeomRaySet (ray,b[0],b[1],b[2],h[0],h[1],h[2]); - dGeomRaySetLength (ray,0.99); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom)) != 0) FAILED(); - - // ********** test ray that just hits - - dGeomRaySetLength (ray,1.01); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - - // ********** test polarity with typical ground plane - - dGeomPlaneSetParams (plane,0,0,1,0); - for (j=0; j<3; j++) a[j] = 0.1; - for (j=0; j<3; j++) b[j] = 0; - a[2] = 1; - b[2] = -1; - dGeomRaySet (ray,a[0],a[1],a[2],b[0],b[1],b[2]); - dGeomRaySetLength (ray,2); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - if (dFabs (contact.depth - 1) > tol) FAILED(); - a[2] = -1; - b[2] = 1; - dGeomRaySet (ray,a[0],a[1],a[2],b[0],b[1],b[2]); - if (dCollide (ray,plane,1,&contact,sizeof(dContactGeom)) != 1) FAILED(); - if (dFabs (contact.depth - 1) > tol) FAILED(); - - PASSED(); -} - -//**************************************************************************** -// a really inefficient, but hopefully correct implementation of -// dBoxTouchesBox(), that does 144 edge-face tests. - -// return 1 if edge v1 -> v2 hits the rectangle described by p1,p2,p3 - -static int edgeIntersectsRect (dVector3 v1, dVector3 v2, - dVector3 p1, dVector3 p2, dVector3 p3) -{ - int k; - dVector3 u1,u2,n,tmp; - for (k=0; k<3; k++) u1[k] = p3[k]-p1[k]; - for (k=0; k<3; k++) u2[k] = p2[k]-p1[k]; - dReal d1 = dSqrt(dDOT(u1,u1)); - dReal d2 = dSqrt(dDOT(u2,u2)); - dNormalize3 (u1); - dNormalize3 (u2); - if (dFabs(dDOT(u1,u2)) > 1e-6) dDebug (0,"bad u1/u2"); - dCROSS (n,=,u1,u2); - for (k=0; k<3; k++) tmp[k] = v2[k]-v1[k]; - dReal d = -dDOT(n,p1); - if (dFabs(dDOT(n,p1)+d) > 1e-8) dDebug (0,"bad n wrt p1"); - if (dFabs(dDOT(n,p2)+d) > 1e-8) dDebug (0,"bad n wrt p2"); - if (dFabs(dDOT(n,p3)+d) > 1e-8) dDebug (0,"bad n wrt p3"); - dReal alpha = -(d+dDOT(n,v1))/dDOT(n,tmp); - for (k=0; k<3; k++) tmp[k] = v1[k]+alpha*(v2[k]-v1[k]); - if (dFabs(dDOT(n,tmp)+d) > 1e-6) dDebug (0,"bad tmp"); - if (alpha < 0) return 0; - if (alpha > 1) return 0; - for (k=0; k<3; k++) tmp[k] -= p1[k]; - dReal a1 = dDOT(u1,tmp); - dReal a2 = dDOT(u2,tmp); - if (a1<0 || a2<0 || a1>d1 || a2>d2) return 0; - return 1; -} - - -// return 1 if box 1 is completely inside box 2 - -static int box1inside2 (const dVector3 p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 p2, - const dMatrix3 R2, const dVector3 side2) -{ - for (int i=-1; i<=1; i+=2) { - for (int j=-1; j<=1; j+=2) { - for (int k=-1; k<=1; k+=2) { - dVector3 v,vv; - v[0] = i*0.5*side1[0]; - v[1] = j*0.5*side1[1]; - v[2] = k*0.5*side1[2]; - dMULTIPLY0_331 (vv,R1,v); - vv[0] += p1[0] - p2[0]; - vv[1] += p1[1] - p2[1]; - vv[2] += p1[2] - p2[2]; - for (int axis=0; axis < 3; axis++) { - dReal z = dDOT14(vv,R2+axis); - if (z < (-side2[axis]*0.5) || z > (side2[axis]*0.5)) return 0; - } - } - } - } - return 1; -} - - -// test if any edge from box 1 hits a face from box 2 - -static int testBoxesTouch2 (const dVector3 p1, const dMatrix3 R1, - const dVector3 side1, const dVector3 p2, - const dMatrix3 R2, const dVector3 side2) -{ - int j,k,j1,j2; - - // for 6 faces from box 2 - for (int fd=0; fd<3; fd++) { // direction for face - - for (int fo=0; fo<2; fo++) { // offset of face - // get four points on the face. first get 2 indexes that are not fd - int k1=0,k2=0; - if (fd==0) { k1 = 1; k2 = 2; } - if (fd==1) { k1 = 0; k2 = 2; } - if (fd==2) { k1 = 0; k2 = 1; } - dVector3 fp[4],tmp; - k=0; - for (j1=-1; j1<=1; j1+=2) { - for (j2=-1; j2<=1; j2+=2) { - fp[k][k1] = j1; - fp[k][k2] = j2; - fp[k][fd] = fo*2-1; - k++; - } - } - for (j=0; j<4; j++) { - for (k=0; k<3; k++) fp[j][k] *= 0.5*side2[k]; - dMULTIPLY0_331 (tmp,R2,fp[j]); - for (k=0; k<3; k++) fp[j][k] = tmp[k] + p2[k]; - } - - // for 8 vertices - dReal v1[3]; - for (v1[0]=-1; v1[0] <= 1; v1[0] += 2) { - for (v1[1]=-1; v1[1] <= 1; v1[1] += 2) { - for (v1[2]=-1; v1[2] <= 1; v1[2] += 2) { - // for all possible +ve leading edges from those vertices - for (int ei=0; ei < 3; ei ++) { - if (v1[ei] < 0) { - // get vertex1 -> vertex2 = an edge from box 1 - dVector3 vv1,vv2; - for (k=0; k<3; k++) vv1[k] = v1[k] * 0.5*side1[k]; - for (k=0; k<3; k++) vv2[k] = (v1[k] + (k==ei)*2)*0.5*side1[k]; - dVector3 vertex1,vertex2; - dMULTIPLY0_331 (vertex1,R1,vv1); - dMULTIPLY0_331 (vertex2,R1,vv2); - for (k=0; k<3; k++) vertex1[k] += p1[k]; - for (k=0; k<3; k++) vertex2[k] += p1[k]; - - // see if vertex1 -> vertex2 interesects face - if (edgeIntersectsRect (vertex1,vertex2,fp[0],fp[1],fp[2])) - return 1; - } - } - } - } - } - } - } - - if (box1inside2 (p1,R1,side1,p2,R2,side2)) return 1; - if (box1inside2 (p2,R2,side2,p1,R1,side1)) return 1; - - return 0; -} - -//**************************************************************************** -// dBoxTouchesBox() test - -int test_dBoxTouchesBox() -{ - int k,bt1,bt2; - dVector3 p1,p2,side1,side2; - dMatrix3 R1,R2; - - dSimpleSpace space(0); - dGeomID box1 = dCreateBox (0,1,1,1); - dSpaceAdd (space,box1); - dGeomID box2 = dCreateBox (0,1,1,1); - dSpaceAdd (space,box2); - - dMakeRandomVector (p1,3,0.5); - dMakeRandomVector (p2,3,0.5); - for (k=0; k<3; k++) side1[k] = dRandReal() + 0.01; - for (k=0; k<3; k++) side2[k] = dRandReal() + 0.01; - dRFromAxisAndAngle (R1,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - dRFromAxisAndAngle (R2,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - - dGeomBoxSetLengths (box1,side1[0],side1[1],side1[2]); - dGeomBoxSetLengths (box2,side2[0],side2[1],side2[2]); - dGeomSetPosition (box1,p1[0],p1[1],p1[2]); - dGeomSetRotation (box1,R1); - dGeomSetPosition (box2,p2[0],p2[1],p2[2]); - dGeomSetRotation (box2,R2); - draw_all_objects (space); - - int t1 = testBoxesTouch2 (p1,R1,side1,p2,R2,side2); - int t2 = testBoxesTouch2 (p2,R2,side2,p1,R1,side1); - bt1 = t1 || t2; - bt2 = dBoxTouchesBox (p1,R1,side1,p2,R2,side2); - - if (bt1 != bt2) FAILED(); - - /* - // some more debugging info if necessary - if (bt1 && bt2) printf ("agree - boxes touch\n"); - if (!bt1 && !bt2) printf ("agree - boxes don't touch\n"); - if (bt1 && !bt2) printf ("disagree - boxes touch but dBoxTouchesBox " - "says no\n"); - if (!bt1 && bt2) printf ("disagree - boxes don't touch but dBoxTouchesBox " - "says yes\n"); - */ - - PASSED(); -} - -//**************************************************************************** -// test box-box collision - -int test_dBoxBox() -{ - int k,bt; - dVector3 p1,p2,side1,side2,normal,normal2; - dMatrix3 R1,R2; - dReal depth,depth2; - int code; - dContactGeom contact[48]; - - dSimpleSpace space(0); - dGeomID box1 = dCreateBox (0,1,1,1); - dSpaceAdd (space,box1); - dGeomID box2 = dCreateBox (0,1,1,1); - dSpaceAdd (space,box2); - - dMakeRandomVector (p1,3,0.5); - dMakeRandomVector (p2,3,0.5); - for (k=0; k<3; k++) side1[k] = dRandReal() + 0.01; - for (k=0; k<3; k++) side2[k] = dRandReal() + 0.01; - - dRFromAxisAndAngle (R1,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - dRFromAxisAndAngle (R2,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - - // dRSetIdentity (R1); // we can also try this - // dRSetIdentity (R2); - - dGeomBoxSetLengths (box1,side1[0],side1[1],side1[2]); - dGeomBoxSetLengths (box2,side2[0],side2[1],side2[2]); - dGeomSetPosition (box1,p1[0],p1[1],p1[2]); - dGeomSetRotation (box1,R1); - dGeomSetPosition (box2,p2[0],p2[1],p2[2]); - dGeomSetRotation (box2,R2); - - code = 0; - depth = 0; - bt = dBoxBox (p1,R1,side1,p2,R2,side2,normal,&depth,&code,8,contact, - sizeof(dContactGeom)); - if (bt==1) { - p2[0] += normal[0] * 0.96 * depth; - p2[1] += normal[1] * 0.96 * depth; - p2[2] += normal[2] * 0.96 * depth; - bt = dBoxBox (p1,R1,side1,p2,R2,side2,normal2,&depth2,&code,8,contact, - sizeof(dContactGeom)); - - /* - dGeomSetPosition (box2,p2[0],p2[1],p2[2]); - draw_all_objects (space); - */ - - if (bt != 1) { - FAILED(); - dGeomSetPosition (box2,p2[0],p2[1],p2[2]); - draw_all_objects (space); - } - - p2[0] += normal[0] * 0.08 * depth; - p2[1] += normal[1] * 0.08 * depth; - p2[2] += normal[2] * 0.08 * depth; - bt = dBoxBox (p1,R1,side1,p2,R2,side2,normal2,&depth2,&code,8,contact, - sizeof(dContactGeom)); - if (bt != 0) FAILED(); - - // dGeomSetPosition (box2,p2[0],p2[1],p2[2]); - // draw_all_objects (space); - } - - // printf ("code=%2d depth=%.4f ",code,depth); - - PASSED(); -} - -//**************************************************************************** -// graphics - -int space_pressed = 0; - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {2.4807,-1.8023,2.7600}; - static float hpr[3] = {141.5000,-18.5000,0.0000}; - dsSetViewpoint (xyz,hpr); -} - - -// called when a key pressed - -static void command (int cmd) -{ - if (cmd == ' ') space_pressed = 1; -} - - -// simulation loop - -static void simLoop (int pause) -{ - do { - draw_all_objects_called = 0; - unsigned long seed = dRandGetSeed(); - testslot[graphical_test].test_fn(); - if (draw_all_objects_called) { - if (space_pressed) space_pressed = 0; else dRandSetSeed (seed); - } - } - while (!draw_all_objects_called); -} - -//**************************************************************************** -// do all the tests - -void do_tests (int argc, char **argv) -{ - int i,j; - - // process command line arguments - if (argc >= 2) { - graphical_test = atoi (argv[1]); - } - - if (graphical_test) { - // do one test gaphically and interactively - - if (graphical_test < 1 || graphical_test >= MAX_TESTS || - !testslot[graphical_test].name) { - dError (0,"invalid test number"); - } - - printf ("performing test: %s\n",testslot[graphical_test].name); - - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - - dsSetSphereQuality (3); - dsSetCapsuleQuality (8); - dsSimulationLoop (argc,argv,1280,900,&fn); - } - else { - // do all tests noninteractively - - for (i=0; ifailcount = 0; - int total_reps=0; - for (int batch=0; batch<2; batch++) { - int reps = (batch==0) ? TEST_REPS1 : TEST_REPS2; - total_reps += reps; - printf ("testing batch %d (%d reps)...\n",batch+1,reps); - - // run tests - for (j=0; jnumber; - if (ts[i]->test_fn() != 1) ts[i]->failcount++; - } - } - - // check for failures - int total_fail_count=0; - for (i=0; ifailcount; - if (total_fail_count) break; - } - - // print results - for (i=0; inumber,ts[i]->name); - if (ts[i]->failcount) { - printf ("FAILED (%.2f%%) at line %d\n", - double(ts[i]->failcount)/double(total_reps)*100.0, - ts[i]->last_failed_line); - } - else { - printf ("ok\n"); - } - } - } -} - -//**************************************************************************** - -int main (int argc, char **argv) -{ - // setup all tests - - memset (testslot,0,sizeof(testslot)); - dInitODE(); - - MAKE_TEST(1,test_sphere_point_depth); - MAKE_TEST(2,test_box_point_depth); - MAKE_TEST(3,test_ccylinder_point_depth); - MAKE_TEST(4,test_plane_point_depth); - - MAKE_TEST(10,test_ray_and_sphere); - MAKE_TEST(11,test_ray_and_box); - MAKE_TEST(12,test_ray_and_ccylinder); - MAKE_TEST(13,test_ray_and_plane); - - MAKE_TEST(100,test_dBoxTouchesBox); - MAKE_TEST(101,test_dBoxBox); - - do_tests (argc,argv); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_convex_cd.cpp b/libraries/ode-0.9/ode/demo/demo_convex_cd.cpp deleted file mode 100644 index e1764f3f4e..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_convex_cd.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include -#include -#include -#include -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - - -#ifndef M_PI -#define M_PI (3.14159265358979323846) -#endif - -//<---- Convex Object -dReal planes[]= // planes for a cube - { - 1.0f ,0.0f ,0.0f ,0.25f, - 0.0f ,1.0f ,0.0f ,0.25f, - 0.0f ,0.0f ,1.0f ,0.25f, - -1.0f,0.0f ,0.0f ,0.25f, - 0.0f ,-1.0f,0.0f ,0.25f, - 0.0f ,0.0f ,-1.0f,0.25f - /* - 1.0f ,0.0f ,0.0f ,2.0f, - 0.0f ,1.0f ,0.0f ,1.0f, - 0.0f ,0.0f ,1.0f ,1.0f, - 0.0f ,0.0f ,-1.0f,1.0f, - 0.0f ,-1.0f,0.0f ,1.0f, - -1.0f,0.0f ,0.0f ,0.0f - */ - }; -const unsigned int planecount=6; - -dReal points[]= // points for a cube - { - 0.25f,0.25f,0.25f, // point 0 - -0.25f,0.25f,0.25f, // point 1 - - 0.25f,-0.25f,0.25f, // point 2 - -0.25f,-0.25f,0.25f,// point 3 - - 0.25f,0.25f,-0.25f, // point 4 - -0.25f,0.25f,-0.25f,// point 5 - - 0.25f,-0.25f,-0.25f,// point 6 - -0.25f,-0.25f,-0.25f,// point 7 - }; -const unsigned int pointcount=8; -unsigned int polygons[] = //Polygons for a cube (6 squares) - { - 4,0,2,6,4, // positive X - 4,1,0,4,5, // positive Y - 4,0,1,3,2, // positive Z - 4,3,1,5,7, // negative X - 4,2,3,7,6, // negative Y - 4,5,4,6,7, // negative Z - }; -//----> Convex Object - -#ifdef dDOUBLE -#define dsDrawConvex dsDrawConvexD -#define dsDrawBox dsDrawBoxD -#endif - -dGeomID geoms[2]; -dSpaceID space; -dWorldID world; -dJointGroupID contactgroup; - -void start() -{ - // adjust the starting viewpoint a bit - float xyz[3],hpr[3]; - dsGetViewpoint (xyz,hpr); - hpr[0] += 7; - dsSetViewpoint (xyz,hpr); - geoms[0]=dCreateConvex (space, - planes, - planecount, - points, - pointcount, - polygons); - dGeomSetPosition (geoms[0],0,0,0.25); - geoms[1]=dCreateConvex (space, - planes, - planecount, - points, - pointcount, - polygons); - dGeomSetPosition (geoms[1],0.25,0.25,0.70); - -} - -int dCollideConvexConvex (dxGeom *o1, dxGeom *o2, int flags, - dContactGeom *contact, int skip); -void simLoop (int pause) -{ - static bool DumpInfo=true; - const dReal ss[3] = {0.02,0.02,0.02}; - dContactGeom contacts[8]; - int contactcount = dCollideConvexConvex(geoms[0],geoms[1],8,contacts,sizeof(dContactGeom)); - //fprintf(stdout,"Contact Count %d\n",contactcount); - const dReal* pos; - const dReal* R; - dsSetTexture (DS_WOOD); - pos = dGeomGetPosition (geoms[0]); - R = dGeomGetRotation (geoms[0]); - dsSetColor (0.6f,0.6f,1); - dsDrawConvex(pos,R,planes, - planecount, - points, - pointcount, - polygons); - pos = dGeomGetPosition (geoms[1]); - R = dGeomGetRotation (geoms[1]); - dsSetColor (0.4f,1,1); - dsDrawConvex(pos,R,planes, - planecount, - points, - pointcount, - polygons); - /*if (show_contacts) */ - dMatrix3 RI; - dRSetIdentity (RI); - dsSetColor (1.0f,0,0); - for(int i=0;i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// select the method you want to test here (only uncomment *one* line) -#define QUICKSTEP 1 -//#define STEPFAST 1 - -// some constants - -#define LENGTH 3.5 // chassis length -#define WIDTH 2.5 // chassis width -#define HEIGHT 1.0 // chassis height -#define RADIUS 0.5 // wheel radius -#define STARTZ 1.0 // starting height of chassis -#define CMASS 1 // chassis mass -#define WMASS 1 // wheel mass -#define COMOFFSET -5 // center of mass offset -#define WALLMASS 1 // wall box mass -#define BALLMASS 1 // ball mass -#define FMAX 25 // car engine fmax -#define ROWS 1 // rows of cars -#define COLS 1 // columns of cars -#define ITERS 20 // number of iterations -#define WBOXSIZE 1.0 // size of wall boxes -#define WALLWIDTH 12 // width of wall -#define WALLHEIGHT 10 // height of wall -#define DISABLE_THRESHOLD 0.008 // maximum velocity (squared) a body can have and be disabled -#define DISABLE_STEPS 10 // number of steps a box has to have been disable-able before it will be disabled -#define CANNON_X -10 // x position of cannon -#define CANNON_Y 5 // y position of cannon -#define CANNON_BALL_MASS 10 // mass of the cannon ball -#define CANNON_BALL_RADIUS 0.5 - -//#define BOX -#define CARS -#define WALL -//#define BALLS -//#define BALLSTACK -//#define ONEBALL -//#define CENTIPEDE -#define CANNON - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; -static dBodyID body[10000]; -static int bodies; -static dJointID joint[100000]; -static int joints; -static dJointGroupID contactgroup; -static dGeomID ground; -static dGeomID box[10000]; -static int boxes; -static dGeomID sphere[10000]; -static int spheres; -static dGeomID wall_boxes[10000]; -static dBodyID wall_bodies[10000]; -static dGeomID cannon_ball_geom; -static dBodyID cannon_ball_body; -static int wb_stepsdis[10000]; -static int wb; -static bool doFast; -static dBodyID b; -static dMass m; - - -// things that the user controls - -static dReal turn = 0, speed = 0; // user commands -static dReal cannon_angle=0,cannon_elevation=-1.2; - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i,n; - - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnected(b1, b2)) - return; - - const int N = 4; - dContact contact[N]; - n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); - if (n > 0) { - for (i=0; i -20; x-=RADIUS*2) - { - body[bodies] = dBodyCreate (world); - dBodySetPosition(body[bodies], x, y, STARTZ); - dMassSetSphere(&m, 1, RADIUS); - dMassAdjust(&m, WMASS); - dBodySetMass(body[bodies], &m); - sphere[spheres] = dCreateSphere (space, RADIUS); - dGeomSetBody (sphere[spheres++], body[bodies]); - - joint[joints] = dJointCreateHinge2 (world,0); - if (x == -17) - dJointAttach (joint[joints],b,body[bodies]); - else - dJointAttach (joint[joints],body[bodies-2],body[bodies]); - const dReal *a = dBodyGetPosition (body[bodies++]); - dJointSetHinge2Anchor (joint[joints],a[0],a[1],a[2]); - dJointSetHinge2Axis1 (joint[joints],0,0,1); - dJointSetHinge2Axis2 (joint[joints],1,0,0); - dJointSetHinge2Param (joint[joints],dParamSuspensionERP,1.0); - dJointSetHinge2Param (joint[joints],dParamSuspensionCFM,1e-5); - dJointSetHinge2Param (joint[joints],dParamLoStop,0); - dJointSetHinge2Param (joint[joints],dParamHiStop,0); - dJointSetHinge2Param (joint[joints],dParamVel2,-10.0); - dJointSetHinge2Param (joint[joints++],dParamFMax2,FMAX); - - body[bodies] = dBodyCreate (world); - dBodySetPosition(body[bodies], -30 - x, y, STARTZ); - dMassSetSphere(&m, 1, RADIUS); - dMassAdjust(&m, WMASS); - dBodySetMass(body[bodies], &m); - sphere[spheres] = dCreateSphere (space, RADIUS); - dGeomSetBody (sphere[spheres++], body[bodies]); - - joint[joints] = dJointCreateHinge2 (world,0); - if (x == -17) - dJointAttach (joint[joints],b,body[bodies]); - else - dJointAttach (joint[joints],body[bodies-2],body[bodies]); - const dReal *b = dBodyGetPosition (body[bodies++]); - dJointSetHinge2Anchor (joint[joints],b[0],b[1],b[2]); - dJointSetHinge2Axis1 (joint[joints],0,0,1); - dJointSetHinge2Axis2 (joint[joints],1,0,0); - dJointSetHinge2Param (joint[joints],dParamSuspensionERP,1.0); - dJointSetHinge2Param (joint[joints],dParamSuspensionCFM,1e-5); - dJointSetHinge2Param (joint[joints],dParamLoStop,0); - dJointSetHinge2Param (joint[joints],dParamHiStop,0); - dJointSetHinge2Param (joint[joints],dParamVel2,10.0); - dJointSetHinge2Param (joint[joints++],dParamFMax2,FMAX); - } - if (lastb) - { - dJointID j = dJointCreateFixed(world,0); - dJointAttach (j, b, lastb); - dJointSetFixed(j); - } - lastb = b; - } -#endif -#ifdef BOX - body[bodies] = dBodyCreate (world); - dBodySetPosition (body[bodies],0,0,HEIGHT/2); - dMassSetBox (&m,1,LENGTH,WIDTH,HEIGHT); - dMassAdjust (&m, 1); - dBodySetMass (body[bodies],&m); - box[boxes] = dCreateBox (space,LENGTH,WIDTH,HEIGHT); - dGeomSetBody (box[boxes++],body[bodies++]); -#endif -#ifdef CANNON - cannon_ball_body = dBodyCreate (world); - cannon_ball_geom = dCreateSphere (space,CANNON_BALL_RADIUS); - dMassSetSphereTotal (&m,CANNON_BALL_MASS,CANNON_BALL_RADIUS); - dBodySetMass (cannon_ball_body,&m); - dGeomSetBody (cannon_ball_geom,cannon_ball_body); - dBodySetPosition (cannon_ball_body,CANNON_X,CANNON_Y,CANNON_BALL_RADIUS); -#endif -} - -// called when a key pressed - -static void command (int cmd) -{ - switch (cmd) { - case 'a': case 'A': - speed += 0.3; - break; - case 'z': case 'Z': - speed -= 0.3; - break; - case ',': - turn += 0.1; - if (turn > 0.3) - turn = 0.3; - break; - case '.': - turn -= 0.1; - if (turn < -0.3) - turn = -0.3; - break; - case ' ': - speed = 0; - turn = 0; - break; - case 'f': case 'F': - doFast = !doFast; - break; - case '+': - dWorldSetAutoEnableDepthSF1 (world, dWorldGetAutoEnableDepthSF1 (world) + 1); - break; - case '-': - dWorldSetAutoEnableDepthSF1 (world, dWorldGetAutoEnableDepthSF1 (world) - 1); - break; - case 'r': case 'R': - resetSimulation(); - break; - case '[': - cannon_angle += 0.1; - break; - case ']': - cannon_angle -= 0.1; - break; - case '1': - cannon_elevation += 0.1; - break; - case '2': - cannon_elevation -= 0.1; - break; - case 'x': case 'X': { - dMatrix3 R2,R3,R4; - dRFromAxisAndAngle (R2,0,0,1,cannon_angle); - dRFromAxisAndAngle (R3,0,1,0,cannon_elevation); - dMultiply0 (R4,R2,R3,3,3,3); - dReal cpos[3] = {CANNON_X,CANNON_Y,1}; - for (int i=0; i<3; i++) cpos[i] += 3*R4[i*4+2]; - dBodySetPosition (cannon_ball_body,cpos[0],cpos[1],cpos[2]); - dReal force = 10; - dBodySetLinearVel (cannon_ball_body,force*R4[2],force*R4[6],force*R4[10]); - dBodySetAngularVel (cannon_ball_body,0,0,0); - break; - } - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - int i, j; - - dsSetTexture (DS_WOOD); - - if (!pause) { -#ifdef BOX - dBodyAddForce(body[bodies-1],lspeed,0,0); -#endif - for (j = 0; j < joints; j++) - { - dReal curturn = dJointGetHinge2Angle1 (joint[j]); - //dMessage (0,"curturn %e, turn %e, vel %e", curturn, turn, (turn-curturn)*1.0); - dJointSetHinge2Param(joint[j],dParamVel,(turn-curturn)*1.0); - dJointSetHinge2Param(joint[j],dParamFMax,dInfinity); - dJointSetHinge2Param(joint[j],dParamVel2,speed); - dJointSetHinge2Param(joint[j],dParamFMax2,FMAX); - dBodyEnable(dJointGetBody(joint[j],0)); - dBodyEnable(dJointGetBody(joint[j],1)); - } - if (doFast) - { - dSpaceCollide (space,0,&nearCallback); -#if defined(QUICKSTEP) - dWorldQuickStep (world,0.05); -#elif defined(STEPFAST) - dWorldStepFast1 (world,0.05,ITERS); -#endif - dJointGroupEmpty (contactgroup); - } - else - { - dSpaceCollide (space,0,&nearCallback); - dWorldStep (world,0.05); - dJointGroupEmpty (contactgroup); - } - - for (i = 0; i < wb; i++) - { - b = dGeomGetBody(wall_boxes[i]); - if (dBodyIsEnabled(b)) - { - bool disable = true; - const dReal *lvel = dBodyGetLinearVel(b); - dReal lspeed = lvel[0]*lvel[0]+lvel[1]*lvel[1]+lvel[2]*lvel[2]; - if (lspeed > DISABLE_THRESHOLD) - disable = false; - const dReal *avel = dBodyGetAngularVel(b); - dReal aspeed = avel[0]*avel[0]+avel[1]*avel[1]+avel[2]*avel[2]; - if (aspeed > DISABLE_THRESHOLD) - disable = false; - - if (disable) - wb_stepsdis[i]++; - else - wb_stepsdis[i] = 0; - - if (wb_stepsdis[i] > DISABLE_STEPS) - { - dBodyDisable(b); - dsSetColor(0.5,0.5,1); - } - else - dsSetColor(1,1,1); - - } - else - dsSetColor(0.4,0.4,0.4); - dVector3 ss; - dGeomBoxGetLengths (wall_boxes[i], ss); - dsDrawBox(dGeomGetPosition(wall_boxes[i]), dGeomGetRotation(wall_boxes[i]), ss); - } - } - else - { - for (i = 0; i < wb; i++) - { - b = dGeomGetBody(wall_boxes[i]); - if (dBodyIsEnabled(b)) - dsSetColor(1,1,1); - else - dsSetColor(0.4,0.4,0.4); - dVector3 ss; - dGeomBoxGetLengths (wall_boxes[i], ss); - dsDrawBox(dGeomGetPosition(wall_boxes[i]), dGeomGetRotation(wall_boxes[i]), ss); - } - } - - dsSetColor (0,1,1); - dReal sides[3] = {LENGTH,WIDTH,HEIGHT}; - for (i = 0; i < boxes; i++) - dsDrawBox (dGeomGetPosition(box[i]),dGeomGetRotation(box[i]),sides); - dsSetColor (1,1,1); - for (i=0; i< spheres; i++) dsDrawSphere (dGeomGetPosition(sphere[i]), - dGeomGetRotation(sphere[i]),RADIUS); - - // draw the cannon - dsSetColor (1,1,0); - dMatrix3 R2,R3,R4; - dRFromAxisAndAngle (R2,0,0,1,cannon_angle); - dRFromAxisAndAngle (R3,0,1,0,cannon_elevation); - dMultiply0 (R4,R2,R3,3,3,3); - dReal cpos[3] = {CANNON_X,CANNON_Y,1}; - dReal csides[3] = {2,2,2}; - dsDrawBox (cpos,R2,csides); - for (i=0; i<3; i++) cpos[i] += 1.5*R4[i*4+2]; - dsDrawCylinder (cpos,R4,3,0.5); - - // draw the cannon ball - dsDrawSphere (dBodyGetPosition(cannon_ball_body),dBodyGetRotation(cannon_ball_body), - CANNON_BALL_RADIUS); -} - -int main (int argc, char **argv) -{ - doFast = true; - - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - dInitODE(); - - bodies = 0; - joints = 0; - boxes = 0; - spheres = 0; - - resetSimulation(); - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dJointGroupDestroy (contactgroup); - dSpaceDestroy (space); - dWorldDestroy (world); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_cyl.cpp b/libraries/ode-0.9/ode/demo/demo_cyl.cpp deleted file mode 100644 index 3692234e7e..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_cyl.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -// Test for non-capped cylinder, by Bram Stolk -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include - -#include "world_geom3.h" // this is our world mesh - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -#define BOX -#define CYL - -// some constants - -#define RADIUS 0.22 // wheel radius -#define WMASS 0.2 // wheel mass -#define WHEELW 0.2 // wheel width -#define BOXSZ 0.4 // box size -//#define CYL_GEOM_OFFSET // rotate cylinder using geom offset - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; -#ifdef BOX -static dBodyID boxbody; -static dGeomID boxgeom; -#endif -#ifdef CYL -static dBodyID cylbody; -static dGeomID cylgeom; -#endif -static dJointGroupID contactgroup; -static dGeomID world_mesh; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - assert(o1); - assert(o2); - - if (dGeomIsSpace(o1) || dGeomIsSpace(o2)) - { - fprintf(stderr,"testing space %p %p\n", o1,o2); - // colliding a space with something - dSpaceCollide2(o1,o2,data,&nearCallback); - // Note we do not want to test intersections within a space, - // only between spaces. - return; - } - -// fprintf(stderr,"testing geoms %p %p\n", o1, o2); - - const int N = 32; - dContact contact[N]; - int n = dCollide (o1,o2,N,&(contact[0].geom),sizeof(dContact)); - if (n > 0) - { - for (int i=0; i -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; - -static dBodyID cylbody; -static dGeomID cylgeom; - -static dBodyID sphbody; -static dGeomID sphgeom; - -static dJointGroupID contactgroup; -static dGeomID world_mesh; - -static bool show_contacts = true; - -#define CYLRADIUS 0.6 -#define CYLLENGTH 2.0 -#define SPHERERADIUS 0.5 - - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawLine dsDrawLineD -#endif - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - assert(o1); - assert(o2); - - if (dGeomIsSpace(o1) || dGeomIsSpace(o2)) - { - fprintf(stderr,"testing space %p %p\n", o1,o2); - // colliding a space with something - dSpaceCollide2(o1,o2,data,&nearCallback); - // Note we do not want to test intersections within a space, - // only between spaces. - return; - } - - const int N = 32; - dContact contact[N]; - int n = dCollide (o1,o2,N,&(contact[0].geom),sizeof(dContact)); - if (n > 0) - { - for (int i=0; i -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include - - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawCylinder dsDrawCylinderD -#endif - - -// dynamics and collision objects (chassis, 3 wheels, environment) - -static dWorldID world; -static dSpaceID space; - -static const int STACKCNT=10; // nr of weights on bridge -static const int SEGMCNT=16; // nr of segments in bridge -static const float SEGMDIM[3] = { 0.9, 4, 0.1 }; - -static dGeomID groundgeom; -static dBodyID segbodies[SEGMCNT]; -static dGeomID seggeoms[SEGMCNT]; -static dBodyID stackbodies[STACKCNT]; -static dGeomID stackgeoms[STACKCNT]; -static dJointID hinges[SEGMCNT-1]; -static dJointID sliders[2]; -static dJointFeedback jfeedbacks[SEGMCNT-1]; -static dReal colours[SEGMCNT]; -static int stress[SEGMCNT-1]; - -static dJointGroupID contactgroup; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - assert(o1); - assert(o2); - - if (dGeomIsSpace(o1) || dGeomIsSpace(o2)) - { - fprintf(stderr,"testing space %p %p\n", o1,o2); - // colliding a space with something - dSpaceCollide2(o1,o2,data,&nearCallback); - // Note we do not want to test intersections within a space, - // only between spaces. - return; - } - - const int N = 32; - dContact contact[N]; - int n = dCollide (o1,o2,N,&(contact[0].geom),sizeof(dContact)); - if (n > 0) - { - for (int i=0; i forcelimit || l1 > forcelimit) - stress[i]++; - else - stress[i]=0; - if (stress[i]>4) - { - // Low-pass filter the noisy feedback data. - // Only after 4 consecutive timesteps with excessive load, snap. - fprintf(stderr,"SNAP! (that was the sound of joint %d breaking)\n", i); - dJointAttach (hinges[i], 0, 0); - } - } - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - int i; - - double simstep = 0.005; // 5ms simulation steps - double dt = dsElapsedTime(); - int nrofsteps = (int) ceilf(dt/simstep); - for (i=0; i1.0) v=1.0; - if (v<0.5) - { - r=2*v; - g=1.0; - } - else - { - r=1.0; - g=2*(1.0-v); - } - dsSetColor (r,g,b); - drawGeom(seggeoms[i]); - } - dsSetColor (1,1,1); - for (i=0; i MU * body_mass * GRAVITY - (j+1)*FORCE > MU * (i+1)*MASS * GRAVITY - (j+1) > (i+1) * (MU*MASS*GRAVITY/FORCE) - (j+1) > (i+1) * k - -this should be independent of the number of contact points, as N contact -points will each have 1/N'th the normal force but the pushing force will -have to overcome N contacts. the constants are chosen so that k=1. -thus you should see a triangle made of half the bodies in the array start to -slide. - -*/ - - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define LENGTH 0.2 // box length & width -#define HEIGHT 0.05 // box height -#define MASS 0.2 // mass of box[i][j] = (i+1) * MASS -#define FORCE 0.05 // force applied to box[i][j] = (j+1) * FORCE -#define MU 0.5 // the global mu to use -#define GRAVITY 0.5 // the global gravity to use -#define N1 10 // number of different forces to try -#define N2 10 // number of different masses to try - - -// dynamics and collision objects - -static dWorldID world; -static dSpaceID space; -static dBodyID body[N1][N2]; -static dJointGroupID contactgroup; -static dGeomID ground; -static dGeomID box[N1][N2]; - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - - // only collide things with the ground - int g1 = (o1 == ground); - int g2 = (o2 == ground); - if (!(g1 ^ g2)) return; - - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - - dContact contact[3]; // up to 3 contacts per box - for (i=0; i<3; i++) { - contact[i].surface.mode = dContactSoftCFM | dContactApprox1; - contact[i].surface.mu = MU; - contact[i].surface.soft_cfm = 0.01; - } - if (int numc = dCollide (o1,o2,3,&contact[0].geom,sizeof(dContact))) { - for (i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -#define DEGTORAD 0.01745329251994329577f //!< PI / 180.0, convert degrees to radians - - -// Our heightfield geom -dGeomID gheight; - - - -// Heightfield dimensions - -#define HFIELD_WSTEP 15 // Vertex count along edge >= 2 -#define HFIELD_DSTEP 31 - -#define HFIELD_WIDTH REAL( 4.0 ) -#define HFIELD_DEPTH REAL( 8.0 ) - -#define HFIELD_WSAMP ( HFIELD_WIDTH / ( HFIELD_WSTEP-1 ) ) -#define HFIELD_DSAMP ( HFIELD_DEPTH / ( HFIELD_DSTEP-1 ) ) - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#define dsDrawConvex dsDrawConvexD -#define dsDrawTriangle dsDrawTriangleD -#endif - - - -//<---- Convex Object -dReal planes[]= // planes for a cube - { - 1.0f ,0.0f ,0.0f ,0.25f, - 0.0f ,1.0f ,0.0f ,0.25f, - 0.0f ,0.0f ,1.0f ,0.25f, - 0.0f ,0.0f ,-1.0f,0.25f, - 0.0f ,-1.0f,0.0f ,0.25f, - -1.0f,0.0f ,0.0f ,0.25f - /* - 1.0f ,0.0f ,0.0f ,2.0f, - 0.0f ,1.0f ,0.0f ,1.0f, - 0.0f ,0.0f ,1.0f ,1.0f, - 0.0f ,0.0f ,-1.0f,1.0f, - 0.0f ,-1.0f,0.0f ,1.0f, - -1.0f,0.0f ,0.0f ,0.0f - */ - }; -const unsigned int planecount=6; - -dReal points[]= // points for a cube - { - 0.25f,0.25f,0.25f, // point 0 - -0.25f,0.25f,0.25f, // point 1 - - 0.25f,-0.25f,0.25f, // point 2 - -0.25f,-0.25f,0.25f,// point 3 - - 0.25f,0.25f,-0.25f, // point 4 - -0.25f,0.25f,-0.25f,// point 5 - - 0.25f,-0.25f,-0.25f,// point 6 - -0.25f,-0.25f,-0.25f,// point 7 - }; -const unsigned int pointcount=8; -unsigned int polygons[] = //Polygons for a cube (6 squares) - { - 4,0,2,6,4, // positive X - 4,1,0,4,5, // positive Y - 4,0,1,3,2, // positive Z - 4,3,1,5,7, // negative X - 4,2,3,7,6, // negative Y - 4,5,4,6,7, // negative Z - }; -//----> Convex Object - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#define dsDrawConvex dsDrawConvexD -#endif - - -// some constants - -#define NUM 100 // max number of objects -#define DENSITY (5.0) // density of all objects -#define GPB 3 // maximum number of geometries per body -#define MAX_CONTACTS 64 // maximum number of contact points per body - - -// dynamics and collision objects - -struct MyObject { - dBodyID body; // the body - dGeomID geom[GPB]; // geometries representing this body - - // Trimesh only - double buffered matrices for 'last transform' setup - dReal matrix_dblbuff[ 16 * 2 ]; - int last_matrix_index; -}; - -static int num=0; // number of objects in simulation -static int nextobj=0; // next object to recycle if num==NUM -static dWorldID world; -static dSpaceID space; -static MyObject obj[NUM]; -static dJointGroupID contactgroup; -static int selected = -1; // selected object -static int show_aabb = 0; // show geom AABBs? -static int show_contacts = 0; // show contact points? -static int random_pos = 1; // drop objects from random position? -static int write_world = 0; - - - - -//============================ - -// Bunny mesh ripped from Opcode -const int VertexCount = 453; -const int IndexCount = 902 * 3; - -typedef dReal dVector3R[3]; - -dGeomID TriMesh1; -dGeomID TriMesh2; -static dTriMeshDataID TriData1, TriData2; // reusable static trimesh data - -static float Vertices[VertexCount * 3] = { - REAL(-0.334392), REAL(0.133007), REAL(0.062259), - REAL(-0.350189), REAL(0.150354), REAL(-0.147769), - REAL(-0.234201), REAL(0.343811), REAL(-0.174307), - REAL(-0.200259), REAL(0.285207), REAL(0.093749), - REAL(0.003520), REAL(0.475208), REAL(-0.159365), - REAL(0.001856), REAL(0.419203), REAL(0.098582), - REAL(-0.252802), REAL(0.093666), REAL(0.237538), - REAL(-0.162901), REAL(0.237984), REAL(0.206905), - REAL(0.000865), REAL(0.318141), REAL(0.235370), - REAL(-0.414624), REAL(0.164083), REAL(-0.278254), - REAL(-0.262213), REAL(0.357334), REAL(-0.293246), - REAL(0.004628), REAL(0.482694), REAL(-0.338626), - REAL(-0.402162), REAL(0.133528), REAL(-0.443247), - REAL(-0.243781), REAL(0.324275), REAL(-0.436763), - REAL(0.005293), REAL(0.437592), REAL(-0.458332), - REAL(-0.339884), REAL(-0.041150), REAL(-0.668211), - REAL(-0.248382), REAL(0.255825), REAL(-0.627493), - REAL(0.006261), REAL(0.376103), REAL(-0.631506), - REAL(-0.216201), REAL(-0.126776), REAL(-0.886936), - REAL(-0.171075), REAL(0.011544), REAL(-0.881386), - REAL(-0.181074), REAL(0.098223), REAL(-0.814779), - REAL(-0.119891), REAL(0.218786), REAL(-0.760153), - REAL(-0.078895), REAL(0.276780), REAL(-0.739281), - REAL(0.006801), REAL(0.310959), REAL(-0.735661), - REAL(-0.168842), REAL(0.102387), REAL(-0.920381), - REAL(-0.104072), REAL(0.177278), REAL(-0.952530), - REAL(-0.129704), REAL(0.211848), REAL(-0.836678), - REAL(-0.099875), REAL(0.310931), REAL(-0.799381), - REAL(0.007237), REAL(0.361687), REAL(-0.794439), - REAL(-0.077913), REAL(0.258753), REAL(-0.921640), - REAL(0.007957), REAL(0.282241), REAL(-0.931680), - REAL(-0.252222), REAL(-0.550401), REAL(-0.557810), - REAL(-0.267633), REAL(-0.603419), REAL(-0.655209), - REAL(-0.446838), REAL(-0.118517), REAL(-0.466159), - REAL(-0.459488), REAL(-0.093017), REAL(-0.311341), - REAL(-0.370645), REAL(-0.100108), REAL(-0.159454), - REAL(-0.371984), REAL(-0.091991), REAL(-0.011044), - REAL(-0.328945), REAL(-0.098269), REAL(0.088659), - REAL(-0.282452), REAL(-0.018862), REAL(0.311501), - REAL(-0.352403), REAL(-0.131341), REAL(0.144902), - REAL(-0.364126), REAL(-0.200299), REAL(0.202388), - REAL(-0.283965), REAL(-0.231869), REAL(0.023668), - REAL(-0.298943), REAL(-0.155218), REAL(0.369716), - REAL(-0.293787), REAL(-0.121856), REAL(0.419097), - REAL(-0.290163), REAL(-0.290797), REAL(0.107824), - REAL(-0.264165), REAL(-0.272849), REAL(0.036347), - REAL(-0.228567), REAL(-0.372573), REAL(0.290309), - REAL(-0.190431), REAL(-0.286997), REAL(0.421917), - REAL(-0.191039), REAL(-0.240973), REAL(0.507118), - REAL(-0.287272), REAL(-0.276431), REAL(-0.065444), - REAL(-0.295675), REAL(-0.280818), REAL(-0.174200), - REAL(-0.399537), REAL(-0.313131), REAL(-0.376167), - REAL(-0.392666), REAL(-0.488581), REAL(-0.427494), - REAL(-0.331669), REAL(-0.570185), REAL(-0.466054), - REAL(-0.282290), REAL(-0.618140), REAL(-0.589220), - REAL(-0.374238), REAL(-0.594882), REAL(-0.323298), - REAL(-0.381071), REAL(-0.629723), REAL(-0.350777), - REAL(-0.382112), REAL(-0.624060), REAL(-0.221577), - REAL(-0.272701), REAL(-0.566522), REAL(0.259157), - REAL(-0.256702), REAL(-0.663406), REAL(0.286079), - REAL(-0.280948), REAL(-0.428359), REAL(0.055790), - REAL(-0.184974), REAL(-0.508894), REAL(0.326265), - REAL(-0.279971), REAL(-0.526918), REAL(0.395319), - REAL(-0.282599), REAL(-0.663393), REAL(0.412411), - REAL(-0.188329), REAL(-0.475093), REAL(0.417954), - REAL(-0.263384), REAL(-0.663396), REAL(0.466604), - REAL(-0.209063), REAL(-0.663393), REAL(0.509344), - REAL(-0.002044), REAL(-0.319624), REAL(0.553078), - REAL(-0.001266), REAL(-0.371260), REAL(0.413296), - REAL(-0.219753), REAL(-0.339762), REAL(-0.040921), - REAL(-0.256986), REAL(-0.282511), REAL(-0.006349), - REAL(-0.271706), REAL(-0.260881), REAL(0.001764), - REAL(-0.091191), REAL(-0.419184), REAL(-0.045912), - REAL(-0.114944), REAL(-0.429752), REAL(-0.124739), - REAL(-0.113970), REAL(-0.382987), REAL(-0.188540), - REAL(-0.243012), REAL(-0.464942), REAL(-0.242850), - REAL(-0.314815), REAL(-0.505402), REAL(-0.324768), - REAL(0.002774), REAL(-0.437526), REAL(-0.262766), - REAL(-0.072625), REAL(-0.417748), REAL(-0.221440), - REAL(-0.160112), REAL(-0.476932), REAL(-0.293450), - REAL(0.003859), REAL(-0.453425), REAL(-0.443916), - REAL(-0.120363), REAL(-0.581567), REAL(-0.438689), - REAL(-0.091499), REAL(-0.584191), REAL(-0.294511), - REAL(-0.116469), REAL(-0.599861), REAL(-0.188308), - REAL(-0.208032), REAL(-0.513640), REAL(-0.134649), - REAL(-0.235749), REAL(-0.610017), REAL(-0.040939), - REAL(-0.344916), REAL(-0.622487), REAL(-0.085380), - REAL(-0.336401), REAL(-0.531864), REAL(-0.212298), - REAL(0.001961), REAL(-0.459550), REAL(-0.135547), - REAL(-0.058296), REAL(-0.430536), REAL(-0.043440), - REAL(0.001378), REAL(-0.449511), REAL(-0.037762), - REAL(-0.130135), REAL(-0.510222), REAL(0.079144), - REAL(0.000142), REAL(-0.477549), REAL(0.157064), - REAL(-0.114284), REAL(-0.453206), REAL(0.304397), - REAL(-0.000592), REAL(-0.443558), REAL(0.285401), - REAL(-0.056215), REAL(-0.663402), REAL(0.326073), - REAL(-0.026248), REAL(-0.568010), REAL(0.273318), - REAL(-0.049261), REAL(-0.531064), REAL(0.389854), - REAL(-0.127096), REAL(-0.663398), REAL(0.479316), - REAL(-0.058384), REAL(-0.663401), REAL(0.372891), - REAL(-0.303961), REAL(0.054199), REAL(0.625921), - REAL(-0.268594), REAL(0.193403), REAL(0.502766), - REAL(-0.277159), REAL(0.126123), REAL(0.443289), - REAL(-0.287605), REAL(-0.005722), REAL(0.531844), - REAL(-0.231396), REAL(-0.121289), REAL(0.587387), - REAL(-0.253475), REAL(-0.081797), REAL(0.756541), - REAL(-0.195164), REAL(-0.137969), REAL(0.728011), - REAL(-0.167673), REAL(-0.156573), REAL(0.609388), - REAL(-0.145917), REAL(-0.169029), REAL(0.697600), - REAL(-0.077776), REAL(-0.214247), REAL(0.622586), - REAL(-0.076873), REAL(-0.214971), REAL(0.696301), - REAL(-0.002341), REAL(-0.233135), REAL(0.622859), - REAL(-0.002730), REAL(-0.213526), REAL(0.691267), - REAL(-0.003136), REAL(-0.192628), REAL(0.762731), - REAL(-0.056136), REAL(-0.201222), REAL(0.763806), - REAL(-0.114589), REAL(-0.166192), REAL(0.770723), - REAL(-0.155145), REAL(-0.129632), REAL(0.791738), - REAL(-0.183611), REAL(-0.058705), REAL(0.847012), - REAL(-0.165562), REAL(0.001980), REAL(0.833386), - REAL(-0.220084), REAL(0.019914), REAL(0.768935), - REAL(-0.255730), REAL(0.090306), REAL(0.670782), - REAL(-0.255594), REAL(0.113833), REAL(0.663389), - REAL(-0.226380), REAL(0.212655), REAL(0.617740), - REAL(-0.003367), REAL(-0.195342), REAL(0.799680), - REAL(-0.029743), REAL(-0.210508), REAL(0.827180), - REAL(-0.003818), REAL(-0.194783), REAL(0.873636), - REAL(-0.004116), REAL(-0.157907), REAL(0.931268), - REAL(-0.031280), REAL(-0.184555), REAL(0.889476), - REAL(-0.059885), REAL(-0.184448), REAL(0.841330), - REAL(-0.135333), REAL(-0.164332), REAL(0.878200), - REAL(-0.085574), REAL(-0.170948), REAL(0.925547), - REAL(-0.163833), REAL(-0.094170), REAL(0.897114), - REAL(-0.138444), REAL(-0.104250), REAL(0.945975), - REAL(-0.083497), REAL(-0.084934), REAL(0.979607), - REAL(-0.004433), REAL(-0.146642), REAL(0.985872), - REAL(-0.150715), REAL(0.032650), REAL(0.884111), - REAL(-0.135892), REAL(-0.035520), REAL(0.945455), - REAL(-0.070612), REAL(0.036849), REAL(0.975733), - REAL(-0.004458), REAL(-0.042526), REAL(1.015670), - REAL(-0.004249), REAL(0.046042), REAL(1.003240), - REAL(-0.086969), REAL(0.133224), REAL(0.947633), - REAL(-0.003873), REAL(0.161605), REAL(0.970499), - REAL(-0.125544), REAL(0.140012), REAL(0.917678), - REAL(-0.125651), REAL(0.250246), REAL(0.857602), - REAL(-0.003127), REAL(0.284070), REAL(0.878870), - REAL(-0.159174), REAL(0.125726), REAL(0.888878), - REAL(-0.183807), REAL(0.196970), REAL(0.844480), - REAL(-0.159890), REAL(0.291736), REAL(0.732480), - REAL(-0.199495), REAL(0.207230), REAL(0.779864), - REAL(-0.206182), REAL(0.164608), REAL(0.693257), - REAL(-0.186315), REAL(0.160689), REAL(0.817193), - REAL(-0.192827), REAL(0.166706), REAL(0.782271), - REAL(-0.175112), REAL(0.110008), REAL(0.860621), - REAL(-0.161022), REAL(0.057420), REAL(0.855111), - REAL(-0.172319), REAL(0.036155), REAL(0.816189), - REAL(-0.190318), REAL(0.064083), REAL(0.760605), - REAL(-0.195072), REAL(0.129179), REAL(0.731104), - REAL(-0.203126), REAL(0.410287), REAL(0.680536), - REAL(-0.216677), REAL(0.309274), REAL(0.642272), - REAL(-0.241515), REAL(0.311485), REAL(0.587832), - REAL(-0.002209), REAL(0.366663), REAL(0.749413), - REAL(-0.088230), REAL(0.396265), REAL(0.678635), - REAL(-0.170147), REAL(0.109517), REAL(0.840784), - REAL(-0.160521), REAL(0.067766), REAL(0.830650), - REAL(-0.181546), REAL(0.139805), REAL(0.812146), - REAL(-0.180495), REAL(0.148568), REAL(0.776087), - REAL(-0.180255), REAL(0.129125), REAL(0.744192), - REAL(-0.186298), REAL(0.078308), REAL(0.769352), - REAL(-0.167622), REAL(0.060539), REAL(0.806675), - REAL(-0.189876), REAL(0.102760), REAL(0.802582), - REAL(-0.108340), REAL(0.455446), REAL(0.657174), - REAL(-0.241585), REAL(0.527592), REAL(0.669296), - REAL(-0.265676), REAL(0.513366), REAL(0.634594), - REAL(-0.203073), REAL(0.478550), REAL(0.581526), - REAL(-0.266772), REAL(0.642330), REAL(0.602061), - REAL(-0.216961), REAL(0.564846), REAL(0.535435), - REAL(-0.202210), REAL(0.525495), REAL(0.475944), - REAL(-0.193888), REAL(0.467925), REAL(0.520606), - REAL(-0.265837), REAL(0.757267), REAL(0.500933), - REAL(-0.240306), REAL(0.653440), REAL(0.463215), - REAL(-0.309239), REAL(0.776868), REAL(0.304726), - REAL(-0.271009), REAL(0.683094), REAL(0.382018), - REAL(-0.312111), REAL(0.671099), REAL(0.286687), - REAL(-0.268791), REAL(0.624342), REAL(0.377231), - REAL(-0.302457), REAL(0.533996), REAL(0.360289), - REAL(-0.263656), REAL(0.529310), REAL(0.412564), - REAL(-0.282311), REAL(0.415167), REAL(0.447666), - REAL(-0.239201), REAL(0.442096), REAL(0.495604), - REAL(-0.220043), REAL(0.569026), REAL(0.445877), - REAL(-0.001263), REAL(0.395631), REAL(0.602029), - REAL(-0.057345), REAL(0.442535), REAL(0.572224), - REAL(-0.088927), REAL(0.506333), REAL(0.529106), - REAL(-0.125738), REAL(0.535076), REAL(0.612913), - REAL(-0.126251), REAL(0.577170), REAL(0.483159), - REAL(-0.149594), REAL(0.611520), REAL(0.557731), - REAL(-0.163188), REAL(0.660791), REAL(0.491080), - REAL(-0.172482), REAL(0.663387), REAL(0.415416), - REAL(-0.160464), REAL(0.591710), REAL(0.370659), - REAL(-0.156445), REAL(0.536396), REAL(0.378302), - REAL(-0.136496), REAL(0.444358), REAL(0.425226), - REAL(-0.095564), REAL(0.373768), REAL(0.473659), - REAL(-0.104146), REAL(0.315912), REAL(0.498104), - REAL(-0.000496), REAL(0.384194), REAL(0.473817), - REAL(-0.000183), REAL(0.297770), REAL(0.401486), - REAL(-0.129042), REAL(0.270145), REAL(0.434495), - REAL(0.000100), REAL(0.272963), REAL(0.349138), - REAL(-0.113060), REAL(0.236984), REAL(0.385554), - REAL(0.007260), REAL(0.016311), REAL(-0.883396), - REAL(0.007865), REAL(0.122104), REAL(-0.956137), - REAL(-0.032842), REAL(0.115282), REAL(-0.953252), - REAL(-0.089115), REAL(0.108449), REAL(-0.950317), - REAL(-0.047440), REAL(0.014729), REAL(-0.882756), - REAL(-0.104458), REAL(0.013137), REAL(-0.882070), - REAL(-0.086439), REAL(-0.584866), REAL(-0.608343), - REAL(-0.115026), REAL(-0.662605), REAL(-0.436732), - REAL(-0.071683), REAL(-0.665372), REAL(-0.606385), - REAL(-0.257884), REAL(-0.665381), REAL(-0.658052), - REAL(-0.272542), REAL(-0.665381), REAL(-0.592063), - REAL(-0.371322), REAL(-0.665382), REAL(-0.353620), - REAL(-0.372362), REAL(-0.665381), REAL(-0.224420), - REAL(-0.335166), REAL(-0.665380), REAL(-0.078623), - REAL(-0.225999), REAL(-0.665375), REAL(-0.038981), - REAL(-0.106719), REAL(-0.665374), REAL(-0.186351), - REAL(-0.081749), REAL(-0.665372), REAL(-0.292554), - REAL(0.006943), REAL(-0.091505), REAL(-0.858354), - REAL(0.006117), REAL(-0.280985), REAL(-0.769967), - REAL(0.004495), REAL(-0.502360), REAL(-0.559799), - REAL(-0.198638), REAL(-0.302135), REAL(-0.845816), - REAL(-0.237395), REAL(-0.542544), REAL(-0.587188), - REAL(-0.270001), REAL(-0.279489), REAL(-0.669861), - REAL(-0.134547), REAL(-0.119852), REAL(-0.959004), - REAL(-0.052088), REAL(-0.122463), REAL(-0.944549), - REAL(-0.124463), REAL(-0.293508), REAL(-0.899566), - REAL(-0.047616), REAL(-0.289643), REAL(-0.879292), - REAL(-0.168595), REAL(-0.529132), REAL(-0.654931), - REAL(-0.099793), REAL(-0.515719), REAL(-0.645873), - REAL(-0.186168), REAL(-0.605282), REAL(-0.724690), - REAL(-0.112970), REAL(-0.583097), REAL(-0.707469), - REAL(-0.108152), REAL(-0.665375), REAL(-0.700408), - REAL(-0.183019), REAL(-0.665378), REAL(-0.717630), - REAL(-0.349529), REAL(-0.334459), REAL(-0.511985), - REAL(-0.141182), REAL(-0.437705), REAL(-0.798194), - REAL(-0.212670), REAL(-0.448725), REAL(-0.737447), - REAL(-0.261111), REAL(-0.414945), REAL(-0.613835), - REAL(-0.077364), REAL(-0.431480), REAL(-0.778113), - REAL(0.005174), REAL(-0.425277), REAL(-0.651592), - REAL(0.089236), REAL(-0.431732), REAL(-0.777093), - REAL(0.271006), REAL(-0.415749), REAL(-0.610577), - REAL(0.223981), REAL(-0.449384), REAL(-0.734774), - REAL(0.153275), REAL(-0.438150), REAL(-0.796391), - REAL(0.358414), REAL(-0.335529), REAL(-0.507649), - REAL(0.193434), REAL(-0.665946), REAL(-0.715325), - REAL(0.118363), REAL(-0.665717), REAL(-0.699021), - REAL(0.123515), REAL(-0.583454), REAL(-0.706020), - REAL(0.196851), REAL(-0.605860), REAL(-0.722345), - REAL(0.109788), REAL(-0.516035), REAL(-0.644590), - REAL(0.178656), REAL(-0.529656), REAL(-0.652804), - REAL(0.061157), REAL(-0.289807), REAL(-0.878626), - REAL(0.138234), REAL(-0.293905), REAL(-0.897958), - REAL(0.066933), REAL(-0.122643), REAL(-0.943820), - REAL(0.149571), REAL(-0.120281), REAL(-0.957264), - REAL(0.280989), REAL(-0.280321), REAL(-0.666487), - REAL(0.246581), REAL(-0.543275), REAL(-0.584224), - REAL(0.211720), REAL(-0.302754), REAL(-0.843303), - REAL(0.086966), REAL(-0.665627), REAL(-0.291520), - REAL(0.110634), REAL(-0.665702), REAL(-0.185021), - REAL(0.228099), REAL(-0.666061), REAL(-0.036201), - REAL(0.337743), REAL(-0.666396), REAL(-0.074503), - REAL(0.376722), REAL(-0.666513), REAL(-0.219833), - REAL(0.377265), REAL(-0.666513), REAL(-0.349036), - REAL(0.281411), REAL(-0.666217), REAL(-0.588670), - REAL(0.267564), REAL(-0.666174), REAL(-0.654834), - REAL(0.080745), REAL(-0.665602), REAL(-0.605452), - REAL(0.122016), REAL(-0.662963), REAL(-0.435280), - REAL(0.095767), REAL(-0.585141), REAL(-0.607228), - REAL(0.118944), REAL(0.012799), REAL(-0.880702), - REAL(0.061944), REAL(0.014564), REAL(-0.882086), - REAL(0.104725), REAL(0.108156), REAL(-0.949130), - REAL(0.048513), REAL(0.115159), REAL(-0.952753), - REAL(0.112696), REAL(0.236643), REAL(0.386937), - REAL(0.128177), REAL(0.269757), REAL(0.436071), - REAL(0.102643), REAL(0.315600), REAL(0.499370), - REAL(0.094535), REAL(0.373481), REAL(0.474824), - REAL(0.136270), REAL(0.443946), REAL(0.426895), - REAL(0.157071), REAL(0.535923), REAL(0.380222), - REAL(0.161350), REAL(0.591224), REAL(0.372630), - REAL(0.173035), REAL(0.662865), REAL(0.417531), - REAL(0.162808), REAL(0.660299), REAL(0.493077), - REAL(0.148250), REAL(0.611070), REAL(0.559555), - REAL(0.125719), REAL(0.576790), REAL(0.484702), - REAL(0.123489), REAL(0.534699), REAL(0.614440), - REAL(0.087621), REAL(0.506066), REAL(0.530188), - REAL(0.055321), REAL(0.442365), REAL(0.572915), - REAL(0.219936), REAL(0.568361), REAL(0.448571), - REAL(0.238099), REAL(0.441375), REAL(0.498528), - REAL(0.281711), REAL(0.414315), REAL(0.451121), - REAL(0.263833), REAL(0.528513), REAL(0.415794), - REAL(0.303284), REAL(0.533081), REAL(0.363998), - REAL(0.269687), REAL(0.623528), REAL(0.380528), - REAL(0.314255), REAL(0.670153), REAL(0.290524), - REAL(0.272023), REAL(0.682273), REAL(0.385343), - REAL(0.311480), REAL(0.775931), REAL(0.308527), - REAL(0.240239), REAL(0.652714), REAL(0.466159), - REAL(0.265619), REAL(0.756464), REAL(0.504187), - REAL(0.192562), REAL(0.467341), REAL(0.522972), - REAL(0.201605), REAL(0.524885), REAL(0.478417), - REAL(0.215743), REAL(0.564193), REAL(0.538084), - REAL(0.264969), REAL(0.641527), REAL(0.605317), - REAL(0.201031), REAL(0.477940), REAL(0.584002), - REAL(0.263086), REAL(0.512567), REAL(0.637832), - REAL(0.238615), REAL(0.526867), REAL(0.672237), - REAL(0.105309), REAL(0.455123), REAL(0.658482), - REAL(0.183993), REAL(0.102195), REAL(0.804872), - REAL(0.161563), REAL(0.060042), REAL(0.808692), - REAL(0.180748), REAL(0.077754), REAL(0.771600), - REAL(0.175168), REAL(0.128588), REAL(0.746368), - REAL(0.175075), REAL(0.148030), REAL(0.778264), - REAL(0.175658), REAL(0.139265), REAL(0.814333), - REAL(0.154191), REAL(0.067291), REAL(0.832578), - REAL(0.163818), REAL(0.109013), REAL(0.842830), - REAL(0.084760), REAL(0.396004), REAL(0.679695), - REAL(0.238888), REAL(0.310760), REAL(0.590775), - REAL(0.213380), REAL(0.308625), REAL(0.644905), - REAL(0.199666), REAL(0.409678), REAL(0.683003), - REAL(0.190143), REAL(0.128597), REAL(0.733463), - REAL(0.184833), REAL(0.063516), REAL(0.762902), - REAL(0.166070), REAL(0.035644), REAL(0.818261), - REAL(0.154361), REAL(0.056943), REAL(0.857042), - REAL(0.168542), REAL(0.109489), REAL(0.862725), - REAL(0.187387), REAL(0.166131), REAL(0.784599), - REAL(0.180428), REAL(0.160135), REAL(0.819438), - REAL(0.201823), REAL(0.163991), REAL(0.695756), - REAL(0.194206), REAL(0.206635), REAL(0.782275), - REAL(0.155438), REAL(0.291260), REAL(0.734412), - REAL(0.177696), REAL(0.196424), REAL(0.846693), - REAL(0.152305), REAL(0.125256), REAL(0.890786), - REAL(0.119546), REAL(0.249876), REAL(0.859104), - REAL(0.118369), REAL(0.139643), REAL(0.919173), - REAL(0.079410), REAL(0.132973), REAL(0.948652), - REAL(0.062419), REAL(0.036648), REAL(0.976547), - REAL(0.127847), REAL(-0.035919), REAL(0.947070), - REAL(0.143624), REAL(0.032206), REAL(0.885913), - REAL(0.074888), REAL(-0.085173), REAL(0.980577), - REAL(0.130184), REAL(-0.104656), REAL(0.947620), - REAL(0.156201), REAL(-0.094653), REAL(0.899074), - REAL(0.077366), REAL(-0.171194), REAL(0.926545), - REAL(0.127722), REAL(-0.164729), REAL(0.879810), - REAL(0.052670), REAL(-0.184618), REAL(0.842019), - REAL(0.023477), REAL(-0.184638), REAL(0.889811), - REAL(0.022626), REAL(-0.210587), REAL(0.827500), - REAL(0.223089), REAL(0.211976), REAL(0.620493), - REAL(0.251444), REAL(0.113067), REAL(0.666494), - REAL(0.251419), REAL(0.089540), REAL(0.673887), - REAL(0.214360), REAL(0.019258), REAL(0.771595), - REAL(0.158999), REAL(0.001490), REAL(0.835374), - REAL(0.176696), REAL(-0.059249), REAL(0.849218), - REAL(0.148696), REAL(-0.130091), REAL(0.793599), - REAL(0.108290), REAL(-0.166528), REAL(0.772088), - REAL(0.049820), REAL(-0.201382), REAL(0.764454), - REAL(0.071341), REAL(-0.215195), REAL(0.697209), - REAL(0.073148), REAL(-0.214475), REAL(0.623510), - REAL(0.140502), REAL(-0.169461), REAL(0.699354), - REAL(0.163374), REAL(-0.157073), REAL(0.611416), - REAL(0.189466), REAL(-0.138550), REAL(0.730366), - REAL(0.247593), REAL(-0.082554), REAL(0.759610), - REAL(0.227468), REAL(-0.121982), REAL(0.590197), - REAL(0.284702), REAL(-0.006586), REAL(0.535347), - REAL(0.275741), REAL(0.125287), REAL(0.446676), - REAL(0.266650), REAL(0.192594), REAL(0.506044), - REAL(0.300086), REAL(0.053287), REAL(0.629620), - REAL(0.055450), REAL(-0.663935), REAL(0.375065), - REAL(0.122854), REAL(-0.664138), REAL(0.482323), - REAL(0.046520), REAL(-0.531571), REAL(0.391918), - REAL(0.024824), REAL(-0.568450), REAL(0.275106), - REAL(0.053855), REAL(-0.663931), REAL(0.328224), - REAL(0.112829), REAL(-0.453549), REAL(0.305788), - REAL(0.131265), REAL(-0.510617), REAL(0.080746), - REAL(0.061174), REAL(-0.430716), REAL(-0.042710), - REAL(0.341019), REAL(-0.532887), REAL(-0.208150), - REAL(0.347705), REAL(-0.623533), REAL(-0.081139), - REAL(0.238040), REAL(-0.610732), REAL(-0.038037), - REAL(0.211764), REAL(-0.514274), REAL(-0.132078), - REAL(0.120605), REAL(-0.600219), REAL(-0.186856), - REAL(0.096985), REAL(-0.584476), REAL(-0.293357), - REAL(0.127621), REAL(-0.581941), REAL(-0.437170), - REAL(0.165902), REAL(-0.477425), REAL(-0.291453), - REAL(0.077720), REAL(-0.417975), REAL(-0.220519), - REAL(0.320892), REAL(-0.506363), REAL(-0.320874), - REAL(0.248214), REAL(-0.465684), REAL(-0.239842), - REAL(0.118764), REAL(-0.383338), REAL(-0.187114), - REAL(0.118816), REAL(-0.430106), REAL(-0.123307), - REAL(0.094131), REAL(-0.419464), REAL(-0.044777), - REAL(0.274526), REAL(-0.261706), REAL(0.005110), - REAL(0.259842), REAL(-0.283292), REAL(-0.003185), - REAL(0.222861), REAL(-0.340431), REAL(-0.038210), - REAL(0.204445), REAL(-0.664380), REAL(0.513353), - REAL(0.259286), REAL(-0.664547), REAL(0.471281), - REAL(0.185402), REAL(-0.476020), REAL(0.421718), - REAL(0.279163), REAL(-0.664604), REAL(0.417328), - REAL(0.277157), REAL(-0.528122), REAL(0.400208), - REAL(0.183069), REAL(-0.509812), REAL(0.329995), - REAL(0.282599), REAL(-0.429210), REAL(0.059242), - REAL(0.254816), REAL(-0.664541), REAL(0.290687), - REAL(0.271436), REAL(-0.567707), REAL(0.263966), - REAL(0.386561), REAL(-0.625221), REAL(-0.216870), - REAL(0.387086), REAL(-0.630883), REAL(-0.346073), - REAL(0.380021), REAL(-0.596021), REAL(-0.318679), - REAL(0.291269), REAL(-0.619007), REAL(-0.585707), - REAL(0.339280), REAL(-0.571198), REAL(-0.461946), - REAL(0.400045), REAL(-0.489778), REAL(-0.422640), - REAL(0.406817), REAL(-0.314349), REAL(-0.371230), - REAL(0.300588), REAL(-0.281718), REAL(-0.170549), - REAL(0.290866), REAL(-0.277304), REAL(-0.061905), - REAL(0.187735), REAL(-0.241545), REAL(0.509437), - REAL(0.188032), REAL(-0.287569), REAL(0.424234), - REAL(0.227520), REAL(-0.373262), REAL(0.293102), - REAL(0.266526), REAL(-0.273650), REAL(0.039597), - REAL(0.291592), REAL(-0.291676), REAL(0.111386), - REAL(0.291914), REAL(-0.122741), REAL(0.422683), - REAL(0.297574), REAL(-0.156119), REAL(0.373368), - REAL(0.286603), REAL(-0.232731), REAL(0.027162), - REAL(0.364663), REAL(-0.201399), REAL(0.206850), - REAL(0.353855), REAL(-0.132408), REAL(0.149228), - REAL(0.282208), REAL(-0.019715), REAL(0.314960), - REAL(0.331187), REAL(-0.099266), REAL(0.092701), - REAL(0.375463), REAL(-0.093120), REAL(-0.006467), - REAL(0.375917), REAL(-0.101236), REAL(-0.154882), - REAL(0.466635), REAL(-0.094416), REAL(-0.305669), - REAL(0.455805), REAL(-0.119881), REAL(-0.460632), - REAL(0.277465), REAL(-0.604242), REAL(-0.651871), - REAL(0.261022), REAL(-0.551176), REAL(-0.554667), - REAL(0.093627), REAL(0.258494), REAL(-0.920589), - REAL(0.114248), REAL(0.310608), REAL(-0.798070), - REAL(0.144232), REAL(0.211434), REAL(-0.835001), - REAL(0.119916), REAL(0.176940), REAL(-0.951159), - REAL(0.184061), REAL(0.101854), REAL(-0.918220), - REAL(0.092431), REAL(0.276521), REAL(-0.738231), - REAL(0.133504), REAL(0.218403), REAL(-0.758602), - REAL(0.194987), REAL(0.097655), REAL(-0.812476), - REAL(0.185542), REAL(0.011005), REAL(-0.879202), - REAL(0.230315), REAL(-0.127450), REAL(-0.884202), - REAL(0.260471), REAL(0.255056), REAL(-0.624378), - REAL(0.351567), REAL(-0.042194), REAL(-0.663976), - REAL(0.253742), REAL(0.323524), REAL(-0.433716), - REAL(0.411612), REAL(0.132299), REAL(-0.438264), - REAL(0.270513), REAL(0.356530), REAL(-0.289984), - REAL(0.422146), REAL(0.162819), REAL(-0.273130), - REAL(0.164724), REAL(0.237490), REAL(0.208912), - REAL(0.253806), REAL(0.092900), REAL(0.240640), - REAL(0.203608), REAL(0.284597), REAL(0.096223), - REAL(0.241006), REAL(0.343093), REAL(-0.171396), - REAL(0.356076), REAL(0.149288), REAL(-0.143443), - REAL(0.337656), REAL(0.131992), REAL(0.066374) -}; - -int Indices[IndexCount / 3][3] = { - {126,134,133}, - {342,138,134}, - {133,134,138}, - {126,342,134}, - {312,316,317}, - {169,163,162}, - {312,317,319}, - {312,319,318}, - {169,162,164}, - {169,168,163}, - {312,314,315}, - {169,164,165}, - {169,167,168}, - {312,315,316}, - {312,313,314}, - {169,165,166}, - {169,166,167}, - {312,318,313}, - {308,304,305}, - {308,305,306}, - {179,181,188}, - {177,173,175}, - {177,175,176}, - {302,293,300}, - {322,294,304}, - {188,176,175}, - {188,175,179}, - {158,177,187}, - {305,293,302}, - {305,302,306}, - {322,304,308}, - {188,181,183}, - {158,173,177}, - {293,298,300}, - {304,294,296}, - {304,296,305}, - {185,176,188}, - {185,188,183}, - {187,177,176}, - {187,176,185}, - {305,296,298}, - {305,298,293}, - {436,432, 28}, - {436, 28, 23}, - {434,278,431}, - { 30,208,209}, - { 30,209, 29}, - { 19, 20, 24}, - {208,207,211}, - {208,211,209}, - { 19,210,212}, - {433,434,431}, - {433,431,432}, - {433,432,436}, - {436,437,433}, - {277,275,276}, - {277,276,278}, - {209,210, 25}, - { 21, 26, 24}, - { 21, 24, 20}, - { 25, 26, 27}, - { 25, 27, 29}, - {435,439,277}, - {439,275,277}, - {432,431, 30}, - {432, 30, 28}, - {433,437,438}, - {433,438,435}, - {434,277,278}, - { 24, 25,210}, - { 24, 26, 25}, - { 29, 27, 28}, - { 29, 28, 30}, - { 19, 24,210}, - {208, 30,431}, - {208,431,278}, - {435,434,433}, - {435,277,434}, - { 25, 29,209}, - { 27, 22, 23}, - { 27, 23, 28}, - { 26, 22, 27}, - { 26, 21, 22}, - {212,210,209}, - {212,209,211}, - {207,208,278}, - {207,278,276}, - {439,435,438}, - { 12, 9, 10}, - { 12, 10, 13}, - { 2, 3, 5}, - { 2, 5, 4}, - { 16, 13, 14}, - { 16, 14, 17}, - { 22, 21, 16}, - { 13, 10, 11}, - { 13, 11, 14}, - { 1, 0, 3}, - { 1, 3, 2}, - { 15, 12, 16}, - { 19, 18, 15}, - { 19, 15, 16}, - { 19, 16, 20}, - { 9, 1, 2}, - { 9, 2, 10}, - { 3, 7, 8}, - { 3, 8, 5}, - { 16, 17, 23}, - { 16, 23, 22}, - { 21, 20, 16}, - { 10, 2, 4}, - { 10, 4, 11}, - { 0, 6, 7}, - { 0, 7, 3}, - { 12, 13, 16}, - {451,446,445}, - {451,445,450}, - {442,440,439}, - {442,439,438}, - {442,438,441}, - {421,420,422}, - {412,411,426}, - {412,426,425}, - {408,405,407}, - {413, 67, 68}, - {413, 68,414}, - {391,390,412}, - { 80,384,386}, - {404,406,378}, - {390,391,377}, - {390,377, 88}, - {400,415,375}, - {398,396,395}, - {398,395,371}, - {398,371,370}, - {112,359,358}, - {112,358,113}, - {351,352,369}, - {125,349,348}, - {345,343,342}, - {342,340,339}, - {341,335,337}, - {328,341,327}, - {331,323,333}, - {331,322,323}, - {327,318,319}, - {327,319,328}, - {315,314,324}, - {302,300,301}, - {302,301,303}, - {320,311,292}, - {285,284,289}, - {310,307,288}, - {310,288,290}, - {321,350,281}, - {321,281,282}, - {423,448,367}, - {272,273,384}, - {272,384,274}, - {264,265,382}, - {264,382,383}, - {440,442,261}, - {440,261,263}, - {252,253,254}, - {252,254,251}, - {262,256,249}, - {262,249,248}, - {228,243,242}, - {228, 31,243}, - {213,215,238}, - {213,238,237}, - { 19,212,230}, - {224,225,233}, - {224,233,231}, - {217,218, 56}, - {217, 56, 54}, - {217,216,239}, - {217,239,238}, - {217,238,215}, - {218,217,215}, - {218,215,214}, - { 6,102,206}, - {186,199,200}, - {197,182,180}, - {170,171,157}, - {201,200,189}, - {170,190,191}, - {170,191,192}, - {175,174,178}, - {175,178,179}, - {168,167,155}, - {122,149,158}, - {122,158,159}, - {135,153,154}, - {135,154,118}, - {143,140,141}, - {143,141,144}, - {132,133,136}, - {130,126,133}, - {124,125,127}, - {122,101,100}, - {122,100,121}, - {110,108,107}, - {110,107,109}, - { 98, 99, 97}, - { 98, 97, 64}, - { 98, 64, 66}, - { 87, 55, 57}, - { 83, 82, 79}, - { 83, 79, 84}, - { 78, 74, 50}, - { 49, 71, 41}, - { 49, 41, 37}, - { 49, 37, 36}, - { 58, 44, 60}, - { 60, 59, 58}, - { 51, 34, 33}, - { 39, 40, 42}, - { 39, 42, 38}, - {243,240, 33}, - {243, 33,229}, - { 39, 38, 6}, - { 44, 46, 40}, - { 55, 56, 57}, - { 64, 62, 65}, - { 64, 65, 66}, - { 41, 71, 45}, - { 75, 50, 51}, - { 81, 79, 82}, - { 77, 88, 73}, - { 93, 92, 94}, - { 68, 47, 46}, - { 96, 97, 99}, - { 96, 99, 95}, - {110,109,111}, - {111,112,110}, - {114,113,123}, - {114,123,124}, - {132,131,129}, - {133,137,136}, - {135,142,145}, - {145,152,135}, - {149,147,157}, - {157,158,149}, - {164,150,151}, - {153,163,168}, - {153,168,154}, - {185,183,182}, - {185,182,184}, - {161,189,190}, - {200,199,191}, - {200,191,190}, - {180,178,195}, - {180,195,196}, - {102,101,204}, - {102,204,206}, - { 43, 48,104}, - { 43,104,103}, - {216,217, 54}, - {216, 54, 32}, - {207,224,231}, - {230,212,211}, - {230,211,231}, - {227,232,241}, - {227,241,242}, - {235,234,241}, - {235,241,244}, - {430,248,247}, - {272,274,253}, - {272,253,252}, - {439,260,275}, - {225,224,259}, - {225,259,257}, - {269,270,407}, - {269,407,405}, - {270,269,273}, - {270,273,272}, - {273,269,268}, - {273,268,267}, - {273,267,266}, - {273,266,265}, - {273,265,264}, - {448,279,367}, - {281,350,368}, - {285,286,301}, - {290,323,310}, - {290,311,323}, - {282,281,189}, - {292,311,290}, - {292,290,291}, - {307,306,302}, - {307,302,303}, - {316,315,324}, - {316,324,329}, - {331,351,350}, - {330,334,335}, - {330,335,328}, - {341,337,338}, - {344,355,354}, - {346,345,348}, - {346,348,347}, - {364,369,352}, - {364,352,353}, - {365,363,361}, - {365,361,362}, - {376,401,402}, - {373,372,397}, - {373,397,400}, - {376, 92,377}, - {381,378,387}, - {381,387,385}, - {386, 77, 80}, - {390,389,412}, - {416,417,401}, - {403,417,415}, - {408,429,430}, - {419,423,418}, - {427,428,444}, - {427,444,446}, - {437,436,441}, - {450,445, 11}, - {450, 11, 4}, - {447,449, 5}, - {447, 5, 8}, - {441,438,437}, - {425,426,451}, - {425,451,452}, - {417,421,415}, - {408,407,429}, - {399,403,400}, - {399,400,397}, - {394,393,416}, - {389,411,412}, - {386,383,385}, - {408,387,378}, - {408,378,406}, - {377,391,376}, - { 94,375,415}, - {372,373,374}, - {372,374,370}, - {359,111,360}, - {359,112,111}, - {113,358,349}, - {113,349,123}, - {346,343,345}, - {343,340,342}, - {338,336,144}, - {338,144,141}, - {327,341,354}, - {327,354,326}, - {331,350,321}, - {331,321,322}, - {314,313,326}, - {314,326,325}, - {300,298,299}, - {300,299,301}, - {288,287,289}, - {189,292,282}, - {287,288,303}, - {284,285,297}, - {368,280,281}, - {448,447,279}, - {274,226,255}, - {267,268,404}, - {267,404,379}, - {429,262,430}, - {439,440,260}, - {257,258,249}, - {257,249,246}, - {430,262,248}, - {234,228,242}, - {234,242,241}, - {237,238,239}, - {237,239,236}, - { 15, 18,227}, - { 15,227,229}, - {222,223, 82}, - {222, 82, 83}, - {214,215,213}, - {214,213, 81}, - { 38,102, 6}, - {122,159,200}, - {122,200,201}, - {174,171,192}, - {174,192,194}, - {197,193,198}, - {190,170,161}, - {181,179,178}, - {181,178,180}, - {166,156,155}, - {163,153,152}, - {163,152,162}, - {120,156,149}, - {120,149,121}, - {152,153,135}, - {140,143,142}, - {135,131,132}, - {135,132,136}, - {130,129,128}, - {130,128,127}, - {100,105,119}, - {100,119,120}, - {106,104,107}, - {106,107,108}, - { 91, 95, 59}, - { 93, 94, 68}, - { 91, 89, 92}, - { 76, 53, 55}, - { 76, 55, 87}, - { 81, 78, 79}, - { 74, 73, 49}, - { 69, 60, 45}, - { 58, 62, 64}, - { 58, 64, 61}, - { 53, 31, 32}, - { 32, 54, 53}, - { 42, 43, 38}, - { 35, 36, 0}, - { 35, 0, 1}, - { 34, 35, 1}, - { 34, 1, 9}, - { 44, 40, 41}, - { 44, 41, 45}, - { 33,240, 51}, - { 63, 62, 58}, - { 63, 58, 59}, - { 45, 71, 70}, - { 76, 75, 51}, - { 76, 51, 52}, - { 86, 85, 84}, - { 86, 84, 87}, - { 89, 72, 73}, - { 89, 73, 88}, - { 91, 92, 96}, - { 91, 96, 95}, - { 72, 91, 60}, - { 72, 60, 69}, - {104,106,105}, - {119,105,117}, - {119,117,118}, - {124,127,128}, - {117,116,129}, - {117,129,131}, - {118,117,131}, - {135,140,142}, - {146,150,152}, - {146,152,145}, - {149,122,121}, - {166,165,151}, - {166,151,156}, - {158,172,173}, - {161,160,189}, - {199,198,193}, - {199,193,191}, - {204,201,202}, - {178,174,194}, - {200,159,186}, - {109, 48, 67}, - { 48,107,104}, - {216, 32,236}, - {216,236,239}, - {223,214, 81}, - {223, 81, 82}, - { 33, 12, 15}, - { 32,228,234}, - { 32,234,236}, - {240, 31, 52}, - {256,255,246}, - {256,246,249}, - {258,263,248}, - {258,248,249}, - {275,260,259}, - {275,259,276}, - {207,276,259}, - {270,271,429}, - {270,429,407}, - {413,418,366}, - {413,366,365}, - {368,367,279}, - {368,279,280}, - {303,301,286}, - {303,286,287}, - {283,282,292}, - {283,292,291}, - {320,292,189}, - {298,296,297}, - {298,297,299}, - {318,327,326}, - {318,326,313}, - {329,330,317}, - {336,333,320}, - {326,354,353}, - {334,332,333}, - {334,333,336}, - {342,339,139}, - {342,139,138}, - {345,342,126}, - {347,357,356}, - {369,368,351}, - {363,356,357}, - {363,357,361}, - {366,367,368}, - {366,368,369}, - {375,373,400}, - { 92, 90,377}, - {409,387,408}, - {386,385,387}, - {386,387,388}, - {412,394,391}, - {396,398,399}, - {408,406,405}, - {415,421,419}, - {415,419,414}, - {425,452,448}, - {425,448,424}, - {444,441,443}, - {448,452,449}, - {448,449,447}, - {446,444,443}, - {446,443,445}, - {250,247,261}, - {250,261,428}, - {421,422,423}, - {421,423,419}, - {427,410,250}, - {417,403,401}, - {403,402,401}, - {420,392,412}, - {420,412,425}, - {420,425,424}, - {386,411,389}, - {383,382,381}, - {383,381,385}, - {378,379,404}, - {372,371,395}, - {372,395,397}, - {371,372,370}, - {361,359,360}, - {361,360,362}, - {368,350,351}, - {349,347,348}, - {356,355,344}, - {356,344,346}, - {344,341,340}, - {344,340,343}, - {338,337,336}, - {328,335,341}, - {324,352,351}, - {324,351,331}, - {320,144,336}, - {314,325,324}, - {322,308,309}, - {310,309,307}, - {287,286,289}, - {203,280,279}, - {203,279,205}, - {297,295,283}, - {297,283,284}, - {447,205,279}, - {274,384, 80}, - {274, 80,226}, - {266,267,379}, - {266,379,380}, - {225,257,246}, - {225,246,245}, - {256,254,253}, - {256,253,255}, - {430,247,250}, - {226,235,244}, - {226,244,245}, - {232,233,244}, - {232,244,241}, - {230, 18, 19}, - { 32, 31,228}, - {219,220, 86}, - {219, 86, 57}, - {226,213,235}, - {206, 7, 6}, - {122,201,101}, - {201,204,101}, - {180,196,197}, - {170,192,171}, - {200,190,189}, - {194,193,195}, - {183,181,180}, - {183,180,182}, - {155,154,168}, - {149,156,151}, - {149,151,148}, - {155,156,120}, - {145,142,143}, - {145,143,146}, - {136,137,140}, - {133,132,130}, - {128,129,116}, - {100,120,121}, - {110,112,113}, - {110,113,114}, - { 66, 65, 63}, - { 66, 63, 99}, - { 66, 99, 98}, - { 96, 46, 61}, - { 89, 88, 90}, - { 86, 87, 57}, - { 80, 78, 81}, - { 72, 69, 49}, - { 67, 48, 47}, - { 67, 47, 68}, - { 56, 55, 53}, - { 50, 49, 36}, - { 50, 36, 35}, - { 40, 39, 41}, - {242,243,229}, - {242,229,227}, - { 6, 37, 39}, - { 42, 47, 48}, - { 42, 48, 43}, - { 61, 46, 44}, - { 45, 70, 69}, - { 69, 70, 71}, - { 69, 71, 49}, - { 74, 78, 77}, - { 83, 84, 85}, - { 73, 74, 77}, - { 93, 96, 92}, - { 68, 46, 93}, - { 95, 99, 63}, - { 95, 63, 59}, - {115,108,110}, - {115,110,114}, - {125,126,127}, - {129,130,132}, - {137,133,138}, - {137,138,139}, - {148,146,143}, - {148,143,147}, - {119,118,154}, - {161,147,143}, - {165,164,151}, - {158,157,171}, - {158,171,172}, - {159,158,187}, - {159,187,186}, - {194,192,191}, - {194,191,193}, - {189,202,201}, - {182,197,184}, - {205, 8, 7}, - { 48,109,107}, - {218,219, 57}, - {218, 57, 56}, - {207,231,211}, - {232,230,231}, - {232,231,233}, - { 53, 52, 31}, - {388,411,386}, - {409,430,250}, - {262,429,254}, - {262,254,256}, - {442,444,428}, - {273,264,383}, - {273,383,384}, - {429,271,251}, - {429,251,254}, - {413,365,362}, - { 67,413,360}, - {282,283,295}, - {285,301,299}, - {202,281,280}, - {284,283,291}, - {284,291,289}, - {320,189,160}, - {308,306,307}, - {307,309,308}, - {319,317,330}, - {319,330,328}, - {353,352,324}, - {332,331,333}, - {340,341,338}, - {354,341,344}, - {349,358,357}, - {349,357,347}, - {364,355,356}, - {364,356,363}, - {364,365,366}, - {364,366,369}, - {374,376,402}, - {375, 92,373}, - { 77,389,390}, - {382,380,381}, - {389, 77,386}, - {393,394,412}, - {393,412,392}, - {401,394,416}, - {415,400,403}, - {411,410,427}, - {411,427,426}, - {422,420,424}, - {247,248,263}, - {247,263,261}, - {445,443, 14}, - {445, 14, 11}, - {449,450, 4}, - {449, 4, 5}, - {443,441, 17}, - {443, 17, 14}, - {436, 23, 17}, - {436, 17,441}, - {424,448,422}, - {448,423,422}, - {414,419,418}, - {414,418,413}, - {406,404,405}, - {399,397,395}, - {399,395,396}, - {420,416,392}, - {388,410,411}, - {386,384,383}, - {390, 88, 77}, - {375, 94, 92}, - {415,414, 68}, - {415, 68, 94}, - {370,374,402}, - {370,402,398}, - {361,357,358}, - {361,358,359}, - {125,348,126}, - {346,344,343}, - {340,338,339}, - {337,335,334}, - {337,334,336}, - {325,353,324}, - {324,331,332}, - {324,332,329}, - {323,322,309}, - {323,309,310}, - {294,295,297}, - {294,297,296}, - {289,286,285}, - {202,280,203}, - {288,307,303}, - {282,295,321}, - { 67,360,111}, - {418,423,367}, - {418,367,366}, - {272,252,251}, - {272,251,271}, - {272,271,270}, - {255,253,274}, - {265,266,380}, - {265,380,382}, - {442,428,261}, - {440,263,258}, - {440,258,260}, - {409,250,410}, - {255,226,245}, - {255,245,246}, - { 31,240,243}, - {236,234,235}, - {236,235,237}, - {233,225,245}, - {233,245,244}, - {220,221, 85}, - {220, 85, 86}, - { 81,213,226}, - { 81,226, 80}, - { 7,206,205}, - {186,184,198}, - {186,198,199}, - {204,203,205}, - {204,205,206}, - {195,193,196}, - {171,174,172}, - {173,174,175}, - {173,172,174}, - {155,167,166}, - {160,161,143}, - {160,143,144}, - {119,154,155}, - {148,151,150}, - {148,150,146}, - {140,137,139}, - {140,139,141}, - {127,126,130}, - {114,124,128}, - {114,128,115}, - {117,105,106}, - {117,106,116}, - {104,105,100}, - {104,100,103}, - { 59, 60, 91}, - { 97, 96, 61}, - { 97, 61, 64}, - { 91, 72, 89}, - { 87, 84, 79}, - { 87, 79, 76}, - { 78, 80, 77}, - { 49, 50, 74}, - { 60, 44, 45}, - { 61, 44, 58}, - { 51, 50, 35}, - { 51, 35, 34}, - { 39, 37, 41}, - { 33, 34, 9}, - { 33, 9, 12}, - { 0, 36, 37}, - { 0, 37, 6}, - { 40, 46, 47}, - { 40, 47, 42}, - { 53, 54, 56}, - { 65, 62, 63}, - { 72, 49, 73}, - { 79, 78, 75}, - { 79, 75, 76}, - { 52, 53, 76}, - { 92, 89, 90}, - { 96, 93, 46}, - {102,103,100}, - {102,100,101}, - {116,106,108}, - {116,108,115}, - {123,125,124}, - {116,115,128}, - {118,131,135}, - {140,135,136}, - {148,147,149}, - {120,119,155}, - {164,162,152}, - {164,152,150}, - {157,147,161}, - {157,161,170}, - {186,187,185}, - {186,185,184}, - {193,197,196}, - {202,203,204}, - {194,195,178}, - {198,184,197}, - { 67,111,109}, - { 38, 43,103}, - { 38,103,102}, - {214,223,222}, - {214,222,221}, - {214,221,220}, - {214,220,219}, - {214,219,218}, - {213,237,235}, - {221,222, 83}, - {221, 83, 85}, - { 15,229, 33}, - {227, 18,230}, - {227,230,232}, - { 52, 51,240}, - { 75, 78, 50}, - {408,430,409}, - {260,258,257}, - {260,257,259}, - {224,207,259}, - {268,269,405}, - {268,405,404}, - {413,362,360}, - {447, 8,205}, - {299,297,285}, - {189,281,202}, - {290,288,289}, - {290,289,291}, - {322,321,295}, - {322,295,294}, - {333,323,311}, - {333,311,320}, - {317,316,329}, - {320,160,144}, - {353,325,326}, - {329,332,334}, - {329,334,330}, - {339,338,141}, - {339,141,139}, - {348,345,126}, - {347,356,346}, - {123,349,125}, - {364,353,354}, - {364,354,355}, - {365,364,363}, - {376,391,394}, - {376,394,401}, - { 92,376,374}, - { 92,374,373}, - {377, 90, 88}, - {380,379,378}, - {380,378,381}, - {388,387,409}, - {388,409,410}, - {416,393,392}, - {399,398,402}, - {399,402,403}, - {250,428,427}, - {421,417,416}, - {421,416,420}, - {426,427,446}, - {426,446,451}, - {444,442,441}, - {452,451,450}, - {452,450,449} -}; - -//============================ - - -dReal heightfield_callback( void* pUserData, int x, int z ) -{ - dIASSERT( x < HFIELD_WSTEP ); - dIASSERT( z < HFIELD_DSTEP ); - - dReal fx = ( ((dReal)x) - ( HFIELD_WSTEP-1 )/2 ) / (dReal)( HFIELD_WSTEP-1 ); - dReal fz = ( ((dReal)z) - ( HFIELD_DSTEP-1 )/2 ) / (dReal)( HFIELD_DSTEP-1 ); - - // Create an interesting 'hump' shape - dReal h = REAL( 1.0 ) + ( REAL( -16.0 ) * ( fx*fx*fx + fz*fz*fz ) ); - - return h; -} - - - - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - // if (o1->body && o2->body) return; - - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - - dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - else return c; -} - - -// called when a key pressed - -static void command (int cmd) -{ - size_t i; - int j,k; - dReal sides[3]; - dMass m; - - cmd = locase (cmd); - - - // - // Geom Creation - // - - if ( cmd == 'b' || cmd == 's' || cmd == 'c' || - cmd == 'x' || cmd == 'y' || cmd == 'm' || cmd == 'v' ) - { - if ( num < NUM ) - { - i = num; - num++; - } - else - { - i = nextobj; - nextobj++; - if (nextobj >= num) nextobj = 0; - - // destroy the body and geoms for slot i - dBodyDestroy (obj[i].body); - for (k=0; k < GPB; k++) - { - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - } - memset (&obj[i],0,sizeof(obj[i])); - } - - obj[i].body = dBodyCreate (world); - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - dMatrix3 R; - if (random_pos) { - dBodySetPosition (obj[i].body, - (dRandReal()-0.5)*HFIELD_WIDTH*0.75, - (dRandReal()-0.5)*HFIELD_DEPTH*0.75, - dRandReal() + 2 ); - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - } - else { - dReal maxheight = 0; - for (k=0; k maxheight) maxheight = pos[2]; - } - dBodySetPosition (obj[i].body, 0,maxheight+1,0); - dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0); - } - dBodySetRotation (obj[i].body,R); - dBodySetData (obj[i].body,(void*) i); - - if (cmd == 'b') - { - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - } - else if (cmd == 'c') - { - sides[0] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCapsule (space,sides[0],sides[1]); - } - //<---- Convex Object - else if (cmd == 'v') - { - dMassSetBox (&m,DENSITY,0.25,0.25,0.25); - obj[i].geom[0] = dCreateConvex (space, - planes, - planecount, - points, - pointcount, - polygons); - } - //----> Convex Object - else if (cmd == 'y') - { - dMassSetCylinder (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); - } - else if (cmd == 's') - { - sides[0] *= 0.5; - dMassSetSphere (&m,DENSITY,sides[0]); - obj[i].geom[0] = dCreateSphere (space,sides[0]); - } -#ifdef dTRIMESH_ENABLED - else if (cmd == 'm') - { - dTriMeshDataID new_tmdata = dGeomTriMeshDataCreate(); - dGeomTriMeshDataBuildSingle(new_tmdata, &Vertices[0], 3 * sizeof(float), VertexCount, (int*)&Indices[0], IndexCount, 3 * sizeof(int)); - - obj[i].geom[0] = dCreateTriMesh(space, new_tmdata, 0, 0, 0); - - // remember the mesh's dTriMeshDataID on its userdata for convenience. - dGeomSetData(obj[i].geom[0], new_tmdata); - - dMassSetTrimesh( &m, DENSITY, obj[i].geom[0] ); - } -#endif - else if (cmd == 'x') - { - dGeomID g2[GPB]; // encapsulated geometries - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - - // start accumulating masses for the encapsulated geometries - dMass m2; - dMassSetZero (&m); - - // set random delta positions - for (j=0; j= num) selected = 0; - if (selected < 0) selected = 0; - } - else if (cmd == 'd' && selected >= 0 && selected < num) { - dBodyDisable (obj[selected].body); - } - else if (cmd == 'e' && selected >= 0 && selected < num) { - dBodyEnable (obj[selected].body); - } - else if (cmd == 'a') { - show_aabb ^= 1; - } - else if (cmd == 't') { - show_contacts ^= 1; - } - else if (cmd == 'r') { - random_pos ^= 1; - } - else if (cmd == '1') { - write_world = 1; - } -} - - -// draw a geom - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) -{ - int i; - - if (!g) return; - if (!pos) pos = dGeomGetPosition (g); - if (!R) R = dGeomGetRotation (g); - - int type = dGeomGetClass (g); - if (type == dBoxClass) { - dVector3 sides; - dGeomBoxGetLengths (g,sides); - dsDrawBox (pos,R,sides); - } - else if (type == dSphereClass) { - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - } - else if (type == dCapsuleClass) { - dReal radius,length; - dGeomCapsuleGetParams (g,&radius,&length); - dsDrawCapsule (pos,R,length,radius); - } - //<---- Convex Object - else if (type == dConvexClass) - { - //dVector3 sides={0.50,0.50,0.50}; - dsDrawConvex(pos,R,planes, - planecount, - points, - pointcount, - polygons); - } - //----> Convex Object - else if (type == dCylinderClass) { - dReal radius,length; - dGeomCylinderGetParams (g,&radius,&length); - dsDrawCylinder (pos,R,length,radius); - } - else if (type == dGeomTransformClass) { - dGeomID g2 = dGeomTransformGetGeom (g); - const dReal *pos2 = dGeomGetPosition (g2); - const dReal *R2 = dGeomGetRotation (g2); - dVector3 actual_pos; - dMatrix3 actual_R; - dMULTIPLY0_331 (actual_pos,R,pos2); - actual_pos[0] += pos[0]; - actual_pos[1] += pos[1]; - actual_pos[2] += pos[2]; - dMULTIPLY0_333 (actual_R,R,R2); - drawGeom (g2,actual_pos,actual_R,0); - } - - if (show_aabb) { - // draw the bounding box for this geom - dReal aabb[6]; - dGeomGetAABB (g,aabb); - dVector3 bbpos; - for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - dVector3 bbsides; - for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; - dMatrix3 RI; - dRSetIdentity (RI); - dsSetColorAlpha (1,0,0,0.5); - dsDrawBox (bbpos,RI,bbsides); - } - -} - -// simulation loop - -static void simLoop (int pause) -{ - int i,j; - - dsSetColor (0,0,2); - - dSpaceCollide (space,0,&nearCallback); - - //if (!pause) dWorldStep (world,0.05); - //if (!pause) dWorldQuickStep (world,0.05); - if (!pause) dWorldStepFast1 (world,0.05, 5); - - - if (write_world) { - FILE *f = fopen ("state.dif","wt"); - if (f) { - dWorldExportDIF (world,f,"X"); - fclose (f); - } - write_world = 0; - } - - // remove all contact joints - dJointGroupEmpty (contactgroup); - - - - const dReal* pReal = dGeomGetPosition( gheight ); - - const dReal* RReal = dGeomGetRotation( gheight ); - - // - // Draw Heightfield - // - - // Set ox and oz to zero for DHEIGHTFIELD_CORNER_ORIGIN mode. - int ox = (int) ( -HFIELD_WIDTH/2 ); - int oz = (int) ( -HFIELD_DEPTH/2 ); - -// for ( int tx = -1; tx < 2; ++tx ) -// for ( int tz = -1; tz < 2; ++tz ) - { - dsSetColorAlpha (0.5,1,0.5,0.5); - dsSetTexture( DS_WOOD ); - - for ( int i = 0; i < HFIELD_WSTEP - 1; ++i ) - for ( int j = 0; j < HFIELD_DSTEP - 1; ++j ) - { - dReal a[3], b[3], c[3], d[3]; - - a[ 0 ] = ox + ( i ) * HFIELD_WSAMP; - a[ 1 ] = heightfield_callback( NULL, i, j ); - a[ 2 ] = oz + ( j ) * HFIELD_DSAMP; - - b[ 0 ] = ox + ( i + 1 ) * HFIELD_WSAMP; - b[ 1 ] = heightfield_callback( NULL, i + 1, j ); - b[ 2 ] = oz + ( j ) * HFIELD_DSAMP; - - c[ 0 ] = ox + ( i ) * HFIELD_WSAMP; - c[ 1 ] = heightfield_callback( NULL, i, j + 1 ); - c[ 2 ] = oz + ( j + 1 ) * HFIELD_DSAMP; - - d[ 0 ] = ox + ( i + 1 ) * HFIELD_WSAMP; - d[ 1 ] = heightfield_callback( NULL, i + 1, j + 1 ); - d[ 2 ] = oz + ( j + 1 ) * HFIELD_DSAMP; - - dsDrawTriangle( pReal, RReal, a, c, b, 1 ); - dsDrawTriangle( pReal, RReal, b, c, d, 1 ); - } - } - - - - - - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - for (i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#endif - - -// some constants -#define SIDE (0.5f) // side length of a box -#define MASS (1.0) // mass of a box - - -// dynamics and collision objects -static dWorldID world; -static dBodyID body[2]; -static dJointID hinge; - - -// state set by keyboard commands -static int occasional_error = 0; - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {1.0382f,-1.0811f,1.4700f}; - static float hpr[3] = {135.0000f,-19.5000f,0.0000f}; - dsSetViewpoint (xyz,hpr); - printf ("Press 'e' to start/stop occasional error.\n"); -} - - -// called when a key pressed - -static void command (int cmd) -{ - if (cmd == 'e' || cmd == 'E') { - occasional_error ^= 1; - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - const dReal kd = -0.3; // angular damping constant - if (!pause) { - // add an oscillating torque to body 0, and also damp its rotational motion - static dReal a=0; - const dReal *w = dBodyGetAngularVel (body[0]); - dBodyAddTorque (body[0],kd*w[0],kd*w[1]+0.1*cos(a),kd*w[2]+0.1*sin(a)); - dWorldStep (world,0.05); - a += 0.01; - - // occasionally re-orient one of the bodies to create a deliberate error. - if (occasional_error) { - static int count = 0; - if ((count % 20)==0) { - // randomly adjust orientation of body[0] - const dReal *R1; - dMatrix3 R2,R3; - R1 = dBodyGetRotation (body[0]); - dRFromAxisAndAngle (R2,dRandReal()-0.5,dRandReal()-0.5, - dRandReal()-0.5,dRandReal()-0.5); - dMultiply0 (R3,R1,R2,3,3,3); - dBodySetRotation (body[0],R3); - - // randomly adjust position of body[0] - const dReal *pos = dBodyGetPosition (body[0]); - dBodySetPosition (body[0], - pos[0]+0.2*(dRandReal()-0.5), - pos[1]+0.2*(dRandReal()-0.5), - pos[2]+0.2*(dRandReal()-0.5)); - } - count++; - } - } - - dReal sides1[3] = {SIDE,SIDE,SIDE}; - dReal sides2[3] = {SIDE,SIDE,SIDE*0.8f}; - dsSetTexture (DS_WOOD); - dsSetColor (1,1,0); - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides1); - dsSetColor (0,1,1); - dsDrawBox (dBodyGetPosition(body[1]),dBodyGetRotation(body[1]),sides2); -} - - -int main (int argc, char **argv) -{ - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - // create world - dInitODE(); - world = dWorldCreate(); - - dMass m; - dMassSetBox (&m,1,SIDE,SIDE,SIDE); - dMassAdjust (&m,MASS); - - dQuaternion q; - dQFromAxisAndAngle (q,1,1,0,0.25*M_PI); - - body[0] = dBodyCreate (world); - dBodySetMass (body[0],&m); - dBodySetPosition (body[0],0.5*SIDE,0.5*SIDE,1); - dBodySetQuaternion (body[0],q); - - body[1] = dBodyCreate (world); - dBodySetMass (body[1],&m); - dBodySetPosition (body[1],-0.5*SIDE,-0.5*SIDE,1); - dBodySetQuaternion (body[1],q); - - hinge = dJointCreateHinge (world,0); - dJointAttach (hinge,body[0],body[1]); - dJointSetHingeAnchor (hinge,0,0,1); - dJointSetHingeAxis (hinge,1,-1,1.41421356); - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dWorldDestroy (world); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_jointPR.cpp b/libraries/ode-0.9/ode/demo/demo_jointPR.cpp deleted file mode 100644 index e0d002d8cd..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_jointPR.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -This file try to demonstrate how the PR joint is working. - -The axisP is draw in red and the axisR is in green - -*/ - - -#include -#include -#include -#include - - -#define DRAWSTUFF_TEXTURE_PATH "../../drawstuff/textures" - - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif -// select correct drawing functions -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#endif - -// physics parameters -#define BOX1_LENGTH 2 // Size along the X axis -#define BOX1_WIDTH 1 // Size along the Y axis -#define BOX1_HEIGHT 0.4 // Size along the Z axis (up) since gravity is (0,0,-10) -#define BOX2_LENGTH 0.2 -#define BOX2_WIDTH 0.1 -#define BOX2_HEIGHT 0.4 -#define Mass1 10 -#define Mass2 0.1 - - -#define PRISMATIC_ONLY 1 -#define ROTOIDE_ONLY 2 -int flag = 0; - - -//camera view -static float xyz[3] = {2.0f,-3.5f,2.0000f}; -static float hpr[3] = {90.000f,-25.5000f,0.0000f}; -//world,space,body & geom -static dWorldID world; -static dSpaceID space; -static dSpaceID box1_space; -static dSpaceID box2_space; -static dBodyID box1_body[1]; -static dBodyID box2_body[1]; -static dJointID joint[1]; -static dJointGroupID contactgroup; -static dGeomID ground; -static dGeomID box1[1]; -static dGeomID box2[1]; - - -//collision detection -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i,n; - - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - const int N = 10; - dContact contact[N]; - n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); - if (n > 0) - { - for (i=0; i= 2 ) - { - for (int i=1; i < argc; ++i) - { - if( 0 == strcmp("-h", argv[i]) || 0 == strcmp("--help", argv[i]) ) - Help(argv); - - if(!flag && (0 == strcmp("-p", argv[i]) ||0 == strcmp("--prismatic-only", argv[i])) ) - flag = PRISMATIC_ONLY; - - if(!flag && (0 == strcmp("-r", argv[i]) || 0 == strcmp("--rotoide-only", argv[i])) ) - flag = ROTOIDE_ONLY; - - if(0 == strcmp("-t", argv[i]) || 0 == strcmp("--texture-path", argv[i])) - { - int j = i+1; - if ( j+1 > argc || // Check if we have enough arguments - argv[j] == '\0' || // We should have a path here - argv[j][0] == '-' ) // We should have a path not a command line - Help(argv); - else - fn.path_to_textures = argv[++i]; // Increase i since we use this argument - } - } - } - - // create world - world = dWorldCreate(); - space = dHashSpaceCreate (0); - contactgroup = dJointGroupCreate (0); - dWorldSetGravity (world,0,0,-10); - ground = dCreatePlane (space,0,0,1,0); - - //create two boxes - dMass m; - box1_body[0] = dBodyCreate (world); - dMassSetBox (&m,1,BOX1_LENGTH,BOX1_WIDTH,BOX1_HEIGHT); - dMassAdjust (&m,Mass1); - dBodySetMass (box1_body[0],&m); - box1[0] = dCreateBox (0,BOX1_LENGTH,BOX1_WIDTH,BOX1_HEIGHT); - dGeomSetBody (box1[0],box1_body[0]); - - box2_body[0] = dBodyCreate (world); - dMassSetBox (&m,10,BOX2_LENGTH,BOX2_WIDTH,BOX2_HEIGHT); - dMassAdjust (&m,Mass2); - dBodySetMass (box2_body[0],&m); - box2[0] = dCreateBox (0,BOX2_LENGTH,BOX2_WIDTH,BOX2_HEIGHT); - dGeomSetBody (box2[0],box2_body[0]); - - //set the initial positions of body1 and body2 - dMatrix3 R; - dRSetIdentity(R); - dBodySetPosition (box1_body[0],0,0,BOX1_HEIGHT/2.0); - dBodySetRotation (box1_body[0], R); - - dBodySetPosition (box2_body[0], - 2.1, - 0.0, - BOX2_HEIGHT/2.0); - dBodySetRotation (box2_body[0], R); - - - //set PR joint - joint[0] = dJointCreatePR(world,0); - dJointAttach (joint[0],box1_body[0],box2_body[0]); - switch (flag) - { - case PRISMATIC_ONLY: - dJointSetPRAnchor (joint[0], - 2.1, - 0.0, - BOX2_HEIGHT/2.0); - dJointSetPRParam (joint[0],dParamLoStop, -0.5); - dJointSetPRParam (joint[0],dParamHiStop, 1.5); - break; - - case ROTOIDE_ONLY: - dJointSetPRAnchor (joint[0], - 0.0, - 0.0, - BOX2_HEIGHT/2.0); - dJointSetPRParam (joint[0],dParamLoStop, 0.0); - dJointSetPRParam (joint[0],dParamHiStop, 0.0); - break; - - default: - dJointSetPRAnchor (joint[0], - 1.1, - 0.0, - BOX2_HEIGHT/2.0); - dJointSetPRParam (joint[0],dParamLoStop, -0.5); - dJointSetPRParam (joint[0],dParamHiStop, 1.5); - break; - } - - dJointSetPRAxis1(joint[0],1,0,0); - dJointSetPRAxis2(joint[0],0,0,1); -// We position the 2 body -// The position of the rotoide joint is on the second body so it can rotate on itself -// and move along the X axis. -// With this anchor -// - A force in X will move only the body 2 inside the low and hi limit -// of the prismatic -// - A force in Y will make the 2 bodies to rotate around on the plane - - box1_space = dSimpleSpaceCreate (space); - dSpaceSetCleanup (box1_space,0); - dSpaceAdd(box1_space,box1[0]); - - // run simulation - dsSimulationLoop (argc,argv,400,300,&fn); - dJointGroupDestroy (contactgroup); - dSpaceDestroy (space); - dWorldDestroy (world); - return 0; -} - diff --git a/libraries/ode-0.9/ode/demo/demo_joints.cpp b/libraries/ode-0.9/ode/demo/demo_joints.cpp deleted file mode 100644 index 2a83c2f263..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_joints.cpp +++ /dev/null @@ -1,1092 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -perform tests on all the joint types. -this should be done using the double precision version of the library. - -usage: - test_joints [-nXXX] [-g] [-i] [-e] [path_to_textures] - -if a test number is given then that specific test is performed, otherwise -all the tests are performed. the tests are numbered `xxyy', where xx -corresponds to the joint type and yy is the sub-test number. not every -number maps to an actual test. - -flags: - i: the test is interactive. - g: turn off graphical display (can't use this with `i'). - e: turn on occasional error perturbations - n: performe test XXX -some tests compute and display error values. these values are scaled so -<1 is good and >1 is bad. other tests just show graphical results which -you must verify visually. - -*/ - -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#endif - - -// some constants -#define NUM_JOINTS 10 // number of joints to test (the `xx' value) -#define SIDE (0.5f) // side length of a box - don't change this -#define MASS (1.0) // mass of a box -#define STEPSIZE 0.05 - - -// dynamics objects -static dWorldID world; -static dBodyID body[2]; -static dJointID joint; - - -// data from the command line arguments -static int cmd_test_num = -1; -static int cmd_interactive = 0; -static int cmd_graphics = 1; -static char *cmd_path_to_textures = NULL; -static int cmd_occasional_error = 0; // perturb occasionally - - -// info about the current test -struct TestInfo; -static int test_num = 0; // number of the current test -static int iteration = 0; -static int max_iterations = 0; -static dReal max_error = 0; - -//**************************************************************************** -// utility stuff - -static char loCase (char a) -{ - if (a >= 'A' && a <= 'Z') return a + ('a'-'A'); - else return a; -} - - -static dReal length (dVector3 a) -{ - return dSqrt (a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); -} - - -// get the max difference between a 3x3 matrix and the identity - -dReal cmpIdentity (const dMatrix3 A) -{ - dMatrix3 I; - dSetZero (I,12); - I[0] = 1; - I[5] = 1; - I[10] = 1; - return dMaxDifference (A,I,3,3); -} - -//**************************************************************************** -// test world construction and utilities - -void constructWorldForTest (dReal gravity, int bodycount, - /* body 1 pos */ dReal pos1x, dReal pos1y, dReal pos1z, - /* body 2 pos */ dReal pos2x, dReal pos2y, dReal pos2z, - /* body 1 rotation axis */ dReal ax1x, dReal ax1y, dReal ax1z, - /* body 1 rotation axis */ dReal ax2x, dReal ax2y, dReal ax2z, - /* rotation angles */ dReal a1, dReal a2) -{ - // create world - world = dWorldCreate(); - dWorldSetERP (world,0.2); - dWorldSetCFM (world,1e-6); - dWorldSetGravity (world,0,0,gravity); - - dMass m; - dMassSetBox (&m,1,SIDE,SIDE,SIDE); - dMassAdjust (&m,MASS); - - body[0] = dBodyCreate (world); - dBodySetMass (body[0],&m); - dBodySetPosition (body[0], pos1x, pos1y, pos1z); - dQuaternion q; - dQFromAxisAndAngle (q,ax1x,ax1y,ax1z,a1); - dBodySetQuaternion (body[0],q); - - if (bodycount==2) { - body[1] = dBodyCreate (world); - dBodySetMass (body[1],&m); - dBodySetPosition (body[1], pos2x, pos2y, pos2z); - dQFromAxisAndAngle (q,ax2x,ax2y,ax2z,a2); - dBodySetQuaternion (body[1],q); - } - else body[1] = 0; -} - - -// add an oscillating torque to body 0 - -void addOscillatingTorque (dReal tscale) -{ - static dReal a=0; - dBodyAddTorque (body[0],tscale*cos(2*a),tscale*cos(2.7183*a), - tscale*cos(1.5708*a)); - a += 0.01; -} - - -void addOscillatingTorqueAbout(dReal tscale, dReal x, dReal y, dReal z) -{ - static dReal a=0; - dBodyAddTorque (body[0], tscale*cos(a) * x, tscale*cos(a) * y, - tscale * cos(a) * z); - a += 0.02; -} - - -// damp the rotational motion of body 0 a bit - -void dampRotationalMotion (dReal kd) -{ - const dReal *w = dBodyGetAngularVel (body[0]); - dBodyAddTorque (body[0],-kd*w[0],-kd*w[1],-kd*w[2]); -} - - -// add a spring force to keep the bodies together, otherwise they may fly -// apart with some joints. - -void addSpringForce (dReal ks) -{ - const dReal *p1 = dBodyGetPosition (body[0]); - const dReal *p2 = dBodyGetPosition (body[1]); - dBodyAddForce (body[0],ks*(p2[0]-p1[0]),ks*(p2[1]-p1[1]),ks*(p2[2]-p1[2])); - dBodyAddForce (body[1],ks*(p1[0]-p2[0]),ks*(p1[1]-p2[1]),ks*(p1[2]-p2[2])); -} - - -// add an oscillating Force to body 0 - -void addOscillatingForce (dReal fscale) -{ - static dReal a=0; - dBodyAddForce (body[0],fscale*cos(2*a),fscale*cos(2.7183*a), - fscale*cos(1.5708*a)); - a += 0.01; -} - -//**************************************************************************** -// stuff specific to the tests -// -// 0xx : fixed -// 1xx : ball and socket -// 2xx : hinge -// 3xx : slider -// 4xx : hinge 2 -// 5xx : contact -// 6xx : amotor -// 7xx : universal joint -// 8xx : PR joint (Prismatic and Rotoide) - -// setup for the given test. return 0 if there is no such test - -int setupTest (int n) -{ - switch (n) { - - // ********** fixed joint - - case 0: { // 2 body - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,1,0, 1,1,0, - 0.25*M_PI,0.25*M_PI); - joint = dJointCreateFixed (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetFixed (joint); - return 1; - } - - case 1: { // 1 body to static env - constructWorldForTest (0,1, - 0.5*SIDE,0.5*SIDE,1, 0,0,0, - 1,0,0, 1,0,0, - 0,0); - joint = dJointCreateFixed (world,0); - dJointAttach (joint,body[0],0); - dJointSetFixed (joint); - return 1; - } - - case 2: { // 2 body with relative rotation - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,1,0, 1,1,0, - 0.25*M_PI,-0.25*M_PI); - joint = dJointCreateFixed (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetFixed (joint); - return 1; - } - - case 3: { // 1 body to static env with relative rotation - constructWorldForTest (0,1, - 0.5*SIDE,0.5*SIDE,1, 0,0,0, - 1,0,0, 1,0,0, - 0.25*M_PI,0); - joint = dJointCreateFixed (world,0); - dJointAttach (joint,body[0],0); - dJointSetFixed (joint); - return 1; - } - - // ********** hinge joint - - case 200: // 2 body - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,1,0, 1,1,0, 0.25*M_PI,0.25*M_PI); - joint = dJointCreateHinge (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetHingeAnchor (joint,0,0,1); - dJointSetHingeAxis (joint,1,-1,1.41421356); - return 1; - - case 220: // hinge angle polarity test - case 221: // hinge angle rate test - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateHinge (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetHingeAnchor (joint,0,0,1); - dJointSetHingeAxis (joint,0,0,1); - max_iterations = 50; - return 1; - - case 230: // hinge motor rate (and polarity) test - case 231: // ...with stops - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateHinge (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetHingeAnchor (joint,0,0,1); - dJointSetHingeAxis (joint,0,0,1); - dJointSetHingeParam (joint,dParamFMax,1); - if (n==231) { - dJointSetHingeParam (joint,dParamLoStop,-0.5); - dJointSetHingeParam (joint,dParamHiStop,0.5); - } - return 1; - - case 250: // limit bounce test (gravity down) - case 251: { // ...gravity up - constructWorldForTest ((n==251) ? 0.1 : -0.1, 2, - 0.5*SIDE,0,1+0.5*SIDE, -0.5*SIDE,0,1-0.5*SIDE, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateHinge (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetHingeAnchor (joint,0,0,1); - dJointSetHingeAxis (joint,0,1,0); - dJointSetHingeParam (joint,dParamLoStop,-0.9); - dJointSetHingeParam (joint,dParamHiStop,0.7854); - dJointSetHingeParam (joint,dParamBounce,0.5); - // anchor 2nd body with a fixed joint - dJointID j = dJointCreateFixed (world,0); - dJointAttach (j,body[1],0); - dJointSetFixed (j); - return 1; - } - - // ********** slider - - case 300: // 2 body - constructWorldForTest (0,2, - 0,0,1, 0.2,0.2,1.2, - 0,0,1, -1,1,0, 0,0.25*M_PI); - joint = dJointCreateSlider (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetSliderAxis (joint,1,1,1); - return 1; - - case 320: // slider angle polarity test - case 321: // slider angle rate test - constructWorldForTest (0,2, - 0,0,1, 0,0,1.2, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateSlider (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetSliderAxis (joint,0,0,1); - max_iterations = 50; - return 1; - - case 330: // slider motor rate (and polarity) test - case 331: // ...with stops - constructWorldForTest (0, 2, - 0,0,1, 0,0,1.2, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateSlider (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetSliderAxis (joint,0,0,1); - dJointSetSliderParam (joint,dParamFMax,100); - if (n==331) { - dJointSetSliderParam (joint,dParamLoStop,-0.4); - dJointSetSliderParam (joint,dParamHiStop,0.4); - } - return 1; - - case 350: // limit bounce tests - case 351: { - constructWorldForTest ((n==351) ? 0.1 : -0.1, 2, - 0,0,1, 0,0,1.2, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateSlider (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetSliderAxis (joint,0,0,1); - dJointSetSliderParam (joint,dParamLoStop,-0.5); - dJointSetSliderParam (joint,dParamHiStop,0.5); - dJointSetSliderParam (joint,dParamBounce,0.5); - // anchor 2nd body with a fixed joint - dJointID j = dJointCreateFixed (world,0); - dJointAttach (j,body[1],0); - dJointSetFixed (j); - return 1; - } - - // ********** hinge-2 joint - - case 420: // hinge-2 steering angle polarity test - case 421: // hinge-2 steering angle rate test - constructWorldForTest (0,2, - 0.5*SIDE,0,1, -0.5*SIDE,0,1, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateHinge2 (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetHinge2Anchor (joint,-0.5*SIDE,0,1); - dJointSetHinge2Axis1 (joint,0,0,1); - dJointSetHinge2Axis2 (joint,1,0,0); - max_iterations = 50; - return 1; - - case 430: // hinge 2 steering motor rate (+polarity) test - case 431: // ...with stops - case 432: // hinge 2 wheel motor rate (+polarity) test - constructWorldForTest (0,2, - 0.5*SIDE,0,1, -0.5*SIDE,0,1, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateHinge2 (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetHinge2Anchor (joint,-0.5*SIDE,0,1); - dJointSetHinge2Axis1 (joint,0,0,1); - dJointSetHinge2Axis2 (joint,1,0,0); - dJointSetHinge2Param (joint,dParamFMax,1); - dJointSetHinge2Param (joint,dParamFMax2,1); - if (n==431) { - dJointSetHinge2Param (joint,dParamLoStop,-0.5); - dJointSetHinge2Param (joint,dParamHiStop,0.5); - } - return 1; - - // ********** angular motor joint - - case 600: // test euler angle calculations - constructWorldForTest (0,2, - -SIDE*0.5,0,1, SIDE*0.5,0,1, - 0,0,1, 0,0,1, 0,0); - joint = dJointCreateAMotor (world,0); - dJointAttach (joint,body[0],body[1]); - - dJointSetAMotorNumAxes (joint,3); - dJointSetAMotorAxis (joint,0,1, 0,0,1); - dJointSetAMotorAxis (joint,2,2, 1,0,0); - dJointSetAMotorMode (joint,dAMotorEuler); - max_iterations = 200; - return 1; - - // ********** universal joint - - case 700: // 2 body - case 701: - case 702: - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,1,0, 1,1,0, 0.25*M_PI,0.25*M_PI); - joint = dJointCreateUniversal (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetUniversalAnchor (joint,0,0,1); - dJointSetUniversalAxis1 (joint, 1, -1, 1.41421356); - dJointSetUniversalAxis2 (joint, 1, -1, -1.41421356); - return 1; - - case 720: // universal transmit torque test - case 721: - case 722: - case 730: // universal torque about axis 1 - case 731: - case 732: - case 740: // universal torque about axis 2 - case 741: - case 742: - constructWorldForTest (0,2, - 0.5*SIDE,0.5*SIDE,1, -0.5*SIDE,-0.5*SIDE,1, - 1,0,0, 1,0,0, 0,0); - joint = dJointCreateUniversal (world,0); - dJointAttach (joint,body[0],body[1]); - dJointSetUniversalAnchor (joint,0,0,1); - dJointSetUniversalAxis1 (joint,0,0,1); - dJointSetUniversalAxis2 (joint, 1, -1,0); - max_iterations = 100; - return 1; - - // Joint PR (Prismatic and Rotoide) - case 800: // 2 body - case 801: // 2 bodies with spring force and prismatic fixed - case 802: // 2 bodies with torque on body1 and prismatic fixed - constructWorldForTest (0, 2, - -1.0, 0.0, 1.0, - 1.0, 0.0, 1.0, - 1,0,0, 1,0,0, - 0, 0); - joint = dJointCreatePR (world, 0); - dJointAttach (joint, body[0], body[1]); - dJointSetPRAnchor (joint,-0.5, 0.0, 1.0); - dJointSetPRAxis1 (joint, 0, 1, 0); - dJointSetPRAxis2 (joint, 1, 0, 0); - dJointSetPRParam (joint,dParamLoStop,-0.5); - dJointSetPRParam (joint,dParamHiStop,0.5); - dJointSetPRParam (joint,dParamLoStop2,0); - dJointSetPRParam (joint,dParamHiStop2,0); - return 1; - case 803: // 2 bodies with spring force and prismatic NOT fixed - case 804: // 2 bodies with torque force and prismatic NOT fixed - case 805: // 2 bodies with force only on first body - constructWorldForTest (0, 2, - -1.0, 0.0, 1.0, - 1.0, 0.0, 1.0, - 1,0,0, 1,0,0, - 0, 0); - joint = dJointCreatePR (world, 0); - dJointAttach (joint, body[0], body[1]); - dJointSetPRAnchor (joint,-0.5, 0.0, 1.0); - dJointSetPRAxis1 (joint, 0, 1, 0); - dJointSetPRAxis2 (joint, 1, 0, 0); - dJointSetPRParam (joint,dParamLoStop,-0.5); - dJointSetPRParam (joint,dParamHiStop,0.5); - dJointSetPRParam (joint,dParamLoStop2,-0.5); - dJointSetPRParam (joint,dParamHiStop2,0.5); - return 1; - } - return 0; -} - - -// do stuff specific to this test each iteration. you can check some -// invariants for the test -- the return value is some scaled error measurement -// that must be less than 1. -// return a dInfinity if error is not measured for this n. - -dReal doStuffAndGetError (int n) -{ - switch (n) { - - // ********** fixed joint - - case 0: { // 2 body - addOscillatingTorque (0.1); - dampRotationalMotion (0.1); - // check the orientations are the same - const dReal *R1 = dBodyGetRotation (body[0]); - const dReal *R2 = dBodyGetRotation (body[1]); - dReal err1 = dMaxDifference (R1,R2,3,3); - // check the body offset is correct - dVector3 p,pp; - const dReal *p1 = dBodyGetPosition (body[0]); - const dReal *p2 = dBodyGetPosition (body[1]); - for (int i=0; i<3; i++) p[i] = p2[i] - p1[i]; - dMULTIPLY1_331 (pp,R1,p); - pp[0] += 0.5; - pp[1] += 0.5; - return (err1 + length (pp)) * 300; - } - - case 1: { // 1 body to static env - addOscillatingTorque (0.1); - - // check the orientation is the identity - dReal err1 = cmpIdentity (dBodyGetRotation (body[0])); - - // check the body offset is correct - dVector3 p; - const dReal *p1 = dBodyGetPosition (body[0]); - for (int i=0; i<3; i++) p[i] = p1[i]; - p[0] -= 0.25; - p[1] -= 0.25; - p[2] -= 1; - return (err1 + length (p)) * 1e6; - } - - case 2: { // 2 body - addOscillatingTorque (0.1); - dampRotationalMotion (0.1); - // check the body offset is correct - // Should really check body rotation too. Oh well. - const dReal *R1 = dBodyGetRotation (body[0]); - dVector3 p,pp; - const dReal *p1 = dBodyGetPosition (body[0]); - const dReal *p2 = dBodyGetPosition (body[1]); - for (int i=0; i<3; i++) p[i] = p2[i] - p1[i]; - dMULTIPLY1_331 (pp,R1,p); - pp[0] += 0.5; - pp[1] += 0.5; - return length(pp) * 300; - } - - case 3: { // 1 body to static env with relative rotation - addOscillatingTorque (0.1); - - // check the body offset is correct - dVector3 p; - const dReal *p1 = dBodyGetPosition (body[0]); - for (int i=0; i<3; i++) p[i] = p1[i]; - p[0] -= 0.25; - p[1] -= 0.25; - p[2] -= 1; - return length (p) * 1e6; - } - - - // ********** hinge joint - - case 200: // 2 body - addOscillatingTorque (0.1); - dampRotationalMotion (0.1); - return dInfinity; - - case 220: // hinge angle polarity test - dBodyAddTorque (body[0],0,0,0.01); - dBodyAddTorque (body[1],0,0,-0.01); - if (iteration == 40) { - dReal a = dJointGetHingeAngle (joint); - if (a > 0.5 && a < 1) return 0; else return 10; - } - return 0; - - case 221: { // hinge angle rate test - static dReal last_angle = 0; - dBodyAddTorque (body[0],0,0,0.01); - dBodyAddTorque (body[1],0,0,-0.01); - dReal a = dJointGetHingeAngle (joint); - dReal r = dJointGetHingeAngleRate (joint); - dReal er = (a-last_angle)/STEPSIZE; // estimated rate - last_angle = a; - return fabs(r-er) * 4e4; - } - - case 230: // hinge motor rate (and polarity) test - case 231: { // ...with stops - static dReal a = 0; - dReal r = dJointGetHingeAngleRate (joint); - dReal err = fabs (cos(a) - r); - if (a==0) err = 0; - a += 0.03; - dJointSetHingeParam (joint,dParamVel,cos(a)); - if (n==231) return dInfinity; - return err * 1e6; - } - - // ********** slider joint - - case 300: // 2 body - addOscillatingTorque (0.05); - dampRotationalMotion (0.1); - addSpringForce (0.5); - return dInfinity; - - case 320: // slider angle polarity test - dBodyAddForce (body[0],0,0,0.1); - dBodyAddForce (body[1],0,0,-0.1); - if (iteration == 40) { - dReal a = dJointGetSliderPosition (joint); - if (a > 0.2 && a < 0.5) return 0; else return 10; - return a; - } - return 0; - - case 321: { // slider angle rate test - static dReal last_pos = 0; - dBodyAddForce (body[0],0,0,0.1); - dBodyAddForce (body[1],0,0,-0.1); - dReal p = dJointGetSliderPosition (joint); - dReal r = dJointGetSliderPositionRate (joint); - dReal er = (p-last_pos)/STEPSIZE; // estimated rate (almost exact) - last_pos = p; - return fabs(r-er) * 1e9; - } - - case 330: // slider motor rate (and polarity) test - case 331: { // ...with stops - static dReal a = 0; - dReal r = dJointGetSliderPositionRate (joint); - dReal err = fabs (0.7*cos(a) - r); - if (a < 0.04) err = 0; - a += 0.03; - dJointSetSliderParam (joint,dParamVel,0.7*cos(a)); - if (n==331) return dInfinity; - return err * 1e6; - } - - // ********** hinge-2 joint - - case 420: // hinge-2 steering angle polarity test - dBodyAddTorque (body[0],0,0,0.01); - dBodyAddTorque (body[1],0,0,-0.01); - if (iteration == 40) { - dReal a = dJointGetHinge2Angle1 (joint); - if (a > 0.5 && a < 0.6) return 0; else return 10; - } - return 0; - - case 421: { // hinge-2 steering angle rate test - static dReal last_angle = 0; - dBodyAddTorque (body[0],0,0,0.01); - dBodyAddTorque (body[1],0,0,-0.01); - dReal a = dJointGetHinge2Angle1 (joint); - dReal r = dJointGetHinge2Angle1Rate (joint); - dReal er = (a-last_angle)/STEPSIZE; // estimated rate - last_angle = a; - return fabs(r-er)*2e4; - } - - case 430: // hinge 2 steering motor rate (+polarity) test - case 431: { // ...with stops - static dReal a = 0; - dReal r = dJointGetHinge2Angle1Rate (joint); - dReal err = fabs (cos(a) - r); - if (a==0) err = 0; - a += 0.03; - dJointSetHinge2Param (joint,dParamVel,cos(a)); - if (n==431) return dInfinity; - return err * 1e6; - } - - case 432: { // hinge 2 wheel motor rate (+polarity) test - static dReal a = 0; - dReal r = dJointGetHinge2Angle2Rate (joint); - dReal err = fabs (cos(a) - r); - if (a==0) err = 0; - a += 0.03; - dJointSetHinge2Param (joint,dParamVel2,cos(a)); - return err * 1e6; - } - - // ********** angular motor joint - - case 600: { // test euler angle calculations - // desired euler angles from last iteration - static dReal a1,a2,a3; - - // find actual euler angles - dReal aa1 = dJointGetAMotorAngle (joint,0); - dReal aa2 = dJointGetAMotorAngle (joint,1); - dReal aa3 = dJointGetAMotorAngle (joint,2); - // printf ("actual = %.4f %.4f %.4f\n\n",aa1,aa2,aa3); - - dReal err = dInfinity; - if (iteration > 0) { - err = dFabs(aa1-a1) + dFabs(aa2-a2) + dFabs(aa3-a3); - err *= 1e10; - } - - // get random base rotation for both bodies - dMatrix3 Rbase; - dRFromAxisAndAngle (Rbase, 3*(dRandReal()-0.5), 3*(dRandReal()-0.5), - 3*(dRandReal()-0.5), 3*(dRandReal()-0.5)); - dBodySetRotation (body[0],Rbase); - - // rotate body 2 by random euler angles w.r.t. body 1 - a1 = 3.14 * 2 * (dRandReal()-0.5); - a2 = 1.57 * 2 * (dRandReal()-0.5); - a3 = 3.14 * 2 * (dRandReal()-0.5); - dMatrix3 R1,R2,R3,Rtmp1,Rtmp2; - dRFromAxisAndAngle (R1,0,0,1,-a1); - dRFromAxisAndAngle (R2,0,1,0,a2); - dRFromAxisAndAngle (R3,1,0,0,-a3); - dMultiply0 (Rtmp1,R2,R3,3,3,3); - dMultiply0 (Rtmp2,R1,Rtmp1,3,3,3); - dMultiply0 (Rtmp1,Rbase,Rtmp2,3,3,3); - dBodySetRotation (body[1],Rtmp1); - // printf ("desired = %.4f %.4f %.4f\n",a1,a2,a3); - - return err; - } - - // ********** universal joint - - case 700: { // 2 body: joint constraint - dVector3 ax1, ax2; - - addOscillatingTorque (0.1); - dampRotationalMotion (0.1); - dJointGetUniversalAxis1(joint, ax1); - dJointGetUniversalAxis2(joint, ax2); - return fabs(10*dDOT(ax1, ax2)); - } - - case 701: { // 2 body: angle 1 rate - static dReal last_angle = 0; - addOscillatingTorque (0.1); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle1(joint); - dReal r = dJointGetUniversalAngle1Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - // I'm not sure why the error is so large here. - return fabs(r - er) * 1e1; - } - - case 702: { // 2 body: angle 2 rate - static dReal last_angle = 0; - addOscillatingTorque (0.1); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle2(joint); - dReal r = dJointGetUniversalAngle2Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - // I'm not sure why the error is so large here. - return fabs(r - er) * 1e1; - } - - case 720: { // universal transmit torque test: constraint error - dVector3 ax1, ax2; - addOscillatingTorqueAbout (0.1, 1, 1, 0); - dampRotationalMotion (0.1); - dJointGetUniversalAxis1(joint, ax1); - dJointGetUniversalAxis2(joint, ax2); - return fabs(10*dDOT(ax1, ax2)); - } - - case 721: { // universal transmit torque test: angle1 rate - static dReal last_angle = 0; - addOscillatingTorqueAbout (0.1, 1, 1, 0); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle1(joint); - dReal r = dJointGetUniversalAngle1Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - return fabs(r - er) * 1e10; - } - - case 722: { // universal transmit torque test: angle2 rate - static dReal last_angle = 0; - addOscillatingTorqueAbout (0.1, 1, 1, 0); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle2(joint); - dReal r = dJointGetUniversalAngle2Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - return fabs(r - er) * 1e10; - } - - case 730:{ - dVector3 ax1, ax2; - dJointGetUniversalAxis1(joint, ax1); - dJointGetUniversalAxis2(joint, ax2); - addOscillatingTorqueAbout (0.1, ax1[0], ax1[1], ax1[2]); - dampRotationalMotion (0.1); - return fabs(10*dDOT(ax1, ax2)); - } - - case 731:{ - dVector3 ax1; - static dReal last_angle = 0; - dJointGetUniversalAxis1(joint, ax1); - addOscillatingTorqueAbout (0.1, ax1[0], ax1[1], ax1[2]); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle1(joint); - dReal r = dJointGetUniversalAngle1Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - return fabs(r - er) * 2e3; - } - - case 732:{ - dVector3 ax1; - static dReal last_angle = 0; - dJointGetUniversalAxis1(joint, ax1); - addOscillatingTorqueAbout (0.1, ax1[0], ax1[1], ax1[2]); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle2(joint); - dReal r = dJointGetUniversalAngle2Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - return fabs(r - er) * 1e10; - } - - case 740:{ - dVector3 ax1, ax2; - dJointGetUniversalAxis1(joint, ax1); - dJointGetUniversalAxis2(joint, ax2); - addOscillatingTorqueAbout (0.1, ax2[0], ax2[1], ax2[2]); - dampRotationalMotion (0.1); - return fabs(10*dDOT(ax1, ax2)); - } - - case 741:{ - dVector3 ax2; - static dReal last_angle = 0; - dJointGetUniversalAxis2(joint, ax2); - addOscillatingTorqueAbout (0.1, ax2[0], ax2[1], ax2[2]); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle1(joint); - dReal r = dJointGetUniversalAngle1Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - return fabs(r - er) * 1e10; - } - - case 742:{ - dVector3 ax2; - static dReal last_angle = 0; - dJointGetUniversalAxis2(joint, ax2); - addOscillatingTorqueAbout (0.1, ax2[0], ax2[1], ax2[2]); - dampRotationalMotion (0.1); - dReal a = dJointGetUniversalAngle2(joint); - dReal r = dJointGetUniversalAngle2Rate(joint); - dReal diff = a - last_angle; - if (diff > M_PI) diff -= 2*M_PI; - if (diff < -M_PI) diff += 2*M_PI; - dReal er = diff / STEPSIZE; // estimated rate - last_angle = a; - return fabs(r - er) * 1e4; - } - - // ********** slider joint - case 801: - case 803: - addSpringForce (0.25); - return dInfinity; - - case 802: - case 804: { - static dReal a = 0; - dBodyAddTorque (body[0], 0, 0.01*cos(1.5708*a), 0); - a += 0.01; - return dInfinity; - } - - case 805: - addOscillatingForce (0.1); - return dInfinity; - } - - - return dInfinity; -} - -//**************************************************************************** -// simulation stuff common to all the tests - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {1.0382f,-1.0811f,1.4700f}; - static float hpr[3] = {135.0000f,-19.5000f,0.0000f}; - dsSetViewpoint (xyz,hpr); -} - - -// simulation loop - -static void simLoop (int pause) -{ - // stop after a given number of iterations, as long as we are not in - // interactive mode - if (cmd_graphics && !cmd_interactive && - (iteration >= max_iterations)) { - dsStop(); - return; - } - iteration++; - - if (!pause) { - // do stuff for this test and check to see if the joint is behaving well - dReal error = doStuffAndGetError (test_num); - if (error > max_error) max_error = error; - if (cmd_interactive && error < dInfinity) { - printf ("scaled error = %.4e\n",error); - } - - // take a step - dWorldStep (world,STEPSIZE); - - // occasionally re-orient the first body to create a deliberate error. - if (cmd_occasional_error) { - static int count = 0; - if ((count % 20)==0) { - // randomly adjust orientation of body[0] - const dReal *R1; - dMatrix3 R2,R3; - R1 = dBodyGetRotation (body[0]); - dRFromAxisAndAngle (R2,dRandReal()-0.5,dRandReal()-0.5, - dRandReal()-0.5,dRandReal()-0.5); - dMultiply0 (R3,R1,R2,3,3,3); - dBodySetRotation (body[0],R3); - - // randomly adjust position of body[0] - const dReal *pos = dBodyGetPosition (body[0]); - dBodySetPosition (body[0], - pos[0]+0.2*(dRandReal()-0.5), - pos[1]+0.2*(dRandReal()-0.5), - pos[2]+0.2*(dRandReal()-0.5)); - } - count++; - } - } - - if (cmd_graphics) { - dReal sides1[3] = {SIDE,SIDE,SIDE}; - dReal sides2[3] = {SIDE*0.99f,SIDE*0.99f,SIDE*0.99f}; - dsSetTexture (DS_WOOD); - dsSetColor (1,1,0); - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides1); - if (body[1]) { - dsSetColor (0,1,1); - dsDrawBox (dBodyGetPosition(body[1]),dBodyGetRotation(body[1]),sides2); - } - } -} - -//**************************************************************************** -// conduct a specific test, and report the results - -void doTest (int argc, char **argv, int n, int fatal_if_bad_n) -{ - test_num = n; - iteration = 0; - max_iterations = 300; - max_error = 0; - - if (! setupTest (n)) { - if (fatal_if_bad_n) dError (0,"bad test number"); - return; - } - - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = 0; - fn.stop = 0; - if (cmd_path_to_textures) - fn.path_to_textures = cmd_path_to_textures; - else - fn.path_to_textures = "../../drawstuff/textures"; - - // run simulation - if (cmd_graphics) { - dsSimulationLoop (argc,argv,352,288,&fn); - } - else { - for (int i=0; i < max_iterations; i++) simLoop (0); - } - dWorldDestroy (world); - body[0] = 0; - body[1] = 0; - joint = 0; - - // print results - printf ("test %d: ",n); - if (max_error == dInfinity) printf ("error not computed\n"); - else { - printf ("max scaled error = %.4e",max_error); - if (max_error < 1) printf (" - passed\n"); - else printf (" - FAILED\n"); - } -} - -//**************************************************************************** -// main - -int main (int argc, char **argv) -{ - int i; - dInitODE(); - - // process the command line args. anything that starts with `-' is assumed - // to be a drawstuff argument. - for (i=1; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#endif - - -// some constants -#define SIDE (0.5f) // side length of a box -#define MASS (1.0) // mass of a box - - -// dynamics and collision objects -static dWorldID world; -static dBodyID body[2]; -static dGeomID geom[2]; -static dJointID lmotor[2]; -static dJointID amotor[2]; -static dSpaceID space; -static dJointGroupID contactgroup; - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {1.0382f,-1.0811f,1.4700f}; - static float hpr[3] = {135.0000f,-19.5000f,0.0000f}; - dsSetViewpoint (xyz,hpr); - printf ("Press 'q,a,z' to control one axis of lmotor connectiong two bodies. (q is +,a is 0, z is -)\n"); - printf ("Press 'w,e,r' to control one axis of lmotor connectiong first body with world. (w is +,e is 0, r is -)\n"); -} - - -// called when a key pressed - -static void command (int cmd) -{ - if (cmd == 'q' || cmd == 'Q') { - dJointSetLMotorParam(lmotor[0],dParamVel,0); - dJointSetLMotorParam(lmotor[0],dParamVel2,0); - dJointSetLMotorParam(lmotor[0],dParamVel3,0.1); - } else if (cmd == 'a' || cmd == 'A') { - dJointSetLMotorParam(lmotor[0],dParamVel,0); - dJointSetLMotorParam(lmotor[0],dParamVel2,0); - dJointSetLMotorParam(lmotor[0],dParamVel3,0); - } else if (cmd == 'z' || cmd == 'Z') { - dJointSetLMotorParam(lmotor[0],dParamVel,0); - dJointSetLMotorParam(lmotor[0],dParamVel2,0); - dJointSetLMotorParam(lmotor[0],dParamVel3,-0.1); - } else if (cmd == 'w' || cmd == 'W') { - dJointSetLMotorParam(lmotor[1],dParamVel,0.1); - dJointSetLMotorParam(lmotor[1],dParamVel2,0); - dJointSetLMotorParam(lmotor[1],dParamVel3,0); - } else if (cmd == 'e' || cmd == 'E') { - dJointSetLMotorParam(lmotor[1],dParamVel,0); - dJointSetLMotorParam(lmotor[1],dParamVel2,0); - dJointSetLMotorParam(lmotor[1],dParamVel3,0); - } else if (cmd == 'r' || cmd == 'R') { - dJointSetLMotorParam(lmotor[1],dParamVel,-0.1); - dJointSetLMotorParam(lmotor[1],dParamVel2,0); - dJointSetLMotorParam(lmotor[1],dParamVel3,0); - } - -} - - - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - - dContact contact; - contact.surface.mode = 0; - contact.surface.mu = dInfinity; - if (dCollide (o1,o2,1,&contact.geom,sizeof(dContactGeom))) { - dJointID c = dJointCreateContact (world,contactgroup,&contact); - dJointAttach (c,b1,b2); - } -} - -// simulation loop - -static void simLoop (int pause) -{ - if (!pause) { - dSpaceCollide(space,0,&nearCallback); - dWorldQuickStep (world,0.05); - dJointGroupEmpty(contactgroup); - } - - dReal sides1[3]; - dGeomBoxGetLengths(geom[0], sides1); - dReal sides2[3]; - dGeomBoxGetLengths(geom[1], sides2); - dsSetTexture (DS_WOOD); - dsSetColor (1,1,0); - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides1); - dsSetColor (0,1,1); - dsDrawBox (dBodyGetPosition(body[1]),dBodyGetRotation(body[1]),sides2); -} - - -int main (int argc, char **argv) -{ - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc>=2) - { - fn.path_to_textures = argv[1]; - } - - // create world - dInitODE(); - contactgroup = dJointGroupCreate(0); - world = dWorldCreate(); - space = dSimpleSpaceCreate(0); - dMass m; - dMassSetBox (&m,1,SIDE,SIDE,SIDE); - dMassAdjust (&m,MASS); - - body[0] = dBodyCreate (world); - dBodySetMass (body[0],&m); - dBodySetPosition (body[0],0,0,1); - geom[0] = dCreateBox(space,SIDE,SIDE,SIDE); - body[1] = dBodyCreate (world); - dBodySetMass (body[1],&m); - dBodySetPosition (body[1],0,0,2); - geom[1] = dCreateBox(space,SIDE,SIDE,SIDE); - - dGeomSetBody(geom[0],body[0]); - dGeomSetBody(geom[1],body[1]); - - lmotor[0] = dJointCreateLMotor (world,0); - dJointAttach (lmotor[0],body[0],body[1]); - lmotor[1] = dJointCreateLMotor (world,0); - dJointAttach (lmotor[1],body[0],0); - amotor[0] = dJointCreateAMotor(world,0); - dJointAttach(amotor[0], body[0],body[1]); - amotor[1] = dJointCreateAMotor(world,0); - dJointAttach(amotor[1], body[0], 0); - - for (int i=0; i<2; i++) { - dJointSetAMotorNumAxes(amotor[i], 3); - dJointSetAMotorAxis(amotor[i],0,1,1,0,0); - dJointSetAMotorAxis(amotor[i],1,1,0,1,0); - dJointSetAMotorAxis(amotor[i],2,1,0,0,1); - dJointSetAMotorParam(amotor[i],dParamFMax,0.00001); - dJointSetAMotorParam(amotor[i],dParamFMax2,0.00001); - dJointSetAMotorParam(amotor[i],dParamFMax3,0.00001); - - dJointSetAMotorParam(amotor[i],dParamVel,0); - dJointSetAMotorParam(amotor[i],dParamVel2,0); - dJointSetAMotorParam(amotor[i],dParamVel3,0); - - dJointSetLMotorNumAxes(lmotor[i],3); - dJointSetLMotorAxis(lmotor[i],0,1,1,0,0); - dJointSetLMotorAxis(lmotor[i],1,1,0,1,0); - dJointSetLMotorAxis(lmotor[i],2,1,0,0,1); - - dJointSetLMotorParam(lmotor[i],dParamFMax,0.0001); - dJointSetLMotorParam(lmotor[i],dParamFMax2,0.0001); - dJointSetLMotorParam(lmotor[i],dParamFMax3,0.0001); - } - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dJointGroupDestroy(contactgroup); - dSpaceDestroy (space); - dWorldDestroy (world); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp b/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp deleted file mode 100644 index 3d0302071a..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp +++ /dev/null @@ -1,1944 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#define dsDrawLine dsDrawLineD -#define dsDrawTriangle dsDrawTriangleD -#endif - - -// some constants - -#define NUM 200 // max number of objects -#define DENSITY (5.0) // density of all objects -#define GPB 3 // maximum number of geometries per body -#define MAX_CONTACTS 64 // maximum number of contact points per body - - -// dynamics and collision objects - -struct MyObject { - dBodyID body; // the body - dGeomID geom[GPB]; // geometries representing this body - - // Trimesh only - double buffered matrices for 'last transform' setup - dReal matrix_dblbuff[ 16 * 2 ]; - int last_matrix_index; -}; - -static int num=0; // number of objects in simulation -static int nextobj=0; // next object to recycle if num==NUM -static dWorldID world; -static dSpaceID space; -static MyObject obj[NUM]; -static dJointGroupID contactgroup; -static int selected = -1; // selected object -static int show_aabb = 0; // show geom AABBs? -static int show_contacts = 0; // show contact points? -static int random_pos = 1; // drop objects from random position? - -// Bunny mesh ripped from Opcode -const int VertexCount = 453; -const int IndexCount = 902 * 3; - -typedef dReal dVector3R[3]; - -dGeomID TriMesh1; -dGeomID TriMesh2; -static dTriMeshDataID TriData1, TriData2; // reusable static trimesh data - -float Vertices[VertexCount * 3] = { - REAL(-0.334392), REAL(0.133007), REAL(0.062259), - REAL(-0.350189), REAL(0.150354), REAL(-0.147769), - REAL(-0.234201), REAL(0.343811), REAL(-0.174307), - REAL(-0.200259), REAL(0.285207), REAL(0.093749), - REAL(0.003520), REAL(0.475208), REAL(-0.159365), - REAL(0.001856), REAL(0.419203), REAL(0.098582), - REAL(-0.252802), REAL(0.093666), REAL(0.237538), - REAL(-0.162901), REAL(0.237984), REAL(0.206905), - REAL(0.000865), REAL(0.318141), REAL(0.235370), - REAL(-0.414624), REAL(0.164083), REAL(-0.278254), - REAL(-0.262213), REAL(0.357334), REAL(-0.293246), - REAL(0.004628), REAL(0.482694), REAL(-0.338626), - REAL(-0.402162), REAL(0.133528), REAL(-0.443247), - REAL(-0.243781), REAL(0.324275), REAL(-0.436763), - REAL(0.005293), REAL(0.437592), REAL(-0.458332), - REAL(-0.339884), REAL(-0.041150), REAL(-0.668211), - REAL(-0.248382), REAL(0.255825), REAL(-0.627493), - REAL(0.006261), REAL(0.376103), REAL(-0.631506), - REAL(-0.216201), REAL(-0.126776), REAL(-0.886936), - REAL(-0.171075), REAL(0.011544), REAL(-0.881386), - REAL(-0.181074), REAL(0.098223), REAL(-0.814779), - REAL(-0.119891), REAL(0.218786), REAL(-0.760153), - REAL(-0.078895), REAL(0.276780), REAL(-0.739281), - REAL(0.006801), REAL(0.310959), REAL(-0.735661), - REAL(-0.168842), REAL(0.102387), REAL(-0.920381), - REAL(-0.104072), REAL(0.177278), REAL(-0.952530), - REAL(-0.129704), REAL(0.211848), REAL(-0.836678), - REAL(-0.099875), REAL(0.310931), REAL(-0.799381), - REAL(0.007237), REAL(0.361687), REAL(-0.794439), - REAL(-0.077913), REAL(0.258753), REAL(-0.921640), - REAL(0.007957), REAL(0.282241), REAL(-0.931680), - REAL(-0.252222), REAL(-0.550401), REAL(-0.557810), - REAL(-0.267633), REAL(-0.603419), REAL(-0.655209), - REAL(-0.446838), REAL(-0.118517), REAL(-0.466159), - REAL(-0.459488), REAL(-0.093017), REAL(-0.311341), - REAL(-0.370645), REAL(-0.100108), REAL(-0.159454), - REAL(-0.371984), REAL(-0.091991), REAL(-0.011044), - REAL(-0.328945), REAL(-0.098269), REAL(0.088659), - REAL(-0.282452), REAL(-0.018862), REAL(0.311501), - REAL(-0.352403), REAL(-0.131341), REAL(0.144902), - REAL(-0.364126), REAL(-0.200299), REAL(0.202388), - REAL(-0.283965), REAL(-0.231869), REAL(0.023668), - REAL(-0.298943), REAL(-0.155218), REAL(0.369716), - REAL(-0.293787), REAL(-0.121856), REAL(0.419097), - REAL(-0.290163), REAL(-0.290797), REAL(0.107824), - REAL(-0.264165), REAL(-0.272849), REAL(0.036347), - REAL(-0.228567), REAL(-0.372573), REAL(0.290309), - REAL(-0.190431), REAL(-0.286997), REAL(0.421917), - REAL(-0.191039), REAL(-0.240973), REAL(0.507118), - REAL(-0.287272), REAL(-0.276431), REAL(-0.065444), - REAL(-0.295675), REAL(-0.280818), REAL(-0.174200), - REAL(-0.399537), REAL(-0.313131), REAL(-0.376167), - REAL(-0.392666), REAL(-0.488581), REAL(-0.427494), - REAL(-0.331669), REAL(-0.570185), REAL(-0.466054), - REAL(-0.282290), REAL(-0.618140), REAL(-0.589220), - REAL(-0.374238), REAL(-0.594882), REAL(-0.323298), - REAL(-0.381071), REAL(-0.629723), REAL(-0.350777), - REAL(-0.382112), REAL(-0.624060), REAL(-0.221577), - REAL(-0.272701), REAL(-0.566522), REAL(0.259157), - REAL(-0.256702), REAL(-0.663406), REAL(0.286079), - REAL(-0.280948), REAL(-0.428359), REAL(0.055790), - REAL(-0.184974), REAL(-0.508894), REAL(0.326265), - REAL(-0.279971), REAL(-0.526918), REAL(0.395319), - REAL(-0.282599), REAL(-0.663393), REAL(0.412411), - REAL(-0.188329), REAL(-0.475093), REAL(0.417954), - REAL(-0.263384), REAL(-0.663396), REAL(0.466604), - REAL(-0.209063), REAL(-0.663393), REAL(0.509344), - REAL(-0.002044), REAL(-0.319624), REAL(0.553078), - REAL(-0.001266), REAL(-0.371260), REAL(0.413296), - REAL(-0.219753), REAL(-0.339762), REAL(-0.040921), - REAL(-0.256986), REAL(-0.282511), REAL(-0.006349), - REAL(-0.271706), REAL(-0.260881), REAL(0.001764), - REAL(-0.091191), REAL(-0.419184), REAL(-0.045912), - REAL(-0.114944), REAL(-0.429752), REAL(-0.124739), - REAL(-0.113970), REAL(-0.382987), REAL(-0.188540), - REAL(-0.243012), REAL(-0.464942), REAL(-0.242850), - REAL(-0.314815), REAL(-0.505402), REAL(-0.324768), - REAL(0.002774), REAL(-0.437526), REAL(-0.262766), - REAL(-0.072625), REAL(-0.417748), REAL(-0.221440), - REAL(-0.160112), REAL(-0.476932), REAL(-0.293450), - REAL(0.003859), REAL(-0.453425), REAL(-0.443916), - REAL(-0.120363), REAL(-0.581567), REAL(-0.438689), - REAL(-0.091499), REAL(-0.584191), REAL(-0.294511), - REAL(-0.116469), REAL(-0.599861), REAL(-0.188308), - REAL(-0.208032), REAL(-0.513640), REAL(-0.134649), - REAL(-0.235749), REAL(-0.610017), REAL(-0.040939), - REAL(-0.344916), REAL(-0.622487), REAL(-0.085380), - REAL(-0.336401), REAL(-0.531864), REAL(-0.212298), - REAL(0.001961), REAL(-0.459550), REAL(-0.135547), - REAL(-0.058296), REAL(-0.430536), REAL(-0.043440), - REAL(0.001378), REAL(-0.449511), REAL(-0.037762), - REAL(-0.130135), REAL(-0.510222), REAL(0.079144), - REAL(0.000142), REAL(-0.477549), REAL(0.157064), - REAL(-0.114284), REAL(-0.453206), REAL(0.304397), - REAL(-0.000592), REAL(-0.443558), REAL(0.285401), - REAL(-0.056215), REAL(-0.663402), REAL(0.326073), - REAL(-0.026248), REAL(-0.568010), REAL(0.273318), - REAL(-0.049261), REAL(-0.531064), REAL(0.389854), - REAL(-0.127096), REAL(-0.663398), REAL(0.479316), - REAL(-0.058384), REAL(-0.663401), REAL(0.372891), - REAL(-0.303961), REAL(0.054199), REAL(0.625921), - REAL(-0.268594), REAL(0.193403), REAL(0.502766), - REAL(-0.277159), REAL(0.126123), REAL(0.443289), - REAL(-0.287605), REAL(-0.005722), REAL(0.531844), - REAL(-0.231396), REAL(-0.121289), REAL(0.587387), - REAL(-0.253475), REAL(-0.081797), REAL(0.756541), - REAL(-0.195164), REAL(-0.137969), REAL(0.728011), - REAL(-0.167673), REAL(-0.156573), REAL(0.609388), - REAL(-0.145917), REAL(-0.169029), REAL(0.697600), - REAL(-0.077776), REAL(-0.214247), REAL(0.622586), - REAL(-0.076873), REAL(-0.214971), REAL(0.696301), - REAL(-0.002341), REAL(-0.233135), REAL(0.622859), - REAL(-0.002730), REAL(-0.213526), REAL(0.691267), - REAL(-0.003136), REAL(-0.192628), REAL(0.762731), - REAL(-0.056136), REAL(-0.201222), REAL(0.763806), - REAL(-0.114589), REAL(-0.166192), REAL(0.770723), - REAL(-0.155145), REAL(-0.129632), REAL(0.791738), - REAL(-0.183611), REAL(-0.058705), REAL(0.847012), - REAL(-0.165562), REAL(0.001980), REAL(0.833386), - REAL(-0.220084), REAL(0.019914), REAL(0.768935), - REAL(-0.255730), REAL(0.090306), REAL(0.670782), - REAL(-0.255594), REAL(0.113833), REAL(0.663389), - REAL(-0.226380), REAL(0.212655), REAL(0.617740), - REAL(-0.003367), REAL(-0.195342), REAL(0.799680), - REAL(-0.029743), REAL(-0.210508), REAL(0.827180), - REAL(-0.003818), REAL(-0.194783), REAL(0.873636), - REAL(-0.004116), REAL(-0.157907), REAL(0.931268), - REAL(-0.031280), REAL(-0.184555), REAL(0.889476), - REAL(-0.059885), REAL(-0.184448), REAL(0.841330), - REAL(-0.135333), REAL(-0.164332), REAL(0.878200), - REAL(-0.085574), REAL(-0.170948), REAL(0.925547), - REAL(-0.163833), REAL(-0.094170), REAL(0.897114), - REAL(-0.138444), REAL(-0.104250), REAL(0.945975), - REAL(-0.083497), REAL(-0.084934), REAL(0.979607), - REAL(-0.004433), REAL(-0.146642), REAL(0.985872), - REAL(-0.150715), REAL(0.032650), REAL(0.884111), - REAL(-0.135892), REAL(-0.035520), REAL(0.945455), - REAL(-0.070612), REAL(0.036849), REAL(0.975733), - REAL(-0.004458), REAL(-0.042526), REAL(1.015670), - REAL(-0.004249), REAL(0.046042), REAL(1.003240), - REAL(-0.086969), REAL(0.133224), REAL(0.947633), - REAL(-0.003873), REAL(0.161605), REAL(0.970499), - REAL(-0.125544), REAL(0.140012), REAL(0.917678), - REAL(-0.125651), REAL(0.250246), REAL(0.857602), - REAL(-0.003127), REAL(0.284070), REAL(0.878870), - REAL(-0.159174), REAL(0.125726), REAL(0.888878), - REAL(-0.183807), REAL(0.196970), REAL(0.844480), - REAL(-0.159890), REAL(0.291736), REAL(0.732480), - REAL(-0.199495), REAL(0.207230), REAL(0.779864), - REAL(-0.206182), REAL(0.164608), REAL(0.693257), - REAL(-0.186315), REAL(0.160689), REAL(0.817193), - REAL(-0.192827), REAL(0.166706), REAL(0.782271), - REAL(-0.175112), REAL(0.110008), REAL(0.860621), - REAL(-0.161022), REAL(0.057420), REAL(0.855111), - REAL(-0.172319), REAL(0.036155), REAL(0.816189), - REAL(-0.190318), REAL(0.064083), REAL(0.760605), - REAL(-0.195072), REAL(0.129179), REAL(0.731104), - REAL(-0.203126), REAL(0.410287), REAL(0.680536), - REAL(-0.216677), REAL(0.309274), REAL(0.642272), - REAL(-0.241515), REAL(0.311485), REAL(0.587832), - REAL(-0.002209), REAL(0.366663), REAL(0.749413), - REAL(-0.088230), REAL(0.396265), REAL(0.678635), - REAL(-0.170147), REAL(0.109517), REAL(0.840784), - REAL(-0.160521), REAL(0.067766), REAL(0.830650), - REAL(-0.181546), REAL(0.139805), REAL(0.812146), - REAL(-0.180495), REAL(0.148568), REAL(0.776087), - REAL(-0.180255), REAL(0.129125), REAL(0.744192), - REAL(-0.186298), REAL(0.078308), REAL(0.769352), - REAL(-0.167622), REAL(0.060539), REAL(0.806675), - REAL(-0.189876), REAL(0.102760), REAL(0.802582), - REAL(-0.108340), REAL(0.455446), REAL(0.657174), - REAL(-0.241585), REAL(0.527592), REAL(0.669296), - REAL(-0.265676), REAL(0.513366), REAL(0.634594), - REAL(-0.203073), REAL(0.478550), REAL(0.581526), - REAL(-0.266772), REAL(0.642330), REAL(0.602061), - REAL(-0.216961), REAL(0.564846), REAL(0.535435), - REAL(-0.202210), REAL(0.525495), REAL(0.475944), - REAL(-0.193888), REAL(0.467925), REAL(0.520606), - REAL(-0.265837), REAL(0.757267), REAL(0.500933), - REAL(-0.240306), REAL(0.653440), REAL(0.463215), - REAL(-0.309239), REAL(0.776868), REAL(0.304726), - REAL(-0.271009), REAL(0.683094), REAL(0.382018), - REAL(-0.312111), REAL(0.671099), REAL(0.286687), - REAL(-0.268791), REAL(0.624342), REAL(0.377231), - REAL(-0.302457), REAL(0.533996), REAL(0.360289), - REAL(-0.263656), REAL(0.529310), REAL(0.412564), - REAL(-0.282311), REAL(0.415167), REAL(0.447666), - REAL(-0.239201), REAL(0.442096), REAL(0.495604), - REAL(-0.220043), REAL(0.569026), REAL(0.445877), - REAL(-0.001263), REAL(0.395631), REAL(0.602029), - REAL(-0.057345), REAL(0.442535), REAL(0.572224), - REAL(-0.088927), REAL(0.506333), REAL(0.529106), - REAL(-0.125738), REAL(0.535076), REAL(0.612913), - REAL(-0.126251), REAL(0.577170), REAL(0.483159), - REAL(-0.149594), REAL(0.611520), REAL(0.557731), - REAL(-0.163188), REAL(0.660791), REAL(0.491080), - REAL(-0.172482), REAL(0.663387), REAL(0.415416), - REAL(-0.160464), REAL(0.591710), REAL(0.370659), - REAL(-0.156445), REAL(0.536396), REAL(0.378302), - REAL(-0.136496), REAL(0.444358), REAL(0.425226), - REAL(-0.095564), REAL(0.373768), REAL(0.473659), - REAL(-0.104146), REAL(0.315912), REAL(0.498104), - REAL(-0.000496), REAL(0.384194), REAL(0.473817), - REAL(-0.000183), REAL(0.297770), REAL(0.401486), - REAL(-0.129042), REAL(0.270145), REAL(0.434495), - REAL(0.000100), REAL(0.272963), REAL(0.349138), - REAL(-0.113060), REAL(0.236984), REAL(0.385554), - REAL(0.007260), REAL(0.016311), REAL(-0.883396), - REAL(0.007865), REAL(0.122104), REAL(-0.956137), - REAL(-0.032842), REAL(0.115282), REAL(-0.953252), - REAL(-0.089115), REAL(0.108449), REAL(-0.950317), - REAL(-0.047440), REAL(0.014729), REAL(-0.882756), - REAL(-0.104458), REAL(0.013137), REAL(-0.882070), - REAL(-0.086439), REAL(-0.584866), REAL(-0.608343), - REAL(-0.115026), REAL(-0.662605), REAL(-0.436732), - REAL(-0.071683), REAL(-0.665372), REAL(-0.606385), - REAL(-0.257884), REAL(-0.665381), REAL(-0.658052), - REAL(-0.272542), REAL(-0.665381), REAL(-0.592063), - REAL(-0.371322), REAL(-0.665382), REAL(-0.353620), - REAL(-0.372362), REAL(-0.665381), REAL(-0.224420), - REAL(-0.335166), REAL(-0.665380), REAL(-0.078623), - REAL(-0.225999), REAL(-0.665375), REAL(-0.038981), - REAL(-0.106719), REAL(-0.665374), REAL(-0.186351), - REAL(-0.081749), REAL(-0.665372), REAL(-0.292554), - REAL(0.006943), REAL(-0.091505), REAL(-0.858354), - REAL(0.006117), REAL(-0.280985), REAL(-0.769967), - REAL(0.004495), REAL(-0.502360), REAL(-0.559799), - REAL(-0.198638), REAL(-0.302135), REAL(-0.845816), - REAL(-0.237395), REAL(-0.542544), REAL(-0.587188), - REAL(-0.270001), REAL(-0.279489), REAL(-0.669861), - REAL(-0.134547), REAL(-0.119852), REAL(-0.959004), - REAL(-0.052088), REAL(-0.122463), REAL(-0.944549), - REAL(-0.124463), REAL(-0.293508), REAL(-0.899566), - REAL(-0.047616), REAL(-0.289643), REAL(-0.879292), - REAL(-0.168595), REAL(-0.529132), REAL(-0.654931), - REAL(-0.099793), REAL(-0.515719), REAL(-0.645873), - REAL(-0.186168), REAL(-0.605282), REAL(-0.724690), - REAL(-0.112970), REAL(-0.583097), REAL(-0.707469), - REAL(-0.108152), REAL(-0.665375), REAL(-0.700408), - REAL(-0.183019), REAL(-0.665378), REAL(-0.717630), - REAL(-0.349529), REAL(-0.334459), REAL(-0.511985), - REAL(-0.141182), REAL(-0.437705), REAL(-0.798194), - REAL(-0.212670), REAL(-0.448725), REAL(-0.737447), - REAL(-0.261111), REAL(-0.414945), REAL(-0.613835), - REAL(-0.077364), REAL(-0.431480), REAL(-0.778113), - REAL(0.005174), REAL(-0.425277), REAL(-0.651592), - REAL(0.089236), REAL(-0.431732), REAL(-0.777093), - REAL(0.271006), REAL(-0.415749), REAL(-0.610577), - REAL(0.223981), REAL(-0.449384), REAL(-0.734774), - REAL(0.153275), REAL(-0.438150), REAL(-0.796391), - REAL(0.358414), REAL(-0.335529), REAL(-0.507649), - REAL(0.193434), REAL(-0.665946), REAL(-0.715325), - REAL(0.118363), REAL(-0.665717), REAL(-0.699021), - REAL(0.123515), REAL(-0.583454), REAL(-0.706020), - REAL(0.196851), REAL(-0.605860), REAL(-0.722345), - REAL(0.109788), REAL(-0.516035), REAL(-0.644590), - REAL(0.178656), REAL(-0.529656), REAL(-0.652804), - REAL(0.061157), REAL(-0.289807), REAL(-0.878626), - REAL(0.138234), REAL(-0.293905), REAL(-0.897958), - REAL(0.066933), REAL(-0.122643), REAL(-0.943820), - REAL(0.149571), REAL(-0.120281), REAL(-0.957264), - REAL(0.280989), REAL(-0.280321), REAL(-0.666487), - REAL(0.246581), REAL(-0.543275), REAL(-0.584224), - REAL(0.211720), REAL(-0.302754), REAL(-0.843303), - REAL(0.086966), REAL(-0.665627), REAL(-0.291520), - REAL(0.110634), REAL(-0.665702), REAL(-0.185021), - REAL(0.228099), REAL(-0.666061), REAL(-0.036201), - REAL(0.337743), REAL(-0.666396), REAL(-0.074503), - REAL(0.376722), REAL(-0.666513), REAL(-0.219833), - REAL(0.377265), REAL(-0.666513), REAL(-0.349036), - REAL(0.281411), REAL(-0.666217), REAL(-0.588670), - REAL(0.267564), REAL(-0.666174), REAL(-0.654834), - REAL(0.080745), REAL(-0.665602), REAL(-0.605452), - REAL(0.122016), REAL(-0.662963), REAL(-0.435280), - REAL(0.095767), REAL(-0.585141), REAL(-0.607228), - REAL(0.118944), REAL(0.012799), REAL(-0.880702), - REAL(0.061944), REAL(0.014564), REAL(-0.882086), - REAL(0.104725), REAL(0.108156), REAL(-0.949130), - REAL(0.048513), REAL(0.115159), REAL(-0.952753), - REAL(0.112696), REAL(0.236643), REAL(0.386937), - REAL(0.128177), REAL(0.269757), REAL(0.436071), - REAL(0.102643), REAL(0.315600), REAL(0.499370), - REAL(0.094535), REAL(0.373481), REAL(0.474824), - REAL(0.136270), REAL(0.443946), REAL(0.426895), - REAL(0.157071), REAL(0.535923), REAL(0.380222), - REAL(0.161350), REAL(0.591224), REAL(0.372630), - REAL(0.173035), REAL(0.662865), REAL(0.417531), - REAL(0.162808), REAL(0.660299), REAL(0.493077), - REAL(0.148250), REAL(0.611070), REAL(0.559555), - REAL(0.125719), REAL(0.576790), REAL(0.484702), - REAL(0.123489), REAL(0.534699), REAL(0.614440), - REAL(0.087621), REAL(0.506066), REAL(0.530188), - REAL(0.055321), REAL(0.442365), REAL(0.572915), - REAL(0.219936), REAL(0.568361), REAL(0.448571), - REAL(0.238099), REAL(0.441375), REAL(0.498528), - REAL(0.281711), REAL(0.414315), REAL(0.451121), - REAL(0.263833), REAL(0.528513), REAL(0.415794), - REAL(0.303284), REAL(0.533081), REAL(0.363998), - REAL(0.269687), REAL(0.623528), REAL(0.380528), - REAL(0.314255), REAL(0.670153), REAL(0.290524), - REAL(0.272023), REAL(0.682273), REAL(0.385343), - REAL(0.311480), REAL(0.775931), REAL(0.308527), - REAL(0.240239), REAL(0.652714), REAL(0.466159), - REAL(0.265619), REAL(0.756464), REAL(0.504187), - REAL(0.192562), REAL(0.467341), REAL(0.522972), - REAL(0.201605), REAL(0.524885), REAL(0.478417), - REAL(0.215743), REAL(0.564193), REAL(0.538084), - REAL(0.264969), REAL(0.641527), REAL(0.605317), - REAL(0.201031), REAL(0.477940), REAL(0.584002), - REAL(0.263086), REAL(0.512567), REAL(0.637832), - REAL(0.238615), REAL(0.526867), REAL(0.672237), - REAL(0.105309), REAL(0.455123), REAL(0.658482), - REAL(0.183993), REAL(0.102195), REAL(0.804872), - REAL(0.161563), REAL(0.060042), REAL(0.808692), - REAL(0.180748), REAL(0.077754), REAL(0.771600), - REAL(0.175168), REAL(0.128588), REAL(0.746368), - REAL(0.175075), REAL(0.148030), REAL(0.778264), - REAL(0.175658), REAL(0.139265), REAL(0.814333), - REAL(0.154191), REAL(0.067291), REAL(0.832578), - REAL(0.163818), REAL(0.109013), REAL(0.842830), - REAL(0.084760), REAL(0.396004), REAL(0.679695), - REAL(0.238888), REAL(0.310760), REAL(0.590775), - REAL(0.213380), REAL(0.308625), REAL(0.644905), - REAL(0.199666), REAL(0.409678), REAL(0.683003), - REAL(0.190143), REAL(0.128597), REAL(0.733463), - REAL(0.184833), REAL(0.063516), REAL(0.762902), - REAL(0.166070), REAL(0.035644), REAL(0.818261), - REAL(0.154361), REAL(0.056943), REAL(0.857042), - REAL(0.168542), REAL(0.109489), REAL(0.862725), - REAL(0.187387), REAL(0.166131), REAL(0.784599), - REAL(0.180428), REAL(0.160135), REAL(0.819438), - REAL(0.201823), REAL(0.163991), REAL(0.695756), - REAL(0.194206), REAL(0.206635), REAL(0.782275), - REAL(0.155438), REAL(0.291260), REAL(0.734412), - REAL(0.177696), REAL(0.196424), REAL(0.846693), - REAL(0.152305), REAL(0.125256), REAL(0.890786), - REAL(0.119546), REAL(0.249876), REAL(0.859104), - REAL(0.118369), REAL(0.139643), REAL(0.919173), - REAL(0.079410), REAL(0.132973), REAL(0.948652), - REAL(0.062419), REAL(0.036648), REAL(0.976547), - REAL(0.127847), REAL(-0.035919), REAL(0.947070), - REAL(0.143624), REAL(0.032206), REAL(0.885913), - REAL(0.074888), REAL(-0.085173), REAL(0.980577), - REAL(0.130184), REAL(-0.104656), REAL(0.947620), - REAL(0.156201), REAL(-0.094653), REAL(0.899074), - REAL(0.077366), REAL(-0.171194), REAL(0.926545), - REAL(0.127722), REAL(-0.164729), REAL(0.879810), - REAL(0.052670), REAL(-0.184618), REAL(0.842019), - REAL(0.023477), REAL(-0.184638), REAL(0.889811), - REAL(0.022626), REAL(-0.210587), REAL(0.827500), - REAL(0.223089), REAL(0.211976), REAL(0.620493), - REAL(0.251444), REAL(0.113067), REAL(0.666494), - REAL(0.251419), REAL(0.089540), REAL(0.673887), - REAL(0.214360), REAL(0.019258), REAL(0.771595), - REAL(0.158999), REAL(0.001490), REAL(0.835374), - REAL(0.176696), REAL(-0.059249), REAL(0.849218), - REAL(0.148696), REAL(-0.130091), REAL(0.793599), - REAL(0.108290), REAL(-0.166528), REAL(0.772088), - REAL(0.049820), REAL(-0.201382), REAL(0.764454), - REAL(0.071341), REAL(-0.215195), REAL(0.697209), - REAL(0.073148), REAL(-0.214475), REAL(0.623510), - REAL(0.140502), REAL(-0.169461), REAL(0.699354), - REAL(0.163374), REAL(-0.157073), REAL(0.611416), - REAL(0.189466), REAL(-0.138550), REAL(0.730366), - REAL(0.247593), REAL(-0.082554), REAL(0.759610), - REAL(0.227468), REAL(-0.121982), REAL(0.590197), - REAL(0.284702), REAL(-0.006586), REAL(0.535347), - REAL(0.275741), REAL(0.125287), REAL(0.446676), - REAL(0.266650), REAL(0.192594), REAL(0.506044), - REAL(0.300086), REAL(0.053287), REAL(0.629620), - REAL(0.055450), REAL(-0.663935), REAL(0.375065), - REAL(0.122854), REAL(-0.664138), REAL(0.482323), - REAL(0.046520), REAL(-0.531571), REAL(0.391918), - REAL(0.024824), REAL(-0.568450), REAL(0.275106), - REAL(0.053855), REAL(-0.663931), REAL(0.328224), - REAL(0.112829), REAL(-0.453549), REAL(0.305788), - REAL(0.131265), REAL(-0.510617), REAL(0.080746), - REAL(0.061174), REAL(-0.430716), REAL(-0.042710), - REAL(0.341019), REAL(-0.532887), REAL(-0.208150), - REAL(0.347705), REAL(-0.623533), REAL(-0.081139), - REAL(0.238040), REAL(-0.610732), REAL(-0.038037), - REAL(0.211764), REAL(-0.514274), REAL(-0.132078), - REAL(0.120605), REAL(-0.600219), REAL(-0.186856), - REAL(0.096985), REAL(-0.584476), REAL(-0.293357), - REAL(0.127621), REAL(-0.581941), REAL(-0.437170), - REAL(0.165902), REAL(-0.477425), REAL(-0.291453), - REAL(0.077720), REAL(-0.417975), REAL(-0.220519), - REAL(0.320892), REAL(-0.506363), REAL(-0.320874), - REAL(0.248214), REAL(-0.465684), REAL(-0.239842), - REAL(0.118764), REAL(-0.383338), REAL(-0.187114), - REAL(0.118816), REAL(-0.430106), REAL(-0.123307), - REAL(0.094131), REAL(-0.419464), REAL(-0.044777), - REAL(0.274526), REAL(-0.261706), REAL(0.005110), - REAL(0.259842), REAL(-0.283292), REAL(-0.003185), - REAL(0.222861), REAL(-0.340431), REAL(-0.038210), - REAL(0.204445), REAL(-0.664380), REAL(0.513353), - REAL(0.259286), REAL(-0.664547), REAL(0.471281), - REAL(0.185402), REAL(-0.476020), REAL(0.421718), - REAL(0.279163), REAL(-0.664604), REAL(0.417328), - REAL(0.277157), REAL(-0.528122), REAL(0.400208), - REAL(0.183069), REAL(-0.509812), REAL(0.329995), - REAL(0.282599), REAL(-0.429210), REAL(0.059242), - REAL(0.254816), REAL(-0.664541), REAL(0.290687), - REAL(0.271436), REAL(-0.567707), REAL(0.263966), - REAL(0.386561), REAL(-0.625221), REAL(-0.216870), - REAL(0.387086), REAL(-0.630883), REAL(-0.346073), - REAL(0.380021), REAL(-0.596021), REAL(-0.318679), - REAL(0.291269), REAL(-0.619007), REAL(-0.585707), - REAL(0.339280), REAL(-0.571198), REAL(-0.461946), - REAL(0.400045), REAL(-0.489778), REAL(-0.422640), - REAL(0.406817), REAL(-0.314349), REAL(-0.371230), - REAL(0.300588), REAL(-0.281718), REAL(-0.170549), - REAL(0.290866), REAL(-0.277304), REAL(-0.061905), - REAL(0.187735), REAL(-0.241545), REAL(0.509437), - REAL(0.188032), REAL(-0.287569), REAL(0.424234), - REAL(0.227520), REAL(-0.373262), REAL(0.293102), - REAL(0.266526), REAL(-0.273650), REAL(0.039597), - REAL(0.291592), REAL(-0.291676), REAL(0.111386), - REAL(0.291914), REAL(-0.122741), REAL(0.422683), - REAL(0.297574), REAL(-0.156119), REAL(0.373368), - REAL(0.286603), REAL(-0.232731), REAL(0.027162), - REAL(0.364663), REAL(-0.201399), REAL(0.206850), - REAL(0.353855), REAL(-0.132408), REAL(0.149228), - REAL(0.282208), REAL(-0.019715), REAL(0.314960), - REAL(0.331187), REAL(-0.099266), REAL(0.092701), - REAL(0.375463), REAL(-0.093120), REAL(-0.006467), - REAL(0.375917), REAL(-0.101236), REAL(-0.154882), - REAL(0.466635), REAL(-0.094416), REAL(-0.305669), - REAL(0.455805), REAL(-0.119881), REAL(-0.460632), - REAL(0.277465), REAL(-0.604242), REAL(-0.651871), - REAL(0.261022), REAL(-0.551176), REAL(-0.554667), - REAL(0.093627), REAL(0.258494), REAL(-0.920589), - REAL(0.114248), REAL(0.310608), REAL(-0.798070), - REAL(0.144232), REAL(0.211434), REAL(-0.835001), - REAL(0.119916), REAL(0.176940), REAL(-0.951159), - REAL(0.184061), REAL(0.101854), REAL(-0.918220), - REAL(0.092431), REAL(0.276521), REAL(-0.738231), - REAL(0.133504), REAL(0.218403), REAL(-0.758602), - REAL(0.194987), REAL(0.097655), REAL(-0.812476), - REAL(0.185542), REAL(0.011005), REAL(-0.879202), - REAL(0.230315), REAL(-0.127450), REAL(-0.884202), - REAL(0.260471), REAL(0.255056), REAL(-0.624378), - REAL(0.351567), REAL(-0.042194), REAL(-0.663976), - REAL(0.253742), REAL(0.323524), REAL(-0.433716), - REAL(0.411612), REAL(0.132299), REAL(-0.438264), - REAL(0.270513), REAL(0.356530), REAL(-0.289984), - REAL(0.422146), REAL(0.162819), REAL(-0.273130), - REAL(0.164724), REAL(0.237490), REAL(0.208912), - REAL(0.253806), REAL(0.092900), REAL(0.240640), - REAL(0.203608), REAL(0.284597), REAL(0.096223), - REAL(0.241006), REAL(0.343093), REAL(-0.171396), - REAL(0.356076), REAL(0.149288), REAL(-0.143443), - REAL(0.337656), REAL(0.131992), REAL(0.066374) -}; - -int Indices[IndexCount / 3][3] = { - {126,134,133}, - {342,138,134}, - {133,134,138}, - {126,342,134}, - {312,316,317}, - {169,163,162}, - {312,317,319}, - {312,319,318}, - {169,162,164}, - {169,168,163}, - {312,314,315}, - {169,164,165}, - {169,167,168}, - {312,315,316}, - {312,313,314}, - {169,165,166}, - {169,166,167}, - {312,318,313}, - {308,304,305}, - {308,305,306}, - {179,181,188}, - {177,173,175}, - {177,175,176}, - {302,293,300}, - {322,294,304}, - {188,176,175}, - {188,175,179}, - {158,177,187}, - {305,293,302}, - {305,302,306}, - {322,304,308}, - {188,181,183}, - {158,173,177}, - {293,298,300}, - {304,294,296}, - {304,296,305}, - {185,176,188}, - {185,188,183}, - {187,177,176}, - {187,176,185}, - {305,296,298}, - {305,298,293}, - {436,432, 28}, - {436, 28, 23}, - {434,278,431}, - { 30,208,209}, - { 30,209, 29}, - { 19, 20, 24}, - {208,207,211}, - {208,211,209}, - { 19,210,212}, - {433,434,431}, - {433,431,432}, - {433,432,436}, - {436,437,433}, - {277,275,276}, - {277,276,278}, - {209,210, 25}, - { 21, 26, 24}, - { 21, 24, 20}, - { 25, 26, 27}, - { 25, 27, 29}, - {435,439,277}, - {439,275,277}, - {432,431, 30}, - {432, 30, 28}, - {433,437,438}, - {433,438,435}, - {434,277,278}, - { 24, 25,210}, - { 24, 26, 25}, - { 29, 27, 28}, - { 29, 28, 30}, - { 19, 24,210}, - {208, 30,431}, - {208,431,278}, - {435,434,433}, - {435,277,434}, - { 25, 29,209}, - { 27, 22, 23}, - { 27, 23, 28}, - { 26, 22, 27}, - { 26, 21, 22}, - {212,210,209}, - {212,209,211}, - {207,208,278}, - {207,278,276}, - {439,435,438}, - { 12, 9, 10}, - { 12, 10, 13}, - { 2, 3, 5}, - { 2, 5, 4}, - { 16, 13, 14}, - { 16, 14, 17}, - { 22, 21, 16}, - { 13, 10, 11}, - { 13, 11, 14}, - { 1, 0, 3}, - { 1, 3, 2}, - { 15, 12, 16}, - { 19, 18, 15}, - { 19, 15, 16}, - { 19, 16, 20}, - { 9, 1, 2}, - { 9, 2, 10}, - { 3, 7, 8}, - { 3, 8, 5}, - { 16, 17, 23}, - { 16, 23, 22}, - { 21, 20, 16}, - { 10, 2, 4}, - { 10, 4, 11}, - { 0, 6, 7}, - { 0, 7, 3}, - { 12, 13, 16}, - {451,446,445}, - {451,445,450}, - {442,440,439}, - {442,439,438}, - {442,438,441}, - {421,420,422}, - {412,411,426}, - {412,426,425}, - {408,405,407}, - {413, 67, 68}, - {413, 68,414}, - {391,390,412}, - { 80,384,386}, - {404,406,378}, - {390,391,377}, - {390,377, 88}, - {400,415,375}, - {398,396,395}, - {398,395,371}, - {398,371,370}, - {112,359,358}, - {112,358,113}, - {351,352,369}, - {125,349,348}, - {345,343,342}, - {342,340,339}, - {341,335,337}, - {328,341,327}, - {331,323,333}, - {331,322,323}, - {327,318,319}, - {327,319,328}, - {315,314,324}, - {302,300,301}, - {302,301,303}, - {320,311,292}, - {285,284,289}, - {310,307,288}, - {310,288,290}, - {321,350,281}, - {321,281,282}, - {423,448,367}, - {272,273,384}, - {272,384,274}, - {264,265,382}, - {264,382,383}, - {440,442,261}, - {440,261,263}, - {252,253,254}, - {252,254,251}, - {262,256,249}, - {262,249,248}, - {228,243,242}, - {228, 31,243}, - {213,215,238}, - {213,238,237}, - { 19,212,230}, - {224,225,233}, - {224,233,231}, - {217,218, 56}, - {217, 56, 54}, - {217,216,239}, - {217,239,238}, - {217,238,215}, - {218,217,215}, - {218,215,214}, - { 6,102,206}, - {186,199,200}, - {197,182,180}, - {170,171,157}, - {201,200,189}, - {170,190,191}, - {170,191,192}, - {175,174,178}, - {175,178,179}, - {168,167,155}, - {122,149,158}, - {122,158,159}, - {135,153,154}, - {135,154,118}, - {143,140,141}, - {143,141,144}, - {132,133,136}, - {130,126,133}, - {124,125,127}, - {122,101,100}, - {122,100,121}, - {110,108,107}, - {110,107,109}, - { 98, 99, 97}, - { 98, 97, 64}, - { 98, 64, 66}, - { 87, 55, 57}, - { 83, 82, 79}, - { 83, 79, 84}, - { 78, 74, 50}, - { 49, 71, 41}, - { 49, 41, 37}, - { 49, 37, 36}, - { 58, 44, 60}, - { 60, 59, 58}, - { 51, 34, 33}, - { 39, 40, 42}, - { 39, 42, 38}, - {243,240, 33}, - {243, 33,229}, - { 39, 38, 6}, - { 44, 46, 40}, - { 55, 56, 57}, - { 64, 62, 65}, - { 64, 65, 66}, - { 41, 71, 45}, - { 75, 50, 51}, - { 81, 79, 82}, - { 77, 88, 73}, - { 93, 92, 94}, - { 68, 47, 46}, - { 96, 97, 99}, - { 96, 99, 95}, - {110,109,111}, - {111,112,110}, - {114,113,123}, - {114,123,124}, - {132,131,129}, - {133,137,136}, - {135,142,145}, - {145,152,135}, - {149,147,157}, - {157,158,149}, - {164,150,151}, - {153,163,168}, - {153,168,154}, - {185,183,182}, - {185,182,184}, - {161,189,190}, - {200,199,191}, - {200,191,190}, - {180,178,195}, - {180,195,196}, - {102,101,204}, - {102,204,206}, - { 43, 48,104}, - { 43,104,103}, - {216,217, 54}, - {216, 54, 32}, - {207,224,231}, - {230,212,211}, - {230,211,231}, - {227,232,241}, - {227,241,242}, - {235,234,241}, - {235,241,244}, - {430,248,247}, - {272,274,253}, - {272,253,252}, - {439,260,275}, - {225,224,259}, - {225,259,257}, - {269,270,407}, - {269,407,405}, - {270,269,273}, - {270,273,272}, - {273,269,268}, - {273,268,267}, - {273,267,266}, - {273,266,265}, - {273,265,264}, - {448,279,367}, - {281,350,368}, - {285,286,301}, - {290,323,310}, - {290,311,323}, - {282,281,189}, - {292,311,290}, - {292,290,291}, - {307,306,302}, - {307,302,303}, - {316,315,324}, - {316,324,329}, - {331,351,350}, - {330,334,335}, - {330,335,328}, - {341,337,338}, - {344,355,354}, - {346,345,348}, - {346,348,347}, - {364,369,352}, - {364,352,353}, - {365,363,361}, - {365,361,362}, - {376,401,402}, - {373,372,397}, - {373,397,400}, - {376, 92,377}, - {381,378,387}, - {381,387,385}, - {386, 77, 80}, - {390,389,412}, - {416,417,401}, - {403,417,415}, - {408,429,430}, - {419,423,418}, - {427,428,444}, - {427,444,446}, - {437,436,441}, - {450,445, 11}, - {450, 11, 4}, - {447,449, 5}, - {447, 5, 8}, - {441,438,437}, - {425,426,451}, - {425,451,452}, - {417,421,415}, - {408,407,429}, - {399,403,400}, - {399,400,397}, - {394,393,416}, - {389,411,412}, - {386,383,385}, - {408,387,378}, - {408,378,406}, - {377,391,376}, - { 94,375,415}, - {372,373,374}, - {372,374,370}, - {359,111,360}, - {359,112,111}, - {113,358,349}, - {113,349,123}, - {346,343,345}, - {343,340,342}, - {338,336,144}, - {338,144,141}, - {327,341,354}, - {327,354,326}, - {331,350,321}, - {331,321,322}, - {314,313,326}, - {314,326,325}, - {300,298,299}, - {300,299,301}, - {288,287,289}, - {189,292,282}, - {287,288,303}, - {284,285,297}, - {368,280,281}, - {448,447,279}, - {274,226,255}, - {267,268,404}, - {267,404,379}, - {429,262,430}, - {439,440,260}, - {257,258,249}, - {257,249,246}, - {430,262,248}, - {234,228,242}, - {234,242,241}, - {237,238,239}, - {237,239,236}, - { 15, 18,227}, - { 15,227,229}, - {222,223, 82}, - {222, 82, 83}, - {214,215,213}, - {214,213, 81}, - { 38,102, 6}, - {122,159,200}, - {122,200,201}, - {174,171,192}, - {174,192,194}, - {197,193,198}, - {190,170,161}, - {181,179,178}, - {181,178,180}, - {166,156,155}, - {163,153,152}, - {163,152,162}, - {120,156,149}, - {120,149,121}, - {152,153,135}, - {140,143,142}, - {135,131,132}, - {135,132,136}, - {130,129,128}, - {130,128,127}, - {100,105,119}, - {100,119,120}, - {106,104,107}, - {106,107,108}, - { 91, 95, 59}, - { 93, 94, 68}, - { 91, 89, 92}, - { 76, 53, 55}, - { 76, 55, 87}, - { 81, 78, 79}, - { 74, 73, 49}, - { 69, 60, 45}, - { 58, 62, 64}, - { 58, 64, 61}, - { 53, 31, 32}, - { 32, 54, 53}, - { 42, 43, 38}, - { 35, 36, 0}, - { 35, 0, 1}, - { 34, 35, 1}, - { 34, 1, 9}, - { 44, 40, 41}, - { 44, 41, 45}, - { 33,240, 51}, - { 63, 62, 58}, - { 63, 58, 59}, - { 45, 71, 70}, - { 76, 75, 51}, - { 76, 51, 52}, - { 86, 85, 84}, - { 86, 84, 87}, - { 89, 72, 73}, - { 89, 73, 88}, - { 91, 92, 96}, - { 91, 96, 95}, - { 72, 91, 60}, - { 72, 60, 69}, - {104,106,105}, - {119,105,117}, - {119,117,118}, - {124,127,128}, - {117,116,129}, - {117,129,131}, - {118,117,131}, - {135,140,142}, - {146,150,152}, - {146,152,145}, - {149,122,121}, - {166,165,151}, - {166,151,156}, - {158,172,173}, - {161,160,189}, - {199,198,193}, - {199,193,191}, - {204,201,202}, - {178,174,194}, - {200,159,186}, - {109, 48, 67}, - { 48,107,104}, - {216, 32,236}, - {216,236,239}, - {223,214, 81}, - {223, 81, 82}, - { 33, 12, 15}, - { 32,228,234}, - { 32,234,236}, - {240, 31, 52}, - {256,255,246}, - {256,246,249}, - {258,263,248}, - {258,248,249}, - {275,260,259}, - {275,259,276}, - {207,276,259}, - {270,271,429}, - {270,429,407}, - {413,418,366}, - {413,366,365}, - {368,367,279}, - {368,279,280}, - {303,301,286}, - {303,286,287}, - {283,282,292}, - {283,292,291}, - {320,292,189}, - {298,296,297}, - {298,297,299}, - {318,327,326}, - {318,326,313}, - {329,330,317}, - {336,333,320}, - {326,354,353}, - {334,332,333}, - {334,333,336}, - {342,339,139}, - {342,139,138}, - {345,342,126}, - {347,357,356}, - {369,368,351}, - {363,356,357}, - {363,357,361}, - {366,367,368}, - {366,368,369}, - {375,373,400}, - { 92, 90,377}, - {409,387,408}, - {386,385,387}, - {386,387,388}, - {412,394,391}, - {396,398,399}, - {408,406,405}, - {415,421,419}, - {415,419,414}, - {425,452,448}, - {425,448,424}, - {444,441,443}, - {448,452,449}, - {448,449,447}, - {446,444,443}, - {446,443,445}, - {250,247,261}, - {250,261,428}, - {421,422,423}, - {421,423,419}, - {427,410,250}, - {417,403,401}, - {403,402,401}, - {420,392,412}, - {420,412,425}, - {420,425,424}, - {386,411,389}, - {383,382,381}, - {383,381,385}, - {378,379,404}, - {372,371,395}, - {372,395,397}, - {371,372,370}, - {361,359,360}, - {361,360,362}, - {368,350,351}, - {349,347,348}, - {356,355,344}, - {356,344,346}, - {344,341,340}, - {344,340,343}, - {338,337,336}, - {328,335,341}, - {324,352,351}, - {324,351,331}, - {320,144,336}, - {314,325,324}, - {322,308,309}, - {310,309,307}, - {287,286,289}, - {203,280,279}, - {203,279,205}, - {297,295,283}, - {297,283,284}, - {447,205,279}, - {274,384, 80}, - {274, 80,226}, - {266,267,379}, - {266,379,380}, - {225,257,246}, - {225,246,245}, - {256,254,253}, - {256,253,255}, - {430,247,250}, - {226,235,244}, - {226,244,245}, - {232,233,244}, - {232,244,241}, - {230, 18, 19}, - { 32, 31,228}, - {219,220, 86}, - {219, 86, 57}, - {226,213,235}, - {206, 7, 6}, - {122,201,101}, - {201,204,101}, - {180,196,197}, - {170,192,171}, - {200,190,189}, - {194,193,195}, - {183,181,180}, - {183,180,182}, - {155,154,168}, - {149,156,151}, - {149,151,148}, - {155,156,120}, - {145,142,143}, - {145,143,146}, - {136,137,140}, - {133,132,130}, - {128,129,116}, - {100,120,121}, - {110,112,113}, - {110,113,114}, - { 66, 65, 63}, - { 66, 63, 99}, - { 66, 99, 98}, - { 96, 46, 61}, - { 89, 88, 90}, - { 86, 87, 57}, - { 80, 78, 81}, - { 72, 69, 49}, - { 67, 48, 47}, - { 67, 47, 68}, - { 56, 55, 53}, - { 50, 49, 36}, - { 50, 36, 35}, - { 40, 39, 41}, - {242,243,229}, - {242,229,227}, - { 6, 37, 39}, - { 42, 47, 48}, - { 42, 48, 43}, - { 61, 46, 44}, - { 45, 70, 69}, - { 69, 70, 71}, - { 69, 71, 49}, - { 74, 78, 77}, - { 83, 84, 85}, - { 73, 74, 77}, - { 93, 96, 92}, - { 68, 46, 93}, - { 95, 99, 63}, - { 95, 63, 59}, - {115,108,110}, - {115,110,114}, - {125,126,127}, - {129,130,132}, - {137,133,138}, - {137,138,139}, - {148,146,143}, - {148,143,147}, - {119,118,154}, - {161,147,143}, - {165,164,151}, - {158,157,171}, - {158,171,172}, - {159,158,187}, - {159,187,186}, - {194,192,191}, - {194,191,193}, - {189,202,201}, - {182,197,184}, - {205, 8, 7}, - { 48,109,107}, - {218,219, 57}, - {218, 57, 56}, - {207,231,211}, - {232,230,231}, - {232,231,233}, - { 53, 52, 31}, - {388,411,386}, - {409,430,250}, - {262,429,254}, - {262,254,256}, - {442,444,428}, - {273,264,383}, - {273,383,384}, - {429,271,251}, - {429,251,254}, - {413,365,362}, - { 67,413,360}, - {282,283,295}, - {285,301,299}, - {202,281,280}, - {284,283,291}, - {284,291,289}, - {320,189,160}, - {308,306,307}, - {307,309,308}, - {319,317,330}, - {319,330,328}, - {353,352,324}, - {332,331,333}, - {340,341,338}, - {354,341,344}, - {349,358,357}, - {349,357,347}, - {364,355,356}, - {364,356,363}, - {364,365,366}, - {364,366,369}, - {374,376,402}, - {375, 92,373}, - { 77,389,390}, - {382,380,381}, - {389, 77,386}, - {393,394,412}, - {393,412,392}, - {401,394,416}, - {415,400,403}, - {411,410,427}, - {411,427,426}, - {422,420,424}, - {247,248,263}, - {247,263,261}, - {445,443, 14}, - {445, 14, 11}, - {449,450, 4}, - {449, 4, 5}, - {443,441, 17}, - {443, 17, 14}, - {436, 23, 17}, - {436, 17,441}, - {424,448,422}, - {448,423,422}, - {414,419,418}, - {414,418,413}, - {406,404,405}, - {399,397,395}, - {399,395,396}, - {420,416,392}, - {388,410,411}, - {386,384,383}, - {390, 88, 77}, - {375, 94, 92}, - {415,414, 68}, - {415, 68, 94}, - {370,374,402}, - {370,402,398}, - {361,357,358}, - {361,358,359}, - {125,348,126}, - {346,344,343}, - {340,338,339}, - {337,335,334}, - {337,334,336}, - {325,353,324}, - {324,331,332}, - {324,332,329}, - {323,322,309}, - {323,309,310}, - {294,295,297}, - {294,297,296}, - {289,286,285}, - {202,280,203}, - {288,307,303}, - {282,295,321}, - { 67,360,111}, - {418,423,367}, - {418,367,366}, - {272,252,251}, - {272,251,271}, - {272,271,270}, - {255,253,274}, - {265,266,380}, - {265,380,382}, - {442,428,261}, - {440,263,258}, - {440,258,260}, - {409,250,410}, - {255,226,245}, - {255,245,246}, - { 31,240,243}, - {236,234,235}, - {236,235,237}, - {233,225,245}, - {233,245,244}, - {220,221, 85}, - {220, 85, 86}, - { 81,213,226}, - { 81,226, 80}, - { 7,206,205}, - {186,184,198}, - {186,198,199}, - {204,203,205}, - {204,205,206}, - {195,193,196}, - {171,174,172}, - {173,174,175}, - {173,172,174}, - {155,167,166}, - {160,161,143}, - {160,143,144}, - {119,154,155}, - {148,151,150}, - {148,150,146}, - {140,137,139}, - {140,139,141}, - {127,126,130}, - {114,124,128}, - {114,128,115}, - {117,105,106}, - {117,106,116}, - {104,105,100}, - {104,100,103}, - { 59, 60, 91}, - { 97, 96, 61}, - { 97, 61, 64}, - { 91, 72, 89}, - { 87, 84, 79}, - { 87, 79, 76}, - { 78, 80, 77}, - { 49, 50, 74}, - { 60, 44, 45}, - { 61, 44, 58}, - { 51, 50, 35}, - { 51, 35, 34}, - { 39, 37, 41}, - { 33, 34, 9}, - { 33, 9, 12}, - { 0, 36, 37}, - { 0, 37, 6}, - { 40, 46, 47}, - { 40, 47, 42}, - { 53, 54, 56}, - { 65, 62, 63}, - { 72, 49, 73}, - { 79, 78, 75}, - { 79, 75, 76}, - { 52, 53, 76}, - { 92, 89, 90}, - { 96, 93, 46}, - {102,103,100}, - {102,100,101}, - {116,106,108}, - {116,108,115}, - {123,125,124}, - {116,115,128}, - {118,131,135}, - {140,135,136}, - {148,147,149}, - {120,119,155}, - {164,162,152}, - {164,152,150}, - {157,147,161}, - {157,161,170}, - {186,187,185}, - {186,185,184}, - {193,197,196}, - {202,203,204}, - {194,195,178}, - {198,184,197}, - { 67,111,109}, - { 38, 43,103}, - { 38,103,102}, - {214,223,222}, - {214,222,221}, - {214,221,220}, - {214,220,219}, - {214,219,218}, - {213,237,235}, - {221,222, 83}, - {221, 83, 85}, - { 15,229, 33}, - {227, 18,230}, - {227,230,232}, - { 52, 51,240}, - { 75, 78, 50}, - {408,430,409}, - {260,258,257}, - {260,257,259}, - {224,207,259}, - {268,269,405}, - {268,405,404}, - {413,362,360}, - {447, 8,205}, - {299,297,285}, - {189,281,202}, - {290,288,289}, - {290,289,291}, - {322,321,295}, - {322,295,294}, - {333,323,311}, - {333,311,320}, - {317,316,329}, - {320,160,144}, - {353,325,326}, - {329,332,334}, - {329,334,330}, - {339,338,141}, - {339,141,139}, - {348,345,126}, - {347,356,346}, - {123,349,125}, - {364,353,354}, - {364,354,355}, - {365,364,363}, - {376,391,394}, - {376,394,401}, - { 92,376,374}, - { 92,374,373}, - {377, 90, 88}, - {380,379,378}, - {380,378,381}, - {388,387,409}, - {388,409,410}, - {416,393,392}, - {399,398,402}, - {399,402,403}, - {250,428,427}, - {421,417,416}, - {421,416,420}, - {426,427,446}, - {426,446,451}, - {444,442,441}, - {452,451,450}, - {452,450,449} -}; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - // if (o1->body && o2->body) return; - - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - - dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - else return c; -} - - -// called when a key pressed - -static void command (int cmd) -{ - int i,j,k; - dReal sides[3]; - dMass m; - - cmd = locase (cmd); - if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' || cmd == 'm' || cmd == 'y' ) { - if (num < NUM) { - i = num; - num++; - } - else { - i = nextobj; - nextobj++; - if (nextobj >= num) nextobj = 0; - - // destroy the body and geoms for slot i - dBodyDestroy (obj[i].body); - for (k=0; k < GPB; k++) { - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - } - memset (&obj[i],0,sizeof(obj[i])); - } - - obj[i].body = dBodyCreate (world); - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - dMatrix3 R; - if (random_pos) { - dBodySetPosition (obj[i].body, - dRandReal()*2-1,dRandReal()*2-1,dRandReal()+3); - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - } - else { - dReal maxheight = 0; - for (k=0; k maxheight) maxheight = pos[2]; - } - dBodySetPosition (obj[i].body, 0,0,maxheight+1); - dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0); - } - dBodySetRotation (obj[i].body,R); - dBodySetData (obj[i].body,(void*)(size_t)i); - - if (cmd == 'b') { - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - } - else if (cmd == 'c') { - sides[0] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCapsule (space,sides[0],sides[1]); - } - else if (cmd == 'y') { - sides[1] *= 0.5; - dMassSetCylinder (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); - } - else if (cmd == 's') { - sides[0] *= 0.5; - dMassSetSphere (&m,DENSITY,sides[0]); - obj[i].geom[0] = dCreateSphere (space,sides[0]); - } - else if (cmd == 'm') { - dTriMeshDataID new_tmdata = dGeomTriMeshDataCreate(); - dGeomTriMeshDataBuildSingle(new_tmdata, &Vertices[0], 3 * sizeof(float), VertexCount, (int*)&Indices[0], IndexCount, 3 * sizeof(int)); - - obj[i].geom[0] = dCreateTriMesh(space, new_tmdata, 0, 0, 0); - - // remember the mesh's dTriMeshDataID on its userdata for convenience. - dGeomSetData(obj[i].geom[0], new_tmdata); - - dMassSetTrimesh( &m, DENSITY, obj[i].geom[0] ); - printf("mass at %f %f %f\n", m.c[0], m.c[1], m.c[2]); - dGeomSetPosition(obj[i].geom[0], -m.c[0], -m.c[1], -m.c[2]); - dMassTranslate(&m, -m.c[0], -m.c[1], -m.c[2]); - } - else if (cmd == 'x') { - dGeomID g2[GPB]; // encapsulated geometries - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - - // start accumulating masses for the encapsulated geometries - dMass m2; - dMassSetZero (&m); - - // set random delta positions - for (j=0; j= num) selected = 0; - if (selected < 0) selected = 0; - } - else if (cmd == 'd' && selected >= 0 && selected < num) { - dBodyDisable (obj[selected].body); - } - else if (cmd == 'e' && selected >= 0 && selected < num) { - dBodyEnable (obj[selected].body); - } - else if (cmd == 'a') { - show_aabb ^= 1; - } - else if (cmd == 't') { - show_contacts ^= 1; - } - else if (cmd == 'r') { - random_pos ^= 1; - } -} - - -// draw a geom - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) -{ - if (!g) return; - if (!pos) pos = dGeomGetPosition (g); - if (!R) R = dGeomGetRotation (g); - - int type = dGeomGetClass (g); - if (type == dBoxClass) { - dVector3 sides; - dGeomBoxGetLengths (g,sides); - dsDrawBox (pos,R,sides); - } - else if (type == dSphereClass) { - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - } - else if (type == dCapsuleClass) { - dReal radius,length; - dGeomCapsuleGetParams (g,&radius,&length); - dsDrawCapsule (pos,R,length,radius); - } - else if (type == dCylinderClass) { - dReal radius,length; - dGeomCylinderGetParams (g,&radius,&length); - dsDrawCylinder (pos,R,length,radius); - } - - else if (type == dGeomTransformClass) { - dGeomID g2 = dGeomTransformGetGeom (g); - const dReal *pos2 = dGeomGetPosition (g2); - const dReal *R2 = dGeomGetRotation (g2); - dVector3 actual_pos; - dMatrix3 actual_R; - dMULTIPLY0_331 (actual_pos,R,pos2); - actual_pos[0] += pos[0]; - actual_pos[1] += pos[1]; - actual_pos[2] += pos[2]; - dMULTIPLY0_333 (actual_R,R,R2); - drawGeom (g2,actual_pos,actual_R,0); - } - - if (show_aabb) { - // draw the bounding box for this geom - dReal aabb[6]; - dGeomGetAABB (g,aabb); - dVector3 bbpos; - for (int i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - dVector3 bbsides; - for (int j=0; j<3; j++) bbsides[j] = aabb[j*2+1] - aabb[j*2]; - dMatrix3 RI; - dRSetIdentity (RI); - dsSetColorAlpha (1,0,0,0.5); - dsDrawBox (bbpos,RI,bbsides); - } -} - - -// set previous transformation matrix for trimesh -void setCurrentTransform(dGeomID geom) -{ - const dReal* Pos = dGeomGetPosition(geom); - const dReal* Rot = dGeomGetRotation(geom); - - const dReal Transform[16] = - { - Rot[0], Rot[4], Rot[8], 0, - Rot[1], Rot[5], Rot[9], 0, - Rot[2], Rot[6], Rot[10], 0, - Pos[0], Pos[1], Pos[2], 1 - }; - - dGeomTriMeshSetLastTransform( geom, *(dMatrix4*)(&Transform) ); - -} - - -// simulation loop - -static void simLoop (int pause) -{ - dsSetColor (0,0,2); - dSpaceCollide (space,0,&nearCallback); - - -#if 0 - // What is this for??? - Bram - if (!pause) - { - for (int i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -//**************************************************************************** -// matrix accessors - -#define _A(i,j) A[(i)*4+(j)] -#define _I(i,j) I[(i)*4+(j)] -#define _R(i,j) R[(i)*4+(j)] - -//**************************************************************************** -// tolerances - -#ifdef dDOUBLE -const double tol = 1e-10; -#endif - -#ifdef dSINGLE -const double tol = 1e-5; -#endif - -//**************************************************************************** -// misc messages and error handling - -#ifdef __GNUC__ -#define HEADER printf ("%s()\n", __FUNCTION__); -#else -#define HEADER printf ("%s:%d\n",__FILE__,__LINE__); -#endif - -static jmp_buf jump_buffer; - - -void myMessageFunction (int num, const char *msg, va_list ap) -{ - printf ("(Message %d: ",num); - vprintf (msg,ap); - printf (")"); - dSetMessageHandler (0); - longjmp (jump_buffer,1); -} - - -#define TRAP_MESSAGE(do,ifnomsg,ifmsg) \ - dSetMessageHandler (&myMessageFunction); \ - if (setjmp (jump_buffer)) { \ - dSetMessageHandler (0); \ - ifmsg ; \ - } \ - else { \ - dSetMessageHandler (&myMessageFunction); \ - do ; \ - ifnomsg ; \ - } \ - dSetMessageHandler (0); - -//**************************************************************************** -// utility stuff - -// compare two numbers, within a threshhold, return 1 if approx equal - -int cmp (dReal a, dReal b) -{ - return (fabs(a-b) < tol); -} - -//**************************************************************************** -// matrix utility stuff - -// compare a 3x3 matrix with the identity - -int cmpIdentityMat3 (dMatrix3 A) -{ - return - (cmp(_A(0,0),1.0) && cmp(_A(0,1),0.0) && cmp(_A(0,2),0.0) && - cmp(_A(1,0),0.0) && cmp(_A(1,1),1.0) && cmp(_A(1,2),0.0) && - cmp(_A(2,0),0.0) && cmp(_A(2,1),0.0) && cmp(_A(2,2),1.0)); -} - - -// transpose a 3x3 matrix in-line - -void transpose3x3 (dMatrix3 A) -{ - dReal tmp; - tmp=A[4]; A[4]=A[1]; A[1]=tmp; - tmp=A[8]; A[8]=A[2]; A[2]=tmp; - tmp=A[9]; A[9]=A[6]; A[6]=tmp; -} - -//**************************************************************************** -// test miscellaneous math functions - -void testRandomNumberGenerator() -{ - HEADER; - if (dTestRand()) printf ("\tpassed\n"); - else printf ("\tFAILED\n"); -} - - -void testInfinity() -{ - HEADER; - if (1e10 < dInfinity && -1e10 > -dInfinity && -dInfinity < dInfinity) - printf ("\tpassed\n"); - else printf ("\tFAILED\n"); -} - - -void testPad() -{ - HEADER; - char s[100]; - s[0]=0; - for (int i=0; i<=16; i++) sprintf (s+strlen(s),"%d ",dPAD(i)); - printf ("\t%s\n", strcmp(s,"0 1 4 4 4 8 8 8 8 12 12 12 12 16 16 16 16 ") ? - "FAILED" : "passed"); -} - - -void testCrossProduct() -{ - HEADER; - - dVector3 a1,a2,b,c; - dMatrix3 B; - dMakeRandomVector (b,3,1.0); - dMakeRandomVector (c,3,1.0); - - dCROSS (a1,=,b,c); - - dSetZero (B,12); - dCROSSMAT (B,b,4,+,-); - dMultiply0 (a2,B,c,3,3,1); - - dReal diff = dMaxDifference(a1,a2,3,1); - printf ("\t%s\n", diff > tol ? "FAILED" : "passed"); -} - - -void testSetZero() -{ - HEADER; - dReal a[100]; - dMakeRandomVector (a,100,1.0); - dSetZero (a,100); - for (int i=0; i<100; i++) if (a[i] != 0.0) { - printf ("\tFAILED\n"); - return; - } - printf ("\tpassed\n"); -} - - -void testNormalize3() -{ - HEADER; - int i,j,bad=0; - dVector3 n1,n2; - for (i=0; i<1000; i++) { - dMakeRandomVector (n1,3,1.0); - for (j=0; j<3; j++) n2[j]=n1[j]; - dNormalize3 (n2); - if (dFabs(dDOT(n2,n2) - 1.0) > tol) bad |= 1; - if (dFabs(n2[0]/n1[0] - n2[1]/n1[1]) > tol) bad |= 2; - if (dFabs(n2[0]/n1[0] - n2[2]/n1[2]) > tol) bad |= 4; - if (dFabs(n2[1]/n1[1] - n2[2]/n1[2]) > tol) bad |= 8; - if (dFabs(dDOT(n2,n1) - dSqrt(dDOT(n1,n1))) > tol) bad |= 16; - if (bad) { - printf ("\tFAILED (code=%x)\n",bad); - return; - } - } - printf ("\tpassed\n"); -} - - -/* -void testReorthonormalize() -{ - HEADER; - dMatrix3 R,I; - dMakeRandomMatrix (R,3,3,1.0); - for (int i=0; i<30; i++) dReorthonormalize (R); - dMultiply2 (I,R,R,3,3,3); - printf ("\t%s\n",cmpIdentityMat3 (I) ? "passed" : "FAILED"); -} -*/ - - -void testPlaneSpace() -{ - HEADER; - dVector3 n,p,q; - int bad = 0; - for (int i=0; i<1000; i++) { - dMakeRandomVector (n,3,1.0); - dNormalize3 (n); - dPlaneSpace (n,p,q); - if (fabs(dDOT(n,p)) > tol) bad = 1; - if (fabs(dDOT(n,q)) > tol) bad = 1; - if (fabs(dDOT(p,q)) > tol) bad = 1; - if (fabs(dDOT(p,p)-1) > tol) bad = 1; - if (fabs(dDOT(q,q)-1) > tol) bad = 1; - } - printf ("\t%s\n", bad ? "FAILED" : "passed"); -} - -//**************************************************************************** -// test matrix functions - -#define MSIZE 21 -#define MSIZE4 24 // MSIZE rounded up to 4 - - -void testMatrixMultiply() -{ - // A is 2x3, B is 3x4, B2 is B except stored columnwise, C is 2x4 - dReal A[8],B[12],A2[12],B2[16],C[8]; - int i; - - HEADER; - dSetZero (A,8); - for (i=0; i<3; i++) A[i] = i+2; - for (i=0; i<3; i++) A[i+4] = i+3+2; - for (i=0; i<12; i++) B[i] = i+8; - dSetZero (A2,12); - for (i=0; i<6; i++) A2[i+2*(i/2)] = A[i+i/3]; - dSetZero (B2,16); - for (i=0; i<12; i++) B2[i+i/3] = B[i]; - - dMultiply0 (C,A,B,2,3,4); - if (C[0] != 116 || C[1] != 125 || C[2] != 134 || C[3] != 143 || - C[4] != 224 || C[5] != 242 || C[6] != 260 || C[7] != 278) - printf ("\tFAILED (1)\n"); else printf ("\tpassed (1)\n"); - - dMultiply1 (C,A2,B,2,3,4); - if (C[0] != 160 || C[1] != 172 || C[2] != 184 || C[3] != 196 || - C[4] != 196 || C[5] != 211 || C[6] != 226 || C[7] != 241) - printf ("\tFAILED (2)\n"); else printf ("\tpassed (2)\n"); - - dMultiply2 (C,A,B2,2,3,4); - if (C[0] != 83 || C[1] != 110 || C[2] != 137 || C[3] != 164 || - C[4] != 164 || C[5] != 218 || C[6] != 272 || C[7] != 326) - printf ("\tFAILED (3)\n"); else printf ("\tpassed (3)\n"); -} - - -void testSmallMatrixMultiply() -{ - dMatrix3 A,B,C,A2; - dVector3 a,a2,x; - - HEADER; - dMakeRandomMatrix (A,3,3,1.0); - dMakeRandomMatrix (B,3,3,1.0); - dMakeRandomMatrix (C,3,3,1.0); - dMakeRandomMatrix (x,3,1,1.0); - - // dMULTIPLY0_331() - dMULTIPLY0_331 (a,B,x); - dMultiply0 (a2,B,x,3,3,1); - printf ("\t%s (1)\n",(dMaxDifference (a,a2,3,1) > tol) ? "FAILED" : - "passed"); - - // dMULTIPLY1_331() - dMULTIPLY1_331 (a,B,x); - dMultiply1 (a2,B,x,3,3,1); - printf ("\t%s (2)\n",(dMaxDifference (a,a2,3,1) > tol) ? "FAILED" : - "passed"); - - // dMULTIPLY0_133 - dMULTIPLY0_133 (a,x,B); - dMultiply0 (a2,x,B,1,3,3); - printf ("\t%s (3)\n",(dMaxDifference (a,a2,1,3) > tol) ? "FAILED" : - "passed"); - - // dMULTIPLY0_333() - dMULTIPLY0_333 (A,B,C); - dMultiply0 (A2,B,C,3,3,3); - printf ("\t%s (4)\n",(dMaxDifference (A,A2,3,3) > tol) ? "FAILED" : - "passed"); - - // dMULTIPLY1_333() - dMULTIPLY1_333 (A,B,C); - dMultiply1 (A2,B,C,3,3,3); - printf ("\t%s (5)\n",(dMaxDifference (A,A2,3,3) > tol) ? "FAILED" : - "passed"); - - // dMULTIPLY2_333() - dMULTIPLY2_333 (A,B,C); - dMultiply2 (A2,B,C,3,3,3); - printf ("\t%s (6)\n",(dMaxDifference (A,A2,3,3) > tol) ? "FAILED" : - "passed"); -} - - -void testCholeskyFactorization() -{ - dReal A[MSIZE4*MSIZE], B[MSIZE4*MSIZE], C[MSIZE4*MSIZE], diff; - HEADER; - dMakeRandomMatrix (A,MSIZE,MSIZE,1.0); - dMultiply2 (B,A,A,MSIZE,MSIZE,MSIZE); - memcpy (A,B,MSIZE4*MSIZE*sizeof(dReal)); - if (dFactorCholesky (B,MSIZE)) printf ("\tpassed (1)\n"); - else printf ("\tFAILED (1)\n"); - dClearUpperTriangle (B,MSIZE); - dMultiply2 (C,B,B,MSIZE,MSIZE,MSIZE); - diff = dMaxDifference(A,C,MSIZE,MSIZE); - printf ("\tmaximum difference = %.6e - %s (2)\n",diff, - diff > tol ? "FAILED" : "passed"); -} - - -void testCholeskySolve() -{ - dReal A[MSIZE4*MSIZE], L[MSIZE4*MSIZE], b[MSIZE],x[MSIZE],btest[MSIZE],diff; - HEADER; - - // get A,L = PD matrix - dMakeRandomMatrix (A,MSIZE,MSIZE,1.0); - dMultiply2 (L,A,A,MSIZE,MSIZE,MSIZE); - memcpy (A,L,MSIZE4*MSIZE*sizeof(dReal)); - - // get b,x = right hand side - dMakeRandomMatrix (b,MSIZE,1,1.0); - memcpy (x,b,MSIZE*sizeof(dReal)); - - // factor L - if (dFactorCholesky (L,MSIZE)) printf ("\tpassed (1)\n"); - else printf ("\tFAILED (1)\n"); - dClearUpperTriangle (L,MSIZE); - - // solve A*x = b - dSolveCholesky (L,x,MSIZE); - - // compute A*x and compare it with b - dMultiply2 (btest,A,x,MSIZE,MSIZE,1); - diff = dMaxDifference(b,btest,MSIZE,1); - printf ("\tmaximum difference = %.6e - %s (2)\n",diff, - diff > tol ? "FAILED" : "passed"); -} - - -void testInvertPDMatrix() -{ - int i,j,ok; - dReal A[MSIZE4*MSIZE], Ainv[MSIZE4*MSIZE], I[MSIZE4*MSIZE]; - HEADER; - - dMakeRandomMatrix (A,MSIZE,MSIZE,1.0); - dMultiply2 (Ainv,A,A,MSIZE,MSIZE,MSIZE); - memcpy (A,Ainv,MSIZE4*MSIZE*sizeof(dReal)); - dSetZero (Ainv,MSIZE4*MSIZE); - - if (dInvertPDMatrix (A,Ainv,MSIZE)) - printf ("\tpassed (1)\n"); else printf ("\tFAILED (1)\n"); - dMultiply0 (I,A,Ainv,MSIZE,MSIZE,MSIZE); - - // compare with identity - ok = 1; - for (i=0; i tol ? "FAILED" : "passed"); -} - - -void testSolveLDLT() -{ - dReal A[MSIZE4*MSIZE], L[MSIZE4*MSIZE], d[MSIZE], x[MSIZE], - b[MSIZE], btest[MSIZE], diff; - HEADER; - dMakeRandomMatrix (A,MSIZE,MSIZE,1.0); - dMultiply2 (L,A,A,MSIZE,MSIZE,MSIZE); - memcpy (A,L,MSIZE4*MSIZE*sizeof(dReal)); - - dMakeRandomMatrix (b,MSIZE,1,1.0); - memcpy (x,b,MSIZE*sizeof(dReal)); - - dFactorLDLT (L,d,MSIZE,MSIZE4); - dSolveLDLT (L,d,x,MSIZE,MSIZE4); - - dMultiply2 (btest,A,x,MSIZE,MSIZE,1); - diff = dMaxDifference(b,btest,MSIZE,1); - printf ("\tmaximum difference = %.6e - %s\n",diff, - diff > tol ? "FAILED" : "passed"); -} - - -void testLDLTAddTL() -{ - int i,j; - dReal A[MSIZE4*MSIZE], L[MSIZE4*MSIZE], d[MSIZE], a[MSIZE], - DL[MSIZE4*MSIZE], ATEST[MSIZE4*MSIZE], diff; - HEADER; - - dMakeRandomMatrix (A,MSIZE,MSIZE,1.0); - dMultiply2 (L,A,A,MSIZE,MSIZE,MSIZE); - memcpy (A,L,MSIZE4*MSIZE*sizeof(dReal)); - dFactorLDLT (L,d,MSIZE,MSIZE4); - - // delete first row and column of factorization - for (i=0; i tol ? "FAILED" : "passed"); -} - - -void testLDLTRemove() -{ - int i,j,r,p[MSIZE]; - dReal A[MSIZE4*MSIZE], L[MSIZE4*MSIZE], d[MSIZE], - L2[MSIZE4*MSIZE], d2[MSIZE], DL2[MSIZE4*MSIZE], - Atest1[MSIZE4*MSIZE], Atest2[MSIZE4*MSIZE], diff, maxdiff; - HEADER; - - // make array of A row pointers - dReal *Arows[MSIZE]; - for (i=0; i= r) ii--; - if (jj >= r) jj--; - if (A[i*MSIZE4+j] != Atest1[ii*MSIZE4+jj]) bad = 1; - } - } - } - if (bad) printf ("\trow/col removal FAILED for row %d\n",r); - - // zero out last row/column of Atest1 - for (i=0; i tol ? "FAILED" : "passed"); -} - -//**************************************************************************** -// test mass stuff - -#define NUMP 10 // number of particles - - -void printMassParams (dMass *m) -{ - printf ("mass = %.4f\n",m->mass); - printf ("com = (%.4f,%.4f,%.4f)\n",m->c[0],m->c[1],m->c[2]); - printf ("I = [ %10.4f %10.4f %10.4f ]\n" - " [ %10.4f %10.4f %10.4f ]\n" - " [ %10.4f %10.4f %10.4f ]\n", - m->_I(0,0),m->_I(0,1),m->_I(0,2), - m->_I(1,0),m->_I(1,1),m->_I(1,2), - m->_I(2,0),m->_I(2,1),m->_I(2,2)); -} - - -void compareMassParams (dMass *m1, dMass *m2, char *msg) -{ - int i,j,ok = 1; - if (!(cmp(m1->mass,m2->mass) && cmp(m1->c[0],m2->c[0]) && - cmp(m1->c[1],m2->c[1]) && cmp(m1->c[2],m2->c[2]))) - ok = 0; - for (i=0; i<3; i++) for (j=0; j<3; j++) - if (cmp (m1->_I(i,j),m2->_I(i,j))==0) ok = 0; - if (ok) printf ("\tpassed (%s)\n",msg); else printf ("\tFAILED (%s)\n",msg); -} - - -// compute the mass parameters of a particle set - -void computeMassParams (dMass *m, dReal q[NUMP][3], dReal pm[NUMP]) -{ - int i,j; - dMassSetZero (m); - for (i=0; imass += pm[i]; - for (j=0; j<3; j++) m->c[j] += pm[i]*q[i][j]; - m->_I(0,0) += pm[i]*(q[i][1]*q[i][1] + q[i][2]*q[i][2]); - m->_I(1,1) += pm[i]*(q[i][0]*q[i][0] + q[i][2]*q[i][2]); - m->_I(2,2) += pm[i]*(q[i][0]*q[i][0] + q[i][1]*q[i][1]); - m->_I(0,1) -= pm[i]*(q[i][0]*q[i][1]); - m->_I(0,2) -= pm[i]*(q[i][0]*q[i][2]); - m->_I(1,2) -= pm[i]*(q[i][1]*q[i][2]); - } - for (j=0; j<3; j++) m->c[j] /= m->mass; - m->_I(1,0) = m->_I(0,1); - m->_I(2,0) = m->_I(0,2); - m->_I(2,1) = m->_I(1,2); -} - - -void testMassFunctions() -{ - dMass m; - int i,j; - dReal q[NUMP][3]; // particle positions - dReal pm[NUMP]; // particle masses - dMass m1,m2; - dMatrix3 R; - - HEADER; - - printf ("\t"); - dMassSetZero (&m); - TRAP_MESSAGE (dMassSetParameters (&m,10, 0,0,0, 1,2,3, 4,5,6), - printf (" FAILED (1)\n"), printf (" passed (1)\n")); - - printf ("\t"); - dMassSetZero (&m); - TRAP_MESSAGE (dMassSetParameters (&m,10, 0.1,0.2,0.15, 3,5,14, 3.1,3.2,4), - printf (" passed (2)\n") , printf (" FAILED (2)\n")); - if (m.mass==10 && m.c[0]==REAL(0.1) && m.c[1]==REAL(0.2) && - m.c[2]==REAL(0.15) && m._I(0,0)==3 && m._I(1,1)==5 && m._I(2,2)==14 && - m._I(0,1)==REAL(3.1) && m._I(0,2)==REAL(3.2) && m._I(1,2)==4 && - m._I(1,0)==REAL(3.1) && m._I(2,0)==REAL(3.2) && m._I(2,1)==4) - printf ("\tpassed (3)\n"); else printf ("\tFAILED (3)\n"); - - dMassSetZero (&m); - dMassSetSphere (&m,1.4, 0.86); - if (cmp(m.mass,3.73002719949386) && m.c[0]==0 && m.c[1]==0 && m.c[2]==0 && - cmp(m._I(0,0),1.10349124669826) && - cmp(m._I(1,1),1.10349124669826) && - cmp(m._I(2,2),1.10349124669826) && - m._I(0,1)==0 && m._I(0,2)==0 && m._I(1,2)==0 && - m._I(1,0)==0 && m._I(2,0)==0 && m._I(2,1)==0) - printf ("\tpassed (4)\n"); else printf ("\tFAILED (4)\n"); - - dMassSetZero (&m); - dMassSetCapsule (&m,1.3,1,0.76,1.53); - if (cmp(m.mass,5.99961928996029) && m.c[0]==0 && m.c[1]==0 && m.c[2]==0 && - cmp(m._I(0,0),1.59461986077384) && - cmp(m._I(1,1),4.57537403079093) && - cmp(m._I(2,2),4.57537403079093) && - m._I(0,1)==0 && m._I(0,2)==0 && m._I(1,2)==0 && - m._I(1,0)==0 && m._I(2,0)==0 && m._I(2,1)==0) - printf ("\tpassed (5)\n"); else printf ("\tFAILED (5)\n"); - - dMassSetZero (&m); - dMassSetBox (&m,0.27,3,4,5); - if (cmp(m.mass,16.2) && m.c[0]==0 && m.c[1]==0 && m.c[2]==0 && - cmp(m._I(0,0),55.35) && cmp(m._I(1,1),45.9) && cmp(m._I(2,2),33.75) && - m._I(0,1)==0 && m._I(0,2)==0 && m._I(1,2)==0 && - m._I(1,0)==0 && m._I(2,0)==0 && m._I(2,1)==0) - printf ("\tpassed (6)\n"); else printf ("\tFAILED (6)\n"); - - // test dMassAdjust? - - // make random particles and compute the mass, COM and inertia, then - // translate and repeat. - for (i=0; i Q -> R works - dReal maxdiff=0; - for (i=0; i<100; i++) { - makeRandomRotation (R); - dRtoQ (R,q); - dQtoR (q,R2); - dReal diff = dMaxDifference (R,R2,3,3); - if (diff > maxdiff) maxdiff = diff; - } - printf ("\tmaximum difference = %e - %s (3)\n",maxdiff, - (maxdiff > tol) ? "FAILED" : "passed"); -} - - -void testQuaternionMultiply() -{ - HEADER; - dMatrix3 RA,RB,RC,Rtest; - dQuaternion qa,qb,qc; - dReal diff,maxdiff=0; - - for (int i=0; i<100; i++) { - makeRandomRotation (RB); - makeRandomRotation (RC); - dRtoQ (RB,qb); - dRtoQ (RC,qc); - - dMultiply0 (RA,RB,RC,3,3,3); - dQMultiply0 (qa,qb,qc); - dQtoR (qa,Rtest); - diff = dMaxDifference (Rtest,RA,3,3); - if (diff > maxdiff) maxdiff = diff; - - dMultiply1 (RA,RB,RC,3,3,3); - dQMultiply1 (qa,qb,qc); - dQtoR (qa,Rtest); - diff = dMaxDifference (Rtest,RA,3,3); - if (diff > maxdiff) maxdiff = diff; - - dMultiply2 (RA,RB,RC,3,3,3); - dQMultiply2 (qa,qb,qc); - dQtoR (qa,Rtest); - diff = dMaxDifference (Rtest,RA,3,3); - if (diff > maxdiff) maxdiff = diff; - - dMultiply0 (RA,RC,RB,3,3,3); - transpose3x3 (RA); - dQMultiply3 (qa,qb,qc); - dQtoR (qa,Rtest); - diff = dMaxDifference (Rtest,RA,3,3); - if (diff > maxdiff) maxdiff = diff; - } - printf ("\tmaximum difference = %e - %s\n",maxdiff, - (maxdiff > tol) ? "FAILED" : "passed"); -} - - -void testRotationFunctions() -{ - dMatrix3 R1; - HEADER; - - printf ("\tdRSetIdentity - "); - dMakeRandomMatrix (R1,3,3,1.0); - dRSetIdentity (R1); - if (cmpIdentityMat3(R1)) printf ("passed\n"); else printf ("FAILED\n"); - - printf ("\tdRFromAxisAndAngle - "); - - printf ("\n"); - printf ("\tdRFromEulerAngles - "); - - printf ("\n"); - printf ("\tdRFrom2Axes - "); - - printf ("\n"); -} - -//**************************************************************************** - -#include "../src/array.h" -#include "../src/array.cpp" - -// matrix header on the stack - -class dMatrixComparison { - struct dMatInfo; - dArray mat; - int afterfirst,index; - -public: - dMatrixComparison(); - ~dMatrixComparison(); - - dReal nextMatrix (dReal *A, int n, int m, int lower_tri, char *name, ...); - // add a new n*m matrix A to the sequence. the name of the matrix is given - // by the printf-style arguments (name,...). if this is the first sequence - // then this object will simply record the matrices and return 0. - // if this the second or subsequent sequence then this object will compare - // the matrices with the first sequence, and report any differences. - // the matrix error will be returned. if `lower_tri' is 1 then only the - // lower triangle of the matrix (including the diagonal) will be compared - // (the matrix must be square). - - void end(); - // end a sequence. - - void reset(); - // restarts the object, so the next sequence will be the first sequence. - - void dump(); - // print out info about all the matrices in the sequence -}; - -struct dMatrixComparison::dMatInfo { - int n,m; // size of matrix - char name[128]; // name of the matrix - dReal *data; // matrix data - int size; // size of `data' -}; - - - -dMatrixComparison::dMatrixComparison() -{ - afterfirst = 0; - index = 0; -} - - -dMatrixComparison::~dMatrixComparison() -{ - reset(); -} - - -dReal dMatrixComparison::nextMatrix (dReal *A, int n, int m, int lower_tri, - char *name, ...) -{ - if (A==0 || n < 1 || m < 1 || name==0) dDebug (0,"bad args to nextMatrix"); - int num = n*dPAD(m); - - if (afterfirst==0) { - dMatInfo *mi = (dMatInfo*) dAlloc (sizeof(dMatInfo)); - mi->n = n; - mi->m = m; - mi->size = num * sizeof(dReal); - mi->data = (dReal*) dAlloc (mi->size); - memcpy (mi->data,A,mi->size); - - va_list ap; - va_start (ap,name); - vsprintf (mi->name,name,ap); - if (strlen(mi->name) >= sizeof (mi->name)) dDebug (0,"name too long"); - - mat.push (mi); - return 0; - } - else { - if (lower_tri && n != m) - dDebug (0,"dMatrixComparison, lower triangular matrix must be square"); - if (index >= mat.size()) dDebug (0,"dMatrixComparison, too many matrices"); - dMatInfo *mp = mat[index]; - index++; - - dMatInfo mi; - va_list ap; - va_start (ap,name); - vsprintf (mi.name,name,ap); - if (strlen(mi.name) >= sizeof (mi.name)) dDebug (0,"name too long"); - - if (strcmp(mp->name,mi.name) != 0) - dDebug (0,"dMatrixComparison, name mismatch (\"%s\" and \"%s\")", - mp->name,mi.name); - if (mp->n != n || mp->m != m) - dDebug (0,"dMatrixComparison, size mismatch (%dx%d and %dx%d)", - mp->n,mp->m,n,m); - - dReal maxdiff; - if (lower_tri) { - maxdiff = dMaxDifferenceLowerTriangle (A,mp->data,n); - } - else { - maxdiff = dMaxDifference (A,mp->data,n,m); - } - if (maxdiff > tol) - dDebug (0,"dMatrixComparison, matrix error (size=%dx%d, name=\"%s\", " - "error=%.4e)",n,m,mi.name,maxdiff); - return maxdiff; - } -} - - -void dMatrixComparison::end() -{ - if (mat.size() <= 0) dDebug (0,"no matrices in sequence"); - afterfirst = 1; - index = 0; -} - - -void dMatrixComparison::reset() -{ - for (int i=0; idata,mat[i]->size); - dFree (mat[i],sizeof(dMatInfo)); - } - mat.setSize (0); - afterfirst = 0; - index = 0; -} - - -void dMatrixComparison::dump() -{ - for (int i=0; iname,mat[i]->n,mat[i]->m); -} - -//**************************************************************************** -// unit test - -#include - -// static jmp_buf jump_buffer; - -static void myDebug (int num, const char *msg, va_list ap) -{ - // printf ("(Error %d: ",num); - // vprintf (msg,ap); - // printf (")\n"); - longjmp (jump_buffer,1); -} - - -extern "C" void dTestMatrixComparison() -{ - volatile int i; - printf ("dTestMatrixComparison()\n"); - dMessageFunction *orig_debug = dGetDebugHandler(); - - dMatrixComparison mc; - dReal A[50*50]; - - // make first sequence - unsigned long seed = dRandGetSeed(); - for (i=1; i<49; i++) { - dMakeRandomMatrix (A,i,i+1,1.0); - mc.nextMatrix (A,i,i+1,0,"A%d",i); - } - mc.end(); - - //mc.dump(); - - // test identical sequence - dSetDebugHandler (&myDebug); - dRandSetSeed (seed); - if (setjmp (jump_buffer)) { - printf ("\tFAILED (1)\n"); - } - else { - for (i=1; i<49; i++) { - dMakeRandomMatrix (A,i,i+1,1.0); - mc.nextMatrix (A,i,i+1,0,"A%d",i); - } - mc.end(); - printf ("\tpassed (1)\n"); - } - dSetDebugHandler (orig_debug); - - // test broken sequences (with matrix error) - dRandSetSeed (seed); - volatile int passcount = 0; - for (i=1; i<49; i++) { - if (setjmp (jump_buffer)) { - passcount++; - } - else { - dSetDebugHandler (&myDebug); - dMakeRandomMatrix (A,i,i+1,1.0); - A[(i-1)*dPAD(i+1)+i] += REAL(0.01); - mc.nextMatrix (A,i,i+1,0,"A%d",i); - dSetDebugHandler (orig_debug); - } - } - mc.end(); - printf ("\t%s (2)\n",(passcount == 48) ? "passed" : "FAILED"); - - // test broken sequences (with name error) - dRandSetSeed (seed); - passcount = 0; - for (i=1; i<49; i++) { - if (setjmp (jump_buffer)) { - passcount++; - } - else { - dSetDebugHandler (&myDebug); - dMakeRandomMatrix (A,i,i+1,1.0); - mc.nextMatrix (A,i,i+1,0,"B%d",i); - dSetDebugHandler (orig_debug); - } - } - mc.end(); - printf ("\t%s (3)\n",(passcount == 48) ? "passed" : "FAILED"); - - // test identical sequence again - dSetDebugHandler (&myDebug); - dRandSetSeed (seed); - if (setjmp (jump_buffer)) { - printf ("\tFAILED (4)\n"); - } - else { - for (i=1; i<49; i++) { - dMakeRandomMatrix (A,i,i+1,1.0); - mc.nextMatrix (A,i,i+1,0,"A%d",i); - } - mc.end(); - printf ("\tpassed (4)\n"); - } - dSetDebugHandler (orig_debug); -} - -//**************************************************************************** - -// internal unit tests -extern "C" void dTestDataStructures(); -extern "C" void dTestMatrixComparison(); -extern "C" void dTestSolveLCP(); - - -int main() -{ - dInitODE(); - testRandomNumberGenerator(); - testInfinity(); - testPad(); - testCrossProduct(); - testSetZero(); - testNormalize3(); - //testReorthonormalize(); ... not any more - testPlaneSpace(); - testMatrixMultiply(); - testSmallMatrixMultiply(); - testCholeskyFactorization(); - testCholeskySolve(); - testInvertPDMatrix(); - testIsPositiveDefinite(); - testFastLDLTFactorization(); - testSolveLDLT(); - testLDLTAddTL(); - testLDLTRemove(); - testMassFunctions(); - testRtoQandQtoR(); - testQuaternionMultiply(); - testRotationFunctions(); - dTestMatrixComparison(); - dTestSolveLCP(); - // dTestDataStructures(); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_plane2d.cpp b/libraries/ode-0.9/ode/demo/demo_plane2d.cpp deleted file mode 100644 index 3ba4df82fc..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_plane2d.cpp +++ /dev/null @@ -1,268 +0,0 @@ -// Test my Plane2D constraint. -// Uses ode-0.35 collision API. - -# include -# include -# include -# include -# include - -# define drand48() ((double) (((double) rand()) / ((double) RAND_MAX))) - -# define N_BODIES 40 -# define STAGE_SIZE 8.0 // in m - -# define TIME_STEP 0.01 -# define K_SPRING 10.0 -# define K_DAMP 10.0 - - -static dWorld dyn_world; -static dBody dyn_bodies[N_BODIES]; -static dReal bodies_sides[N_BODIES][3]; - -static dSpaceID coll_space_id; -static dJointID plane2d_joint_ids[N_BODIES]; -static dJointGroup - coll_contacts; - - - -static void cb_start () -/*************************/ -{ - static float xyz[3] = { 0.5f*STAGE_SIZE, 0.5f*STAGE_SIZE, 0.65f*STAGE_SIZE}; - static float hpr[3] = { 90.0f, -90.0f, 0 }; - - dsSetViewpoint (xyz, hpr); -} - - - -static void cb_near_collision (void *data, dGeomID o1, dGeomID o2) -/********************************************************************/ -{ - dBodyID b1 = dGeomGetBody (o1); - dBodyID b2 = dGeomGetBody (o2); - dContact contact; - - - // exit without doing anything if the two bodies are static - if (b1 == 0 && b2 == 0) - return; - - // exit without doing anything if the two bodies are connected by a joint - if (b1 && b2 && dAreConnected (b1, b2)) - { - /* MTRAP; */ - return; - } - - contact.surface.mode = 0; - contact.surface.mu = 0; // frictionless - - if (dCollide (o1, o2, 1, &contact.geom, sizeof (dContactGeom))) - { - dJointID c = dJointCreateContact (dyn_world.id(), - coll_contacts.id (), &contact); - dJointAttach (c, b1, b2); - } -} - - -static void track_to_pos (dBody &body, dJointID joint_id, - dReal target_x, dReal target_y) -/************************************************************************/ -{ - dReal curr_x = body.getPosition()[0]; - dReal curr_y = body.getPosition()[1]; - - dJointSetPlane2DXParam (joint_id, dParamVel, 1 * (target_x - curr_x)); - dJointSetPlane2DYParam (joint_id, dParamVel, 1 * (target_y - curr_y)); -} - - - -static void cb_sim_step (int pause) -/*************************************/ -{ - if (! pause) - { - static dReal angle = 0; - - angle += REAL( 0.01 ); - - track_to_pos (dyn_bodies[0], plane2d_joint_ids[0], - dReal( STAGE_SIZE/2 + STAGE_SIZE/2.0 * cos (angle) ), - dReal( STAGE_SIZE/2 + STAGE_SIZE/2.0 * sin (angle) )); - - /* double f0 = 0.001; */ - /* for (int b = 0; b < N_BODIES; b ++) */ - /* { */ - /* double p = 1 + b / (double) N_BODIES; */ - /* double q = 2 - b / (double) N_BODIES; */ - /* dyn_bodies[b].addForce (f0 * cos (p*angle), f0 * sin (q*angle), 0); */ - /* } */ - /* dyn_bodies[0].addTorque (0, 0, 0.1); */ - - const int n = 10; - for (int i = 0; i < n; i ++) - { - dSpaceCollide (coll_space_id, 0, &cb_near_collision); - dyn_world.step (dReal(TIME_STEP/n)); - coll_contacts.empty (); - } - } - -# if 1 /* [ */ - { - // @@@ hack Plane2D constraint error reduction here: - for (int b = 0; b < N_BODIES; b ++) - { - const dReal *rot = dBodyGetAngularVel (dyn_bodies[b].id()); - const dReal *quat_ptr; - dReal quat[4], - quat_len; - - - quat_ptr = dBodyGetQuaternion (dyn_bodies[b].id()); - quat[0] = quat_ptr[0]; - quat[1] = 0; - quat[2] = 0; - quat[3] = quat_ptr[3]; - quat_len = sqrt (quat[0] * quat[0] + quat[3] * quat[3]); - quat[0] /= quat_len; - quat[3] /= quat_len; - dBodySetQuaternion (dyn_bodies[b].id(), quat); - dBodySetAngularVel (dyn_bodies[b].id(), 0, 0, rot[2]); - } - } -# endif /* ] */ - - -# if 0 /* [ */ - { - // @@@ friction - for (int b = 0; b < N_BODIES; b ++) - { - const dReal *vel = dBodyGetLinearVel (dyn_bodies[b].id()), - *rot = dBodyGetAngularVel (dyn_bodies[b].id()); - dReal s = 1.00; - dReal t = 0.99; - - dBodySetLinearVel (dyn_bodies[b].id(), s*vel[0],s*vel[1],s*vel[2]); - dBodySetAngularVel (dyn_bodies[b].id(),t*rot[0],t*rot[1],t*rot[2]); - } - } -# endif /* ] */ - - - { - // ode drawstuff - - dsSetTexture (DS_WOOD); - for (int b = 0; b < N_BODIES; b ++) - { - if (b == 0) - dsSetColor (1.0, 0.5, 1.0); - else - dsSetColor (0, 0.5, 1.0); -#ifdef dDOUBLE - dsDrawBoxD (dyn_bodies[b].getPosition(), dyn_bodies[b].getRotation(), bodies_sides[b]); -#else - dsDrawBox (dyn_bodies[b].getPosition(), dyn_bodies[b].getRotation(), bodies_sides[b]); -#endif - } - } -} - - - -extern int main -/******************/ -( - int argc, - char **argv -) -{ - int b; - dsFunctions drawstuff_functions; - - - dInitODE(); - - // dynamic world - - dReal cf_mixing;// = 1 / TIME_STEP * K_SPRING + K_DAMP; - dReal err_reduct;// = TIME_STEP * K_SPRING * cf_mixing; - err_reduct = REAL( 0.5 ); - cf_mixing = REAL( 0.001 ); - dWorldSetERP (dyn_world.id (), err_reduct); - dWorldSetCFM (dyn_world.id (), cf_mixing); - dyn_world.setGravity (0, 0.0, -1.0); - - coll_space_id = dSimpleSpaceCreate (0); - - // dynamic bodies - for (b = 0; b < N_BODIES; b ++) - { - int l = (int) (1 + sqrt ((double) N_BODIES)); - dReal x = dReal( (0.5 + (b / l)) / l * STAGE_SIZE ); - dReal y = dReal( (0.5 + (b % l)) / l * STAGE_SIZE ); - dReal z = REAL( 1.0 ) + REAL( 0.1 ) * (dReal)drand48(); - - bodies_sides[b][0] = dReal( 5 * (0.2 + 0.7*drand48()) / sqrt((double)N_BODIES) ); - bodies_sides[b][1] = dReal( 5 * (0.2 + 0.7*drand48()) / sqrt((double)N_BODIES) ); - bodies_sides[b][2] = z; - - dyn_bodies[b].create (dyn_world); - dyn_bodies[b].setPosition (x, y, z/2); - dyn_bodies[b].setData ((void*) (size_t)b); - dBodySetLinearVel (dyn_bodies[b].id (), - dReal( 3 * (drand48 () - 0.5) ), - dReal( 3 * (drand48 () - 0.5) ), 0); - - dMass m; - m.setBox (1, bodies_sides[b][0],bodies_sides[b][1],bodies_sides[b][2]); - m.adjust (REAL(0.1) * bodies_sides[b][0] * bodies_sides[b][1]); - dyn_bodies[b].setMass (&m); - - plane2d_joint_ids[b] = dJointCreatePlane2D (dyn_world.id (), 0); - dJointAttach (plane2d_joint_ids[b], dyn_bodies[b].id (), 0); - } - - dJointSetPlane2DXParam (plane2d_joint_ids[0], dParamFMax, 10); - dJointSetPlane2DYParam (plane2d_joint_ids[0], dParamFMax, 10); - - - // collision geoms and joints - dCreatePlane (coll_space_id, 1, 0, 0, 0); - dCreatePlane (coll_space_id, -1, 0, 0, -STAGE_SIZE); - dCreatePlane (coll_space_id, 0, 1, 0, 0); - dCreatePlane (coll_space_id, 0, -1, 0, -STAGE_SIZE); - - for (b = 0; b < N_BODIES; b ++) - { - dGeomID coll_box_id; - coll_box_id = dCreateBox (coll_space_id, - bodies_sides[b][0], bodies_sides[b][1], bodies_sides[b][2]); - dGeomSetBody (coll_box_id, dyn_bodies[b].id ()); - } - - coll_contacts.create (0); - - { - // simulation loop (by drawstuff lib) - drawstuff_functions.version = DS_VERSION; - drawstuff_functions.start = &cb_start; - drawstuff_functions.step = &cb_sim_step; - drawstuff_functions.command = 0; - drawstuff_functions.stop = 0; - drawstuff_functions.path_to_textures = "../../drawstuff/textures"; - - dsSimulationLoop (argc, argv, 352,288,&drawstuff_functions); - } - - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_slider.cpp b/libraries/ode-0.9/ode/demo/demo_slider.cpp deleted file mode 100644 index 5de08b0e7a..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_slider.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#endif - - -// some constants -#define SIDE (0.5f) // side length of a box -#define MASS (1.0) // mass of a box - - -// dynamics and collision objects -static dWorldID world; -static dBodyID body[2]; -static dJointID slider; - - -// state set by keyboard commands -static int occasional_error = 0; - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {1.0382f,-1.0811f,1.4700f}; - static float hpr[3] = {135.0000f,-19.5000f,0.0000f}; - dsSetViewpoint (xyz,hpr); - printf ("Press 'e' to start/stop occasional error.\n"); -} - - -// called when a key pressed - -static void command (int cmd) -{ - if (cmd == 'e' || cmd == 'E') { - occasional_error ^= 1; - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - const dReal kd = -0.3; // angular damping constant - const dReal ks = 0.5; // spring constant - if (!pause) { - // add an oscillating torque to body 0, and also damp its rotational motion - static dReal a=0; - const dReal *w = dBodyGetAngularVel (body[0]); - dBodyAddTorque (body[0],kd*w[0],kd*w[1]+0.1*cos(a),kd*w[2]+0.1*sin(a)); - a += 0.01; - - // add a spring force to keep the bodies together, otherwise they will - // fly apart along the slider axis. - const dReal *p1 = dBodyGetPosition (body[0]); - const dReal *p2 = dBodyGetPosition (body[1]); - dBodyAddForce (body[0],ks*(p2[0]-p1[0]),ks*(p2[1]-p1[1]), - ks*(p2[2]-p1[2])); - dBodyAddForce (body[1],ks*(p1[0]-p2[0]),ks*(p1[1]-p2[1]), - ks*(p1[2]-p2[2])); - - // occasionally re-orient one of the bodies to create a deliberate error. - if (occasional_error) { - static int count = 0; - if ((count % 20)==0) { - // randomly adjust orientation of body[0] - const dReal *R1; - dMatrix3 R2,R3; - R1 = dBodyGetRotation (body[0]); - dRFromAxisAndAngle (R2,dRandReal()-0.5,dRandReal()-0.5, - dRandReal()-0.5,dRandReal()-0.5); - dMultiply0 (R3,R1,R2,3,3,3); - dBodySetRotation (body[0],R3); - - // randomly adjust position of body[0] - const dReal *pos = dBodyGetPosition (body[0]); - dBodySetPosition (body[0], - pos[0]+0.2*(dRandReal()-0.5), - pos[1]+0.2*(dRandReal()-0.5), - pos[2]+0.2*(dRandReal()-0.5)); - } - count++; - } - - dWorldStep (world,0.05); - } - - dReal sides1[3] = {SIDE,SIDE,SIDE}; - dReal sides2[3] = {SIDE*0.8f,SIDE*0.8f,SIDE*2.0f}; - dsSetTexture (DS_WOOD); - dsSetColor (1,1,0); - dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides1); - dsSetColor (0,1,1); - dsDrawBox (dBodyGetPosition(body[1]),dBodyGetRotation(body[1]),sides2); -} - - -int main (int argc, char **argv) -{ - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - // create world - dInitODE(); - world = dWorldCreate(); - dMass m; - dMassSetBox (&m,1,SIDE,SIDE,SIDE); - dMassAdjust (&m,MASS); - - body[0] = dBodyCreate (world); - dBodySetMass (body[0],&m); - dBodySetPosition (body[0],0,0,1); - body[1] = dBodyCreate (world); - dBodySetMass (body[1],&m); - dQuaternion q; - dQFromAxisAndAngle (q,-1,1,0,0.25*M_PI); - dBodySetPosition (body[1],0.2,0.2,1.2); - dBodySetQuaternion (body[1],q); - - slider = dJointCreateSlider (world,0); - dJointAttach (slider,body[0],body[1]); - dJointSetSliderAxis (slider,1,1,1); - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dWorldDestroy (world); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_space.cpp b/libraries/ode-0.9/ode/demo/demo_space.cpp deleted file mode 100644 index 73101b54fb..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_space.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -/* - -testing procedure: - * create a bunch of random boxes - * test for intersections directly, put results in n^2 array - * get space to report collisions: - - all correct collisions reported - - no pair reported more than once - - no incorrect collisions reported - -*/ - - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define NUM 20 // number of boxes to test - - -// collision objects and globals - -static dSpaceID space; -static dGeomID geom[NUM]; -static dReal bounds[NUM][6]; -static size_t good_matrix[NUM][NUM]; // correct collision matrix -static size_t test_matrix[NUM][NUM]; // testing collision matrix -static size_t hits[NUM]; // number of collisions a box has -static unsigned long seed=37; - - -static void init_test() -{ - int i,j; - const dReal scale = 0.5; - - // set random boxes - dRandSetSeed (seed); - for (i=0; i < NUM; i++) { - bounds[i][0] = dRandReal()*2-1; - bounds[i][1] = bounds[i][0] + dRandReal()*scale; - bounds[i][2] = dRandReal()*2-1; - bounds[i][3] = bounds[i][2] + dRandReal()*scale; - bounds[i][4] = dRandReal()*2; - bounds[i][5] = bounds[i][4] + dRandReal()*scale; - - if (geom[i]) dGeomDestroy (geom[i]); - geom[i] = dCreateBox (space, - bounds[i][1] - bounds[i][0], - bounds[i][3] - bounds[i][2], - bounds[i][5] - bounds[i][4]); - dGeomSetPosition (geom[i], - (bounds[i][0] + bounds[i][1])*0.5, - (bounds[i][2] + bounds[i][3])*0.5, - (bounds[i][4] + bounds[i][5])*0.5); - dGeomSetData (geom[i],(void*)(size_t)(i)); - } - - // compute all intersections and put the results in "good_matrix" - for (i=0; i < NUM; i++) { - for (j=0; j < NUM; j++) good_matrix[i][j] = 0; - } - for (i=0; i < NUM; i++) hits[i] = 0; - - for (i=0; i < NUM; i++) { - for (j=i+1; j < NUM; j++) { - dReal *bounds1 = &bounds[i][0]; - dReal *bounds2 = &bounds[j][0]; - if (bounds1[0] > bounds2[1] || - bounds1[1] < bounds2[0] || - bounds1[2] > bounds2[3] || - bounds1[3] < bounds2[2] || - bounds1[4] > bounds2[5] || - bounds1[5] < bounds2[4]) continue; - good_matrix[i][j] = 1; - good_matrix[j][i] = 1; - hits[i]++; - hits[j]++; - } - } -} - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - size_t i,j; - i = (size_t) dGeomGetData (o1); - j = (size_t) dGeomGetData (o2); - if (i==j) - printf ("collision (%d,%d) is between the same object\n",i,j); - if (!good_matrix[i][j] || !good_matrix[j][i]) - printf ("collision (%d,%d) is incorrect\n",i,j); - if (test_matrix[i][j] || test_matrix[j][i]) - printf ("collision (%d,%d) reported more than once\n",i,j); - test_matrix[i][j] = 1; - test_matrix[j][i] = 1; -} - - -// start simulation - set viewpoint - -static void start() -{ - static float xyz[3] = {2.1640f,-1.3079f,1.7600f}; - static float hpr[3] = {125.5000f,-17.0000f,0.0000f}; - dsSetViewpoint (xyz,hpr); -} - - -static void command (int cmd) -{ - if (cmd == ' ') { - seed++; - init_test(); - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - int i,j; - - for (i=0; i < NUM; i++) { - for (j=0; j < NUM; j++) test_matrix[i][j] = 0; - } - dSpaceCollide (space,0,&nearCallback); - for (i=0; i < NUM; i++) { - for (j=i+1; j < NUM; j++) { - if (good_matrix[i][j] && !test_matrix[i][j]) { - printf ("failed to report collision (%d,%d) (seed=%ld)\n",i,j,seed); - } - } - } - - seed++; - init_test(); - - for (i=0; i 0) dsSetColor (1,0,0); - else dsSetColor (1,1,0); - dsDrawBox (pos,R,side); - } -} - - -int main (int argc, char **argv) -{ - int i; - - // setup pointers to drawstuff callback functions - dsFunctions fn; - fn.version = DS_VERSION; - fn.start = &start; - fn.step = &simLoop; - fn.command = &command; - fn.stop = 0; - fn.path_to_textures = "../../drawstuff/textures"; - if(argc==2) - { - fn.path_to_textures = argv[1]; - } - - dInitODE(); - - // test the simple space: - // space = dSimpleSpaceCreate(); - - // test the hash space: - // space = dHashSpaceCreate (0); - // dHashSpaceSetLevels (space,-10,10); - - // test the quadtree space - dVector3 Center = {0, 0, 0, 0}; - dVector3 Extents = {10, 0, 10, 0}; - space = dQuadTreeSpaceCreate(0, Center, Extents, 7); - - for (i=0; i < NUM; i++) geom[i] = 0; - init_test(); - - // run simulation - dsSimulationLoop (argc,argv,352,288,&fn); - - dSpaceDestroy (space); - dCloseODE(); - return 0; -} diff --git a/libraries/ode-0.9/ode/demo/demo_space_stress.cpp b/libraries/ode-0.9/ode/demo/demo_space_stress.cpp deleted file mode 100644 index e1be369ed5..0000000000 --- a/libraries/ode-0.9/ode/demo/demo_space_stress.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/************************************************************************* - * * - * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. * - * All rights reserved. Email: russ@q12.org Web: www.q12.org * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of EITHER: * - * (1) The GNU Lesser General Public License as published by the Free * - * Software Foundation; either version 2.1 of the License, or (at * - * your option) any later version. The text of the GNU Lesser * - * General Public License is included with this library in the * - * file LICENSE.TXT. * - * (2) The BSD-style license that is included with this library in * - * the file LICENSE-BSD.TXT. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * - * LICENSE.TXT and LICENSE-BSD.TXT for more details. * - * * - *************************************************************************/ - -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define NUM 10000 // max number of objects -#define DENSITY (5.0) // density of all objects -#define GPB 3 // maximum number of geometries per body -#define MAX_CONTACTS 4 // maximum number of contact points per body -#define WORLD_SIZE 100 - - -// dynamics and collision objects - -struct MyObject { - dBodyID body; // the body - dGeomID geom[GPB]; // geometries representing this body -}; - -static int num=0; // number of objects in simulation -static int nextobj=0; // next object to recycle if num==NUM -static dWorldID world; -static dSpaceID space; -static MyObject obj[NUM]; -static dJointGroupID contactgroup; -static int selected = -1; // selected object -static int show_aabb = 0; // show geom AABBs? -static int show_contacts = 0; // show contact points? -static int random_pos = 1; // drop objects from random position? -static int draw_geom = 1; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - // if (o1->body && o2->body) return; - - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - - dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - else return c; -} - - -// called when a key pressed - -static void command (int cmd) -{ - int i,j,k; - dReal sides[3]; - dMass m; - - cmd = locase (cmd); - if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' - /* || cmd == 'l' */) { - if (num < NUM) { - i = num; - num++; - } - else { - i = nextobj; - nextobj++; - if (nextobj >= num) nextobj = 0; - - // destroy the body and geoms for slot i - dBodyDestroy (obj[i].body); - for (k=0; k < GPB; k++) { - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - } - memset (&obj[i],0,sizeof(obj[i])); - } - - obj[i].body = dBodyCreate (world); - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - dMatrix3 R; - if (random_pos) { - dBodySetPosition (obj[i].body, - dRandReal()*WORLD_SIZE-(WORLD_SIZE/2),dRandReal()*WORLD_SIZE-(WORLD_SIZE/2),dRandReal()+1); - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - } - else { - dReal maxheight = 0; - for (k=0; k maxheight) maxheight = pos[2]; - } - dBodySetPosition (obj[i].body, 0,0,maxheight+1); - dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0); - } - dBodySetRotation (obj[i].body,R); - dBodySetData (obj[i].body,(void*)(size_t)i); - - if (cmd == 'b') { - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - } - else if (cmd == 'c') { - sides[0] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCapsule (space,sides[0],sides[1]); - } -/* - // cylinder option not yet implemented - else if (cmd == 'l') { - sides[1] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); - } -*/ - else if (cmd == 's') { - sides[0] *= 0.5; - dMassSetSphere (&m,DENSITY,sides[0]); - obj[i].geom[0] = dCreateSphere (space,sides[0]); - } - else if (cmd == 'x') { - dGeomID g2[GPB]; // encapsulated geometries - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - - // start accumulating masses for the encapsulated geometries - dMass m2; - dMassSetZero (&m); - - // set random delta positions - for (j=0; j= num) selected = 0; - if (selected < 0) selected = 0; - } - else if (cmd == 'd' && selected >= 0 && selected < num) { - dBodyDisable (obj[selected].body); - } - else if (cmd == 'e' && selected >= 0 && selected < num) { - dBodyEnable (obj[selected].body); - } - else if (cmd == 'a') { - show_aabb ^= 1; - } - else if (cmd == 't') { - show_contacts ^= 1; - } - else if (cmd == 'r') { - random_pos ^= 1; - } - else if (cmd == 'o') { - draw_geom ^= 1; - } -} - - -// draw a geom - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) -{ - if (!draw_geom){ - return; - } - - if (!g) return; - if (!pos) pos = dGeomGetPosition (g); - if (!R) R = dGeomGetRotation (g); - - int type = dGeomGetClass (g); - if (type == dBoxClass) { - dVector3 sides; - dGeomBoxGetLengths (g,sides); - dsDrawBox (pos,R,sides); - } - else if (type == dSphereClass) { - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - } - else if (type == dCapsuleClass) { - dReal radius,length; - dGeomCapsuleGetParams (g,&radius,&length); - dsDrawCapsule (pos,R,length,radius); - } -/* - // cylinder option not yet implemented - else if (type == dCylinderClass) { - dReal radius,length; - dGeomCylinderGetParams (g,&radius,&length); - dsDrawCylinder (pos,R,length,radius); - } -*/ - else if (type == dGeomTransformClass) { - dGeomID g2 = dGeomTransformGetGeom (g); - const dReal *pos2 = dGeomGetPosition (g2); - const dReal *R2 = dGeomGetRotation (g2); - dVector3 actual_pos; - dMatrix3 actual_R; - dMULTIPLY0_331 (actual_pos,R,pos2); - actual_pos[0] += pos[0]; - actual_pos[1] += pos[1]; - actual_pos[2] += pos[2]; - dMULTIPLY0_333 (actual_R,R,R2); - drawGeom (g2,actual_pos,actual_R,0); - } - - if (show_aabb) { - // draw the bounding box for this geom - dReal aabb[6]; - dGeomGetAABB (g,aabb); - dVector3 bbpos; - for (int i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - dVector3 bbsides; - for (int j=0; j<3; j++) bbsides[j] = aabb[j*2+1] - aabb[j*2]; - dMatrix3 RI; - dRSetIdentity (RI); - dsSetColorAlpha (1,0,0,0.5); - dsDrawBox (bbpos,RI,bbsides); - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - dsSetColor (0,0,2); - dSpaceCollide (space,0,&nearCallback); - //if (!pause) dWorldStep (world,0.05); - //if (!pause) dWorldStepFast (world,0.05, 1); - - // remove all contact joints - dJointGroupEmpty (contactgroup); - - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - for (int i=0; i -#include -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#endif - - -// some constants - -#define NUM 10 // number of bodies -#define NUMJ 9 // number of joints -#define SIDE (0.2) // side length of a box -#define MASS (1.0) // mass of a box -#define RADIUS (0.1732f) // sphere radius - - - -// dynamics and collision objects - -static dWorldID world=0; -static dBodyID body[NUM]; -static dJointID joint[NUMJ]; - - -// create the test system - -void createTest() -{ - int i,j; - if (world) dWorldDestroy (world); - - world = dWorldCreate(); - - // create random bodies - for (i=0; i -#include - -#ifdef _MSC_VER -#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints -#endif - -// select correct drawing functions - -#ifdef dDOUBLE -#define dsDrawBox dsDrawBoxD -#define dsDrawSphere dsDrawSphereD -#define dsDrawCylinder dsDrawCylinderD -#define dsDrawCapsule dsDrawCapsuleD -#define dsDrawLine dsDrawLineD -#define dsDrawTriangle dsDrawTriangleD -#endif - - -// some constants - -#define NUM 200 // max number of objects -#define DENSITY (5.0) // density of all objects -#define GPB 3 // maximum number of geometries per body -#define MAX_CONTACTS 40 // maximum number of contact points per body - - -// dynamics and collision objects - -struct MyObject { - dBodyID body; // the body - dGeomID geom[GPB]; // geometries representing this body -}; - -static int num=0; // number of objects in simulation -static int nextobj=0; // next object to recycle if num==NUM -static dWorldID world; -static dSpaceID space; -static MyObject obj[NUM]; -static dJointGroupID contactgroup; -static int selected = -1; // selected object -static int show_aabb = 0; // show geom AABBs? -static int show_contacts = 0; // show contact points? -static int random_pos = 1; // drop objects from random position? - -#define VertexCount 5 -#define IndexCount 12 - -static dVector3 Size; -static dVector3 Vertices[VertexCount]; -static int Indices[IndexCount]; - -static dGeomID TriMesh; -static dGeomID Ray; - - -// this is called by dSpaceCollide when two objects in space are -// potentially colliding. - -static void nearCallback (void *data, dGeomID o1, dGeomID o2) -{ - int i; - // if (o1->body && o2->body) return; - - // exit without doing anything if the two bodies are connected by a joint - dBodyID b1 = dGeomGetBody(o1); - dBodyID b2 = dGeomGetBody(o2); - if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; - - dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box - for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); - else return c; -} - - -// called when a key pressed - -static void command (int cmd) -{ - int i,j,k; - dReal sides[3]; - dMass m; - - cmd = locase (cmd); - if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' - /* || cmd == 'l' */) { - if (num < NUM) { - i = num; - num++; - } - else { - i = nextobj; - nextobj++; - if (nextobj >= num) nextobj = 0; - - // destroy the body and geoms for slot i - dBodyDestroy (obj[i].body); - for (k=0; k < GPB; k++) { - if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); - } - memset (&obj[i],0,sizeof(obj[i])); - } - - obj[i].body = dBodyCreate (world); - for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; - - dMatrix3 R; - if (random_pos) { - dBodySetPosition (obj[i].body, - dRandReal()*2-1,dRandReal()*2-1,dRandReal()+1); - dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, - dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); - } - else { - dReal maxheight = 0; - for (k=0; k maxheight) maxheight = pos[2]; - } - dBodySetPosition (obj[i].body, 0,0,maxheight+1); - dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0); - } - dBodySetRotation (obj[i].body,R); - dBodySetData (obj[i].body,(void*)(size_t)i); - - if (cmd == 'b') { - dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); - obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); - } - else if (cmd == 'c') { - sides[0] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCapsule (space,sides[0],sides[1]); - } -/* - // cylinder option not yet implemented - else if (cmd == 'l') { - sides[1] *= 0.5; - dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]); - obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); - } -*/ - else if (cmd == 's') { - sides[0] *= 0.5; - dMassSetSphere (&m,DENSITY,sides[0]); - obj[i].geom[0] = dCreateSphere (space,sides[0]); - } - else if (cmd == 'x') { - dGeomID g2[GPB]; // encapsulated geometries - dReal dpos[GPB][3]; // delta-positions for encapsulated geometries - - // start accumulating masses for the encapsulated geometries - dMass m2; - dMassSetZero (&m); - - // set random delta positions - for (j=0; j= num) selected = 0; - if (selected < 0) selected = 0; - } - else if (cmd == 'd' && selected >= 0 && selected < num) { - dBodyDisable (obj[selected].body); - } - else if (cmd == 'e' && selected >= 0 && selected < num) { - dBodyEnable (obj[selected].body); - } - else if (cmd == 'a') { - show_aabb ^= 1; - } - else if (cmd == 't') { - show_contacts ^= 1; - } - else if (cmd == 'r') { - random_pos ^= 1; - } -} - - -// draw a geom - -void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) -{ - if (!g) return; - if (!pos) pos = dGeomGetPosition (g); - if (!R) R = dGeomGetRotation (g); - - int type = dGeomGetClass (g); - if (type == dBoxClass) { - dVector3 sides; - dGeomBoxGetLengths (g,sides); - dsDrawBox (pos,R,sides); - } - else if (type == dSphereClass) { - dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); - } - else if (type == dCapsuleClass) { - dReal radius,length; - dGeomCapsuleGetParams (g,&radius,&length); - dsDrawCapsule (pos,R,length,radius); - } -/* - // cylinder option not yet implemented - else if (type == dCylinderClass) { - dReal radius,length; - dGeomCylinderGetParams (g,&radius,&length); - dsDrawCylinder (pos,R,length,radius); - } -*/ - else if (type == dGeomTransformClass) { - dGeomID g2 = dGeomTransformGetGeom (g); - const dReal *pos2 = dGeomGetPosition (g2); - const dReal *R2 = dGeomGetRotation (g2); - dVector3 actual_pos; - dMatrix3 actual_R; - dMULTIPLY0_331 (actual_pos,R,pos2); - actual_pos[0] += pos[0]; - actual_pos[1] += pos[1]; - actual_pos[2] += pos[2]; - dMULTIPLY0_333 (actual_R,R,R2); - drawGeom (g2,actual_pos,actual_R,0); - } - - if (show_aabb) { - // draw the bounding box for this geom - dReal aabb[6]; - dGeomGetAABB (g,aabb); - dVector3 bbpos; - for (int i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); - dVector3 bbsides; - for (int j=0; j<3; j++) bbsides[j] = aabb[j*2+1] - aabb[j*2]; - dMatrix3 RI; - dRSetIdentity (RI); - dsSetColorAlpha (1,0,0,0.5); - dsDrawBox (bbpos,RI,bbsides); - } -} - - -// simulation loop - -static void simLoop (int pause) -{ - dsSetColor (0,0,2); - dSpaceCollide (space,0,&nearCallback); - if (!pause) dWorldStep (world,0.05); - //if (!pause) dWorldStepFast (world,0.05, 1); - - // remove all contact joints - dJointGroupEmpty (contactgroup); - - dsSetColor (1,1,0); - dsSetTexture (DS_WOOD); - for (int i=0; i
  • Error messages -
  • Warning messages -
  • Debugging messages - -*/ -typedef struct opj_event_mgr { - /** Error message callback if available, NULL otherwise */ - opj_msg_callback error_handler; - /** Warning message callback if available, NULL otherwise */ - opj_msg_callback warning_handler; - /** Debug message callback if available, NULL otherwise */ - opj_msg_callback info_handler; -} opj_event_mgr_t; - - -/* -========================================================== - codec typedef definitions -========================================================== -*/ - -/** -Progression order changes -*/ -typedef struct opj_poc { - /** Resolution num start, Component num start, given by POC */ - int resno0, compno0; - /** Layer num end,Resolution num end, Component num end, given by POC */ - int layno1, resno1, compno1; - /** Layer num start,Precinct num start, Precinct num end */ - int layno0, precno0, precno1; - /** Progression order enum*/ - OPJ_PROG_ORDER prg1,prg; - /** Progression order string*/ - char progorder[5]; - /** Tile number */ - int tile; - /** Start and end values for Tile width and height*/ - int tx0,tx1,ty0,ty1; - /** Start value, initialised in pi_initialise_encode*/ - int layS, resS, compS, prcS; - /** End value, initialised in pi_initialise_encode */ - int layE, resE, compE, prcE; - /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ - int txS,txE,tyS,tyE,dx,dy; - /** Temporary values for Tile parts, initialised in pi_create_encode */ - int lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t; -} opj_poc_t; - -/** -Compression parameters -*/ -typedef struct opj_cparameters { - /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ - bool tile_size_on; - /** XTOsiz */ - int cp_tx0; - /** YTOsiz */ - int cp_ty0; - /** XTsiz */ - int cp_tdx; - /** YTsiz */ - int cp_tdy; - /** allocation by rate/distortion */ - int cp_disto_alloc; - /** allocation by fixed layer */ - int cp_fixed_alloc; - /** add fixed_quality */ - int cp_fixed_quality; - /** fixed layer */ - int *cp_matrice; - /** comment for coding */ - char *cp_comment; - /** csty : coding style */ - int csty; - /** progression order (default LRCP) */ - OPJ_PROG_ORDER prog_order; - /** progression order changes */ - opj_poc_t POC[32]; - /** number of progression order changes (POC), default to 0 */ - int numpocs; - /** number of layers */ - int tcp_numlayers; - /** rates of layers */ - float tcp_rates[100]; - /** different psnr for successive layers */ - float tcp_distoratio[100]; - /** number of resolutions */ - int numresolution; - /** initial code block width, default to 64 */ - int cblockw_init; - /** initial code block height, default to 64 */ - int cblockh_init; - /** mode switch (cblk_style) */ - int mode; - /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ - int irreversible; - /** region of interest: affected component in [0..3], -1 means no ROI */ - int roi_compno; - /** region of interest: upshift value */ - int roi_shift; - /* number of precinct size specifications */ - int res_spec; - /** initial precinct width */ - int prcw_init[J2K_MAXRLVLS]; - /** initial precinct height */ - int prch_init[J2K_MAXRLVLS]; - - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - /** input file name */ - char infile[OPJ_PATH_LEN]; - /** output file name */ - char outfile[OPJ_PATH_LEN]; - /** creation of an index file, default to 0 (false) */ - int index_on; - /** index file name */ - char index[OPJ_PATH_LEN]; - /** subimage encoding: origin image offset in x direction */ - int image_offset_x0; - /** subimage encoding: origin image offset in y direction */ - int image_offset_y0; - /** subsampling value for dx */ - int subsampling_dx; - /** subsampling value for dy */ - int subsampling_dy; - /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ - int decod_format; - /** output file format 0: J2K, 1: JP2, 2: JPT */ - int cod_format; - /*@}*/ - -/* UniPG>> */ - /**@name JPWL encoding parameters */ - /*@{*/ - /** enables writing of EPC in MH, thus activating JPWL */ - bool jpwl_epc_on; - /** error protection method for MH (0,1,16,32,37-128) */ - int jpwl_hprot_MH; - /** tile number of header protection specification (>=0) */ - int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** error protection methods for TPHs (0,1,16,32,37-128) */ - int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; - /** tile number of packet protection specification (>=0) */ - int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; - /** packet number of packet protection specification (>=0) */ - int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; - /** error protection methods for packets (0,1,16,32,37-128) */ - int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; - /** enables writing of ESD, (0=no/1/2 bytes) */ - int jpwl_sens_size; - /** sensitivity addressing size (0=auto/2/4 bytes) */ - int jpwl_sens_addr; - /** sensitivity range (0-3) */ - int jpwl_sens_range; - /** sensitivity method for MH (-1=no,0-7) */ - int jpwl_sens_MH; - /** tile number of sensitivity specification (>=0) */ - int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** sensitivity methods for TPHs (-1=no,0-7) */ - int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; - /*@}*/ -/* <> */ - /**@name JPWL decoding parameters */ - /*@{*/ - /** activates the JPWL correction capabilities */ - bool jpwl_correct; - /** expected number of components */ - int jpwl_exp_comps; - /** maximum number of tiles */ - int jpwl_max_tiles; - /*@}*/ -/* <cp. -@param dinfo decompressor handle -@param parameters decompression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 codestream -@param dinfo decompressor handle -@param cio Input buffer stream -@return Returns a decoded image if successful, returns NULL otherwise -*/ -OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio); -/** -Creates a J2K/JP2 compression structure -@param format Coder to select -@return Returns a handle to a compressor if successful, returns NULL otherwise -*/ -OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); -/** -Destroy a compressor handle -@param cinfo compressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); -/** -Set encoding parameters to default values, that means : -
      -
    • Lossless -
    • 1 tile -
    • Size of precinct : 2^15 x 2^15 (means 1 precinct) -
    • Size of code-block : 64 x 64 -
    • Number of resolutions: 6 -
    • No SOP marker in the codestream -
    • No EPH marker in the codestream -
    • No sub-sampling in x or y direction -
    • No mode switch activated -
    • Progression order: LRCP -
    • No index file -
    • No ROI upshifted -
    • No offset of the origin of the image -
    • No offset of the origin of the tiles -
    • Reversible DWT 5-3 -
    -@param parameters Compression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters); -/** -Setup the encoder parameters using the current image and using user parameters. -@param cinfo compressor handle -@param parameters compression parameters -@param image input filled image -*/ -OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image); -/** -Encode an image into a JPEG-2000 codestream -@param cinfo compressor handle -@param cio Output buffer stream -@param image Image to encode -@param index Name of the index file if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index); - -#ifdef __cplusplus -} -#endif - -#endif /* OPENJPEG_H */ diff --git a/libraries/openjpeg-libsl/libopenjpeg/opj_includes.h b/libraries/openjpeg-libsl/libopenjpeg/opj_includes.h deleted file mode 100644 index 72152a5ea4..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/opj_includes.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2005, Herv Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ -#ifndef OPJ_INCLUDES_H -#define OPJ_INCLUDES_H - -/* - ========================================================== - Standard includes used by the library - ========================================================== -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - ========================================================== - OpenJPEG interface - ========================================================== - */ -#include "openjpeg.h" - -/* - ========================================================== - OpenJPEG modules - ========================================================== -*/ - -/* -The inline keyword is supported by C99 but not by C90. -Most compilers implement their own version of this keyword ... -*/ -#ifndef INLINE - #if defined(_MSC_VER) - #define INLINE __inline - #elif defined(__GNUC__) - #define INLINE __inline__ - #elif defined(__MWERKS__) - #define INLINE inline - #else - /* add other compilers here ... */ - #define INLINE - #endif /* defined() */ -#endif /* INLINE */ - -#include "j2k_lib.h" -#include "event.h" -#include "cio.h" - -#include "image.h" -#include "j2k.h" -#include "jp2.h" -#include "jpt.h" - -#include "mqc.h" -#include "raw.h" -#include "bio.h" -#include "tgt.h" -#include "pi.h" -#include "tcd.h" -#include "t1.h" -#include "dwt.h" -#include "t2.h" -#include "mct.h" -#include "int.h" -#include "fix.h" - -/* JPWL>> */ -#ifdef USE_JPWL -#include "../jpwl/jpwl.h" -#endif /* USE_JPWL */ -/* <first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; - pi->resno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - if (!pi->tp_on){ - pi->poc.precno1 = res->pw * res->ph; - } - for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - - return false; -} - -static bool pi_next_rlcp(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - if(!pi->tp_on){ - pi->poc.precno1 = res->pw * res->ph; - } - for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - - return false; -} - -static bool pi_next_rpcl(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } -if (!pi->tp_on){ - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){ - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ - continue; - } - - if ((res->pw==0)||(res->pw==0)) continue; - - if ((trx0==trx1)||(try0==try1)) continue; - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - } - - return false; -} - -static bool pi_next_pcrl(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } - if (!pi->tp_on){ - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){ - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ - continue; - } - - if ((res->pw==0)||(res->pw==0)) continue; - - if ((trx0==trx1)||(try0==try1)) continue; - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - } - - return false; -} - -static bool pi_next_cprl(opj_pi_iterator_t * pi) { - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int resno; - comp = &pi->comps[pi->compno]; - pi->dx = 0; - pi->dy = 0; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - if (!pi->tp_on){ - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){ - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){ - continue; - } - - if ((res->pw==0)||(res->pw==0)) continue; - - if ((trx0==trx1)||(try0==try1)) continue; - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP:; - } - } - } - } - } - - return false; -} - -/* -========================================================== - Packet iterator interface -========================================================== -*/ - -opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, int tileno) { - int p, q; - int compno, resno, pino; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - size_t array_size; - - tcp = &cp->tcps[tileno]; - - array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t); - pi = (opj_pi_iterator_t *) opj_malloc(array_size); - if(!pi) { - /* TODO: throw an error */ - return NULL; - } - - for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ - int maxres = 0; - int maxprec = 0; - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - pi[pino].numcomps = image->numcomps; - - array_size = image->numcomps * sizeof(opj_pi_comp_t); - pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size); - if(!pi[pino].comps) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - memset(pi[pino].comps, 0, array_size); - - for (compno = 0; compno < pi->numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = image->comps[compno].dx; - comp->dy = image->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - - array_size = comp->numresolutions * sizeof(opj_pi_resolution_t); - comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size); - if(!comp->resolutions) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi->tx0, comp->dx); - tcy0 = int_ceildiv(pi->ty0, comp->dy); - tcx1 = int_ceildiv(pi->tx1, comp->dx); - tcy1 = int_ceildiv(pi->ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); - res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); - - if (res->pw*res->ph > maxprec) { - maxprec = res->pw*res->ph; - } - - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = image->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - if (pino == 0) { - array_size = image->numcomps * maxres * tcp->numlayers * maxprec * sizeof(short int); - pi[pino].include = (short int *) opj_malloc(array_size); - if(!pi[pino].include) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - } - else { - pi[pino].include = pi[pino - 1].include; - } - - if (tcp->POC == 0) { - pi[pino].first = 1; - pi[pino].poc.resno0 = 0; - pi[pino].poc.compno0 = 0; - pi[pino].poc.layno1 = tcp->numlayers; - pi[pino].poc.resno1 = maxres; - pi[pino].poc.compno1 = image->numcomps; - pi[pino].poc.prg = tcp->prg; - } else { - pi[pino].first = 1; - pi[pino].poc.resno0 = tcp->pocs[pino].resno0; - pi[pino].poc.compno0 = tcp->pocs[pino].compno0; - pi[pino].poc.layno1 = tcp->pocs[pino].layno1; - pi[pino].poc.resno1 = tcp->pocs[pino].resno1; - pi[pino].poc.compno1 = tcp->pocs[pino].compno1; - pi[pino].poc.prg = tcp->pocs[pino].prg; - } - pi[pino].poc.layno0 = 0; - pi[pino].poc.precno0 = 0; - pi[pino].poc.precno1 = maxprec; - - } - - return pi; -} - - -opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno, J2K_T2_MODE t2_mode){ - int p, q, pino; - int compno, resno; - int maxres = 0; - int maxprec = 0; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - size_t array_size; - - tcp = &cp->tcps[tileno]; - - array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t); - pi = (opj_pi_iterator_t *) opj_malloc(array_size); - if(!pi) { return NULL;} - pi->tp_on = cp->tp_on; - - for(pino = 0;pino < tcp->numpocs+1 ; pino ++){ - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - pi[pino].numcomps = image->numcomps; - - array_size = image->numcomps * sizeof(opj_pi_comp_t); - pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size); - if(!pi[pino].comps) { - pi_destroy(pi, cp, tileno); - return NULL; - } - memset(pi[pino].comps, 0, array_size); - - for (compno = 0; compno < pi[pino].numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = image->comps[compno].dx; - comp->dy = image->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - - array_size = comp->numresolutions * sizeof(opj_pi_resolution_t); - comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size); - if(!comp->resolutions) { - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); - tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); - tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); - tcy1 = int_ceildiv(pi[pino].ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); - res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); - - if (res->pw*res->ph > maxprec) { - maxprec = res->pw * res->ph; - } - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = image->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - - if (pino == 0) { - array_size = tcp->numlayers * pi[pino].step_l * sizeof(short int); - pi[pino].include = (short int *) opj_malloc(array_size); - if(!pi[pino].include) { - pi_destroy(pi, cp, tileno); - return NULL; - } - } - else { - pi[pino].include = pi[pino - 1].include; - } - - /* Generation of boundaries for each prog flag*/ - if(tcp->POC & (t2_mode == FINAL_PASS)){ - tcp->pocs[pino].compS= tcp->pocs[pino].compno0; - tcp->pocs[pino].compE= tcp->pocs[pino].compno1; - tcp->pocs[pino].resS = tcp->pocs[pino].resno0; - tcp->pocs[pino].resE = tcp->pocs[pino].resno1; - tcp->pocs[pino].layE = tcp->pocs[pino].layno1; - tcp->pocs[pino].prg = tcp->pocs[pino].prg1; - if (pino > 0) - tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? tcp->pocs[pino - 1].layE : 0; - }else { - tcp->pocs[pino].compS= 0; - tcp->pocs[pino].compE= image->numcomps; - tcp->pocs[pino].resS = 0; - tcp->pocs[pino].resE = maxres; - tcp->pocs[pino].layS = 0; - tcp->pocs[pino].layE = tcp->numlayers; - tcp->pocs[pino].prg = tcp->prg; - } - tcp->pocs[pino].prcS = 0; - tcp->pocs[pino].prcE = maxprec;; - tcp->pocs[pino].txS = pi[pino].tx0; - tcp->pocs[pino].txE = pi[pino].tx1; - tcp->pocs[pino].tyS = pi[pino].ty0; - tcp->pocs[pino].tyE = pi[pino].ty1; - tcp->pocs[pino].dx = pi[pino].dx; - tcp->pocs[pino].dy = pi[pino].dy; - } - return pi; - } - - - -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { - int compno, pino; - opj_tcp_t *tcp = &cp->tcps[tileno]; - if(pi) { - for (pino = 0; pino < tcp->numpocs + 1; pino++) { - if(pi[pino].comps) { - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - if(comp->resolutions) { - opj_free(comp->resolutions); - } - } - opj_free(pi[pino].comps); - } - } - if(pi->include) { - opj_free(pi->include); - } - opj_free(pi); - } -} - -bool pi_next(opj_pi_iterator_t * pi) { - switch (pi->poc.prg) { - case LRCP: - return pi_next_lrcp(pi); - case RLCP: - return pi_next_rlcp(pi); - case RPCL: - return pi_next_rpcl(pi); - case PCRL: - return pi_next_pcrl(pi); - case CPRL: - return pi_next_cprl(pi); - case PROG_UNKNOWN: - return false; - } - - return false; -} - -int pi_check_next_level(int pos,opj_cp_t *cp,int tileno, int pino, char *prog){ - int i,l; - opj_tcp_t *tcps =&cp->tcps[tileno]; - opj_poc_t *tcp = &tcps->pocs[pino]; - if(pos>=0){ - for(i=pos;pos>=0;i--){ - switch(prog[i]){ - case 'R': - if(tcp->res_t==tcp->resE){ - l=pi_check_next_level(pos-1,cp,tileno,pino,prog); - if(l==1){ - return 1; - }else{ - return 0; - } - }else{ - return 1; - } - break; - case 'C': - if(tcp->comp_t==tcp->compE){ - l=pi_check_next_level(pos-1,cp,tileno,pino,prog); - if(l==1){ - return 1; - }else{ - return 0; - } - }else{ - return 1; - } - break; - case 'L': - if(tcp->lay_t==tcp->layE){ - l=pi_check_next_level(pos-1,cp,tileno,pino,prog); - if(l==1){ - return 1; - }else{ - return 0; - } - }else{ - return 1; - } - break; - case 'P': - switch(tcp->prg){ - case LRCP||RLCP: - if(tcp->prc_t == tcp->prcE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - return 1; - }else{ - return 0; - } - }else{ - return 1; - } - break; - default: - if(tcp->tx0_t == tcp->txE){ - //TY - if(tcp->ty0_t == tcp->tyE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - return 1; - }else{ - return 0; - } - }else{ - return 1; - }//TY - }else{ - return 1; - } - break; - }//end case P - }//end switch - }//end for - }//end if - return 0; -} - - -void pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos){ - char *prog; - int i,l; - int incr_top=1,resetX=0; - opj_tcp_t *tcps =&cp->tcps[tileno]; - opj_poc_t *tcp= &tcps->pocs[pino]; - prog = j2k_convert_progression_order(tcp->prg); - - pi[pino].first = 1; - pi[pino].poc.prg = tcp->prg; - - if(!(cp->tp_on)){ - pi[pino].poc.resno0 = tcp->resS; - pi[pino].poc.resno1 = tcp->resE; - pi[pino].poc.compno0 = tcp->compS; - pi[pino].poc.compno1 = tcp->compE; - pi[pino].poc.layno0 = tcp->layS; - pi[pino].poc.layno1 = tcp->layE; - pi[pino].poc.precno0 = tcp->prcS; - pi[pino].poc.precno1 = tcp->prcE; - pi[pino].poc.tx0 = tcp->txS; - pi[pino].poc.ty0 = tcp->tyS; - pi[pino].poc.tx1 = tcp->txE; - pi[pino].poc.ty1 = tcp->tyE; - }else { - for(i=tppos+1;i<4;i++){ - switch(prog[i]){ - case 'R': - pi[pino].poc.resno0 = tcp->resS; - pi[pino].poc.resno1 = tcp->resE; - break; - case 'C': - pi[pino].poc.compno0 = tcp->compS; - pi[pino].poc.compno1 = tcp->compE; - break; - case 'L': - pi[pino].poc.layno0 = tcp->layS; - pi[pino].poc.layno1 = tcp->layE; - break; - case 'P': - switch(tcp->prg){ - case LRCP: - case RLCP: - pi[pino].poc.precno0 = tcp->prcS; - pi[pino].poc.precno1 = tcp->prcE; - break; - default: - pi[pino].poc.tx0 = tcp->txS; - pi[pino].poc.ty0 = tcp->tyS; - pi[pino].poc.tx1 = tcp->txE; - pi[pino].poc.ty1 = tcp->tyE; - break; - } - break; - } - } - - if(tpnum==0){ - for(i=tppos;i>=0;i--){ - switch(prog[i]){ - case 'C': - tcp->comp_t = tcp->compS; - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t+1; - tcp->comp_t+=1; - break; - case 'R': - tcp->res_t = tcp->resS; - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t+1; - tcp->res_t+=1; - break; - case 'L': - tcp->lay_t = tcp->layS; - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t+1; - tcp->lay_t+=1; - break; - case 'P': - switch(tcp->prg){ - case LRCP: - case RLCP: - tcp->prc_t = tcp->prcS; - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t+1; - tcp->prc_t+=1; - break; - default: - tcp->tx0_t = tcp->txS; - tcp->ty0_t = tcp->tyS; - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->tx0_t = pi[pino].poc.tx1; - tcp->ty0_t = pi[pino].poc.ty1; - break; - } - break; - } - } - incr_top=1; - }else{ - for(i=tppos;i>=0;i--){ - switch(prog[i]){ - case 'C': - pi[pino].poc.compno0 = tcp->comp_t-1; - pi[pino].poc.compno1 = tcp->comp_t; - break; - case 'R': - pi[pino].poc.resno0 = tcp->res_t-1; - pi[pino].poc.resno1 = tcp->res_t; - break; - case 'L': - pi[pino].poc.layno0 = tcp->lay_t-1; - pi[pino].poc.layno1 = tcp->lay_t; - break; - case 'P': - switch(tcp->prg){ - case LRCP: - case RLCP: - pi[pino].poc.precno0 = tcp->prc_t-1; - pi[pino].poc.precno1 = tcp->prc_t; - break; - default: - pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); - pi[pino].poc.tx1 = tcp->tx0_t ; - pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); - pi[pino].poc.ty1 = tcp->ty0_t ; - break; - } - break; - } - if(incr_top==1){ - switch(prog[i]){ - case 'R': - if(tcp->res_t==tcp->resE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - tcp->res_t = tcp->resS; - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t+1; - tcp->res_t+=1; - incr_top=1; - }else{ - incr_top=0; - } - }else{ - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t+1; - tcp->res_t+=1; - incr_top=0; - } - break; - case 'C': - if(tcp->comp_t ==tcp->compE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - tcp->comp_t = tcp->compS; - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t+1; - tcp->comp_t+=1; - incr_top=1; - }else{ - incr_top=0; - } - }else{ - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t+1; - tcp->comp_t+=1; - incr_top=0; - } - break; - case 'L': - if(tcp->lay_t == tcp->layE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - tcp->lay_t = tcp->layS; - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t+1; - tcp->lay_t+=1; - incr_top=1; - }else{ - incr_top=0; - } - }else{ - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t+1; - tcp->lay_t+=1; - incr_top=0; - } - break; - case 'P': - switch(tcp->prg){ - case LRCP: - case RLCP: - if(tcp->prc_t == tcp->prcE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - tcp->prc_t = tcp->prcS; - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t+1; - tcp->prc_t+=1; - incr_top=1; - }else{ - incr_top=0; - } - }else{ - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t+1; - tcp->prc_t+=1; - incr_top=0; - } - break; - default: - if(tcp->tx0_t >= tcp->txE){ - if(tcp->ty0_t >= tcp->tyE){ - l=pi_check_next_level(i-1,cp,tileno,pino,prog); - if(l==1){ - tcp->ty0_t = tcp->tyS; - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->ty0_t = pi[pino].poc.ty1; - incr_top=1;resetX=1; - }else{ - incr_top=0;resetX=0; - } - }else{ - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->ty0_t = pi[pino].poc.ty1; - incr_top=0;resetX=1; - } - if(resetX==1){ - tcp->tx0_t = tcp->txS; - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); - tcp->tx0_t = pi[pino].poc.tx1; - } - }else{ - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx); - tcp->tx0_t = pi[pino].poc.tx1; - incr_top=0; - } - break; - } - break; - } - } - } - } - } -} - - diff --git a/libraries/openjpeg-libsl/libopenjpeg/pi.h b/libraries/openjpeg-libsl/libopenjpeg/pi.h deleted file mode 100644 index fc993297ac..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/pi.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#ifndef __PI_H -#define __PI_H -/** -@file pi.h -@brief Implementation of a packet iterator (PI) - -The functions in PI.C have for goal to realize a packet iterator that permits to get the next -packet following the progression order and change of it. The functions in PI.C are used -by some function in T2.C. -*/ - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** -FIXME: documentation -*/ -typedef struct opj_pi_resolution { - int pdx, pdy; - int pw, ph; -} opj_pi_resolution_t; - -/** -FIXME: documentation -*/ -typedef struct opj_pi_comp { - int dx, dy; - /** number of resolution levels */ - int numresolutions; - opj_pi_resolution_t *resolutions; -} opj_pi_comp_t; - -/** -Packet iterator -*/ -typedef struct opj_pi_iterator { - /** Enabling Tile part generation*/ - char tp_on; - /** precise if the packet has been already used (usefull for progression order change) */ - short int *include; - /** layer step used to localize the packet in the include vector */ - int step_l; - /** resolution step used to localize the packet in the include vector */ - int step_r; - /** component step used to localize the packet in the include vector */ - int step_c; - /** precinct step used to localize the packet in the include vector */ - int step_p; - /** component that identify the packet */ - int compno; - /** resolution that identify the packet */ - int resno; - /** precinct that identify the packet */ - int precno; - /** layer that identify the packet */ - int layno; - /** 0 if the first packet */ - int first; - /** progression order change information */ - opj_poc_t poc; - /** number of components in the image */ - int numcomps; - /** Components*/ - opj_pi_comp_t *comps; - int tx0, ty0, tx1, ty1; - int x, y, dx, dy; -} opj_pi_iterator_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a packet iterator for Encoder -@param image Raw image for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, int tileno,J2K_T2_MODE t2_mode); -/** -Modify the packet iterator for enabling tile part generation -@param pi Handle to the packet iterator generated in pi_initialise_encode -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@param tpnum Tile part number of the current tile -@param tppos The position of the tile part flag in the progression order -*/ -void pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos); -/** -Create a packet iterator for Decoder -@param image Raw image for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, int tileno); - -/** -Destroy a packet iterator -@param pi Previously created packet iterator -@param cp Coding parameters -@param tileno Number that identifies the tile for which the packets were listed -@see pi_create -*/ -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); - -/** -Modify the packet iterator to point to the next packet -@param pi Packet iterator to modify -@return Returns false if pi pointed to the last packet or else returns true -*/ -bool pi_next(opj_pi_iterator_t * pi); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __PI_H */ diff --git a/libraries/openjpeg-libsl/libopenjpeg/raw.c b/libraries/openjpeg-libsl/libopenjpeg/raw.c deleted file mode 100644 index 808a4689c2..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/raw.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#include "opj_includes.h" - -/* -========================================================== - local functions -========================================================== -*/ - - -/* -========================================================== - RAW encoding interface -========================================================== -*/ - -opj_raw_t* raw_create() { - opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); - return raw; -} - -void raw_destroy(opj_raw_t *raw) { - if(raw) { - opj_free(raw); - } -} - -int raw_numbytes(opj_raw_t *raw) { - return raw->bp - raw->start; -} - -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) { - raw->start = bp; - raw->lenmax = len; - raw->len = 0; - raw->c = 0; - raw->ct = 0; -} - -int raw_decode(opj_raw_t *raw) { - int d; - if (raw->ct == 0) { - raw->ct = 8; - if (raw->len == raw->lenmax) { - raw->c = 0xff; - } else { - if (raw->c == 0xff) { - raw->ct = 7; - } - raw->c = *(raw->start + raw->len); - raw->len++; - } - } - raw->ct--; - d = (raw->c >> raw->ct) & 0x01; - - return d; -} - diff --git a/libraries/openjpeg-libsl/libopenjpeg/raw.h b/libraries/openjpeg-libsl/libopenjpeg/raw.h deleted file mode 100644 index c4ff9b329f..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/raw.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#ifndef __RAW_H -#define __RAW_H -/** -@file raw.h -@brief Implementation of operations for raw encoding (RAW) - -The functions in RAW.C have for goal to realize the operation of raw encoding linked -with the corresponding mode switch. -*/ - -/** @defgroup RAW RAW - Implementation of operations for raw encoding */ -/*@{*/ - -/** -RAW encoding operations -*/ -typedef struct opj_raw { - /** temporary buffer where bits are coded or decoded */ - unsigned char c; - /** number of bits already read or free to write */ - unsigned int ct; - /** maximum length to decode */ - unsigned int lenmax; - /** length decoded */ - unsigned int len; - /** pointer to the current position in the buffer */ - unsigned char *bp; - /** pointer to the start of the buffer */ - unsigned char *start; - /** pointer to the end of the buffer */ - unsigned char *end; -} opj_raw_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new RAW handle -@return Returns a new RAW handle if successful, returns NULL otherwise -*/ -opj_raw_t* raw_create(); -/** -Destroy a previously created RAW handle -@param raw RAW handle to destroy -*/ -void raw_destroy(opj_raw_t *raw); -/** -Return the number of bytes written/read since initialisation -@param raw RAW handle to destroy -@return Returns the number of bytes already encoded -*/ -int raw_numbytes(opj_raw_t *raw); -/** -Initialize the decoder -@param raw RAW handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); -/** -Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN -@param raw RAW handle -@return Returns the decoded symbol (0 or 1) -*/ -int raw_decode(opj_raw_t *raw); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __RAW_H */ diff --git a/libraries/openjpeg-libsl/libopenjpeg/t1.c b/libraries/openjpeg-libsl/libopenjpeg/t1.c deleted file mode 100644 index b5d9599425..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/t1.c +++ /dev/null @@ -1,1210 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2007, Callum Lerwick - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#include "opj_includes.h" -#include "t1_luts.h" - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static char t1_getctxno_zc(int f, int orient); -static char t1_getctxno_sc(int f); -static char t1_getctxno_mag(int f); -static char t1_getspb(int f); -static short t1_getnmsedec_sig(int x, int bitpos); -static short t1_getnmsedec_ref(int x, int bitpos); -static void t1_updateflags(flag_t *flagsp, int s, int stride); -/** -Encode significant pass -*/ -static void t1_enc_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - char type, - int vsc); -/** -Decode significant pass -*/ -static void t1_dec_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - char type, - int vsc); -/** -Encode significant pass -*/ -static void t1_enc_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - char type, - int cblksty); -/** -Decode significant pass -*/ -static void t1_dec_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - char type, - int cblksty); -/** -Encode refinement pass -*/ -static void t1_enc_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int bpno, - int one, - int *nmsedec, - char type, - int vsc); -/** -Decode refinement pass -*/ -static void t1_dec_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - char type, - int vsc); -/** -Encode refinement pass -*/ -static void t1_enc_refpass( - opj_t1_t *t1, - int bpno, - int *nmsedec, - char type, - int cblksty); -/** -Decode refinement pass -*/ -static void t1_dec_refpass( - opj_t1_t *t1, - int bpno, - char type, - int cblksty); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - int partial, - int vsc); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int partial, - int vsc); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - int cblksty); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty); -static double t1_getwmsedec( - int nmsedec, - int compno, - int level, - int orient, - int bpno, - int qmfbid, - double stepsize, - int numcomps); -/** -Encode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param compno Component number -@param level -@param qmfbid -@param stepsize -@param cblksty Code-block style -@param numcomps -@param tile -*/ -static void t1_encode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_t * cblk, - int orient, - int compno, - int level, - int qmfbid, - double stepsize, - int cblksty, - int numcomps, - opj_tcd_tile_t * tile); -/** -Decode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param roishift Region of interest shifting value -@param cblksty Code-block style -*/ -static void t1_decode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_t * cblk, - int orient, - int roishift, - int cblksty); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static char t1_getctxno_zc(int f, int orient) { - return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; -} - -static char t1_getctxno_sc(int f) { - return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static char t1_getctxno_mag(int f) { - return lut_ctxno_mag[(f & T1_SIG_OTH) | (((f & T1_REFINE) != 0) << 11)]; -} - -static char t1_getspb(int f) { - return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static short t1_getnmsedec_sig(int x, int bitpos) { - if (bitpos > T1_NMSEDEC_FRACBITS) { - return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; - } - - return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static short t1_getnmsedec_ref(int x, int bitpos) { - if (bitpos > T1_NMSEDEC_FRACBITS) { - return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)]; - } - - return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static void t1_updateflags(flag_t *flagsp, int s, int stride) { - flag_t *np = flagsp - stride; - flag_t *sp = flagsp + stride; - - static const flag_t mod[] = { - T1_SIG_S, T1_SIG_N, T1_SIG_E, T1_SIG_W, - T1_SIG_S | T1_SGN_S, T1_SIG_N | T1_SGN_N, T1_SIG_E | T1_SGN_E, T1_SIG_W | T1_SGN_W - }; - - s <<= 2; - - np[-1] |= T1_SIG_SE; - np[0] |= mod[s]; - np[1] |= T1_SIG_SW; - - flagsp[-1] |= mod[s+2]; - flagsp[1] |= mod[s+3]; - - sp[-1] |= T1_SIG_NE; - sp[0] |= mod[s+1]; - sp[1] |= T1_SIG_NW; -} - -static void t1_enc_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - char type, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - v = int_abs(*datap) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - mqc_encode(mqc, v); - } - if (v) { - v = *datap < 0 ? 1 : 0; - *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - mqc_encode(mqc, v ^ t1_getspb(flag)); - } - t1_updateflags(flagsp, v, t1->flags_stride); - *flagsp |= T1_SIG; - } - *flagsp |= T1_VISIT; - } -} - -static void t1_dec_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - char type, - int vsc) -{ - int v, flag; - - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - if (type == T1_TYPE_RAW) { - if (raw_decode(raw)) { - v = raw_decode(raw); /* ESSAI */ - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - *flagsp |= T1_SIG; - } - } else { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - *flagsp |= T1_SIG; - } - } - *flagsp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_enc_sigpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - bpno, - one, - nmsedec, - type, - vsc); - } - } - } -} - -static void t1_dec_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - char type, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_sigpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - type, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int bpno, - int one, - int *nmsedec, - char type, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - v = int_abs(*datap) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); - mqc_encode(mqc, v); - } - *flagsp |= T1_REFINE; - } -} - -static void t1_dec_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - char type, - int vsc) -{ - int v, t, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - opj_raw_t *raw = t1->raw; /* RAW component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - if (type == T1_TYPE_RAW) { - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - v = raw_decode(raw); - } else { - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); - v = mqc_decode(mqc); - } - t = v ? poshalf : neghalf; - *datap += *datap < 0 ? -t : t; - *flagsp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass( - opj_t1_t *t1, - int bpno, - int *nmsedec, - char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_enc_refpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - bpno, - one, - nmsedec, - type, - vsc); - } - } - } -} - -static void t1_dec_refpass( - opj_t1_t *t1, - int bpno, - char type, - int cblksty) -{ - int i, j, k, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_refpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - poshalf, - neghalf, - type, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - int partial, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(*flagsp & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - v = int_abs(*datap) & one ? 1 : 0; - mqc_encode(mqc, v); - if (v) { -LABEL_PARTIAL: - *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = *datap < 0 ? 1 : 0; - mqc_encode(mqc, v ^ t1_getspb(flag)); - t1_updateflags(flagsp, v, t1->flags_stride); - *flagsp |= T1_SIG; - } - } - *flagsp &= ~T1_VISIT; -} - -static void t1_dec_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int partial, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { -LABEL_PARTIAL: - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - *flagsp |= T1_SIG; - } - } - *flagsp &= ~T1_VISIT; -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - int cblksty) -{ - int i, j, k, one, agg, runlen, vsc; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - if (k + 3 < t1->h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (MACRO_t1_flags(1 + k + 3,1 + i) - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } else { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - for (runlen = 0; runlen < 4; ++runlen) { - if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) - break; - } - mqc_setcurctx(mqc, T1_CTXNO_AGG); - mqc_encode(mqc, runlen != 4); - if (runlen == 4) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - mqc_encode(mqc, runlen >> 1); - mqc_encode(mqc, runlen & 1); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_enc_clnpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - bpno, - one, - nmsedec, - agg && (j == k + runlen), - vsc); - } - } - } -} - -static void t1_dec_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, agg, runlen, vsc; - int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - if (k + 3 < t1->h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (MACRO_t1_flags(1 + k + 3,1 + i) - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } else { - agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - mqc_setcurctx(mqc, T1_CTXNO_AGG); - if (!mqc_decode(mqc)) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - runlen = mqc_decode(mqc); - runlen = (runlen << 1) | mqc_decode(mqc); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_clnpass_step( - t1, - &t1->flags[((j+1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - agg && (j == k + runlen), - vsc); - } - } - } - if (segsym) { - int v = 0; - mqc_setcurctx(mqc, T1_CTXNO_UNI); - v = mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - /* - if (v!=0xa) { - opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); - } - */ - } -} /* VSC and BYPASS by Antonin */ - - -/** mod fixed_quality */ -static double t1_getwmsedec( - int nmsedec, - int compno, - int level, - int orient, - int bpno, - int qmfbid, - double stepsize, - int numcomps) -{ - double w1, w2, wmsedec; - if (qmfbid == 1) { - w1 = (numcomps > 1) ? mct_getnorm(compno) : 1.0; - w2 = dwt_getnorm(level, orient); - } else { /* if (qmfbid == 0) */ - w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1.0; - w2 = dwt_getnorm_real(level, orient); - } - wmsedec = w1 * w2 * stepsize * (1 << bpno); - wmsedec *= wmsedec * nmsedec / 8192.0; - - return wmsedec; -} - -static void allocate_buffers( - opj_t1_t *t1, - int w, - int h) -{ - int datasize; - int flagssize; - - datasize=w * h; - //fprintf(stderr,"w=%i h=%i datasize=%i flagssize=%i\n",w,h,datasize,flagssize); - - if(datasize > t1->datasize){ - //fprintf(stderr,"Allocating t1->data: datasize=%i\n",datasize); - free(t1->data); - t1->data=malloc(datasize * sizeof(int)); - if(!t1->data){ - return; - } - t1->datasize=datasize; - } - //memset(t1->data,0xff,t1->datasize); - memset(t1->data,0,datasize * sizeof(int)); - - t1->flags_stride=w+2; - flagssize=t1->flags_stride * (h+2); - - if(flagssize > t1->flagssize){ - //fprintf(stderr,"Allocating t1->flags: flagssize=%i\n",flagssize); - free(t1->flags); - t1->flags=malloc(flagssize * sizeof(flag_t)); - if(!t1->flags){ - fprintf(stderr,"Allocating t1->flags FAILED!\n"); - return; - } - t1->flagssize=flagssize; - } - //memset(t1->flags,0xff,t1->flagssize); - memset(t1->flags,0,flagssize * sizeof(flag_t)); - - t1->w=w; - t1->h=h; -} - -/** mod fixed_quality */ -static void t1_encode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_t * cblk, - int orient, - int compno, - int level, - int qmfbid, - double stepsize, - int cblksty, - int numcomps, - opj_tcd_tile_t * tile) -{ - int i, j; - int passno; - int bpno, passtype; - int max; - int nmsedec = 0; - double cumwmsedec = 0.0; - char type = T1_TYPE_MQ; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - max = 0; - for (j = 0; j < t1->h; ++j) { - for (i = 0; i < t1->w; ++i) { - max = int_max(max, int_abs(t1->data[(j * t1->w) + i])); - } - } - - cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; - - bpno = cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - mqc_init_enc(mqc, cblk->data); - - for (passno = 0; bpno >= 0; ++passno) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int correction = 3; - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - - switch (passtype) { - case 0: - t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); - break; - case 1: - t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); - break; - case 2: - t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); - /* code switch SEGMARK (i.e. SEGSYM) */ - if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) - mqc_segmark_enc(mqc); - break; - } - - /* fixed_quality */ - cumwmsedec += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps); - tile->distotile += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps); - - /* Code switch "RESTART" (i.e. TERMALL) */ - if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - if (((bpno < (cblk->numbps - 4) && (passtype > 0)) - || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - pass->term = 0; - } - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - if (pass->term && bpno > 0) { - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) - mqc_bypass_init_enc(mqc); - else - mqc_restart_init_enc(mqc); - } - - pass->distortiondec = cumwmsedec; - pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ - - /* Code-switch "RESET" */ - if (cblksty & J2K_CCP_CBLKSTY_RESET) - mqc_reset_enc(mqc); - } - - /* Code switch "ERTERM" (i.e. PTERM) */ - if (cblksty & J2K_CCP_CBLKSTY_PTERM) - mqc_erterm_enc(mqc); - else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) - mqc_flush(mqc); - - cblk->totalpasses = passno; - - for (passno = 0; passnototalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (pass->rate > mqc_numbytes(mqc)) - pass->rate = mqc_numbytes(mqc); - /*Preventing generation of FF as last data byte of a pass*/ - if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){ - pass->rate--; - } - pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); - } -} - -static void t1_decode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_t * cblk, - int orient, - int roishift, - int cblksty) -{ - int bpno, passtype; - int segno, passno; - char type = T1_TYPE_MQ; /* BYPASS mode */ - - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - allocate_buffers( - t1, - cblk->x1 - cblk->x0, - cblk->y1 - cblk->y0); - - bpno = roishift + cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - - for (segno = 0; segno < cblk->numsegs; ++segno) { - opj_tcd_seg_t *seg = &cblk->segs[segno]; - - /* BYPASS mode */ - type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) { - raw_init_dec(raw, seg->data, seg->len); - } else { - mqc_init_dec(mqc, seg->data, seg->len); - } - - for (passno = 0; passno < seg->numpasses; ++passno) { - switch (passtype) { - case 0: - t1_dec_sigpass(t1, bpno+1, orient, type, cblksty); - break; - case 1: - t1_dec_refpass(t1, bpno+1, type, cblksty); - break; - case 2: - t1_dec_clnpass(t1, bpno+1, orient, cblksty); - break; - } - - if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - } - if (++passtype == 3) { - passtype = 0; - bpno--; - } - } - } -} - -/* ----------------------------------------------------------------------- */ - -opj_t1_t* t1_create(opj_common_ptr cinfo) { - opj_t1_t *t1 = (opj_t1_t*) malloc(sizeof(opj_t1_t)); - if(!t1) - return NULL; - - t1->cinfo = cinfo; - /* create MQC and RAW handles */ - t1->mqc = mqc_create(); - t1->raw = raw_create(); - - t1->datasize=0; - t1->data=NULL; - t1->flagssize=0; - t1->flags=NULL; - - return t1; -} - -void t1_destroy(opj_t1_t *t1) { - if(t1) { - /* destroy MQC and RAW handles */ - mqc_destroy(t1->mqc); - raw_destroy(t1->raw); - free(t1->data); - free(t1->flags); - free(t1); - } -} - -void t1_encode_cblks( - opj_t1_t *t1, - opj_tcd_tile_t *tile, - opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - - tile->distotile = 0; /* fixed_quality */ - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolutions; ++resno) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; ++precno) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { - int x, y, w, i, j, orient; - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - if (band->bandno & 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x += pres->x1 - pres->x0; - } - if (band->bandno & 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - y += pres->y1 - pres->y0; - } - - allocate_buffers( - t1, - cblk->x1 - cblk->x0, - cblk->y1 - cblk->y0); - - w = tilec->x1 - tilec->x0; - if (tcp->tccps[compno].qmfbid == 1) { - for (j = 0; j < t1->h; ++j) { - for (i = 0; i < t1->w; ++i) { - t1->data[(j * t1->w) + i] = - tilec->data[(x + i) + (y + j) * w] << T1_NMSEDEC_FRACBITS; - } - } - } else { /* if (tcp->tccps[compno].qmfbid == 0) */ - for (j = 0; j < t1->h; ++j) { - for (i = 0; i < t1->w; ++i) { - t1->data[(j * t1->w) + i] = - fix_mul( - tilec->data[x + i + (y + j) * w], - 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (11 - T1_NMSEDEC_FRACBITS); - } - } - } - orient = band->bandno; /* FIXME */ - if (orient == 2) { - orient = 1; - } else if (orient == 1) { - orient = 2; - } - - t1_encode_cblk( - t1, - cblk, - orient, - compno, - tilec->numresolutions - 1 - resno, - tcp->tccps[compno].qmfbid, - band->stepsize, - tcp->tccps[compno].cblksty, - tile->numcomps, - tile); - - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} - -void t1_decode_cblks( - opj_t1_t *t1, - opj_tcd_tile_t *tile, - opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolutions; ++resno) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; ++precno) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { - int x, y, w, i, j, orient, cblk_w, cblk_h; - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - orient = band->bandno; /* FIXME */ - if (orient == 2) { - orient = 1; - } else if (orient == 1) { - orient = 2; - } - - t1_decode_cblk( - t1, - cblk, - orient, - tcp->tccps[compno].roishift, - tcp->tccps[compno].cblksty); - - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - if (band->bandno & 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x += pres->x1 - pres->x0; - } - if (band->bandno & 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - y += pres->y1 - pres->y0; - } - - cblk_w = cblk->x1 - cblk->x0; - cblk_h = cblk->y1 - cblk->y0; - - if (tcp->tccps[compno].roishift) { - int thresh = 1 << tcp->tccps[compno].roishift; - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int val = t1->data[(j * t1->w) + i]; - int mag = int_abs(val); - if (mag >= thresh) { - mag >>= tcp->tccps[compno].roishift; - t1->data[(j * t1->w) + i] = val < 0 ? -mag : mag; - } - } - } - } - - w = tilec->x1 - tilec->x0; - if (tcp->tccps[compno].qmfbid == 1) { - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - tilec->data[x + i + (y + j) * w] = t1->data[(j * t1->w) + i]/2; - } - } - } else { /* if (tcp->tccps[compno].qmfbid == 0) */ - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - if (t1->data[(j * t1->w) + i] >> 1 == 0) { - tilec->data[x + i + (y + j) * w] = 0; - } else { - double tmp = (double)(t1->data[(j * t1->w) + i] * band->stepsize * 4096.0); - int tmp2 = ((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2); - tilec->data[x + i + (y + j) * w] = ((tmp<0)?-tmp2:tmp2); - } - } - } - } - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} - diff --git a/libraries/openjpeg-libsl/libopenjpeg/t1.h b/libraries/openjpeg-libsl/libopenjpeg/t1.h deleted file mode 100644 index 1b6cdb7cf5..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/t1.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ -#ifndef __T1_H -#define __T1_H -/** -@file t1.h -@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) - -The functions in T1.C have for goal to realize the tier-1 coding operation. The functions -in T1.C are used by some function in TCD.C. -*/ - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/* ----------------------------------------------------------------------- */ -#define T1_NMSEDEC_BITS 7 - -#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */ -#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */ -#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */ -#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */ -#define T1_SIG_N 0x0010 /**< Context orientation : North direction */ -#define T1_SIG_E 0x0020 /**< Context orientation : East direction */ -#define T1_SIG_S 0x0040 /**< Context orientation : South direction */ -#define T1_SIG_W 0x0080 /**< Context orientation : West direction */ -#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) -#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) - -#define T1_SGN_N 0x0100 -#define T1_SGN_E 0x0200 -#define T1_SGN_S 0x0400 -#define T1_SGN_W 0x0800 -#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) - -#define T1_SIG 0x1000 -#define T1_REFINE 0x2000 -#define T1_VISIT 0x4000 - -#define T1_NUMCTXS_ZC 9 -#define T1_NUMCTXS_SC 5 -#define T1_NUMCTXS_MAG 3 -#define T1_NUMCTXS_AGG 1 -#define T1_NUMCTXS_UNI 1 - -#define T1_CTXNO_ZC 0 -#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC) -#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC) -#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG) -#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG) -#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) - -#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) - -#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */ -#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/ - -/* ----------------------------------------------------------------------- */ - -typedef short flag_t; - -/** -Tier-1 coding (coding of code-block coefficients) -*/ -typedef struct opj_t1 { - /** codec context */ - opj_common_ptr cinfo; - - /** MQC component */ - opj_mqc_t *mqc; - /** RAW component */ - opj_raw_t *raw; - - int *data; - flag_t *flags; - int w; - int h; - int datasize; - int flagssize; - int flags_stride; -} opj_t1_t; - -#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)] - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new T1 handle -and initialize the look-up tables of the Tier-1 coder/decoder -@return Returns a new T1 handle if successful, returns NULL otherwise -@see t1_init_luts -*/ -opj_t1_t* t1_create(opj_common_ptr cinfo); -/** -Destroy a previously created T1 handle -@param t1 T1 handle to destroy -*/ -void t1_destroy(opj_t1_t *t1); -/** -Encode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to encode -@param tcp Tile coding parameters -*/ -void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Decode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to decode -@param tcp Tile coding parameters -*/ -void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T1_H */ diff --git a/libraries/openjpeg-libsl/libopenjpeg/t1_generate_luts.c b/libraries/openjpeg-libsl/libopenjpeg/t1_generate_luts.c deleted file mode 100644 index 62cb1589e9..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/t1_generate_luts.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2007, Callum Lerwick - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#include "opj_includes.h" -#include - -static int t1_init_ctxno_zc(int f, int orient) { - int h, v, d, n, t, hv; - n = 0; - h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0); - v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0); - d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0); - - switch (orient) { - case 2: - t = h; - h = v; - v = t; - case 0: - case 1: - if (!h) { - if (!v) { - if (!d) - n = 0; - else if (d == 1) - n = 1; - else - n = 2; - } else if (v == 1) { - n = 3; - } else { - n = 4; - } - } else if (h == 1) { - if (!v) { - if (!d) - n = 5; - else - n = 6; - } else { - n = 7; - } - } else - n = 8; - break; - case 3: - hv = h + v; - if (!d) { - if (!hv) { - n = 0; - } else if (hv == 1) { - n = 1; - } else { - n = 2; - } - } else if (d == 1) { - if (!hv) { - n = 3; - } else if (hv == 1) { - n = 4; - } else { - n = 5; - } - } else if (d == 2) { - if (!hv) { - n = 6; - } else { - n = 7; - } - } else { - n = 8; - } - break; - } - - return (T1_CTXNO_ZC + n); -} - -static int t1_init_ctxno_sc(int f) { - int hc, vc, n; - n = 0; - - hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == - T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), - 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == - (T1_SIG_E | T1_SGN_E)) + - ((f & (T1_SIG_W | T1_SGN_W)) == - (T1_SIG_W | T1_SGN_W)), 1); - - vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == - T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), - 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == - (T1_SIG_N | T1_SGN_N)) + - ((f & (T1_SIG_S | T1_SGN_S)) == - (T1_SIG_S | T1_SGN_S)), 1); - - if (hc < 0) { - hc = -hc; - vc = -vc; - } - if (!hc) { - if (vc == -1) - n = 1; - else if (!vc) - n = 0; - else - n = 1; - } else if (hc == 1) { - if (vc == -1) - n = 2; - else if (!vc) - n = 3; - else - n = 4; - } - - return (T1_CTXNO_SC + n); -} - -static int t1_init_ctxno_mag(int f) { - int n; - if (!(f & T1_REFINE)) - n = (f & (T1_SIG_OTH)) ? 1 : 0; - else - n = 2; - - return (T1_CTXNO_MAG + n); -} - -static int t1_init_spb(int f) { - int hc, vc, n; - - hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == - T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), - 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == - (T1_SIG_E | T1_SGN_E)) + - ((f & (T1_SIG_W | T1_SGN_W)) == - (T1_SIG_W | T1_SGN_W)), 1); - - vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == - T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), - 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == - (T1_SIG_N | T1_SGN_N)) + - ((f & (T1_SIG_S | T1_SGN_S)) == - (T1_SIG_S | T1_SGN_S)), 1); - - if (!hc && !vc) - n = 0; - else - n = (!(hc > 0 || (!hc && vc > 0))); - - return n; -} - -void dump_array16(int array[],int size){ - int i; - --size; - for (i = 0; i < size; ++i) { - printf("0x%04x, ", array[i]); - if(!((i+1)&0x7)) - printf("\n "); - } - printf("0x%04x\n};\n\n", array[size]); -} - -int main(){ - int i, j; - double u, v, t; - - int lut_ctxno_zc[1024]; - int lut_ctxno_mag[4096]; - int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; - - printf("/* This file was automatically generated by t1_generate_luts.c */\n\n"); - - // lut_ctxno_zc - for (j = 0; j < 4; ++j) { - for (i = 0; i < 256; ++i) { - lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j); - } - } - - printf("static int8_t lut_ctxno_zc[1024] = {\n "); - for (i = 0; i < 1023; ++i) { - printf("%i, ", lut_ctxno_zc[i]); - if(!((i+1)&0x1f)) - printf("\n "); - } - printf("%i\n};\n\n", lut_ctxno_zc[1023]); - - // lut_ctxno_sc - printf("static int8_t lut_ctxno_sc[256] = {\n "); - for (i = 0; i < 255; ++i) { - printf("0x%x, ", t1_init_ctxno_sc(i << 4)); - if(!((i+1)&0xf)) - printf("\n "); - } - printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4)); - - // lut_ctxno_mag - for (j = 0; j < 2; ++j) { - for (i = 0; i < 2048; ++i) { - lut_ctxno_mag[(j << 11) + i] = t1_init_ctxno_mag((j ? T1_REFINE : 0) | i); - } - } - - printf("static int8_t lut_ctxno_mag[4096] = {\n "); - for (i = 0; i < 4095; ++i) { - printf("%i, ", lut_ctxno_mag[i]); - if(!((i+1)&0xf)) - printf("\n "); - } - printf("%i\n};\n\n", lut_ctxno_mag[4095]); - - // lut_spb - printf("static int8_t lut_spb[256] = {\n "); - for (i = 0; i < 255; ++i) { - printf("%i, ", t1_init_spb(i << 4)); - if(!((i+1)&0x1f)) - printf("\n "); - } - printf("%i\n};\n\n", t1_init_spb(255 << 4)); - - /* FIXME FIXME FIXME */ - /* fprintf(stdout,"nmsedec luts:\n"); */ - for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) { - t = i / pow(2, T1_NMSEDEC_FRACBITS); - u = t; - v = t - 1.5; - lut_nmsedec_sig[i] = - int_max(0, - (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - lut_nmsedec_sig0[i] = - int_max(0, - (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - u = t - 1.0; - if (i & (1 << (T1_NMSEDEC_BITS - 1))) { - v = t - 1.5; - } else { - v = t - 0.5; - } - lut_nmsedec_ref[i] = - int_max(0, - (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - lut_nmsedec_ref0[i] = - int_max(0, - (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0)); - } - - printf("static int16_t lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS); - - printf("static int16_t lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS); - - printf("static int16_t lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS); - - printf("static int16_t lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n "); - dump_array16(&lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS); - - return 0; -} diff --git a/libraries/openjpeg-libsl/libopenjpeg/t1_luts.h b/libraries/openjpeg-libsl/libopenjpeg/t1_luts.h deleted file mode 100644 index 3f957f3648..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/t1_luts.h +++ /dev/null @@ -1,402 +0,0 @@ -/* This file was automatically generated by t1_generate_luts.c */ - -static char lut_ctxno_zc[1024] = { - 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, - 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8 -}; - -static char lut_ctxno_sc[256] = { - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd -}; - -static char lut_ctxno_mag[4096] = { - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 -}; - -static char lut_spb[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 -}; - -static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, - 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, - 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, - 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, - 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, - 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, - 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, - 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, - 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, - 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680 -}; - -static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, - 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, - 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, - 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, - 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, - 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, - 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, - 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, - 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, - 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, - 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, - 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, - 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, - 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00 -}; - -static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = { - 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, - 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, - 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, - 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, - 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, - 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, - 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, - 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, - 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, - 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780 -}; - -static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = { - 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, - 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, - 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, - 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, - 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, - 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, - 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, - 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, - 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, - 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, - 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, - 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00 -}; - diff --git a/libraries/openjpeg-libsl/libopenjpeg/t2.c b/libraries/openjpeg-libsl/libopenjpeg/t2.c deleted file mode 100644 index dc8e24edf8..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/t2.c +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#include "opj_includes.h" - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static void t2_putcommacode(opj_bio_t *bio, int n); -static int t2_getcommacode(opj_bio_t *bio); -/** -Variable length code for signalling delta Zil (truncation point) -@param bio Bit Input/Output component -@param n delta Zil -*/ -static void t2_putnumpasses(opj_bio_t *bio, int n); -static int t2_getnumpasses(opj_bio_t *bio); -/** -Encode a packet of a tile to a destination buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@param dest Destination buffer -@param len Length of the destination buffer -@param image_info Structure to create an index file -@param tileno Number of the tile encoded -@return -*/ -static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_image_info_t *image_info, int tileno); -/** -@param seg -@param cblksty -@param first -*/ -static void t2_init_seg(opj_tcd_seg_t *seg, int cblksty, int first); -/** -Decode a packet of a tile from a source buffer -@param t2 T2 handle -@param src Source buffer -@param len Length of the source buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@return -*/ -static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -/* #define RESTART 0x04 */ - -static void t2_putcommacode(opj_bio_t *bio, int n) { - while (--n >= 0) { - bio_write(bio, 1, 1); - } - bio_write(bio, 0, 1); -} - -static int t2_getcommacode(opj_bio_t *bio) { - int n; - for (n = 0; bio_read(bio, 1); n++) { - ; - } - return n; -} - -static void t2_putnumpasses(opj_bio_t *bio, int n) { - if (n == 1) { - bio_write(bio, 0, 1); - } else if (n == 2) { - bio_write(bio, 2, 2); - } else if (n <= 5) { - bio_write(bio, 0xc | (n - 3), 4); - } else if (n <= 36) { - bio_write(bio, 0x1e0 | (n - 6), 9); - } else if (n <= 164) { - bio_write(bio, 0xff80 | (n - 37), 16); - } -} - -static int t2_getnumpasses(opj_bio_t *bio) { - int n; - if (!bio_read(bio, 1)) - return 1; - if (!bio_read(bio, 1)) - return 2; - if ((n = bio_read(bio, 2)) != 3) - return (3 + n); - if ((n = bio_read(bio, 5)) != 31) - return (6 + n); - return (37 + bio_read(bio, 7)); -} - -static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int length, opj_image_info_t * image_info, int tileno) { - int bandno, cblkno; - unsigned char *sop = 0, *eph = 0; - unsigned char *c = dest; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - opj_bio_t *bio = NULL; /* BIO component */ - - /* */ - if (tcp->csty & J2K_CP_CSTY_SOP) { - sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char)); - sop[0] = 255; - sop[1] = 145; - sop[2] = 0; - sop[3] = 4; - sop[4] = (image_info->num % 65536) / 256; - sop[5] = (image_info->num % 65536) % 256; - memcpy(c, sop, 6); - opj_free(sop); - c += 6; - } - /* */ - - if (!layno) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->numpasses = 0; - tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); - } - } - } - - bio = bio_create(); - bio_init_enc(bio, c, length); - bio_write(bio, 1, 1); /* Empty header bit */ - - /* Writing Packet header */ - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!cblk->numpasses && layer->numpasses) { - tgt_setvalue(prc->incltree, cblkno, layno); - } - } - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int increment = 0; - int nump = 0; - int len = 0, passno; - /* cblk inclusion bits */ - if (!cblk->numpasses) { - tgt_encode(bio, prc->incltree, cblkno, layno + 1); - } else { - bio_write(bio, layer->numpasses != 0, 1); - } - /* if cblk not included, go to the next cblk */ - if (!layer->numpasses) { - continue; - } - /* if first instance of cblk --> zero bit-planes information */ - if (!cblk->numpasses) { - cblk->numlenbits = 3; - tgt_encode(bio, prc->imsbtree, cblkno, 999); - } - /* number of coding passes included */ - t2_putnumpasses(bio, layer->numpasses); - - /* computation of the increase of the length indicator and insertion in the header */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); - len = 0; - nump = 0; - } - } - t2_putcommacode(bio, increment); - - /* computation of the new Length indicator */ - cblk->numlenbits += increment; - - /* insertion of the codeword segment length */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); - len = 0; - nump = 0; - } - } - } - } - - if (bio_flush(bio)) { - return -999; /* modified to eliminate longjmp !! */ - } - - c += bio_numbytes(bio); - - bio_destroy(bio); - - /* */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char)); - eph[0] = 255; - eph[1] = 146; - memcpy(c, eph, 2); - opj_free(eph); - c += 2; - } - /* */ - - /* Writing the packet body */ - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!layer->numpasses) { - continue; - } - if (c + layer->len > dest + length) { - return -999; - } - - memcpy(c, layer->data, layer->len); - cblk->numpasses += layer->numpasses; - c += layer->len; - /* ADD for index Cfr. Marcela --> delta disto by packet */ - if(image_info && image_info->index_write && image_info->index_on) { - opj_tile_info_t *info_TL = &image_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[image_info->num]; - info_PK->disto += layer->disto; - if (image_info->D_max < info_PK->disto) { - image_info->D_max = info_PK->disto; - } - } - /* */ - } - } - - return (c - dest); -} - -static void t2_init_seg(opj_tcd_seg_t * seg, int cblksty, int first) { - seg->numpasses = 0; - seg->len = 0; - if (cblksty & J2K_CCP_CBLKSTY_TERMALL) { - seg->maxpasses = 1; - } - else if (cblksty & J2K_CCP_CBLKSTY_LAZY) { - if (first) { - seg->maxpasses = 10; - } else { - seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1; - } - } else { - seg->maxpasses = 109; - } -} - -static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi) { - int bandno, cblkno; - unsigned char *c = src; - - opj_cp_t *cp = t2->cp; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - unsigned char *hd = NULL; - int present; - - opj_bio_t *bio = NULL; /* BIO component */ - - if (layno == 0) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->numsegs = 0; - } - } - } - - /* SOP markers */ - - if (tcp->csty & J2K_CP_CSTY_SOP) { - if ((*c) != 0xff || (*(c + 1) != 0x91)) { - opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n"); - } else { - c += 6; - } - - /** TODO : check the Nsop value */ - } - - /* - When the marker PPT/PPM is used the packet header are store in PPT/PPM marker - This part deal with this caracteristic - step 1: Read packet header in the saved structure - step 2: Return to codestream for decoding - */ - - bio = bio_create(); - - if (cp->ppm == 1) { /* PPM */ - hd = cp->ppm_data; - bio_init_dec(bio, hd, cp->ppm_len); - } else if (tcp->ppt == 1) { /* PPT */ - hd = tcp->ppt_data; - bio_init_dec(bio, hd, tcp->ppt_len); - } else { /* Normal Case */ - hd = c; - bio_init_dec(bio, hd, src+len-hd); - } - - present = bio_read(bio, 1); - - if (!present) { - bio_inalign(bio); - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - printf("Error : expected EPH marker\n"); - } else { - hd += 2; - } - } - - if (cp->ppm == 1) { /* PPM case */ - cp->ppm_len += cp->ppm_data-hd; - cp->ppm_data = hd; - return (c - src); - } - if (tcp->ppt == 1) { /* PPT case */ - tcp->ppt_len+=tcp->ppt_data-hd; - tcp->ppt_data = hd; - return (c - src); - } - - return (hd - src); - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int included, increment, n; - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_seg_t *seg = NULL; - /* if cblk not yet included before --> inclusion tagtree */ - if (!cblk->numsegs) { - included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); - /* else one bit */ - } else { - included = bio_read(bio, 1); - } - /* if cblk not included */ - if (!included) { - cblk->numnewpasses = 0; - continue; - } - /* if cblk not yet included --> zero-bitplane tagtree */ - if (!cblk->numsegs) { - int i, numimsbs; - for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) { - ; - } - numimsbs = i - 1; - cblk->numbps = band->numbps - numimsbs; - cblk->numlenbits = 3; - } - /* number of coding passes */ - cblk->numnewpasses = t2_getnumpasses(bio); - increment = t2_getcommacode(bio); - /* length indicator increment */ - cblk->numlenbits += increment; - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - t2_init_seg(seg, tcp->tccps[compno].cblksty, 1); - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0); - } - } - n = cblk->numnewpasses; - - do { - seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n); - seg->newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(seg->numnewpasses)); - n -= seg->numnewpasses; - if (n > 0) { - t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0); - } - } while (n > 0); - } - } - - if (bio_inalign(bio)) { - bio_destroy(bio); - return -999; - } - - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); - } else { - hd += 2; - } - } - - if (cp->ppm==1) { - cp->ppm_len+=cp->ppm_data-hd; - cp->ppm_data = hd; - } else if (tcp->ppt == 1) { - tcp->ppt_len+=tcp->ppt_data-hd; - tcp->ppt_data = hd; - } else { - c=hd; - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_seg_t *seg = NULL; - if (!cblk->numnewpasses) - continue; - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - cblk->numsegs++; - cblk->len = 0; - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - seg++; - cblk->numsegs++; - } - } - - do { - if (c + seg->newlen > src + len) { - return -999; - } - -#ifdef USE_JPWL - /* we need here a j2k handle to verify if making a check to - the validity of cblocks parameters is selected from user (-W) */ - - /* let's check that we are not exceeding */ - if ((cblk->len + seg->newlen) > 8192) { - opj_event_msg(t2->cinfo, EVT_WARNING, - "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", - seg->newlen, cblkno, precno, bandno, resno, compno); - if (!JPWL_ASSUME) { - opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return -999; - } - seg->newlen = 8192 - cblk->len; - opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", seg->newlen); - break; - }; - -#endif /* USE_JPWL */ - - memcpy(cblk->data + cblk->len, c, seg->newlen); - if (seg->numpasses == 0) { - seg->data = cblk->data + cblk->len; - } - c += seg->newlen; - cblk->len += seg->newlen; - seg->len += seg->newlen; - seg->numpasses += seg->numnewpasses; - cblk->numnewpasses -= seg->numnewpasses; - if (cblk->numnewpasses > 0) { - seg++; - cblk->numsegs++; - } - } while (cblk->numnewpasses > 0); - } - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_image_info_t *image_info,int tpnum, int tppos,int pino, J2K_T2_MODE t2_mode){ - unsigned char *c = dest; - int e = 0; - int compno; - int comp_len = 0; - opj_pi_iterator_t *pi = NULL; - int poc; - opj_image_t *image = t2->image; - opj_cp_t *cp = t2->cp; - int pocno = cp->cinema == CINEMA4K_24? 2: 1; - int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1; - - pi = pi_initialise_encode(image, cp, tileno, t2_mode); - if(!pi) { - /* TODO: throw an error */ - return -999; - } - - if(image_info) { - image_info->num = 0; - } - - if(t2_mode == THRESH_CALC ){ - for(compno = 0; compno < maxcomp; compno++ ){ - for(poc = 0; poc < pocno ; poc++){ - int comp_len = 0; - int tpnum = compno; - pi_create_encode(pi, cp,tileno,poc,tpnum,tppos); - while (pi_next(&pi[poc])) { - if (pi[poc].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, image_info, tileno); - comp_len = comp_len + e; - if (e == -999) { - break; - } else { - c += e; - } - } - } - if (e == -999) break; - if (cp->max_comp_size){ - if (comp_len > cp->max_comp_size){ - e = -999; - break; - } - } - } - if (e == -999) break; - } - }else{ - pi_create_encode(pi, cp,tileno,pino,tpnum,tppos); - while (pi_next(&pi[pino])) { - if (pi[pino].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, image_info, tileno); - if (e == -999) { - break; - } else { - c += e; - } - } - } - } - - /* INDEX >> */ - if(image_info && image_info->index_on) { - if(image_info->index_write) { - opj_tile_info_t *info_TL = &image_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[image_info->num]; - if (!image_info->num) { - info_PK->start_pos = info_TL->end_header + 1; - } else { - info_PK->start_pos = info_TL->packet[image_info->num - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - } - - image_info->num++; - } - /* << INDEX */ - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - dest); -} - -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile) { - unsigned char *c = src; - opj_pi_iterator_t *pi; - int pino, e = 0; - int n = 0; - - opj_image_t *image = t2->image; - opj_cp_t *cp = t2->cp; - - /* create a packet iterator */ - pi = pi_create_decode(image, cp, tileno); - if(!pi) { - /* TODO: throw an error */ - return -999; - } - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) { - e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino]); - } else { - e = 0; - } - - /* progression in resolution */ - image->comps[pi[pino].compno].resno_decoded = - (e > 0) ? - int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) - : image->comps[pi[pino].compno].resno_decoded; - n++; - - if (e == -999) { /* ADD */ - break; - } else { - c += e; - } - } - } - - /* don't forget to release pi */ - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) { - /* create the tcd structure */ - opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); - if(!t2) return NULL; - t2->cinfo = cinfo; - t2->image = image; - t2->cp = cp; - - return t2; -} - -void t2_destroy(opj_t2_t *t2) { - if(t2) { - opj_free(t2); - } -} - diff --git a/libraries/openjpeg-libsl/libopenjpeg/t2.h b/libraries/openjpeg-libsl/libopenjpeg/t2.h deleted file mode 100644 index 87ed2d2c3f..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/t2.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ -#ifndef __T2_H -#define __T2_H -/** -@file t2.h -@brief Implementation of a tier-2 coding (packetization of code-block data) (T2) - -*/ - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** -Tier-2 coding -*/ -typedef struct opj_t2 { - /** codec context */ - opj_common_ptr cinfo; - - /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ - opj_image_t *image; - /** pointer to the image coding parameters */ - opj_cp_t *cp; -} opj_t2_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Encode the packets of a tile to a destination buffer -@param t2 T2 handle -@param tileno number of the tile encoded -@param tile the tile for which to write the packets -@param maxlayers maximum number of layers -@param dest the destination buffer -@param len the length of the destination buffer -@param image_info structure to create an index file -@param tpnum Tile part number of the current tile -@param tppos The position of the tile part flag in the progression order -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -*/ -int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_image_info_t *image_info,int tpnum, int tppos,int pino,J2K_T2_MODE t2_mode); -/** -Decode the packets of a tile from a source buffer -@param t2 T2 handle -@param src the source buffer -@param len length of the source buffer -@param tileno number that identifies the tile for which to decode the packets -@param tile tile for which to decode the packets - */ -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile); - -/** -Create a T2 handle -@param cinfo Codec context info -@param image Source or destination image -@param cp Image coding parameters -@return Returns a new T2 handle if successful, returns NULL otherwise -*/ -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp); -/** -Destroy a T2 handle -@param t2 T2 handle to destroy -*/ -void t2_destroy(opj_t2_t *t2); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T2_H */ diff --git a/libraries/openjpeg-libsl/libopenjpeg/tcd.c b/libraries/openjpeg-libsl/libopenjpeg/tcd.c deleted file mode 100644 index 525ec91d53..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/tcd.c +++ /dev/null @@ -1,1409 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#include "opj_includes.h" - -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) { - int tileno, compno, resno, bandno, precno, cblkno; - - fprintf(fd, "image {\n"); - fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", - img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1); - - for (tileno = 0; tileno < img->th * img->tw; tileno++) { - opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; - fprintf(fd, " tile {\n"); - fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", - tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - fprintf(fd, " tilec {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", - tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - fprintf(fd, "\n res {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", - res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - fprintf(fd, " band {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n", - band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - fprintf(fd, " prec {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", - prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); - for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; - fprintf(fd, " cblk {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d\n", - cblk->x0, cblk->y0, cblk->x1, cblk->y1); - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -/* ----------------------------------------------------------------------- */ - -/** -Create a new TCD handle -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo) { - /* create the tcd structure */ - opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); - if(!tcd) return NULL; - tcd->cinfo = cinfo; - tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t)); - if(!tcd->tcd_image) { - opj_free(tcd); - return NULL; - } - - return tcd; -} - -/** -Destroy a previously created TCD handle -*/ -void tcd_destroy(opj_tcd_t *tcd) { - if(tcd) { - opj_free(tcd->tcd_image); - opj_free(tcd); - } -} - -/* ----------------------------------------------------------------------- */ - -void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { - int tileno, compno, resno, bandno, precno, cblkno; - - tcd->image = image; - tcd->cp = cp; - tcd->tcd_image->tw = cp->tw; - tcd->tcd_image->th = cp->th; - tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; /* si numerotation matricielle .. */ - int q = curtileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */ - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - tile->numcomps = image->numcomps; - /* tile->PPT=image->PPT; */ - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? - ((float) (tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec))/ - (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) - : 0; - - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - - tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - - res->numbands = resno == 0 ? 1 : 3; - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, i; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = image->comps[compno].prec + gain; - - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t)); - - for (i = 0; i < res->pw * res->ph * 3; i++) { - band->precincts[i].imsbtree = NULL; - band->precincts[i].incltree = NULL; - } - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cw * prc->ch) * sizeof(opj_tcd_cblk_t)); - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - } - } - } - } - } - } - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_free_encode(opj_tcd_t *tcd) { - int tileno, compno, resno, bandno, precno; - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - prc->incltree = NULL; - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - prc->imsbtree = NULL; - } - opj_free(prc->cblks); - prc->cblks = NULL; - } /* for (precno */ - opj_free(band->precincts); - band->precincts = NULL; - } /* for (bandno */ - } /* for (resno */ - opj_free(tilec->resolutions); - tilec->resolutions = NULL; - } /* for (compno */ - opj_free(tile->comps); - tile->comps = NULL; - } /* for (tileno */ - opj_free(tcd->tcd_image->tiles); - tcd->tcd_image->tiles = NULL; -} - -void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) { - int tileno, compno, resno, bandno, precno, cblkno; - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; - int q = curtileno / cp->tw; - - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - - tile->numcomps = image->numcomps; - /* tile->PPT=image->PPT; */ - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? - ((float) (tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec))/ - (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) - : 0; - - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - - /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */ - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - res->numbands = resno == 0 ? 1 : 3; - - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = image->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - opj_free(prc->cblks); - prc->cblks = (opj_tcd_cblk_t *) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_t)); - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - } - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - } /* tileno */ - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) { - int tileno, compno, resno, bandno, precno, cblkno, i, j, p, q; - unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; - - tcd->image = image; - tcd->cp = cp; - tcd->tcd_image->tw = cp->tw; - tcd->tcd_image->th = cp->th; - tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t)); - - for (i = 0; i < cp->tileno_size; i++) { - opj_tcp_t *tcp = &(cp->tcps[cp->tileno[i]]); - opj_tcd_tile_t *tile = &(tcd->tcd_image->tiles[cp->tileno[i]]); - - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tileno = cp->tileno[i]; - p = tileno % cp->tw; /* si numerotation matricielle .. */ - q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - - tile->numcomps = image->numcomps; - tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - res->numbands = resno == 0 ? 1 : 3; - - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx); - res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy); - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); - numbps = image->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t)); - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks = (opj_tcd_cblk_t *) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_t)); - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - /* code-block size (global) */ - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - } /* i = 0..cp->tileno_size */ - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ - - /* - Allocate place to store the decoded data = final image - Place limited by the tile really present in the codestream - */ - - for (i = 0; i < image->numcomps; i++) { - for (j = 0; j < cp->tileno_size; j++) { - tileno = cp->tileno[j]; - x0 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].x0 : int_min(x0, - (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].x0); - y0 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].y0 : int_min(y0, - (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].y0); - x1 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].x1 : int_max(x1, - (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].x1); - y1 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].y1 : int_max(y1, - (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].y1); - } - - w = x1 - x0; - h = y1 - y0; - - image->comps[i].data = (int *) opj_malloc(w * h * sizeof(int)); - image->comps[i].w = w; - image->comps[i].h = h; - image->comps[i].x0 = x0; - image->comps[i].y0 = y0; - } -} - -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) { - int compno, resno, bandno, precno, cblkno; - int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */ - int matrice[10][10][3]; - int i, j, k; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (i = 0; i < tcd_tcp->numlayers; i++) { - for (j = 0; j < tilec->numresolutions; j++) { - for (k = 0; k < 3; k++) { - matrice[i][j][k] = - (int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] - * (float) (tcd->image->comps[compno].prec / 16.0)); - } - } - } - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int n; - int imsb = tcd->image->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */ - /* Correction of the matrix of coefficient to include the IMSB information */ - if (layno == 0) { - value = matrice[layno][resno][bandno]; - if (imsb >= value) { - value = 0; - } else { - value -= imsb; - } - } else { - value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; - if (imsb >= matrice[layno - 1][resno][bandno]) { - value -= (imsb - matrice[layno - 1][resno][bandno]); - if (value < 0) { - value = 0; - } - } - } - - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - - n = cblk->numpassesinlayers; - if (cblk->numpassesinlayers == 0) { - if (value != 0) { - n = 3 * value - 2 + cblk->numpassesinlayers; - } else { - n = cblk->numpassesinlayers; - } - } else { - n = 3 * value + cblk->numpassesinlayers; - } - - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) - continue; - - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - } - if (final) - cblk->numpassesinlayers = n; - } - } - } - } - } -} - -void tcd_rateallocate_fixed(opj_tcd_t *tcd) { - int layno; - for (layno = 0; layno < tcd->tcp->numlayers; layno++) { - tcd_makelayer_fixed(tcd, layno, 1); - } -} - -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) { - int compno, resno, bandno, precno, cblkno, passno; - - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - - tcd_tile->distolayer[layno] = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - - int n; - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - n = cblk->numpassesinlayers; - for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { - int dr; - double dd; - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (n == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[n - 1].rate; - dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; - } - if (!dr) { - if (dd != 0) - n = passno + 1; - continue; - } - if (dd / dr >= thresh) - n = passno + 1; - } - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - layer->disto = 0; - continue; - } - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - layer->disto = cblk->passes[n - 1].distortiondec; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; - } - - tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */ - - if (final) - cblk->numpassesinlayers = n; - } - } - } - } - } -} - -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_info_t * image_info) { - int compno, resno, bandno, precno, cblkno, passno, layno; - double min, max; - double cumdisto[100]; /* fixed_quality */ - const double K = 1; /* 1.1; fixed_quality */ - double maxSE = 0; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - min = DBL_MAX; - max = 0; - - tcd_tile->nbpix = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - tilec->nbpix = 0; - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - for (passno = 0; passno < cblk->totalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int dr; - double dd, rdslope; - if (passno == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[passno - 1].rate; - dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; - } - if (dr == 0) { - continue; - } - rdslope = dd / dr; - if (rdslope < min) { - min = rdslope; - } - if (rdslope > max) { - max = rdslope; - } - } /* passno */ - - /* fixed_quality */ - tcd_tile->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); - tilec->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); - } /* cbklno */ - } /* precno */ - } /* bandno */ - } /* resno */ - - maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) - * ((double)(1 << tcd->image->comps[compno].prec) -1.0)) - * ((double)(tilec->nbpix)); - } /* compno */ - - /* index file */ - if(image_info && image_info->index_on) { - opj_tile_info_t *tile_info = &image_info->tile[tcd->tcd_tileno]; - tile_info->nbpix = tcd_tile->nbpix; - tile_info->distotile = tcd_tile->distotile; - tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); - } - - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - double lo = min; - double hi = max; - int success = 0; - /* TODO: remove maxlen */ - int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(tcd_tcp->rates[layno])), len) : len; - double goodthresh = 0; - double stable_thresh = 0; - int i; - double distotarget; /* fixed_quality */ - - /* fixed_quality */ - distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10)); - - if ((tcd_tcp->rates[layno]) || (cp->disto_alloc == 0)) { - opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp); - - for (i = 0; i < 32; i++) { - double thresh = (lo + hi) / 2; - int l = 0; - double distoachieved = 0; /* fixed_quality */ - - tcd_makelayer(tcd, layno, thresh, 0); - - if (cp->fixed_quality) { /* fixed_quality */ - if(cp->cinema){ - l = t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, image_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC); - if (l == -999) { - lo = thresh; - continue; - }else{ - distoachieved = layno == 0 ? - tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; - if (distoachieved < distotarget) { - hi=thresh; - stable_thresh = thresh; - continue; - }else{ - lo=thresh; - } - } - }else{ - distoachieved = (layno == 0) ? - tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); - if (distoachieved < distotarget) { - hi = thresh; - stable_thresh = thresh; - continue; - } - lo = thresh; - } - } else { - l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, image_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC); - /* TODO: what to do with l ??? seek / tell ??? */ - /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ - if (l == -999) { - lo = thresh; - continue; - } - hi = thresh; - stable_thresh = thresh; - } - } - success = 1; - goodthresh = stable_thresh; - t2_destroy(t2); - } else { - success = 1; - goodthresh = min; - } - - if (!success) { - return false; - } - - if(image_info && image_info->index_on) { /* Threshold for Marcela Index */ - image_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; - } - tcd_makelayer(tcd, layno, goodthresh, 1); - - /* fixed_quality */ - cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); - } - - return true; -} - -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info) { - int compno; - int l, i, npck = 0; - opj_tcd_tile_t *tile = NULL; - opj_tcp_t *tcd_tcp = NULL; - opj_cp_t *cp = NULL; - - opj_tcp_t *tcp = &tcd->cp->tcps[0]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_image_t *image = tcd->image; - - opj_t1_t *t1 = NULL; /* T1 component */ - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = tcd->tcd_image->tiles; - tcd->tcp = &tcd->cp->tcps[tileno]; - - tile = tcd->tcd_tile; - tcd_tcp = tcd->tcp; - cp = tcd->cp; - - if(tcd->cur_tp_num == 0){ - tcd->encoding_time = opj_clock(); /* time needed to encode a tile */ - /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ - if(image_info && image_info->index_on) { - opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ - for (i = 0; i < tilec_idx->numresolutions; i++) { - opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; - - image_info->tile[tileno].pw[i] = res_idx->pw; - image_info->tile[tileno].ph[i] = res_idx->ph; - - npck += res_idx->pw * res_idx->ph; - - image_info->tile[tileno].pdx[i] = tccp->prcw[i]; - image_info->tile[tileno].pdy[i] = tccp->prch[i]; - } - image_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(image_info->comp * image_info->layer * npck * sizeof(opj_packet_info_t)); - } - /* << INDEX */ - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - int x, y; - - int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1); - int offset_x = int_ceildiv(image->x0, image->comps[compno].dx); - int offset_y = int_ceildiv(image->y0, image->comps[compno].dy); - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int tw = tilec->x1 - tilec->x0; - int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx); - - /* extract tile data */ - - if (tcd_tcp->tccps[compno].qmfbid == 1) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = *data++ - adjust; - } - } - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = (*data++ - adjust) << 11; - } - - } - } - } - - /*----------------MCT-------------------*/ - if (tcd_tcp->mct) { - int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0); - if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); - } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples); - } - } - - /*----------------DWT---------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec); - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec); - } - } - - /*------------------TIER1-----------------*/ - t1 = t1_create(tcd->cinfo); - t1_encode_cblks(t1, tile, tcd_tcp); - t1_destroy(t1); - - /*-----------RATE-ALLOCATE------------------*/ - - /* INDEX */ - if(image_info) { - image_info->index_write = 0; - } - if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */ - /* Normal Rate/distortion allocation */ - tcd_rateallocate(tcd, dest, len, image_info); - } else { - /* Fixed layer allocation */ - tcd_rateallocate_fixed(tcd); - } - } - /*--------------TIER2------------------*/ - - /* INDEX */ - if(image_info) { - image_info->index_write = 1; - } - - t2 = t2_create(tcd->cinfo, image, cp); - l = t2_encode_packets(t2,tileno, tile, tcd_tcp->numlayers, dest, len, image_info,tcd->tp_num,tcd->tp_pos,tcd->cur_pino,FINAL_PASS); - t2_destroy(t2); - - /*---------------CLEAN-------------------*/ - - - if(tcd->cur_tp_num == tcd->cur_totnum_tp - 1){ - tcd->encoding_time = opj_clock() - tcd->encoding_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", tcd->encoding_time); - - /* cleaning memory */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_free(tilec->data); - } - } - - return l; -} - -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno) { - int l; - int compno; - int eof = 0; - double tile_time, t1_time, dwt_time; - opj_tcd_tile_t *tile = NULL; - - opj_t1_t *t1 = NULL; /* T1 component */ - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]); - tcd->tcp = &(tcd->cp->tcps[tileno]); - tile = tcd->tcd_tile; - - tile_time = opj_clock(); /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th); - - /*--------------TIER2------------------*/ - - t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp); - l = t2_decode_packets(t2, src, len, tileno, tile); - t2_destroy(t2); - - if (l == -999) { - eof = 1; - opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n"); - } - - /*------------------TIER1-----------------*/ - - t1_time = opj_clock(); /* time needed to decode a tile */ - t1 = t1_create(tcd->cinfo); - t1_decode_cblks(t1, tile, tcd->tcp); - t1_destroy(t1); - t1_time = opj_clock() - t1_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time); - - /*----------------DWT---------------------*/ - - dwt_time = opj_clock(); /* time needed to decode a tile */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd->cp->reduce != 0) { - tcd->image->comps[compno].resno_decoded = - tile->comps[compno].numresolutions - tcd->cp->reduce - 1; - } - - if (tcd->tcp->tccps[compno].qmfbid == 1) { - dwt_decode(tilec, tilec->numresolutions - 1 - tcd->image->comps[compno].resno_decoded); - } else { - dwt_decode_real(tilec, tilec->numresolutions - 1 - tcd->image->comps[compno].resno_decoded); - } - - if (tile->comps[compno].numresolutions > 0) { - tcd->image->comps[compno].factor = tile->comps[compno].numresolutions - (tcd->image->comps[compno].resno_decoded + 1); - } - } - dwt_time = opj_clock() - dwt_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); - - /*----------------MCT-------------------*/ - - if (tcd->tcp->mct) { - if (tcd->tcp->tccps[0].qmfbid == 1) { - mct_decode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); - } else { - mct_decode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); - } - } - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[tcd->image->comps[compno].resno_decoded]; - int adjust = tcd->image->comps[compno].sgnd ? 0 : 1 << (tcd->image->comps[compno].prec - 1); - int min = tcd->image->comps[compno].sgnd ? - -(1 << (tcd->image->comps[compno].prec - 1)) : 0; - int max = tcd->image->comps[compno].sgnd ? - (1 << (tcd->image->comps[compno].prec - 1)) - 1 : (1 << tcd->image->comps[compno].prec) - 1; - - int tw = tilec->x1 - tilec->x0; - int w = tcd->image->comps[compno].w; - - int i, j; - int offset_x = int_ceildivpow2(tcd->image->comps[compno].x0, tcd->image->comps[compno].factor); - int offset_y = int_ceildivpow2(tcd->image->comps[compno].y0, tcd->image->comps[compno].factor); - - for (j = res->y0; j < res->y1; j++) { - for (i = res->x0; i < res->x1; i++) { - int v; - float tmp = (float)((tilec->data[i - res->x0 + (j - res->y0) * tw]) / 8192.0); - - if (tcd->tcp->tccps[compno].qmfbid == 1) { - v = tilec->data[i - res->x0 + (j - res->y0) * tw]; - } else { - int tmp2 = ((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2); - v = ((tmp < 0) ? -tmp2:tmp2); - } - v += adjust; - - tcd->image->comps[compno].data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); - } - } - } - - tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_free(tcd->tcd_image->tiles[tileno].comps[compno].data); - tcd->tcd_image->tiles[tileno].comps[compno].data = NULL; - } - - if (eof) { - return false; - } - - return true; -} - -void tcd_free_decode(opj_tcd_t *tcd) { - int tileno,compno,resno,bandno,precno; - - opj_tcd_image_t *tcd_image = tcd->tcd_image; - - for (tileno = 0; tileno < tcd_image->tw * tcd_image->th; tileno++) { - opj_tcd_tile_t *tile = &tcd_image->tiles[tileno]; - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->ph * res->pw; precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - if (prec->cblks != NULL) opj_free(prec->cblks); - if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree); - if (prec->incltree != NULL) tgt_destroy(prec->incltree); - } - if (band->precincts != NULL) opj_free(band->precincts); - } - } - if (tilec->resolutions != NULL) opj_free(tilec->resolutions); - } - if (tile->comps != NULL) opj_free(tile->comps); - } - - if (tcd_image->tiles != NULL) opj_free(tcd_image->tiles); -} - diff --git a/libraries/openjpeg-libsl/libopenjpeg/tcd.h b/libraries/openjpeg-libsl/libopenjpeg/tcd.h deleted file mode 100644 index ae667098c9..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/tcd.h +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ -#ifndef __TCD_H -#define __TCD_H -/** -@file tcd.h -@brief Implementation of a tile coder/decoder (TCD) - -The functions in TCD.C have for goal to encode or decode each tile independently from -each other. The functions in TCD.C are used by some function in J2K.C. -*/ - -/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ -/*@{*/ - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_seg { - int numpasses; - int len; - unsigned char *data; - int maxpasses; - int numnewpasses; - int newlen; -} opj_tcd_seg_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_pass { - int rate; - double distortiondec; - int term, len; -} opj_tcd_pass_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_layer { - int numpasses; /* Number of passes in the layer */ - int len; /* len of information */ - double disto; /* add for index (Cfr. Marcela) */ - unsigned char *data; /* data */ -} opj_tcd_layer_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_cblk { - int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ - int numbps; - int numlenbits; - int len; /* length */ - int numpasses; /* number of pass already done for the code-blocks */ - int numnewpasses; /* number of pass added to the code-blocks */ - int numsegs; /* number of segments */ - opj_tcd_seg_t segs[100]; /* segments informations */ - unsigned char data[8192]; /* Data */ - int numpassesinlayers; /* number of passes in the layer */ - opj_tcd_layer_t layers[100]; /* layer information */ - int totalpasses; /* total number of passes */ - opj_tcd_pass_t passes[100]; /* information about the passes */ -} opj_tcd_cblk_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_precinct { - int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ - int cw, ch; /* number of precinct in width and heigth */ - opj_tcd_cblk_t *cblks; /* code-blocks informations */ - opj_tgt_tree_t *incltree; /* inclusion tree */ - opj_tgt_tree_t *imsbtree; /* IMSB tree */ -} opj_tcd_precinct_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_band { - int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ - int bandno; - opj_tcd_precinct_t *precincts; /* precinct information */ - int numbps; - float stepsize; -} opj_tcd_band_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_resolution { - int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ - int pw, ph; - int numbands; /* number sub-band for the resolution level */ - opj_tcd_band_t bands[3]; /* subband information */ -} opj_tcd_resolution_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_tilecomp { - int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ - int numresolutions; /* number of resolutions level */ - opj_tcd_resolution_t *resolutions; /* resolutions information */ - int *data; /* data of the component */ - int nbpix; /* add fixed_quality */ -} opj_tcd_tilecomp_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_tile { - int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ - int numcomps; /* number of components in tile */ - opj_tcd_tilecomp_t *comps; /* Components information */ - int nbpix; /* add fixed_quality */ - double distotile; /* add fixed_quality */ - double distolayer[100]; /* add fixed_quality */ -} opj_tcd_tile_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_image { - int tw, th; /* number of tiles in width and heigth */ - opj_tcd_tile_t *tiles; /* Tiles information */ -} opj_tcd_image_t; - -/** -Tile coder/decoder -*/ -typedef struct opj_tcd { - /** Position of the tilepart flag in Progression order*/ - int tp_pos; - /** Tile part number*/ - int tp_num; - /** Current tile part number*/ - int cur_tp_num; - /** Total number of tileparts of the current tile*/ - int cur_totnum_tp; - /** Current Packet iterator number */ - int cur_pino; - /** codec context */ - opj_common_ptr cinfo; - - /** info on each image tile */ - opj_tcd_image_t *tcd_image; - /** image */ - opj_image_t *image; - /** coding parameters */ - opj_cp_t *cp; - /** pointer to the current encoded/decoded tile */ - opj_tcd_tile_t *tcd_tile; - /** coding/decoding parameters common to all tiles */ - opj_tcp_t *tcp; - /** current encoded/decoded tile */ - int tcd_tileno; - /** Time taken to encode a tile*/ - double encoding_time; -} opj_tcd_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Dump the content of a tcd structure -*/ -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); -/** -Create a new TCD handle -@param cinfo Codec context info -@return Returns a new TCD handle if successful returns NULL otherwise -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo); -/** -Destroy a previously created TCD handle -@param tcd TCD handle to destroy -*/ -void tcd_destroy(opj_tcd_t *tcd); -/** -Initialize the tile coder (allocate the memory) -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); -/** -Free the memory allocated for encoding -@param tcd TCD handle -*/ -void tcd_free_encode(opj_tcd_t *tcd); -/** -Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno); -/** -Initialize the tile decoder -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -*/ -void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); -void tcd_rateallocate_fixed(opj_tcd_t *tcd); -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_info_t * image_info); -/** -Encode a tile from the raw image into a buffer -@param tcd TCD handle -@param tileno Number that identifies one of the tiles to be encoded -@param dest Destination buffer -@param len Length of destination buffer -@param image_info Creation of index file -@return -*/ -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info); -/** -Decode a tile from a buffer into a raw image -@param tcd TCD handle -@param src Source buffer -@param len Length of source buffer -@param tileno Number that identifies one of the tiles to be decoded -*/ -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno); -/** -Free the memory allocated for decoding -@param tcd TCD handle -*/ -void tcd_free_decode(opj_tcd_t *tcd); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TCD_H */ diff --git a/libraries/openjpeg-libsl/libopenjpeg/tgt.c b/libraries/openjpeg-libsl/libopenjpeg/tgt.c deleted file mode 100644 index 30b0aee4d3..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/tgt.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#include "opj_includes.h" - -/* -========================================================== - Tag-tree coder interface -========================================================== -*/ - -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { - int nplh[32]; - int nplv[32]; - opj_tgt_node_t *node = NULL; - opj_tgt_node_t *parentnode = NULL; - opj_tgt_node_t *parentnode0 = NULL; - opj_tgt_tree_t *tree = NULL; - int i, j, k; - int numlvls; - int n; - - tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); - if(!tree) return NULL; - tree->numleafsh = numleafsh; - tree->numleafsv = numleafsv; - - numlvls = 0; - nplh[0] = numleafsh; - nplv[0] = numleafsv; - tree->numnodes = 0; - do { - n = nplh[numlvls] * nplv[numlvls]; - nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; - nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; - tree->numnodes += n; - ++numlvls; - } while (n > 1); - - /* ADD */ - if (tree->numnodes == 0) { - opj_free(tree); - return NULL; - } - - tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t)); - if(!tree->nodes) { - opj_free(tree); - return NULL; - } - - node = tree->nodes; - parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; - parentnode0 = parentnode; - - for (i = 0; i < numlvls - 1; ++i) { - for (j = 0; j < nplv[i]; ++j) { - k = nplh[i]; - while (--k >= 0) { - node->parent = parentnode; - ++node; - if (--k >= 0) { - node->parent = parentnode; - ++node; - } - ++parentnode; - } - if ((j & 1) || j == nplv[i] - 1) { - parentnode0 = parentnode; - } else { - parentnode = parentnode0; - parentnode0 += nplh[i]; - } - } - } - node->parent = 0; - - tgt_reset(tree); - - return tree; -} - -void tgt_destroy(opj_tgt_tree_t *tree) { - opj_free(tree->nodes); - opj_free(tree); -} - -void tgt_reset(opj_tgt_tree_t *tree) { - int i; - - if (NULL == tree) - return; - - for (i = 0; i < tree->numnodes; i++) { - tree->nodes[i].value = 999; - tree->nodes[i].low = 0; - tree->nodes[i].known = 0; - } -} - -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { - opj_tgt_node_t *node; - node = &tree->nodes[leafno]; - while (node && node->value > value) { - node->value = value; - node = node->parent; - } -} - -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - - while (low < threshold) { - if (low >= node->value) { - if (!node->known) { - bio_write(bio, 1, 1); - node->known = 1; - } - break; - } - bio_write(bio, 0, 1); - ++low; - } - - node->low = low; - if (stkptr == stk) - break; - node = *--stkptr; - } -} - -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - while (low < threshold && low < node->value) { - if (bio_read(bio, 1)) { - node->value = low; - } else { - ++low; - } - } - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } - - return (node->value < threshold) ? 1 : 0; -} diff --git a/libraries/openjpeg-libsl/libopenjpeg/tgt.h b/libraries/openjpeg-libsl/libopenjpeg/tgt.h deleted file mode 100644 index c08c8da0af..0000000000 --- a/libraries/openjpeg-libsl/libopenjpeg/tgt.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * 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. - */ - -#ifndef __TGT_H -#define __TGT_H -/** -@file tgt.h -@brief Implementation of a tag-tree coder (TGT) - -The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C -are used by some function in T2.C. -*/ - -/** @defgroup TGT TGT - Implementation of a tag-tree coder */ -/*@{*/ - -/** -Tag node -*/ -typedef struct opj_tgt_node { - struct opj_tgt_node *parent; - int value; - int low; - int known; -} opj_tgt_node_t; - -/** -Tag tree -*/ -typedef struct opj_tgt_tree { - int numleafsh; - int numleafsv; - int numnodes; - opj_tgt_node_t *nodes; -} opj_tgt_tree_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a tag-tree -@param numleafsh Width of the array of leafs of the tree -@param numleafsv Height of the array of leafs of the tree -@return Returns a new tag-tree if successful, returns NULL otherwise -*/ -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv); -/** -Destroy a tag-tree, liberating memory -@param tree Tag-tree to destroy -*/ -void tgt_destroy(opj_tgt_tree_t *tree); -/** -Reset a tag-tree (set all leaves to 0) -@param tree Tag-tree to reset -*/ -void tgt_reset(opj_tgt_tree_t *tree); -/** -Set the value of a leaf of a tag-tree -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to modify -@param value New value of the leaf -*/ -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value); -/** -Encode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to encode -@param threshold Threshold to use when encoding value of the leaf -*/ -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); -/** -Decode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to decode -@param leafno Number that identifies the leaf to decode -@param threshold Threshold to use when decoding value of the leaf -@return Returns 1 if the node's value < threshold, returns 0 otherwise -*/ -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TGT_H */ diff --git a/libraries/openjpeg-libsl/libsl/libsl.cpp b/libraries/openjpeg-libsl/libsl/libsl.cpp deleted file mode 100644 index f3cae74b57..0000000000 --- a/libraries/openjpeg-libsl/libsl/libsl.cpp +++ /dev/null @@ -1,259 +0,0 @@ -// This is the main DLL file. - -#include "libsl.h" -extern "C" { -#include "../libopenjpeg/openjpeg.h" -} - -#define NULL 0 - - -struct image_wrapper -{ - opj_image* image; - - image_wrapper(int numcmpts, opj_image_cmptparm_t* cmptparms, OPJ_COLOR_SPACE clrspc) - { - image = opj_image_create(numcmpts, cmptparms, clrspc); - - if (image == NULL) - throw "opj_image_create failed"; - } - - image_wrapper(opj_dinfo* dinfo, opj_cio* cio) - { - image = opj_decode(dinfo,cio); - - if (image == NULL) - throw "opj_decode failed"; - } - - ~image_wrapper() - { - opj_image_destroy(image); - } -}; - -struct cinfo_wrapper -{ - opj_cinfo* cinfo; - - cinfo_wrapper(CODEC_FORMAT format) - { - cinfo = opj_create_compress(format); - - if (cinfo == NULL) - throw "opj_create_compress failed"; - } - - ~cinfo_wrapper() - { - opj_destroy_compress(cinfo); - } -}; - -struct dinfo_wrapper -{ - opj_dinfo* dinfo; - - dinfo_wrapper(CODEC_FORMAT format) - { - dinfo = opj_create_decompress(format); - - if (dinfo == NULL) - throw "opj_create_decompress failed"; - } - - ~dinfo_wrapper() - { - opj_destroy_decompress(dinfo); - } -}; - -struct cio_wrapper -{ - opj_cio* cio; - - cio_wrapper(opj_cinfo* cinfo, unsigned char* buffer, int length) - { - cio = opj_cio_open((opj_common_ptr)cinfo,buffer,length); - - if (cio == NULL) - throw "opj_cio_open failed"; - } - - cio_wrapper(opj_dinfo* dinfo, unsigned char* buffer, int length) - { - cio = opj_cio_open((opj_common_ptr)dinfo,buffer,length); - - if (cio == NULL) - throw "opj_cio_open failed"; - } - - ~cio_wrapper() - { - opj_cio_close(cio); - } -}; - -bool LibslAllocEncoded(LibslImage* image) -{ - try - { - image->encoded = new unsigned char[image->length]; - image->decoded = 0; - } - - catch (...) - { - return false; - } - - return true; -} - -bool LibslAllocDecoded(LibslImage* image) -{ - try - { - image->decoded = new unsigned char[image->width * image->height * image->components]; - image->encoded = 0; - } - - catch (...) - { - return false; - } - - return true; -} - -void LibslFree(LibslImage* image) -{ - if (image->encoded != 0) delete image->encoded; - if (image->decoded != 0) delete image->decoded; -} - - -bool LibslEncode(LibslImage* image, bool lossless) -{ - try - { - opj_cparameters cparameters; - opj_set_default_encoder_parameters(&cparameters); - cparameters.cp_disto_alloc = 1; - - if (lossless) - { - cparameters.tcp_numlayers = 1; - cparameters.tcp_rates[0] = 0; - } - else - { - cparameters.tcp_numlayers = 6; - cparameters.tcp_rates[0] = 1280; - cparameters.tcp_rates[1] = 640; - cparameters.tcp_rates[2] = 320; - cparameters.tcp_rates[3] = 160; - cparameters.tcp_rates[4] = 80; - cparameters.tcp_rates[5] = 40; - } - - cparameters.cp_comment = "LL_RGBHM"; - - if (image->components > 5) - return false; - - opj_image_comptparm comptparm[5]; - - for (int i = 0; i < image->components; i++) - { - comptparm[i].bpp = 8; - comptparm[i].prec = 8; - comptparm[i].sgnd = 0; - comptparm[i].dx = 1; - comptparm[i].dy = 1; - comptparm[i].x0 = 0; - comptparm[i].y0 = 0; - comptparm[i].w = image->width; - comptparm[i].h = image->height; - } - - image_wrapper cimage(image->components,comptparm,CLRSPC_SRGB); - cimage.image->x0 = 0; - cimage.image->y0 = 0; - cimage.image->x1 = image->width; - cimage.image->y1 = image->height; - - int dataIndex = 0, compIndex = 0, x, y, c; - - for (y = 0; y < image->height; y++) - { - for (x = 0; x < image->width; x++) - { - for (c = 0; c < image->components; c++) - cimage.image->comps[c].data[compIndex] = image->decoded[dataIndex++]; - - compIndex++; - } - } - - cinfo_wrapper cinfo(CODEC_J2K); - opj_setup_encoder(cinfo.cinfo,&cparameters,cimage.image); - cio_wrapper cio(cinfo.cinfo,NULL,0); - - if (!opj_encode(cinfo.cinfo,cio.cio,cimage.image,cparameters.index)) - return false; - - image->length = cio_tell(cio.cio); - image->encoded = new unsigned char[image->length]; - - for (int i = 0; i < image->length; i++) - image->encoded[i] = cio.cio->buffer[i]; - - return true; - } - - catch (...) - { - return false; - } -} - -bool LibslDecode(LibslImage* image) -{ - opj_dparameters dparameters; - - try - { - opj_set_default_decoder_parameters(&dparameters); - dinfo_wrapper dinfo(CODEC_J2K); - opj_setup_decoder(dinfo.dinfo, &dparameters); - cio_wrapper cio(dinfo.dinfo,image->encoded,image->length); - image_wrapper cimage(dinfo.dinfo, cio.cio); // decode happens here - - int dataIndex = 0, compIndex = 0, x, y, c; - image->width = cimage.image->x1 - cimage.image->x0; - image->height = cimage.image->y1 - cimage.image->y0; - image->components = cimage.image->numcomps; - image->decoded = new unsigned char[image->width*image->height*image->components]; - - for (y = 0; y < image->height; y++) - { - for (x = 0; x < image->width; x++) - { - for (c = 0; c < image->components; c++) - image->decoded[dataIndex++] = cimage.image->comps[c].data[compIndex]; - - compIndex++; - } - } - - return true; - } - - catch (...) - { - return false; - } -} diff --git a/libraries/openjpeg-libsl/libsl/libsl.h b/libraries/openjpeg-libsl/libsl/libsl.h deleted file mode 100644 index d6e293cda4..0000000000 --- a/libraries/openjpeg-libsl/libsl/libsl.h +++ /dev/null @@ -1,32 +0,0 @@ - - -#ifndef LIBSL_H -#define LIBSL_H - - -struct LibslImage -{ - unsigned char* encoded; - int length; - - unsigned char* decoded; - int width; - int height; - int components; -}; - -#ifdef WIN32 -#define DLLEXPORT extern "C" __declspec(dllexport) -#else -#define DLLEXPORT extern "C" -#endif - -// uncompresed images are raw RGBA 8bit/channel -DLLEXPORT bool LibslEncode(LibslImage* image, bool lossless); -DLLEXPORT bool LibslDecode(LibslImage* image); -DLLEXPORT bool LibslAllocEncoded(LibslImage* image); -DLLEXPORT bool LibslAllocDecoded(LibslImage* image); -DLLEXPORT void LibslFree(LibslImage* image); - - -#endif diff --git a/libraries/openjpeg-libsl/license.txt b/libraries/openjpeg-libsl/license.txt deleted file mode 100644 index 518281c8e8..0000000000 --- a/libraries/openjpeg-libsl/license.txt +++ /dev/null @@ -1 +0,0 @@ -/* * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2007, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * 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. */ \ No newline at end of file diff --git a/libraries/openjpeg-libsl/opensim_build_notes.txt b/libraries/openjpeg-libsl/opensim_build_notes.txt deleted file mode 100755 index 58f0f957ad..0000000000 --- a/libraries/openjpeg-libsl/opensim_build_notes.txt +++ /dev/null @@ -1,21 +0,0 @@ -source: -svn://opensecondlife.org/libsl -revision 1457 - -changes: -OpenJPEG.rc: -commented out line 10: //#include "afxres.h" -commented out line 20: //LANGUAGE LANG_FRENCH, SUBLANG_FRENCH - -build: - -windows: -compiler: Visual Studio 2005 Express -DllOpenJPEG.sln -set release config -build all -copy Release/openjpeg-libsl.dll to /bin - -linux: -make -copy libopenjpeg-libsl-2.1.2.0.so to /bin diff --git a/libraries/sqlite/unix/build/.libs/libsqlite3.a b/libraries/sqlite/unix/build/.libs/libsqlite3.a deleted file mode 100644 index 47e9121815..0000000000 Binary files a/libraries/sqlite/unix/build/.libs/libsqlite3.a and /dev/null differ diff --git a/libraries/sqlite/unix/build/.libs/libsqlite3.lai b/libraries/sqlite/unix/build/.libs/libsqlite3.lai deleted file mode 100644 index 3fcb50d337..0000000000 --- a/libraries/sqlite/unix/build/.libs/libsqlite3.lai +++ /dev/null @@ -1,35 +0,0 @@ -# libsqlite3.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.5.22 (1.1220.2.365 2005/12/18 22:14:06) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libsqlite3.so.0' - -# Names of this library. -library_names='libsqlite3.so.0.8.6 libsqlite3.so.0 libsqlite3.so' - -# The name of the static archive. -old_library='libsqlite3.a' - -# Libraries that this one depends upon. -dependency_libs=' -lpthread' - -# Version information for libsqlite3. -current=8 -age=8 -revision=6 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/lib' diff --git a/libraries/sqlite/unix/build/.libs/libsqlite3.so b/libraries/sqlite/unix/build/.libs/libsqlite3.so deleted file mode 120000 index 026b67c3ab..0000000000 --- a/libraries/sqlite/unix/build/.libs/libsqlite3.so +++ /dev/null @@ -1 +0,0 @@ -libsqlite3.so.0.8.6 \ No newline at end of file diff --git a/libraries/sqlite/unix/build/.libs/libsqlite3.so.0 b/libraries/sqlite/unix/build/.libs/libsqlite3.so.0 deleted file mode 120000 index 026b67c3ab..0000000000 --- a/libraries/sqlite/unix/build/.libs/libsqlite3.so.0 +++ /dev/null @@ -1 +0,0 @@ -libsqlite3.so.0.8.6 \ No newline at end of file diff --git a/libraries/sqlite/unix/build/.libs/libsqlite3.so.0.8.6 b/libraries/sqlite/unix/build/.libs/libsqlite3.so.0.8.6 deleted file mode 100755 index fbfd5e4cd5..0000000000 Binary files a/libraries/sqlite/unix/build/.libs/libsqlite3.so.0.8.6 and /dev/null differ diff --git a/libraries/sqlite/unix/build/.libs/sqlite3 b/libraries/sqlite/unix/build/.libs/sqlite3 deleted file mode 100755 index 8154d1033e..0000000000 Binary files a/libraries/sqlite/unix/build/.libs/sqlite3 and /dev/null differ diff --git a/libraries/sqlite/unix/build/Makefile b/libraries/sqlite/unix/build/Makefile deleted file mode 100644 index e3b6a4509d..0000000000 --- a/libraries/sqlite/unix/build/Makefile +++ /dev/null @@ -1,775 +0,0 @@ -#!/usr/make -# -# Makefile for SQLITE -# -# This makefile is suppose to be configured automatically using the -# autoconf. But if that does not work for you, you can configure -# the makefile manually. Just set the parameters below to values that -# work well for your system. -# -# If the configure script does not work out-of-the-box, you might -# be able to get it to work by giving it some hints. See the comment -# at the beginning of configure.in for additional information. -# - -# The toplevel directory of the source tree. This is the directory -# that contains this "Makefile.in" and the "configure.in" script. -# -TOP = ../sqlite-3.5.1 - -# C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -BCC = gcc -g -O2 - -# C Compile and options for use in building executables that -# will run on the target platform. (BCC and TCC are usually the -# same unless your are cross-compiling.) -# -TCC = gcc -g -O2 -I. -I${TOP}/src - -# Define -DNDEBUG to compile without debugging (i.e., for production usage) -# Omitting the define will cause extra debugging code to be inserted and -# includes extra comments when "EXPLAIN stmt" is used. -# -TCC += -DNDEBUG - -# Compiler options needed for programs that use the TCL library. -# -TCC += - -# The library that programs using TCL must link against. -# -LIBTCL = - -# Compiler options needed for programs that use the readline() library. -# -READLINE_FLAGS = -DHAVE_READLINE=0 - -# The library that programs using readline() must link against. -# -LIBREADLINE = - -# Should the database engine be compiled threadsafe -# -TCC += -DSQLITE_THREADSAFE=1 - -# The pthreads library if needed -# -LIBPTHREAD=-lpthread - -# Do threads override each others locks by default (1), or do we test (-1) -# -TCC += -DSQLITE_THREAD_OVERRIDE_LOCK=-1 - -# The fdatasync library -TLIBS = - -# Flags controlling use of the in memory btree implementation -# -# TEMP_STORE is 0 to force temporary tables to be in a file, 1 to -# default to file, 2 to default to memory, and 3 to force temporary -# tables to always be in memory. -# -TEMP_STORE = -DTEMP_STORE=1 - -# Version numbers and release number for the SQLite being compiled. -# -VERSION = 3.5 -VERSION_NUMBER = 3005001 -RELEASE = 3.5.1 - -# Filename extensions -# -BEXE = -TEXE = - -# The following variable is "1" if the configure script was able to locate -# the tclConfig.sh file. It is an empty string otherwise. When this -# variable is "1", the TCL extension library (libtclsqlite3.so) is built -# and installed. -# -HAVE_TCL = - -# The suffix used on shared libraries. Ex: ".dll", ".so", ".dylib" -# -SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@ - -# The directory into which to store package information for - -# Some standard variables and programs -# -prefix = /usr/local -exec_prefix = ${prefix} -libdir = ${exec_prefix}/lib -INSTALL = /usr/bin/install -c -LIBTOOL = ./libtool -ALLOWRELEASE = - -# libtool compile/link/install -LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(TCC) -LTLINK = $(LIBTOOL) --mode=link $(TCC) -LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) - -# nawk compatible awk. -NAWK = mawk - -# You should not have to change anything below this line -############################################################################### -TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1 - -# Object files for the SQLite library. -# -LIBOBJ = alter.lo analyze.lo attach.lo auth.lo btmutex.lo btree.lo build.lo \ - callback.lo complete.lo date.lo \ - delete.lo expr.lo func.lo hash.lo journal.lo insert.lo loadext.lo \ - main.lo malloc.lo mem1.lo mem2.lo mutex.lo \ - mutex_os2.lo mutex_unix.lo mutex_w32.lo \ - opcodes.lo os.lo os_unix.lo os_win.lo os_os2.lo \ - pager.lo parse.lo pragma.lo prepare.lo printf.lo random.lo \ - select.lo table.lo tokenize.lo trigger.lo update.lo \ - util.lo vacuum.lo \ - vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbefifo.lo vdbemem.lo \ - where.lo utf.lo legacy.lo vtab.lo - -# All of the source code files. -# -SRC = \ - $(TOP)/src/alter.c \ - $(TOP)/src/analyze.c \ - $(TOP)/src/attach.c \ - $(TOP)/src/auth.c \ - $(TOP)/src/btmutex.c \ - $(TOP)/src/btree.c \ - $(TOP)/src/btree.h \ - $(TOP)/src/build.c \ - $(TOP)/src/callback.c \ - $(TOP)/src/complete.c \ - $(TOP)/src/date.c \ - $(TOP)/src/delete.c \ - $(TOP)/src/expr.c \ - $(TOP)/src/func.c \ - $(TOP)/src/hash.c \ - $(TOP)/src/hash.h \ - $(TOP)/src/insert.c \ - $(TOP)/src/journal.c \ - $(TOP)/src/legacy.c \ - $(TOP)/src/loadext.c \ - $(TOP)/src/main.c \ - $(TOP)/src/malloc.c \ - $(TOP)/src/mem1.c \ - $(TOP)/src/mem2.c \ - $(TOP)/src/mutex.c \ - $(TOP)/src/mutex_os2.c \ - $(TOP)/src/mutex_unix.c \ - $(TOP)/src/mutex_w32.c \ - $(TOP)/src/os.c \ - $(TOP)/src/os_unix.c \ - $(TOP)/src/os_win.c \ - $(TOP)/src/os_os2.c \ - $(TOP)/src/pager.c \ - $(TOP)/src/pager.h \ - $(TOP)/src/parse.y \ - $(TOP)/src/pragma.c \ - $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c \ - $(TOP)/src/random.c \ - $(TOP)/src/select.c \ - $(TOP)/src/shell.c \ - $(TOP)/src/sqlite.h.in \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/table.c \ - $(TOP)/src/tclsqlite.c \ - $(TOP)/src/tokenize.c \ - $(TOP)/src/trigger.c \ - $(TOP)/src/utf.c \ - $(TOP)/src/update.c \ - $(TOP)/src/util.c \ - $(TOP)/src/vacuum.c \ - $(TOP)/src/vdbe.c \ - $(TOP)/src/vdbe.h \ - $(TOP)/src/vdbeapi.c \ - $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbeblob.c \ - $(TOP)/src/vdbefifo.c \ - $(TOP)/src/vdbemem.c \ - $(TOP)/src/vdbeInt.h \ - $(TOP)/src/vtab.c \ - $(TOP)/src/where.c - -# Source code for extensions -# -SRC += \ - $(TOP)/ext/fts1/fts1.c \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.c \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_porter.c \ - $(TOP)/ext/fts1/fts1_tokenizer.h \ - $(TOP)/ext/fts1/fts1_tokenizer1.c - - -# Source code to the test files. -# -TESTSRC = \ - $(TOP)/src/attach.c \ - $(TOP)/src/btree.c \ - $(TOP)/src/build.c \ - $(TOP)/src/date.c \ - $(TOP)/src/expr.c \ - $(TOP)/src/func.c \ - $(TOP)/src/insert.c \ - $(TOP)/src/malloc.c \ - $(TOP)/src/os.c \ - $(TOP)/src/os_os2.c \ - $(TOP)/src/os_unix.c \ - $(TOP)/src/os_win.c \ - $(TOP)/src/pager.c \ - $(TOP)/src/pragma.c \ - $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c \ - $(TOP)/src/select.c \ - $(TOP)/src/test1.c \ - $(TOP)/src/test2.c \ - $(TOP)/src/test3.c \ - $(TOP)/src/test4.c \ - $(TOP)/src/test5.c \ - $(TOP)/src/test6.c \ - $(TOP)/src/test7.c \ - $(TOP)/src/test8.c \ - $(TOP)/src/test9.c \ - $(TOP)/src/test_autoext.c \ - $(TOP)/src/test_async.c \ - $(TOP)/src/test_btree.c \ - $(TOP)/src/test_config.c \ - $(TOP)/src/test_hexio.c \ - $(TOP)/src/test_malloc.c \ - $(TOP)/src/test_md5.c \ - $(TOP)/src/test_schema.c \ - $(TOP)/src/test_server.c \ - $(TOP)/src/test_tclvar.c \ - $(TOP)/src/tokenize.c \ - $(TOP)/src/utf.c \ - $(TOP)/src/util.c \ - $(TOP)/src/vdbe.c \ - $(TOP)/src/vdbeapi.c \ - $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbemem.c \ - $(TOP)/src/where.c \ - parse.c - -# Header files used by all library source files. -# -HDR = \ - sqlite3.h \ - $(TOP)/src/btree.h \ - $(TOP)/src/btreeInt.h \ - $(TOP)/src/hash.h \ - $(TOP)/src/sqliteLimit.h \ - $(TOP)/src/mutex.h \ - opcodes.h \ - $(TOP)/src/os.h \ - $(TOP)/src/os_common.h \ - $(TOP)/src/sqlite3ext.h \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/vdbe.h \ - parse.h - -# Header files used by extensions -# -HDR += \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_tokenizer.h - -# Header files used by the VDBE submodule -# -VDBEHDR = \ - $(HDR) \ - $(TOP)/src/vdbeInt.h - -# This is the default Makefile target. The objects listed here -# are what get build when you type just "make" with no arguments. -# -all: sqlite3.h libsqlite3.la sqlite3$(TEXE) $(HAVE_TCL:1=libtclsqlite3.la) - -Makefile: $(TOP)/Makefile.in - ./config.status - -# Generate the file "last_change" which contains the date of change -# of the most recently modified source code file -# -last_change: $(SRC) - cat $(SRC) | grep '$$Id: ' | sort -k 5 | tail -1 \ - | $(NAWK) '{print $$5,$$6}' >last_change - -libsqlite3.la: $(LIBOBJ) - $(LTLINK) -o libsqlite3.la $(LIBOBJ) $(LIBPTHREAD) \ - ${ALLOWRELEASE} -rpath $(libdir) -version-info "8:6:8" - -libtclsqlite3.la: tclsqlite.lo libsqlite3.la - $(LTLINK) -o libtclsqlite3.la tclsqlite.lo \ - $(LIBOBJ) $(LIBPTHREAD) \ - -rpath $(libdir)/sqlite \ - -version-info "8:6:8" - -sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h - $(LTLINK) $(READLINE_FLAGS) $(LIBPTHREAD) \ - -o $@ $(TOP)/src/shell.c libsqlite3.la \ - $(LIBREADLINE) $(TLIBS) - -# This target creates a directory named "tsrc" and fills it with -# copies of all of the C source code and header files needed to -# build on the target system. Some of the C source code and header -# files are automatically generated. This target takes care of -# all that automatic generation. -# -target_source: $(SRC) parse.c opcodes.c keywordhash.h $(VDBEHDR) - rm -rf tsrc - mkdir -p tsrc - cp $(SRC) $(VDBEHDR) tsrc - rm tsrc/sqlite.h.in tsrc/parse.y - cp parse.c opcodes.c keywordhash.h tsrc - -sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl - tclsh $(TOP)/tool/mksqlite3c.tcl - -# Rules to build the LEMON compiler generator -# -lemon$(BEXE): $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c - $(BCC) -o lemon$(BEXE) $(TOP)/tool/lemon.c - cp $(TOP)/tool/lempar.c . - - -# Rules to build individual files -# -alter.lo: $(TOP)/src/alter.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/alter.c - -analyze.lo: $(TOP)/src/analyze.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/analyze.c - -attach.lo: $(TOP)/src/attach.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/attach.c - -auth.lo: $(TOP)/src/auth.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/auth.c - -btmutex.lo: $(TOP)/src/btmutex.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/btmutex.c - -btree.lo: $(TOP)/src/btree.c $(HDR) $(TOP)/src/pager.h - $(LTCOMPILE) -c $(TOP)/src/btree.c - -build.lo: $(TOP)/src/build.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/build.c - -callback.lo: $(TOP)/src/callback.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/callback.c - -complete.lo: $(TOP)/src/complete.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/complete.c - -date.lo: $(TOP)/src/date.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/date.c - -delete.lo: $(TOP)/src/delete.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/delete.c - -expr.lo: $(TOP)/src/expr.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/expr.c - -func.lo: $(TOP)/src/func.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/func.c - -hash.lo: $(TOP)/src/hash.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/hash.c - -insert.lo: $(TOP)/src/insert.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/insert.c - -journal.lo: $(TOP)/src/journal.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/journal.c - -legacy.lo: $(TOP)/src/legacy.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/legacy.c - -loadext.lo: $(TOP)/src/loadext.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/loadext.c - -main.lo: $(TOP)/src/main.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/main.c - -malloc.lo: $(TOP)/src/malloc.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/malloc.c - -mem1.lo: $(TOP)/src/mem1.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem1.c - -mem2.lo: $(TOP)/src/mem2.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem2.c - -mutex.lo: $(TOP)/src/mutex.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex.c - -mutex_os2.lo: $(TOP)/src/mutex_os2.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_os2.c - -mutex_unix.lo: $(TOP)/src/mutex_unix.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_unix.c - -mutex_w32.lo: $(TOP)/src/mutex_w32.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_w32.c - -pager.lo: $(TOP)/src/pager.c $(HDR) $(TOP)/src/pager.h - $(LTCOMPILE) -c $(TOP)/src/pager.c - -opcodes.lo: opcodes.c - $(LTCOMPILE) -c opcodes.c - -opcodes.c: opcodes.h $(TOP)/mkopcodec.awk - sort -n -b -k 3 opcodes.h | $(NAWK) -f $(TOP)/mkopcodec.awk >opcodes.c - -opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk - cat parse.h $(TOP)/src/vdbe.c | $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h - -os.lo: $(TOP)/src/os.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os.c - -os_unix.lo: $(TOP)/src/os_unix.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os_unix.c - -os_win.lo: $(TOP)/src/os_win.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os_win.c - -os_os2.lo: $(TOP)/src/os_os2.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os_os2.c - -parse.lo: parse.c $(HDR) - $(LTCOMPILE) -c parse.c - -parse.h: parse.c - -parse.c: $(TOP)/src/parse.y lemon$(BEXE) $(TOP)/addopcodes.awk - cp $(TOP)/src/parse.y . - ./lemon$(BEXE) $(OPTS) parse.y - mv parse.h parse.h.temp - $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h - -pragma.lo: $(TOP)/src/pragma.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/pragma.c - -prepare.lo: $(TOP)/src/prepare.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/prepare.c - -printf.lo: $(TOP)/src/printf.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/printf.c - -random.lo: $(TOP)/src/random.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/random.c - -select.lo: $(TOP)/src/select.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/select.c - -sqlite3.h: $(TOP)/src/sqlite.h.in - sed -e s/--VERS--/$(RELEASE)/ $(TOP)/src/sqlite.h.in | \ - sed -e s/--VERSION-NUMBER--/$(VERSION_NUMBER)/ >sqlite3.h - -table.lo: $(TOP)/src/table.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/table.c - -tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/tclsqlite.c - -tokenize.lo: $(TOP)/src/tokenize.c keywordhash.h $(HDR) - $(LTCOMPILE) -c $(TOP)/src/tokenize.c - -keywordhash.h: $(TOP)/tool/mkkeywordhash.c - $(BCC) -o mkkeywordhash$(BEXE) $(OPTS) $(TOP)/tool/mkkeywordhash.c - ./mkkeywordhash$(BEXE) >keywordhash.h - -trigger.lo: $(TOP)/src/trigger.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/trigger.c - -update.lo: $(TOP)/src/update.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/update.c - -utf.lo: $(TOP)/src/utf.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/utf.c - -util.lo: $(TOP)/src/util.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/util.c - -vacuum.lo: $(TOP)/src/vacuum.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/vacuum.c - -vdbe.lo: $(TOP)/src/vdbe.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbe.c - -vdbeapi.lo: $(TOP)/src/vdbeapi.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbeapi.c - -vdbeaux.lo: $(TOP)/src/vdbeaux.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbeaux.c - -vdbeblob.lo: $(TOP)/src/vdbeblob.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbeblob.c - -vdbefifo.lo: $(TOP)/src/vdbefifo.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbefifo.c - -vdbemem.lo: $(TOP)/src/vdbemem.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbemem.c - -vtab.lo: $(TOP)/src/vtab.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vtab.c - -where.lo: $(TOP)/src/where.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/where.c - -tclsqlite-shell.lo: $(TOP)/src/tclsqlite.c $(HDR) - $(LTCOMPILE) -DTCLSH=1 -o $@ -c $(TOP)/src/tclsqlite.c - -tclsqlite-stubs.lo: $(TOP)/src/tclsqlite.c $(HDR) - $(LTCOMPILE) -DTCL_USE_STUBS=1 -o $@ -c $(TOP)/src/tclsqlite.c - -tclsqlite3: tclsqlite-shell.lo libsqlite3.la - $(LTLINK) -o tclsqlite3 tclsqlite-shell.lo \ - libsqlite3.la $(LIBTCL) - -testfixture$(TEXE): $(TOP)/src/tclsqlite.c libsqlite3.la $(TESTSRC) - $(LTLINK) -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 \ - -DSQLITE_NO_SYNC=1 $(TEMP_STORE) \ - -o testfixture $(TESTSRC) $(TOP)/src/tclsqlite.c \ - libsqlite3.la $(LIBTCL) - - -fulltest: testfixture$(TEXE) sqlite3$(TEXE) - ./testfixture $(TOP)/test/all.test - -test: testfixture$(TEXE) sqlite3$(TEXE) - ./testfixture $(TOP)/test/quick.test - -sqlite3_analyzer$(TEXE): $(TOP)/src/tclsqlite.c libtclsqlite3.la \ - $(TESTSRC) $(TOP)/tool/spaceanal.tcl - sed \ - -e '/^#/d' \ - -e 's,\\,\\\\,g' \ - -e 's,",\\",g' \ - -e 's,^,",' \ - -e 's,$$,\\n",' \ - $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h - $(LTLINK) -DTCLSH=2 -DSQLITE_TEST=1 $(TEMP_STORE)\ - -o sqlite3_analyzer$(EXE) $(TESTSRC) $(TOP)/src/tclsqlite.c \ - libtclsqlite3.la $(LIBTCL) - -# Rules used to build documentation -# -arch.html: $(TOP)/www/arch.tcl - tclsh $(TOP)/www/arch.tcl >arch.html - -arch2.gif: $(TOP)/www/arch2.gif - cp $(TOP)/www/arch2.gif . - -autoinc.html: $(TOP)/www/autoinc.tcl - tclsh $(TOP)/www/autoinc.tcl >autoinc.html - -c_interface.html: $(TOP)/www/c_interface.tcl - tclsh $(TOP)/www/c_interface.tcl >c_interface.html - -capi3.html: $(TOP)/www/capi3.tcl - tclsh $(TOP)/www/capi3.tcl >capi3.html - -capi3ref.html: $(TOP)/www/mkapidoc.tcl sqlite3.h - tclsh $(TOP)/www/mkapidoc.tcl capi3ref.html - -changes.html: $(TOP)/www/changes.tcl - tclsh $(TOP)/www/changes.tcl >changes.html - -compile.html: $(TOP)/www/compile.tcl - tclsh $(TOP)/www/compile.tcl >compile.html - -copyright.html: $(TOP)/www/copyright.tcl - tclsh $(TOP)/www/copyright.tcl >copyright.html - -copyright-release.html: $(TOP)/www/copyright-release.html - cp $(TOP)/www/copyright-release.html . - -copyright-release.pdf: $(TOP)/www/copyright-release.pdf - cp $(TOP)/www/copyright-release.pdf . - -common.tcl: $(TOP)/www/common.tcl - cp $(TOP)/www/common.tcl . - -conflict.html: $(TOP)/www/conflict.tcl - tclsh $(TOP)/www/conflict.tcl >conflict.html - -datatypes.html: $(TOP)/www/datatypes.tcl - tclsh $(TOP)/www/datatypes.tcl >datatypes.html - -datatype3.html: $(TOP)/www/datatype3.tcl - tclsh $(TOP)/www/datatype3.tcl >datatype3.html - -docs.html: $(TOP)/www/docs.tcl - tclsh $(TOP)/www/docs.tcl >docs.html - -download.html: $(TOP)/www/download.tcl - mkdir -p doc - tclsh $(TOP)/www/download.tcl >download.html - -faq.html: $(TOP)/www/faq.tcl - tclsh $(TOP)/www/faq.tcl >faq.html - -fileformat.html: $(TOP)/www/fileformat.tcl - tclsh $(TOP)/www/fileformat.tcl >fileformat.html - -formatchng.html: $(TOP)/www/formatchng.tcl - tclsh $(TOP)/www/formatchng.tcl >formatchng.html - -index.html: $(TOP)/www/index.tcl last_change - tclsh $(TOP)/www/index.tcl >index.html - -limits.html: $(TOP)/www/limits.tcl last_change - tclsh $(TOP)/www/limits.tcl >limits.html - -lang.html: $(TOP)/www/lang.tcl - tclsh $(TOP)/www/lang.tcl >lang.html - -pragma.html: $(TOP)/www/pragma.tcl - tclsh $(TOP)/www/pragma.tcl >pragma.html - -lockingv3.html: $(TOP)/www/lockingv3.tcl - tclsh $(TOP)/www/lockingv3.tcl >lockingv3.html - -oldnews.html: $(TOP)/www/oldnews.tcl - tclsh $(TOP)/www/oldnews.tcl >oldnews.html - -omitted.html: $(TOP)/www/omitted.tcl - tclsh $(TOP)/www/omitted.tcl >omitted.html - -opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c - tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html - -mingw.html: $(TOP)/www/mingw.tcl - tclsh $(TOP)/www/mingw.tcl >mingw.html - -nulls.html: $(TOP)/www/nulls.tcl - tclsh $(TOP)/www/nulls.tcl >nulls.html - -quickstart.html: $(TOP)/www/quickstart.tcl - tclsh $(TOP)/www/quickstart.tcl >quickstart.html - -speed.html: $(TOP)/www/speed.tcl - tclsh $(TOP)/www/speed.tcl >speed.html - -sqlite.gif: $(TOP)/art/SQLite.gif - cp $(TOP)/art/SQLite.gif sqlite.gif - -sqlite.html: $(TOP)/www/sqlite.tcl - tclsh $(TOP)/www/sqlite.tcl >sqlite.html - -support.html: $(TOP)/www/support.tcl - tclsh $(TOP)/www/support.tcl >support.html - -tclsqlite.html: $(TOP)/www/tclsqlite.tcl - tclsh $(TOP)/www/tclsqlite.tcl >tclsqlite.html - -vdbe.html: $(TOP)/www/vdbe.tcl - tclsh $(TOP)/www/vdbe.tcl >vdbe.html - -version3.html: $(TOP)/www/version3.tcl - tclsh $(TOP)/www/version3.tcl >version3.html - - -# Files to be published on the website. -# -DOC = \ - arch.html \ - arch2.gif \ - autoinc.html \ - c_interface.html \ - capi3.html \ - capi3ref.html \ - changes.html \ - compile.html \ - copyright.html \ - copyright-release.html \ - copyright-release.pdf \ - conflict.html \ - datatypes.html \ - datatype3.html \ - docs.html \ - download.html \ - faq.html \ - fileformat.html \ - formatchng.html \ - index.html \ - lang.html \ - limits.html \ - lockingv3.html \ - mingw.html \ - nulls.html \ - oldnews.html \ - omitted.html \ - opcode.html \ - pragma.html \ - quickstart.html \ - speed.html \ - sqlite.gif \ - sqlite.html \ - support.html \ - tclsqlite.html \ - vdbe.html \ - version3.html - -doc: common.tcl $(DOC) - mkdir -p doc - mv $(DOC) doc - -install: sqlite3 libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} - $(INSTALL) -d $(DESTDIR)$(libdir) - $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) - $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin - $(LTINSTALL) sqlite3 $(DESTDIR)$(exec_prefix)/bin - $(INSTALL) -d $(DESTDIR)$(prefix)/include - $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(prefix)/include - $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(prefix)/include - $(INSTALL) -d $(DESTDIR)$(libdir)/pkgconfig; - $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(libdir)/pkgconfig; - -tcl_install: libtclsqlite3.la - tclsh $(TOP)/tclinstaller.tcl $(VERSION) - -clean: - rm -f *.lo *.la *.o sqlite3$(TEXE) libsqlite3.la - rm -f sqlite3.h opcodes.* - rm -rf .libs .deps - rm -f lemon$(BEXE) lempar.c parse.* sqlite*.tar.gz - rm -f mkkeywordhash$(BEXE) keywordhash.h - rm -f $(PUBLISH) - rm -f *.da *.bb *.bbg gmon.out - rm -f testfixture$(TEXE) test.db - rm -rf doc - rm -f common.tcl - rm -f sqlite3.dll sqlite3.lib sqlite3.def - -distclean: clean - rm -f config.log config.status libtool Makefile config.h sqlite3.pc - -# -# Windows section -# -dll: sqlite3.dll - -REAL_LIBOBJ = $(LIBOBJ:%.lo=.libs/%.o) - -$(REAL_LIBOBJ): $(LIBOBJ) - -sqlite3.def: $(REAL_LIBOBJ) - echo 'EXPORTS' >sqlite3.def - nm $(REAL_LIBOBJ) | grep ' T ' | grep ' _sqlite3_' \ - | sed 's/^.* _//' >>sqlite3.def - -sqlite3.dll: $(REAL_LIBOBJ) sqlite3.def - $(TCC) -shared -o sqlite3.dll sqlite3.def \ - -Wl,"--strip-all" $(REAL_LIBOBJ) diff --git a/libraries/sqlite/unix/opensim_build_notes.txt b/libraries/sqlite/unix/opensim_build_notes.txt deleted file mode 100644 index 370d2bd916..0000000000 --- a/libraries/sqlite/unix/opensim_build_notes.txt +++ /dev/null @@ -1,6 +0,0 @@ -downloaded tarball from: -http://www.sqlite.org/sqlite-3.5.1.tar.gz - -build: -see README -instead of install, you can copy build/.libs/libsqlite3.so.0.8.6 to bin/libsqlite3.so.0 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/Makefile.in b/libraries/sqlite/unix/sqlite-3.5.1/Makefile.in deleted file mode 100644 index 5f7d040105..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/Makefile.in +++ /dev/null @@ -1,775 +0,0 @@ -#!/usr/make -# -# Makefile for SQLITE -# -# This makefile is suppose to be configured automatically using the -# autoconf. But if that does not work for you, you can configure -# the makefile manually. Just set the parameters below to values that -# work well for your system. -# -# If the configure script does not work out-of-the-box, you might -# be able to get it to work by giving it some hints. See the comment -# at the beginning of configure.in for additional information. -# - -# The toplevel directory of the source tree. This is the directory -# that contains this "Makefile.in" and the "configure.in" script. -# -TOP = @srcdir@ - -# C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -BCC = @BUILD_CC@ @BUILD_CFLAGS@ - -# C Compile and options for use in building executables that -# will run on the target platform. (BCC and TCC are usually the -# same unless your are cross-compiling.) -# -TCC = @CC@ @CFLAGS@ -I. -I${TOP}/src - -# Define -DNDEBUG to compile without debugging (i.e., for production usage) -# Omitting the define will cause extra debugging code to be inserted and -# includes extra comments when "EXPLAIN stmt" is used. -# -TCC += @TARGET_DEBUG@ @XTHREADCONNECT@ - -# Compiler options needed for programs that use the TCL library. -# -TCC += @TCL_INCLUDE_SPEC@ - -# The library that programs using TCL must link against. -# -LIBTCL = @TCL_LIB_SPEC@ @TCL_LIBS@ - -# Compiler options needed for programs that use the readline() library. -# -READLINE_FLAGS = -DHAVE_READLINE=@TARGET_HAVE_READLINE@ @TARGET_READLINE_INC@ - -# The library that programs using readline() must link against. -# -LIBREADLINE = @TARGET_READLINE_LIBS@ - -# Should the database engine be compiled threadsafe -# -TCC += -DSQLITE_THREADSAFE=@SQLITE_THREADSAFE@ - -# The pthreads library if needed -# -LIBPTHREAD=@TARGET_THREAD_LIB@ - -# Do threads override each others locks by default (1), or do we test (-1) -# -TCC += -DSQLITE_THREAD_OVERRIDE_LOCK=@THREADSOVERRIDELOCKS@ - -# The fdatasync library -TLIBS = @LIBS@ - -# Flags controlling use of the in memory btree implementation -# -# TEMP_STORE is 0 to force temporary tables to be in a file, 1 to -# default to file, 2 to default to memory, and 3 to force temporary -# tables to always be in memory. -# -TEMP_STORE = -DTEMP_STORE=@TEMP_STORE@ - -# Version numbers and release number for the SQLite being compiled. -# -VERSION = @VERSION@ -VERSION_NUMBER = @VERSION_NUMBER@ -RELEASE = @RELEASE@ - -# Filename extensions -# -BEXE = @BUILD_EXEEXT@ -TEXE = @TARGET_EXEEXT@ - -# The following variable is "1" if the configure script was able to locate -# the tclConfig.sh file. It is an empty string otherwise. When this -# variable is "1", the TCL extension library (libtclsqlite3.so) is built -# and installed. -# -HAVE_TCL = @HAVE_TCL@ - -# The suffix used on shared libraries. Ex: ".dll", ".so", ".dylib" -# -SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@ - -# The directory into which to store package information for - -# Some standard variables and programs -# -prefix = @prefix@ -exec_prefix = @exec_prefix@ -libdir = @libdir@ -INSTALL = @INSTALL@ -LIBTOOL = ./libtool -ALLOWRELEASE = @ALLOWRELEASE@ - -# libtool compile/link/install -LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(TCC) -LTLINK = $(LIBTOOL) --mode=link $(TCC) @LDFLAGS@ -LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) - -# nawk compatible awk. -NAWK = @AWK@ - -# You should not have to change anything below this line -############################################################################### -TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1 - -# Object files for the SQLite library. -# -LIBOBJ = alter.lo analyze.lo attach.lo auth.lo btmutex.lo btree.lo build.lo \ - callback.lo complete.lo date.lo \ - delete.lo expr.lo func.lo hash.lo journal.lo insert.lo loadext.lo \ - main.lo malloc.lo mem1.lo mem2.lo mutex.lo \ - mutex_os2.lo mutex_unix.lo mutex_w32.lo \ - opcodes.lo os.lo os_unix.lo os_win.lo os_os2.lo \ - pager.lo parse.lo pragma.lo prepare.lo printf.lo random.lo \ - select.lo table.lo tokenize.lo trigger.lo update.lo \ - util.lo vacuum.lo \ - vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbefifo.lo vdbemem.lo \ - where.lo utf.lo legacy.lo vtab.lo - -# All of the source code files. -# -SRC = \ - $(TOP)/src/alter.c \ - $(TOP)/src/analyze.c \ - $(TOP)/src/attach.c \ - $(TOP)/src/auth.c \ - $(TOP)/src/btmutex.c \ - $(TOP)/src/btree.c \ - $(TOP)/src/btree.h \ - $(TOP)/src/build.c \ - $(TOP)/src/callback.c \ - $(TOP)/src/complete.c \ - $(TOP)/src/date.c \ - $(TOP)/src/delete.c \ - $(TOP)/src/expr.c \ - $(TOP)/src/func.c \ - $(TOP)/src/hash.c \ - $(TOP)/src/hash.h \ - $(TOP)/src/insert.c \ - $(TOP)/src/journal.c \ - $(TOP)/src/legacy.c \ - $(TOP)/src/loadext.c \ - $(TOP)/src/main.c \ - $(TOP)/src/malloc.c \ - $(TOP)/src/mem1.c \ - $(TOP)/src/mem2.c \ - $(TOP)/src/mutex.c \ - $(TOP)/src/mutex_os2.c \ - $(TOP)/src/mutex_unix.c \ - $(TOP)/src/mutex_w32.c \ - $(TOP)/src/os.c \ - $(TOP)/src/os_unix.c \ - $(TOP)/src/os_win.c \ - $(TOP)/src/os_os2.c \ - $(TOP)/src/pager.c \ - $(TOP)/src/pager.h \ - $(TOP)/src/parse.y \ - $(TOP)/src/pragma.c \ - $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c \ - $(TOP)/src/random.c \ - $(TOP)/src/select.c \ - $(TOP)/src/shell.c \ - $(TOP)/src/sqlite.h.in \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/table.c \ - $(TOP)/src/tclsqlite.c \ - $(TOP)/src/tokenize.c \ - $(TOP)/src/trigger.c \ - $(TOP)/src/utf.c \ - $(TOP)/src/update.c \ - $(TOP)/src/util.c \ - $(TOP)/src/vacuum.c \ - $(TOP)/src/vdbe.c \ - $(TOP)/src/vdbe.h \ - $(TOP)/src/vdbeapi.c \ - $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbeblob.c \ - $(TOP)/src/vdbefifo.c \ - $(TOP)/src/vdbemem.c \ - $(TOP)/src/vdbeInt.h \ - $(TOP)/src/vtab.c \ - $(TOP)/src/where.c - -# Source code for extensions -# -SRC += \ - $(TOP)/ext/fts1/fts1.c \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.c \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_porter.c \ - $(TOP)/ext/fts1/fts1_tokenizer.h \ - $(TOP)/ext/fts1/fts1_tokenizer1.c - - -# Source code to the test files. -# -TESTSRC = \ - $(TOP)/src/attach.c \ - $(TOP)/src/btree.c \ - $(TOP)/src/build.c \ - $(TOP)/src/date.c \ - $(TOP)/src/expr.c \ - $(TOP)/src/func.c \ - $(TOP)/src/insert.c \ - $(TOP)/src/malloc.c \ - $(TOP)/src/os.c \ - $(TOP)/src/os_os2.c \ - $(TOP)/src/os_unix.c \ - $(TOP)/src/os_win.c \ - $(TOP)/src/pager.c \ - $(TOP)/src/pragma.c \ - $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c \ - $(TOP)/src/select.c \ - $(TOP)/src/test1.c \ - $(TOP)/src/test2.c \ - $(TOP)/src/test3.c \ - $(TOP)/src/test4.c \ - $(TOP)/src/test5.c \ - $(TOP)/src/test6.c \ - $(TOP)/src/test7.c \ - $(TOP)/src/test8.c \ - $(TOP)/src/test9.c \ - $(TOP)/src/test_autoext.c \ - $(TOP)/src/test_async.c \ - $(TOP)/src/test_btree.c \ - $(TOP)/src/test_config.c \ - $(TOP)/src/test_hexio.c \ - $(TOP)/src/test_malloc.c \ - $(TOP)/src/test_md5.c \ - $(TOP)/src/test_schema.c \ - $(TOP)/src/test_server.c \ - $(TOP)/src/test_tclvar.c \ - $(TOP)/src/tokenize.c \ - $(TOP)/src/utf.c \ - $(TOP)/src/util.c \ - $(TOP)/src/vdbe.c \ - $(TOP)/src/vdbeapi.c \ - $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbemem.c \ - $(TOP)/src/where.c \ - parse.c - -# Header files used by all library source files. -# -HDR = \ - sqlite3.h \ - $(TOP)/src/btree.h \ - $(TOP)/src/btreeInt.h \ - $(TOP)/src/hash.h \ - $(TOP)/src/sqliteLimit.h \ - $(TOP)/src/mutex.h \ - opcodes.h \ - $(TOP)/src/os.h \ - $(TOP)/src/os_common.h \ - $(TOP)/src/sqlite3ext.h \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/vdbe.h \ - parse.h - -# Header files used by extensions -# -HDR += \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_tokenizer.h - -# Header files used by the VDBE submodule -# -VDBEHDR = \ - $(HDR) \ - $(TOP)/src/vdbeInt.h - -# This is the default Makefile target. The objects listed here -# are what get build when you type just "make" with no arguments. -# -all: sqlite3.h libsqlite3.la sqlite3$(TEXE) $(HAVE_TCL:1=libtclsqlite3.la) - -Makefile: $(TOP)/Makefile.in - ./config.status - -# Generate the file "last_change" which contains the date of change -# of the most recently modified source code file -# -last_change: $(SRC) - cat $(SRC) | grep '$$Id: ' | sort -k 5 | tail -1 \ - | $(NAWK) '{print $$5,$$6}' >last_change - -libsqlite3.la: $(LIBOBJ) - $(LTLINK) -o libsqlite3.la $(LIBOBJ) $(LIBPTHREAD) \ - ${ALLOWRELEASE} -rpath $(libdir) -version-info "8:6:8" - -libtclsqlite3.la: tclsqlite.lo libsqlite3.la - $(LTLINK) -o libtclsqlite3.la tclsqlite.lo \ - $(LIBOBJ) @TCL_STUB_LIB_SPEC@ $(LIBPTHREAD) \ - -rpath $(libdir)/sqlite \ - -version-info "8:6:8" - -sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h - $(LTLINK) $(READLINE_FLAGS) $(LIBPTHREAD) \ - -o $@ $(TOP)/src/shell.c libsqlite3.la \ - $(LIBREADLINE) $(TLIBS) - -# This target creates a directory named "tsrc" and fills it with -# copies of all of the C source code and header files needed to -# build on the target system. Some of the C source code and header -# files are automatically generated. This target takes care of -# all that automatic generation. -# -target_source: $(SRC) parse.c opcodes.c keywordhash.h $(VDBEHDR) - rm -rf tsrc - mkdir -p tsrc - cp $(SRC) $(VDBEHDR) tsrc - rm tsrc/sqlite.h.in tsrc/parse.y - cp parse.c opcodes.c keywordhash.h tsrc - -sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl - tclsh $(TOP)/tool/mksqlite3c.tcl - -# Rules to build the LEMON compiler generator -# -lemon$(BEXE): $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c - $(BCC) -o lemon$(BEXE) $(TOP)/tool/lemon.c - cp $(TOP)/tool/lempar.c . - - -# Rules to build individual files -# -alter.lo: $(TOP)/src/alter.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/alter.c - -analyze.lo: $(TOP)/src/analyze.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/analyze.c - -attach.lo: $(TOP)/src/attach.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/attach.c - -auth.lo: $(TOP)/src/auth.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/auth.c - -btmutex.lo: $(TOP)/src/btmutex.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/btmutex.c - -btree.lo: $(TOP)/src/btree.c $(HDR) $(TOP)/src/pager.h - $(LTCOMPILE) -c $(TOP)/src/btree.c - -build.lo: $(TOP)/src/build.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/build.c - -callback.lo: $(TOP)/src/callback.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/callback.c - -complete.lo: $(TOP)/src/complete.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/complete.c - -date.lo: $(TOP)/src/date.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/date.c - -delete.lo: $(TOP)/src/delete.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/delete.c - -expr.lo: $(TOP)/src/expr.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/expr.c - -func.lo: $(TOP)/src/func.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/func.c - -hash.lo: $(TOP)/src/hash.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/hash.c - -insert.lo: $(TOP)/src/insert.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/insert.c - -journal.lo: $(TOP)/src/journal.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/journal.c - -legacy.lo: $(TOP)/src/legacy.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/legacy.c - -loadext.lo: $(TOP)/src/loadext.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/loadext.c - -main.lo: $(TOP)/src/main.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/main.c - -malloc.lo: $(TOP)/src/malloc.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/malloc.c - -mem1.lo: $(TOP)/src/mem1.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem1.c - -mem2.lo: $(TOP)/src/mem2.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mem2.c - -mutex.lo: $(TOP)/src/mutex.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex.c - -mutex_os2.lo: $(TOP)/src/mutex_os2.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_os2.c - -mutex_unix.lo: $(TOP)/src/mutex_unix.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_unix.c - -mutex_w32.lo: $(TOP)/src/mutex_w32.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/mutex_w32.c - -pager.lo: $(TOP)/src/pager.c $(HDR) $(TOP)/src/pager.h - $(LTCOMPILE) -c $(TOP)/src/pager.c - -opcodes.lo: opcodes.c - $(LTCOMPILE) -c opcodes.c - -opcodes.c: opcodes.h $(TOP)/mkopcodec.awk - sort -n -b -k 3 opcodes.h | $(NAWK) -f $(TOP)/mkopcodec.awk >opcodes.c - -opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk - cat parse.h $(TOP)/src/vdbe.c | $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h - -os.lo: $(TOP)/src/os.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os.c - -os_unix.lo: $(TOP)/src/os_unix.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os_unix.c - -os_win.lo: $(TOP)/src/os_win.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os_win.c - -os_os2.lo: $(TOP)/src/os_os2.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/os_os2.c - -parse.lo: parse.c $(HDR) - $(LTCOMPILE) -c parse.c - -parse.h: parse.c - -parse.c: $(TOP)/src/parse.y lemon$(BEXE) $(TOP)/addopcodes.awk - cp $(TOP)/src/parse.y . - ./lemon$(BEXE) $(OPTS) parse.y - mv parse.h parse.h.temp - $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h - -pragma.lo: $(TOP)/src/pragma.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/pragma.c - -prepare.lo: $(TOP)/src/prepare.c $(HDR) - $(LTCOMPILE) $(TEMP_STORE) -c $(TOP)/src/prepare.c - -printf.lo: $(TOP)/src/printf.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/printf.c - -random.lo: $(TOP)/src/random.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/random.c - -select.lo: $(TOP)/src/select.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/select.c - -sqlite3.h: $(TOP)/src/sqlite.h.in - sed -e s/--VERS--/$(RELEASE)/ $(TOP)/src/sqlite.h.in | \ - sed -e s/--VERSION-NUMBER--/$(VERSION_NUMBER)/ >sqlite3.h - -table.lo: $(TOP)/src/table.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/table.c - -tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/tclsqlite.c - -tokenize.lo: $(TOP)/src/tokenize.c keywordhash.h $(HDR) - $(LTCOMPILE) -c $(TOP)/src/tokenize.c - -keywordhash.h: $(TOP)/tool/mkkeywordhash.c - $(BCC) -o mkkeywordhash$(BEXE) $(OPTS) $(TOP)/tool/mkkeywordhash.c - ./mkkeywordhash$(BEXE) >keywordhash.h - -trigger.lo: $(TOP)/src/trigger.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/trigger.c - -update.lo: $(TOP)/src/update.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/update.c - -utf.lo: $(TOP)/src/utf.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/utf.c - -util.lo: $(TOP)/src/util.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/util.c - -vacuum.lo: $(TOP)/src/vacuum.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/vacuum.c - -vdbe.lo: $(TOP)/src/vdbe.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbe.c - -vdbeapi.lo: $(TOP)/src/vdbeapi.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbeapi.c - -vdbeaux.lo: $(TOP)/src/vdbeaux.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbeaux.c - -vdbeblob.lo: $(TOP)/src/vdbeblob.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbeblob.c - -vdbefifo.lo: $(TOP)/src/vdbefifo.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbefifo.c - -vdbemem.lo: $(TOP)/src/vdbemem.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vdbemem.c - -vtab.lo: $(TOP)/src/vtab.c $(VDBEHDR) - $(LTCOMPILE) -c $(TOP)/src/vtab.c - -where.lo: $(TOP)/src/where.c $(HDR) - $(LTCOMPILE) -c $(TOP)/src/where.c - -tclsqlite-shell.lo: $(TOP)/src/tclsqlite.c $(HDR) - $(LTCOMPILE) -DTCLSH=1 -o $@ -c $(TOP)/src/tclsqlite.c - -tclsqlite-stubs.lo: $(TOP)/src/tclsqlite.c $(HDR) - $(LTCOMPILE) -DTCL_USE_STUBS=1 -o $@ -c $(TOP)/src/tclsqlite.c - -tclsqlite3: tclsqlite-shell.lo libsqlite3.la - $(LTLINK) -o tclsqlite3 tclsqlite-shell.lo \ - libsqlite3.la $(LIBTCL) - -testfixture$(TEXE): $(TOP)/src/tclsqlite.c libsqlite3.la $(TESTSRC) - $(LTLINK) -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 \ - -DSQLITE_NO_SYNC=1 $(TEMP_STORE) \ - -o testfixture $(TESTSRC) $(TOP)/src/tclsqlite.c \ - libsqlite3.la $(LIBTCL) - - -fulltest: testfixture$(TEXE) sqlite3$(TEXE) - ./testfixture $(TOP)/test/all.test - -test: testfixture$(TEXE) sqlite3$(TEXE) - ./testfixture $(TOP)/test/quick.test - -sqlite3_analyzer$(TEXE): $(TOP)/src/tclsqlite.c libtclsqlite3.la \ - $(TESTSRC) $(TOP)/tool/spaceanal.tcl - sed \ - -e '/^#/d' \ - -e 's,\\,\\\\,g' \ - -e 's,",\\",g' \ - -e 's,^,",' \ - -e 's,$$,\\n",' \ - $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h - $(LTLINK) -DTCLSH=2 -DSQLITE_TEST=1 $(TEMP_STORE)\ - -o sqlite3_analyzer$(EXE) $(TESTSRC) $(TOP)/src/tclsqlite.c \ - libtclsqlite3.la $(LIBTCL) - -# Rules used to build documentation -# -arch.html: $(TOP)/www/arch.tcl - tclsh $(TOP)/www/arch.tcl >arch.html - -arch2.gif: $(TOP)/www/arch2.gif - cp $(TOP)/www/arch2.gif . - -autoinc.html: $(TOP)/www/autoinc.tcl - tclsh $(TOP)/www/autoinc.tcl >autoinc.html - -c_interface.html: $(TOP)/www/c_interface.tcl - tclsh $(TOP)/www/c_interface.tcl >c_interface.html - -capi3.html: $(TOP)/www/capi3.tcl - tclsh $(TOP)/www/capi3.tcl >capi3.html - -capi3ref.html: $(TOP)/www/mkapidoc.tcl sqlite3.h - tclsh $(TOP)/www/mkapidoc.tcl capi3ref.html - -changes.html: $(TOP)/www/changes.tcl - tclsh $(TOP)/www/changes.tcl >changes.html - -compile.html: $(TOP)/www/compile.tcl - tclsh $(TOP)/www/compile.tcl >compile.html - -copyright.html: $(TOP)/www/copyright.tcl - tclsh $(TOP)/www/copyright.tcl >copyright.html - -copyright-release.html: $(TOP)/www/copyright-release.html - cp $(TOP)/www/copyright-release.html . - -copyright-release.pdf: $(TOP)/www/copyright-release.pdf - cp $(TOP)/www/copyright-release.pdf . - -common.tcl: $(TOP)/www/common.tcl - cp $(TOP)/www/common.tcl . - -conflict.html: $(TOP)/www/conflict.tcl - tclsh $(TOP)/www/conflict.tcl >conflict.html - -datatypes.html: $(TOP)/www/datatypes.tcl - tclsh $(TOP)/www/datatypes.tcl >datatypes.html - -datatype3.html: $(TOP)/www/datatype3.tcl - tclsh $(TOP)/www/datatype3.tcl >datatype3.html - -docs.html: $(TOP)/www/docs.tcl - tclsh $(TOP)/www/docs.tcl >docs.html - -download.html: $(TOP)/www/download.tcl - mkdir -p doc - tclsh $(TOP)/www/download.tcl >download.html - -faq.html: $(TOP)/www/faq.tcl - tclsh $(TOP)/www/faq.tcl >faq.html - -fileformat.html: $(TOP)/www/fileformat.tcl - tclsh $(TOP)/www/fileformat.tcl >fileformat.html - -formatchng.html: $(TOP)/www/formatchng.tcl - tclsh $(TOP)/www/formatchng.tcl >formatchng.html - -index.html: $(TOP)/www/index.tcl last_change - tclsh $(TOP)/www/index.tcl >index.html - -limits.html: $(TOP)/www/limits.tcl last_change - tclsh $(TOP)/www/limits.tcl >limits.html - -lang.html: $(TOP)/www/lang.tcl - tclsh $(TOP)/www/lang.tcl >lang.html - -pragma.html: $(TOP)/www/pragma.tcl - tclsh $(TOP)/www/pragma.tcl >pragma.html - -lockingv3.html: $(TOP)/www/lockingv3.tcl - tclsh $(TOP)/www/lockingv3.tcl >lockingv3.html - -oldnews.html: $(TOP)/www/oldnews.tcl - tclsh $(TOP)/www/oldnews.tcl >oldnews.html - -omitted.html: $(TOP)/www/omitted.tcl - tclsh $(TOP)/www/omitted.tcl >omitted.html - -opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c - tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html - -mingw.html: $(TOP)/www/mingw.tcl - tclsh $(TOP)/www/mingw.tcl >mingw.html - -nulls.html: $(TOP)/www/nulls.tcl - tclsh $(TOP)/www/nulls.tcl >nulls.html - -quickstart.html: $(TOP)/www/quickstart.tcl - tclsh $(TOP)/www/quickstart.tcl >quickstart.html - -speed.html: $(TOP)/www/speed.tcl - tclsh $(TOP)/www/speed.tcl >speed.html - -sqlite.gif: $(TOP)/art/SQLite.gif - cp $(TOP)/art/SQLite.gif sqlite.gif - -sqlite.html: $(TOP)/www/sqlite.tcl - tclsh $(TOP)/www/sqlite.tcl >sqlite.html - -support.html: $(TOP)/www/support.tcl - tclsh $(TOP)/www/support.tcl >support.html - -tclsqlite.html: $(TOP)/www/tclsqlite.tcl - tclsh $(TOP)/www/tclsqlite.tcl >tclsqlite.html - -vdbe.html: $(TOP)/www/vdbe.tcl - tclsh $(TOP)/www/vdbe.tcl >vdbe.html - -version3.html: $(TOP)/www/version3.tcl - tclsh $(TOP)/www/version3.tcl >version3.html - - -# Files to be published on the website. -# -DOC = \ - arch.html \ - arch2.gif \ - autoinc.html \ - c_interface.html \ - capi3.html \ - capi3ref.html \ - changes.html \ - compile.html \ - copyright.html \ - copyright-release.html \ - copyright-release.pdf \ - conflict.html \ - datatypes.html \ - datatype3.html \ - docs.html \ - download.html \ - faq.html \ - fileformat.html \ - formatchng.html \ - index.html \ - lang.html \ - limits.html \ - lockingv3.html \ - mingw.html \ - nulls.html \ - oldnews.html \ - omitted.html \ - opcode.html \ - pragma.html \ - quickstart.html \ - speed.html \ - sqlite.gif \ - sqlite.html \ - support.html \ - tclsqlite.html \ - vdbe.html \ - version3.html - -doc: common.tcl $(DOC) - mkdir -p doc - mv $(DOC) doc - -install: sqlite3 libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} - $(INSTALL) -d $(DESTDIR)$(libdir) - $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) - $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin - $(LTINSTALL) sqlite3 $(DESTDIR)$(exec_prefix)/bin - $(INSTALL) -d $(DESTDIR)$(prefix)/include - $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(prefix)/include - $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(prefix)/include - $(INSTALL) -d $(DESTDIR)$(libdir)/pkgconfig; - $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(libdir)/pkgconfig; - -tcl_install: libtclsqlite3.la - tclsh $(TOP)/tclinstaller.tcl $(VERSION) - -clean: - rm -f *.lo *.la *.o sqlite3$(TEXE) libsqlite3.la - rm -f sqlite3.h opcodes.* - rm -rf .libs .deps - rm -f lemon$(BEXE) lempar.c parse.* sqlite*.tar.gz - rm -f mkkeywordhash$(BEXE) keywordhash.h - rm -f $(PUBLISH) - rm -f *.da *.bb *.bbg gmon.out - rm -f testfixture$(TEXE) test.db - rm -rf doc - rm -f common.tcl - rm -f sqlite3.dll sqlite3.lib sqlite3.def - -distclean: clean - rm -f config.log config.status libtool Makefile config.h sqlite3.pc - -# -# Windows section -# -dll: sqlite3.dll - -REAL_LIBOBJ = $(LIBOBJ:%.lo=.libs/%.o) - -$(REAL_LIBOBJ): $(LIBOBJ) - -sqlite3.def: $(REAL_LIBOBJ) - echo 'EXPORTS' >sqlite3.def - nm $(REAL_LIBOBJ) | grep ' T ' | grep ' _sqlite3_' \ - | sed 's/^.* _//' >>sqlite3.def - -sqlite3.dll: $(REAL_LIBOBJ) sqlite3.def - $(TCC) -shared -o sqlite3.dll sqlite3.def \ - -Wl,"--strip-all" $(REAL_LIBOBJ) diff --git a/libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc b/libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc deleted file mode 100644 index b4d769914e..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/Makefile.linux-gcc +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/make -# -# Makefile for SQLITE -# -# This is a template makefile for SQLite. Most people prefer to -# use the autoconf generated "configure" script to generate the -# makefile automatically. But that does not work for everybody -# and in every situation. If you are having problems with the -# "configure" script, you might want to try this makefile as an -# alternative. Create a copy of this file, edit the parameters -# below and type "make". -# - -#### The toplevel directory of the source tree. This is the directory -# that contains this "Makefile.in" and the "configure.in" script. -# -TOP = ../sqlite - -#### C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -BCC = gcc -g -O2 -#BCC = /opt/ancic/bin/c89 -0 - -#### If the target operating system supports the "usleep()" system -# call, then define the HAVE_USLEEP macro for all C modules. -# -#USLEEP = -USLEEP = -DHAVE_USLEEP=1 - -#### If you want the SQLite library to be safe for use within a -# multi-threaded program, then define the following macro -# appropriately: -# -#THREADSAFE = -DTHREADSAFE=1 -THREADSAFE = -DTHREADSAFE=0 - -#### Specify any extra linker options needed to make the library -# thread safe -# -#THREADLIB = -lpthread -THREADLIB = - -#### Specify any extra libraries needed to access required functions. -# -#TLIBS = -lrt # fdatasync on Solaris 8 -TLIBS = - -#### Leave SQLITE_DEBUG undefined for maximum speed. Use SQLITE_DEBUG=1 -# to check for memory leaks. Use SQLITE_DEBUG=2 to print a log of all -# malloc()s and free()s in order to track down memory leaks. -# -# SQLite uses some expensive assert() statements in the inner loop. -# You can make the library go almost twice as fast if you compile -# with -DNDEBUG=1 -# -#OPTS = -DSQLITE_DEBUG=2 -#OPTS = -DSQLITE_DEBUG=1 -#OPTS = -OPTS = -DNDEBUG=1 -OPTS += -DHAVE_FDATASYNC=1 - -#### The suffix to add to executable files. ".exe" for windows. -# Nothing for unix. -# -#EXE = .exe -EXE = - -#### C Compile and options for use in building executables that -# will run on the target platform. This is usually the same -# as BCC, unless you are cross-compiling. -# -TCC = gcc -O6 -#TCC = gcc -g -O0 -Wall -#TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage -#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 -#TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive - -#### Tools used to build a static library. -# -AR = ar cr -#AR = /opt/mingw/bin/i386-mingw32-ar cr -RANLIB = ranlib -#RANLIB = /opt/mingw/bin/i386-mingw32-ranlib - -MKSHLIB = gcc -shared -SO = so -SHPREFIX = lib -# SO = dll -# SHPREFIX = - -#### Extra compiler options needed for programs that use the TCL library. -# -#TCL_FLAGS = -#TCL_FLAGS = -DSTATIC_BUILD=1 -TCL_FLAGS = -I/home/drh/tcltk/8.4linux -#TCL_FLAGS = -I/home/drh/tcltk/8.4win -DSTATIC_BUILD=1 -#TCL_FLAGS = -I/home/drh/tcltk/8.3hpux - -#### Linker options needed to link against the TCL library. -# -#LIBTCL = -ltcl -lm -ldl -LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl -#LIBTCL = /home/drh/tcltk/8.4win/libtcl84s.a -lmsvcrt -#LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc - -#### Compiler options needed for programs that use the readline() library. -# -READLINE_FLAGS = -#READLINE_FLAGS = -DHAVE_READLINE=1 -I/usr/include/readline - -#### Linker options needed by programs using readline() must link against. -# -LIBREADLINE = -#LIBREADLINE = -static -lreadline -ltermcap - -#### Which "awk" program provides nawk compatibilty -# -# NAWK = nawk -NAWK = awk - -# You should not have to change anything below this line -############################################################################### -include $(TOP)/main.mk diff --git a/libraries/sqlite/unix/sqlite-3.5.1/README b/libraries/sqlite/unix/sqlite-3.5.1/README deleted file mode 100644 index 6e4f392054..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/README +++ /dev/null @@ -1,35 +0,0 @@ -This directory contains source code to - - SQLite: An Embeddable SQL Database Engine - -To compile the project, first create a directory in which to place -the build products. It is recommended, but not required, that the -build directory be separate from the source directory. Cd into the -build directory and then from the build directory run the configure -script found at the root of the source tree. Then run "make". - -For example: - - tar xzf sqlite.tar.gz ;# Unpack the source tree into "sqlite" - mkdir bld ;# Build will occur in a sibling directory - cd bld ;# Change to the build directory - ../sqlite/configure ;# Run the configure script - make ;# Run the makefile. - make install ;# (Optional) Install the build products - -The configure script uses autoconf 2.50 and libtool. If the configure -script does not work out for you, there is a generic makefile named -"Makefile.linux-gcc" in the top directory of the source tree that you -can copy and edit to suite your needs. Comments on the generic makefile -show what changes are needed. - -The linux binaries on the website are created using the generic makefile, -not the configure script. The configure script is unmaintained. (You -can volunteer to take over maintenance of the configure script, if you want!) -The windows binaries on the website are created using MinGW32 configured -as a cross-compiler running under Linux. For details, see the ./publish.sh -script at the top-level of the source tree. - -Contacts: - - http://www.sqlite.org/ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/VERSION b/libraries/sqlite/unix/sqlite-3.5.1/VERSION deleted file mode 100644 index d5c0c99142..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/VERSION +++ /dev/null @@ -1 +0,0 @@ -3.5.1 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 b/libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 deleted file mode 100644 index 27b6c66b39..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/aclocal.m4 +++ /dev/null @@ -1,6470 +0,0 @@ -# generated automatically by aclocal 1.10 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- - -# serial 48 AC_PROG_LIBTOOL - - -# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) -# ----------------------------------------------------------- -# If this macro is not defined by Autoconf, define it here. -m4_ifdef([AC_PROVIDE_IFELSE], - [], - [m4_define([AC_PROVIDE_IFELSE], - [m4_ifdef([AC_PROVIDE_$1], - [$2], [$3])])]) - - -# AC_PROG_LIBTOOL -# --------------- -AC_DEFUN([AC_PROG_LIBTOOL], -[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl -dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX -dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. - AC_PROVIDE_IFELSE([AC_PROG_CXX], - [AC_LIBTOOL_CXX], - [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX - ])]) -dnl And a similar setup for Fortran 77 support - AC_PROVIDE_IFELSE([AC_PROG_F77], - [AC_LIBTOOL_F77], - [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -])]) - -dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. - AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], - [AC_LIBTOOL_GCJ], - [ifdef([AC_PROG_GCJ], - [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([A][M_PROG_GCJ], - [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) - ifdef([LT_AC_PROG_GCJ], - [define([LT_AC_PROG_GCJ], - defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -])])# AC_PROG_LIBTOOL - - -# _AC_PROG_LIBTOOL -# ---------------- -AC_DEFUN([_AC_PROG_LIBTOOL], -[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl -AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -# Prevent multiple expansion -define([AC_PROG_LIBTOOL], []) -])# _AC_PROG_LIBTOOL - - -# AC_LIBTOOL_SETUP -# ---------------- -AC_DEFUN([AC_LIBTOOL_SETUP], -[AC_PREREQ(2.50)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl -AC_REQUIRE([AC_PROG_NM])dnl - -AC_REQUIRE([AC_PROG_LN_S])dnl -AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl -# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! -AC_REQUIRE([AC_OBJEXT])dnl -AC_REQUIRE([AC_EXEEXT])dnl -dnl - -AC_LIBTOOL_SYS_MAX_CMD_LEN -AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -AC_LIBTOOL_OBJDIR - -AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -_LT_AC_PROG_ECHO_BACKSLASH - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' -[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] - -# Same as above, but do not quote variable references. -[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" - -AC_CHECK_TOOL(AR, ar, false) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(STRIP, strip, :) - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$MAGIC_CMD" && MAGIC_CMD=file -test -z "$NM" && NM=nm -test -z "$SED" && SED=sed -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$ac_objext" && ac_objext=o - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - AC_PATH_MAGIC - fi - ;; -esac - -AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -enable_win32_dll=yes, enable_win32_dll=no) - -AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -AC_ARG_WITH([pic], - [AC_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) -test -z "$pic_mode" && pic_mode=default - -# Check if we have a version mismatch between libtool.m4 and ltmain.sh. -# -# Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. -# We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually -# calls AC_LIBTOOL_CONFIG and creates libtool. -# -_LT_VERSION_CHECK - -# Use C for the default configuration in the libtool script -tagname= -AC_LIBTOOL_LANG_C_CONFIG -_LT_AC_TAGCONFIG -])# AC_LIBTOOL_SETUP - - -# _LT_VERSION_CHECK -# ----------------- -AC_DEFUN([_LT_VERSION_CHECK], -[AC_MSG_CHECKING([for correct ltmain.sh version]) -if test "x$ltmain" = "x" ; then - AC_MSG_RESULT(no) - AC_MSG_ERROR([ - -*** @<:@Gentoo@:>@ sanity check failed! *** -*** \$ltmain is not defined, please check the patch for consistency! *** -]) -fi -gentoo_lt_version="1.5.22" -gentoo_ltmain_version=`sed -n '/^[[ ]]*VERSION=/{s/^[[ ]]*VERSION=//;p;q;}' "$ltmain"` -if test "x$gentoo_lt_version" != "x$gentoo_ltmain_version" ; then - AC_MSG_RESULT(no) - AC_MSG_ERROR([ - -*** @<:@Gentoo@:>@ sanity check failed! *** -*** libtool.m4 and ltmain.sh have a version mismatch! *** -*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** - -Please run: - - libtoolize --copy --force - -if appropriate, please contact the maintainer of this -package (or your distribution) for help. -]) -else - AC_MSG_RESULT(yes) -fi -])# _LT_VERSION_CHECK - - -# _LT_AC_SYS_COMPILER -# ------------------- -AC_DEFUN([_LT_AC_SYS_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_AC_SYS_COMPILER - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -AC_DEFUN([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -]) - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -AC_DEFUN([_LT_COMPILER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -AC_DEFUN([_LT_LINKER_BOILERPLATE], -[ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* -])# _LT_LINKER_BOILERPLATE - - -# _LT_AC_SYS_LIBPATH_AIX -# ---------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -])# _LT_AC_SYS_LIBPATH_AIX - - -# _LT_AC_SHELL_INIT(ARG) -# ---------------------- -AC_DEFUN([_LT_AC_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_AC_SHELL_INIT - - -# _LT_AC_PROG_ECHO_BACKSLASH -# -------------------------- -# Add some code to the start of the generated configure script which -# will find an echo command which doesn't interpret backslashes. -AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], -[_LT_AC_SHELL_INIT([ -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` - ;; -esac - -echo=${ECHO-echo} -if test "X[$]1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X[$]1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} -fi - -if test "X[$]1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null 2>&1 && unset CDPATH - -if test -z "$ECHO"; then -if test "X${echo_test_string+set}" != Xset; then -# find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string=`eval $cmd`) 2>/dev/null && - echo_test_string=`eval $cmd` && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null - then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : -else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} - else - # Try using printf. - echo='printf %s\n' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL [$]0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$CONFIG_SHELL [$]0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "[$]0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -ECHO=$echo -if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then - ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -fi - -AC_SUBST(ECHO) -])])# _LT_AC_PROG_ECHO_BACKSLASH - - -# _LT_AC_LOCK -# ----------- -AC_DEFUN([_LT_AC_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AC_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) LD="${LD-ld} -64" ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw* | *-*-pw32*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; - ]) -esac - -need_locks="$enable_libtool_lock" - -])# _LT_AC_LOCK - - -# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], -[AC_REQUIRE([LT_AC_PROG_SED]) -AC_CACHE_CHECK([$1], [$2], - [$2=no - ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $rm conftest* -]) - -if test x"[$]$2" = xyes; then - ifelse([$5], , :, [$5]) -else - ifelse([$6], , :, [$6]) -fi -])# AC_LIBTOOL_COMPILER_OPTION - - -# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ------------------------------------------------------------ -# Check whether the given compiler option works -AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -[AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - ifelse([$4], , :, [$4]) -else - ifelse([$5], , :, [$5]) -fi -])# AC_LIBTOOL_LINKER_OPTION - - -# AC_LIBTOOL_SYS_MAX_CMD_LEN -# -------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], -[# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ - = "XX$teststring") >/dev/null 2>&1 && - new_result=`expr "X$teststring" : ".*" 2>&1` && - lt_cv_sys_max_cmd_len=$new_result && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - teststring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -])# AC_LIBTOOL_SYS_MAX_CMD_LEN - - -# _LT_AC_CHECK_DLFCN -# ------------------ -AC_DEFUN([_LT_AC_CHECK_DLFCN], -[AC_CHECK_HEADERS(dlfcn.h)dnl -])# _LT_AC_CHECK_DLFCN - - -# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# --------------------------------------------------------------------- -AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - else - puts (dlerror ()); - - exit (status); -}] -EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_AC_TRY_DLOPEN_SELF - - -# AC_LIBTOOL_DLOPEN_SELF -# ---------------------- -AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], -[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_AC_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_AC_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -])# AC_LIBTOOL_DLOPEN_SELF - - -# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) -# --------------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler -AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* -]) -])# AC_LIBTOOL_PROG_CC_C_O - - -# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) -# ----------------------------------------- -# Check to see if we can do hard links to lock some files if needed -AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], -[AC_REQUIRE([_LT_AC_LOCK])dnl - -hard_links="nottested" -if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS - - -# AC_LIBTOOL_OBJDIR -# ----------------- -AC_DEFUN([AC_LIBTOOL_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -])# AC_LIBTOOL_OBJDIR - - -# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) -# ---------------------------------------------- -# Check hardcoding attributes. -AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_AC_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ - test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ - test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_AC_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_AC_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_AC_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH - - -# AC_LIBTOOL_SYS_LIB_STRIP -# ------------------------ -AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], -[striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) -fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -])# AC_LIBTOOL_SYS_LIB_STRIP - - -# AC_LIBTOOL_SYS_DYNAMIC_LINKER -# ----------------------------- -# PORTME Fill in your ld.so characteristics -AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -[AC_MSG_CHECKING([dynamic linker characteristics]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[[45]]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - linux*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - $archive_expsym_cmds="$archive_cmds" - fi - else - ld_shlibs=no - fi - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[123]]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - # Handle Gentoo/FreeBSD as it was Linux - case $host_vendor in - gentoo) - version_type=linux ;; - *) - version_type=freebsd-$objformat ;; - esac - - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - linux) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - need_lib_prefix=no - need_version=no - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - freebsd*) # from 4.6 on - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix3*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - shlibpath_overrides_runpath=no - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - shlibpath_overrides_runpath=yes - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi -])# AC_LIBTOOL_SYS_DYNAMIC_LINKER - - -# _LT_AC_TAGCONFIG -# ---------------- -AC_DEFUN([_LT_AC_TAGCONFIG], -[AC_ARG_WITH([tags], - [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], - [include additional configurations @<:@automatic@:>@])], - [tagnames="$withval"]) - -if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then - AC_MSG_WARN([output file `$ofile' does not exist]) - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then - AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) - else - AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) - fi - fi - if test -z "$LTCFLAGS"; then - eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" - fi - - # Extract list of available tagged configurations in $ofile. - # Note that this assumes the entire list is on one line. - available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` - - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for tagname in $tagnames; do - IFS="$lt_save_ifs" - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in - "") ;; - *) AC_MSG_ERROR([invalid tag name: $tagname]) - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then - AC_MSG_ERROR([tag name \"$tagname\" already exists]) - fi - - # Update the list of available tags. - if test -n "$tagname"; then - echo appending configuration tag \"$tagname\" to $ofile - - case $tagname in - CXX) - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_LIBTOOL_LANG_CXX_CONFIG - else - tagname="" - fi - ;; - - F77) - if test -n "$F77" && test "X$F77" != "Xno"; then - AC_LIBTOOL_LANG_F77_CONFIG - else - tagname="" - fi - ;; - - GCJ) - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - AC_LIBTOOL_LANG_GCJ_CONFIG - else - tagname="" - fi - ;; - - RC) - AC_LIBTOOL_LANG_RC_CONFIG - ;; - - *) - AC_MSG_ERROR([Unsupported tag name: $tagname]) - ;; - esac - - # Append the new tag name to the list of available tags. - if test -n "$tagname" ; then - available_tags="$available_tags $tagname" - fi - fi - done - IFS="$lt_save_ifs" - - # Now substitute the updated list of available tags. - if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then - mv "${ofile}T" "$ofile" - chmod +x "$ofile" - else - rm -f "${ofile}T" - AC_MSG_ERROR([unable to update list of available tagged configurations.]) - fi -fi -])# _LT_AC_TAGCONFIG - - -# AC_LIBTOOL_DLOPEN -# ----------------- -# enable checks for dlopen support -AC_DEFUN([AC_LIBTOOL_DLOPEN], - [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_DLOPEN - - -# AC_LIBTOOL_WIN32_DLL -# -------------------- -# declare package support for building win32 DLLs -AC_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) -])# AC_LIBTOOL_WIN32_DLL - - -# AC_ENABLE_SHARED([DEFAULT]) -# --------------------------- -# implement the --enable-shared flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_SHARED], -[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([shared], - [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]AC_ENABLE_SHARED_DEFAULT) -])# AC_ENABLE_SHARED - - -# AC_DISABLE_SHARED -# ----------------- -# set the default shared flag to --disable-shared -AC_DEFUN([AC_DISABLE_SHARED], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no) -])# AC_DISABLE_SHARED - - -# AC_ENABLE_STATIC([DEFAULT]) -# --------------------------- -# implement the --enable-static flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_STATIC], -[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([static], - [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]AC_ENABLE_STATIC_DEFAULT) -])# AC_ENABLE_STATIC - - -# AC_DISABLE_STATIC -# ----------------- -# set the default static flag to --disable-static -AC_DEFUN([AC_DISABLE_STATIC], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no) -])# AC_DISABLE_STATIC - - -# AC_ENABLE_FAST_INSTALL([DEFAULT]) -# --------------------------------- -# implement the --enable-fast-install flag -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -AC_DEFUN([AC_ENABLE_FAST_INSTALL], -[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE([fast-install], - [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) -])# AC_ENABLE_FAST_INSTALL - - -# AC_DISABLE_FAST_INSTALL -# ----------------------- -# set the default to --disable-fast-install -AC_DEFUN([AC_DISABLE_FAST_INSTALL], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no) -])# AC_DISABLE_FAST_INSTALL - - -# AC_LIBTOOL_PICMODE([MODE]) -# -------------------------- -# implement the --with-pic flag -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -AC_DEFUN([AC_LIBTOOL_PICMODE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -pic_mode=ifelse($#,1,$1,default) -])# AC_LIBTOOL_PICMODE - - -# AC_PROG_EGREP -# ------------- -# This is predefined starting with Autoconf 2.54, so this conditional -# definition can be removed once we require Autoconf 2.54 or later. -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], -[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], - [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi]) - EGREP=$ac_cv_prog_egrep - AC_SUBST([EGREP]) -])]) - - -# AC_PATH_TOOL_PREFIX -# ------------------- -# find a file program which can recognise shared library -AC_DEFUN([AC_PATH_TOOL_PREFIX], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="ifelse([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -])# AC_PATH_TOOL_PREFIX - - -# AC_PATH_MAGIC -# ------------- -# find a file program which can recognise a shared library -AC_DEFUN([AC_PATH_MAGIC], -[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# AC_PATH_MAGIC - - -# AC_PROG_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([AC_PROG_LD], -[AC_ARG_WITH([gnu-ld], - [AC_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no]) -AC_REQUIRE([LT_AC_PROG_SED])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix3*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -nto-qnx*) - lt_cv_deplibs_check_method=unknown - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown -])# AC_DEPLIBS_CHECK_METHOD - - -# AC_PROG_NM -# ---------- -# find the pathname to a BSD-compatible name lister -AC_DEFUN([AC_PROG_NM], -[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -fi]) -NM="$lt_cv_path_NM" -])# AC_PROG_NM - - -# AC_CHECK_LIBM -# ------------- -# check for math library -AC_DEFUN([AC_CHECK_LIBM], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -])# AC_CHECK_LIBM - - -# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl convenience library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-convenience to the configure arguments. Note that -# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, -# it is assumed to be `libltdl'. LIBLTDL will be prefixed with -# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' -# (note the single quotes!). If your package is not flat and you're not -# using automake, define top_builddir and top_srcdir appropriately in -# the Makefiles. -AC_DEFUN([AC_LIBLTDL_CONVENIENCE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case $enable_ltdl_convenience in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_CONVENIENCE - - -# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) -# ----------------------------------- -# sets LIBLTDL to the link flags for the libltdl installable library and -# LTDLINCL to the include flags for the libltdl header and adds -# --enable-ltdl-install to the configure arguments. Note that -# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, -# and an installed libltdl is not found, it is assumed to be `libltdl'. -# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with -# '${top_srcdir}/' (note the single quotes!). If your package is not -# flat and you're not using automake, define top_builddir and top_srcdir -# appropriately in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN([AC_LIBLTDL_INSTALLABLE], -[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, lt_dlinit, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la - LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - LTDLINCL= - fi - # For backwards non-gettext consistent compatibility... - INCLTDL="$LTDLINCL" -])# AC_LIBLTDL_INSTALLABLE - - -# AC_LIBTOOL_CXX -# -------------- -# enable support for C++ libraries -AC_DEFUN([AC_LIBTOOL_CXX], -[AC_REQUIRE([_LT_AC_LANG_CXX]) -])# AC_LIBTOOL_CXX - - -# _LT_AC_LANG_CXX -# --------------- -AC_DEFUN([_LT_AC_LANG_CXX], -[AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([_LT_AC_PROG_CXXCPP]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) -])# _LT_AC_LANG_CXX - -# _LT_AC_PROG_CXXCPP -# ------------------ -AC_DEFUN([_LT_AC_PROG_CXXCPP], -[ -AC_REQUIRE([AC_PROG_CXX]) -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -fi -])# _LT_AC_PROG_CXXCPP - -# AC_LIBTOOL_F77 -# -------------- -# enable support for Fortran 77 libraries -AC_DEFUN([AC_LIBTOOL_F77], -[AC_REQUIRE([_LT_AC_LANG_F77]) -])# AC_LIBTOOL_F77 - - -# _LT_AC_LANG_F77 -# --------------- -AC_DEFUN([_LT_AC_LANG_F77], -[AC_REQUIRE([AC_PROG_F77]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) -])# _LT_AC_LANG_F77 - - -# AC_LIBTOOL_GCJ -# -------------- -# enable support for GCJ libraries -AC_DEFUN([AC_LIBTOOL_GCJ], -[AC_REQUIRE([_LT_AC_LANG_GCJ]) -])# AC_LIBTOOL_GCJ - - -# _LT_AC_LANG_GCJ -# --------------- -AC_DEFUN([_LT_AC_LANG_GCJ], -[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], - [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], - [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], - [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], - [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) -])# _LT_AC_LANG_GCJ - - -# AC_LIBTOOL_RC -# ------------- -# enable support for Windows resource files -AC_DEFUN([AC_LIBTOOL_RC], -[AC_REQUIRE([LT_AC_PROG_RC]) -_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) -])# AC_LIBTOOL_RC - - -# AC_LIBTOOL_LANG_C_CONFIG -# ------------------------ -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) -AC_DEFUN([_LT_AC_LANG_C_CONFIG], -[lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' - -_LT_AC_SYS_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -AC_LIBTOOL_SYS_LIB_STRIP -AC_LIBTOOL_DLOPEN_SELF - -# Report which library types will actually be built -AC_MSG_CHECKING([if libtool supports shared libraries]) -AC_MSG_RESULT([$can_build_shared]) - -AC_MSG_CHECKING([whether to build shared libraries]) -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case $host_os in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; -esac -AC_MSG_RESULT([$enable_shared]) - -AC_MSG_CHECKING([whether to build static libraries]) -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -AC_MSG_RESULT([$enable_static]) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC="$lt_save_CC" -])# AC_LIBTOOL_LANG_C_CONFIG - - -# AC_LIBTOOL_LANG_CXX_CONFIG -# -------------------------- -# Ensure that the configuration vars for the C compiler are -# suitably defined. Those variables are subsequently used by -# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) -AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], -[AC_LANG_PUSH(C++) -AC_REQUIRE([AC_PROG_CXX]) -AC_REQUIRE([_LT_AC_PROG_CXXCPP]) - -_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_AC_TAGVAR(allow_undefined_flag, $1)= -_LT_AC_TAGVAR(always_export_symbols, $1)=no -_LT_AC_TAGVAR(archive_expsym_cmds, $1)= -_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_direct, $1)=no -_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= -_LT_AC_TAGVAR(hardcode_minus_L, $1)=no -_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_AC_TAGVAR(hardcode_automatic, $1)=no -_LT_AC_TAGVAR(module_cmds, $1)= -_LT_AC_TAGVAR(module_expsym_cmds, $1)= -_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown -_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_AC_TAGVAR(no_undefined_flag, $1)= -_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Dependencies to place before and after the object being linked: -_LT_AC_TAGVAR(predep_objects, $1)= -_LT_AC_TAGVAR(postdep_objects, $1)= -_LT_AC_TAGVAR(predeps, $1)= -_LT_AC_TAGVAR(postdeps, $1)= -_LT_AC_TAGVAR(compiler_lib_search_path, $1)= - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_AC_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_AC_SYS_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - $as_unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - $as_unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -_LT_AC_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' -else - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - AC_PROG_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -_LT_AC_TAGVAR(ld_shlibs, $1)=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - fi - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - freebsd[[12]]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - freebsd-elf*) - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - ;; - gnu*) - ;; - hpux9*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - ;; - *) - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - interix3*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - linux*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc*) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC*) - # Portland Group C++ compiler - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - m88k*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - openbsd2*) - # C++ shared libraries are fairly broken - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd='echo' - ;; - osf3*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ - $rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' - ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='echo' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - # So that behaviour is only enabled if SCOABSPATH is set to a - # non-empty value in the environment. Most likely only useful for - # creating official distributions of packages. - # This is a hack until libtool officially supports absolute path - # names for shared libraries. - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; -esac -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_AC_TAGVAR(GCC, $1)="$GXX" -_LT_AC_TAGVAR(LD, $1)="$LD" - -AC_LIBTOOL_POSTDEP_PREDEP($1) -AC_LIBTOOL_PROG_COMPILER_PIC($1) -AC_LIBTOOL_PROG_CC_C_O($1) -AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -AC_LIBTOOL_PROG_LD_SHLIBS($1) -AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) - -AC_LIBTOOL_CONFIG($1) - -AC_LANG_POP -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -])# AC_LIBTOOL_LANG_CXX_CONFIG - -# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) -# ------------------------------------ -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" -ifelse([$1], [], -[#! $SHELL - -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e 1s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# The names of the tagged configurations supported by this script. -available_tags= - -# ### BEGIN LIBTOOL CONFIG], -[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - -# A language-specific compiler. -CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) - -# Is the compiler the GNU C compiler? -with_gcc=$_LT_AC_TAGVAR(GCC, $1) - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_[]_LT_AC_TAGVAR(LD, $1) - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) - -# Commands used to build and install a shared archive. -archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) -archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) -module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" - -# Set to yes if exported symbols are required. -always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) - -# The commands to list exported symbols. -export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) - -# Symbols that must always be exported. -include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) - -ifelse([$1],[], -[# ### END LIBTOOL CONFIG], -[# ### END LIBTOOL TAG CONFIG: $tagname]) - -__EOF__ - -ifelse([$1],[], [ - case $host_os in - aix3*) - cat <<\EOF >> "$cfgfile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || \ - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -]) -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi -])# AC_LIBTOOL_CONFIG - - -# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl - -_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - - AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI - - -# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -# --------------------------------- -AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -[AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_NM]) -AC_REQUIRE([AC_OBJEXT]) -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Transform an extracted symbol line into a proper C declaration -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) # Its linker distinguishes data from code symbols - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - ;; -linux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDGIRSTW]]' - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if grep ' nm_test_var$' "$nlist" >/dev/null; then - if grep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' - - cat <> conftest.$ac_ext -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[[]] = -{ -EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext - cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -f conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi -]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE - - -# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) -# --------------------------------------- -AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], -[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= - -AC_MSG_CHECKING([for $compiler option to produce PIC]) - ifelse([$1],[CXX],[ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - icpc* | ecpc*) - # Intel C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC*) - # Portland Group C++ compiler. - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - esac - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - newsos6) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - linux*) - case $cc_basename in - icc* | ecc*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then - AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], - _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), - [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -# -# Check to make sure the static flag actually works. -# -wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" -AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) -]) - - -# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) -# ------------------------------------ -# See if the linker supports building shared libraries. -AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], -[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -ifelse([$1],[CXX],[ - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw*) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -],[ - runpath_var= - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_AC_TAGVAR(archive_cmds, $1)= - _LT_AC_TAGVAR(archive_expsym_cmds, $1)= - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= - _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_minus_L, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown - _LT_AC_TAGVAR(hardcode_automatic, $1)=no - _LT_AC_TAGVAR(module_cmds, $1)= - _LT_AC_TAGVAR(module_expsym_cmds, $1)= - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_AC_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - _LT_CC_BASENAME([$compiler]) - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=no - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - interix3*) - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_AC_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - else - _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_AC_TAGVAR(archive_cmds, $1)='' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - else - # We have old collect2 - _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_AC_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - _LT_AC_SYS_LIBPATH_AIX - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - # see comment about different semantics on the GNU ld section - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - bsdi[[45]]*) - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' - _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' - _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[[012]]) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_automatic, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - fi - ;; - - dgux*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - openbsd*) - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - wlarc='' - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; - *) - _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; - esac - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes - _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_AC_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_AC_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_AC_TAGVAR(link_all_deplibs, $1)=yes - _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_AC_TAGVAR(ld_shlibs, $1)=no - ;; - esac - fi -]) -AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -# -# Do we need to explicitly link libc? -# -case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_AC_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_MSG_CHECKING([whether -lc should be explicitly linked in]) - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) - _LT_AC_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) - then - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) - ;; - esac - fi - ;; -esac -])# AC_LIBTOOL_PROG_LD_SHLIBS - - -# _LT_AC_FILE_LTDLL_C -# ------------------- -# Be careful that the start marker always follows a newline. -AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ -# /* ltdll.c starts here */ -# #define WIN32_LEAN_AND_MEAN -# #include -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #ifndef __CYGWIN__ -# # ifdef __CYGWIN32__ -# # define __CYGWIN__ __CYGWIN32__ -# # endif -# #endif -# -# #ifdef __cplusplus -# extern "C" { -# #endif -# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -# #ifdef __cplusplus -# } -# #endif -# -# #ifdef __CYGWIN__ -# #include -# DECLARE_CYGWIN_DLL( DllMain ); -# #endif -# HINSTANCE __hDllInstance_base; -# -# BOOL APIENTRY -# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -# { -# __hDllInstance_base = hInst; -# return TRUE; -# } -# /* ltdll.c ends here */ -])# _LT_AC_FILE_LTDLL_C - - -# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) -# --------------------------------- -AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) - - -# old names -AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) -AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) -AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) - -# This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL]) - -AC_DEFUN([LT_AC_PROG_GCJ], -[AC_CHECK_TOOL(GCJ, gcj, no) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS) -]) - -AC_DEFUN([LT_AC_PROG_RC], -[AC_CHECK_TOOL(RC, windres, no) -]) - -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -# LT_AC_PROG_SED -# -------------- -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -AC_DEFUN([LT_AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_MSG_RESULT([$SED]) -]) - diff --git a/libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk b/libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk deleted file mode 100644 index b806b1d96c..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/addopcodes.awk +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/awk -# -# This script appends additional token codes to the end of the -# parse.h file that lemon generates. These extra token codes are -# not used by the parser. But they are used by the tokenizer and/or -# the code generator. -# -# -BEGIN { - max = 0 -} -/^#define TK_/ { - print $0 - if( max<$3 ) max = $3 -} -END { - printf "#define TK_%-29s %4d\n", "TO_TEXT", max+1 - printf "#define TK_%-29s %4d\n", "TO_BLOB", max+2 - printf "#define TK_%-29s %4d\n", "TO_NUMERIC", max+3 - printf "#define TK_%-29s %4d\n", "TO_INT", max+4 - printf "#define TK_%-29s %4d\n", "TO_REAL", max+5 - printf "#define TK_%-29s %4d\n", "END_OF_FILE", max+6 - printf "#define TK_%-29s %4d\n", "ILLEGAL", max+7 - printf "#define TK_%-29s %4d\n", "SPACE", max+8 - printf "#define TK_%-29s %4d\n", "UNCLOSED_STRING", max+9 - printf "#define TK_%-29s %4d\n", "COMMENT", max+10 - printf "#define TK_%-29s %4d\n", "FUNCTION", max+11 - printf "#define TK_%-29s %4d\n", "COLUMN", max+12 - printf "#define TK_%-29s %4d\n", "AGG_FUNCTION", max+13 - printf "#define TK_%-29s %4d\n", "AGG_COLUMN", max+14 - printf "#define TK_%-29s %4d\n", "CONST_FUNC", max+15 -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/2005osaward.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/2005osaward.gif deleted file mode 100644 index fa6d7d7c27..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/2005osaward.gif and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.eps b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.eps deleted file mode 100644 index 1f334ecf7b..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.eps and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.gif deleted file mode 100644 index 5ec05b0be2..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite.gif and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLiteLogo3.tiff b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLiteLogo3.tiff deleted file mode 100644 index 70b88e7805..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLiteLogo3.tiff and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite_big.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite_big.gif deleted file mode 100644 index dc9e6a0e6c..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/SQLite_big.gif and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/nocopy.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/nocopy.gif deleted file mode 100644 index cc4a59c4c0..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/nocopy.gif and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/art/powered_by_sqlite.gif b/libraries/sqlite/unix/sqlite-3.5.1/art/powered_by_sqlite.gif deleted file mode 100644 index 5bfed023ee..0000000000 Binary files a/libraries/sqlite/unix/sqlite-3.5.1/art/powered_by_sqlite.gif and /dev/null differ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/config.guess b/libraries/sqlite/unix/sqlite-3.5.1/config.guess deleted file mode 100644 index 6960a397af..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/config.guess +++ /dev/null @@ -1,1532 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. - -timestamp='2007-01-15' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -if [ "${UNAME_SYSTEM}" = "Linux" ] ; then - eval $set_cc_for_build - cat << EOF > $dummy.c - #include - #ifdef __UCLIBC__ - # ifdef __UCLIBC_CONFIG_VERSION__ - LIBC=uclibc __UCLIBC_CONFIG_VERSION__ - # else - LIBC=uclibc - # endif - #else - LIBC=gnu - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` -fi - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - x86:Interix*:[3456]*) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T:Interix*:[3456]* | authenticamd:Interix*:[3456]*) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-${LIBC} - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-${LIBC} - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-${LIBC} - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-${LIBC} - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; - esac - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-${LIBC} - exit ;; - xtensa:Linux:*:*) - echo xtensa-unknown-linux-${LIBC} - exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" - exit ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" - exit ;; - esac - # This should get integrated into the C code below, but now we hack - if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/libraries/sqlite/unix/sqlite-3.5.1/config.sub b/libraries/sqlite/unix/sqlite-3.5.1/config.sub deleted file mode 100644 index 2a4932e7f5..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/config.sub +++ /dev/null @@ -1,1640 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. - -timestamp='2007-01-18' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx | dvp \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64vr | mips64vrel \ - | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ - | ymp-* \ - | z8k-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16c) - basic_machine=cr16c-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mipsEE* | ee | ps2) - basic_machine=mips64r5900el-scei - case $os in - -linux*) - ;; - *) - os=-elf - ;; - esac - ;; - iop) - basic_machine=mipsel-scei - os=-irx - ;; - dvp) - basic_machine=dvp-scei - os=-elf - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/libraries/sqlite/unix/sqlite-3.5.1/configure b/libraries/sqlite/unix/sqlite-3.5.1/configure deleted file mode 100755 index c862e3ff51..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/configure +++ /dev/null @@ -1,21144 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61. -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -as_nl=' -' -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell autoconf@gnu.org about your system, - echo including any error possibly output before this - echo message -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` - ;; -esac - -echo=${ECHO-echo} -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null 2>&1 && unset CDPATH - -if test -z "$ECHO"; then -if test "X${echo_test_string+set}" != Xset; then -# find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string=`eval $cmd`) 2>/dev/null && - echo_test_string=`eval $cmd` && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null - then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : -else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - echo='printf %s\n' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL $0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - echo="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -ECHO=$echo -if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then - ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" -fi - - - - -tagnames=${tagnames+${tagnames},}CXX - -tagnames=${tagnames+${tagnames},}F77 - -exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= - -ac_unique_file="src/sqlite.h.in" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='SHELL -PATH_SEPARATOR -PACKAGE_NAME -PACKAGE_TARNAME -PACKAGE_VERSION -PACKAGE_STRING -PACKAGE_BUGREPORT -exec_prefix -prefix -program_transform_name -bindir -sbindir -libexecdir -datarootdir -datadir -sysconfdir -sharedstatedir -localstatedir -includedir -oldincludedir -docdir -infodir -htmldir -dvidir -pdfdir -psdir -libdir -localedir -mandir -DEFS -ECHO_C -ECHO_N -ECHO_T -LIBS -build_alias -host_alias -target_alias -build -build_cpu -build_vendor -build_os -host -host_cpu -host_vendor -host_os -CC -CFLAGS -LDFLAGS -CPPFLAGS -ac_ct_CC -EXEEXT -OBJEXT -GREP -EGREP -LN_S -ECHO -AR -RANLIB -STRIP -CPP -CXX -CXXFLAGS -ac_ct_CXX -CXXCPP -F77 -FFLAGS -ac_ct_F77 -LIBTOOL -INSTALL_PROGRAM -INSTALL_SCRIPT -INSTALL_DATA -AWK -program_prefix -VERSION -RELEASE -VERSION_NUMBER -BUILD_CC -BUILD_CFLAGS -SQLITE_THREADSAFE -TARGET_THREAD_LIB -XTHREADCONNECT -THREADSOVERRIDELOCKS -ALLOWRELEASE -TEMP_STORE -BUILD_EXEEXT -OS_UNIX -OS_WIN -OS_OS2 -TARGET_EXEEXT -TCL_VERSION -TCL_BIN_DIR -TCL_SRC_DIR -TCL_LIBS -TCL_INCLUDE_SPEC -TCL_LIB_FILE -TCL_LIB_FLAG -TCL_LIB_SPEC -TCL_STUB_LIB_FILE -TCL_STUB_LIB_FLAG -TCL_STUB_LIB_SPEC -HAVE_TCL -TARGET_READLINE_LIBS -TARGET_READLINE_INC -TARGET_HAVE_READLINE -TARGET_DEBUG -LIBOBJS -LTLIBOBJS' -ac_subst_files='' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -CXX -CXXFLAGS -CCC -CXXCPP -F77 -FFLAGS' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` - eval enable_$ac_feature=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` - eval enable_$ac_feature=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/[-.]/_/g'` - eval with_$ac_package=\$ac_optarg ;; - - -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/[-.]/_/g'` - eval with_$ac_package=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -# Be sure to have absolute directory names. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { echo "$as_me: error: Working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$0" || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - - cat <<\_ACEOF - -Optional Features: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - --enable-threadsafe Support threadsafe operation - --enable-cross-thread-connections - Allow connection sharing across threads - --enable-threads-override-locks - Threads can override each others locks - --enable-releasemode Support libtool link to release mode - --enable-tempstore Use an in-ram database for temporary tables - (never,no,yes,always) - --disable-tcl do not build TCL extension - --disable-readline disable readline support [default=detect] - --enable-debug enable debugging & verbose explain - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-pic try to use only PIC/non-PIC objects [default=use - both] - --with-tags[=TAGS] include additional configurations [automatic] - --with-hints=FILE Read configuration options from FILE - --with-tcl=DIR directory containing tcl configuration - (tclConfig.sh) - --with-readline-lib specify readline library - --with-readline-inc specify readline include paths - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CXXCPP C++ preprocessor - F77 Fortran 77 compiler command - FFLAGS Fortran 77 compiler flags - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -configure -generated by GNU Autoconf 2.61 - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by $as_me, which was -generated by GNU Autoconf 2.61. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args '$ac_arg'" - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -n "$CONFIG_SITE"; then - set x "$CONFIG_SITE" -elif test "x$prefix" != xNONE; then - set x "$prefix/share/config.site" "$prefix/etc/config.site" -else - set x "$ac_default_prefix/share/config.site" \ - "$ac_default_prefix/etc/config.site" -fi -shift -for ac_site_file -do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - - - - - - - - - - - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# The following RCS revision string applies to configure.in -# $Revision: 1.43 $ - -######### -# Programs needed -# -# Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - -# Check whether --enable-static was given. -if test "${enable_static+set}" = set; then - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - -# Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } - -{ echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6; } -if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -echo "$as_me: error: invalid value of canonical build" >&2;} - { (exit 1); exit 1; }; };; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6; } -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - -# Provide some information about the compiler. -echo "$as_me:$LINENO: checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -# -# List of possible output files, starting from the most likely. -# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) -# only as a last resort. b.out is created by i960 compilers. -ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' -# -# The IRIX 6 linker writes into existing files which may not be -# executable, retaining their permissions. Remove them first so a -# subsequent execution test works. -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { (ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi - -{ echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6; } -if test -z "$ac_file"; then - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -{ echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - -rm -f a.out a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6; } - -{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest$ac_cv_exeext -{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } -GCC=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c89=$ac_arg -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6; } ;; - xno) - { echo "$as_me:$LINENO: result: unsupported" >&5 -echo "${ECHO_T}unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; -esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } -if test "${lt_cv_path_SED+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done - -fi - -SED=$lt_cv_path_SED -{ echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6; } - -{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } -if test "${ac_cv_path_GREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Extract the first word of "grep ggrep" to use in msg output -if test -z "$GREP"; then -set dummy grep ggrep; ac_prog_name=$2 -if test "${ac_cv_path_GREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_path_GREP_found=false -# Loop through the user's path and test for each of PROGNAME-LIST -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue - # Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - - $ac_path_GREP_found && break 3 - done -done - -done -IFS=$as_save_IFS - - -fi - -GREP="$ac_cv_path_GREP" -if test -z "$GREP"; then - { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } -fi - -else - ac_cv_path_GREP=$GREP -fi - - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -echo "${ECHO_T}$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - # Extract the first word of "egrep" to use in msg output -if test -z "$EGREP"; then -set dummy egrep; ac_prog_name=$2 -if test "${ac_cv_path_EGREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_path_EGREP_found=false -# Loop through the user's path and test for each of PROGNAME-LIST -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue - # Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - - $ac_path_EGREP_found && break 3 - done -done - -done -IFS=$as_save_IFS - - -fi - -EGREP="$ac_cv_path_EGREP" -if test -z "$EGREP"; then - { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } -fi - -else - ac_cv_path_EGREP=$EGREP -fi - - - fi -fi -{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } -else - { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } -fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -echo "${ECHO_T}$LD" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - -{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } -if test "${lt_cv_ld_reload_flag+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - -{ echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 -echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } -if test "${lt_cv_path_NM+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -fi -fi -{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -echo "${ECHO_T}$lt_cv_path_NM" >&6; } -NM="$lt_cv_path_NM" - -{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -else - { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6; } -fi - -{ echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 -echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6; } -if test "${lt_cv_deplibs_check_method+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix4* | aix5*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump'. - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | kfreebsd*-gnu | dragonfly*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix3*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -nto-qnx*) - lt_cv_deplibs_check_method=unknown - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 3685 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } -if test "${lt_cv_cc_needs_belf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - lt_cv_cc_needs_belf=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_cc_needs_belf=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) LD="${LD-ld} -64" ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - - -esac - -need_locks="$enable_libtool_lock" - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - -for ac_header in dlfcn.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -echo "$as_me:$LINENO: checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } -if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -fi - - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$F77"; then - ac_cv_prog_F77="$F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_F77="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -F77=$ac_cv_prog_F77 -if test -n "$F77"; then - { echo "$as_me:$LINENO: result: $F77" >&5 -echo "${ECHO_T}$F77" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$F77" && break - done -fi -if test -z "$F77"; then - ac_ct_F77=$F77 - for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_F77"; then - ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_F77="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_F77=$ac_cv_prog_ac_ct_F77 -if test -n "$ac_ct_F77"; then - { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -echo "${ECHO_T}$ac_ct_F77" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_F77" && break -done - - if test "x$ac_ct_F77" = x; then - F77="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - F77=$ac_ct_F77 - fi -fi - - -# Provide some information about the compiler. -echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -rm -f a.out - -# If we don't use `.F' as extension, the preprocessor is not run on the -# input file. (Note that this only needs to work for GNU compilers.) -ac_save_ext=$ac_ext -ac_ext=F -{ echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; } -if test "${ac_cv_f77_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF - program main -#ifndef __GNUC__ - choke me -#endif - - end -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_f77_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_f77_compiler_gnu=$ac_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; } -ac_ext=$ac_save_ext -ac_test_FFLAGS=${FFLAGS+set} -ac_save_FFLAGS=$FFLAGS -FFLAGS= -{ echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; } -if test "${ac_cv_prog_f77_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - FFLAGS=-g -cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_f77_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_f77_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_prog_f77_g=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; } -if test "$ac_test_FFLAGS" = set; then - FFLAGS=$ac_save_FFLAGS -elif test $ac_cv_prog_f77_g = yes; then - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O2" - else - FFLAGS="-g" - fi -else - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O2" - else - FFLAGS= - fi -fi - -G77=`test $ac_compiler_gnu = yes && echo yes` -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! - -# find the maximum length of command line arguments -{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } -if test "${lt_cv_sys_max_cmd_len+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ - = "XX$teststring") >/dev/null 2>&1 && - new_result=`expr "X$teststring" : ".*" 2>&1` && - lt_cv_sys_max_cmd_len=$new_result && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - teststring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } -else - { echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6; } -fi - - - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Transform an extracted symbol line into a proper C declaration -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32*) - symcode='[ABCDGISTW]' - ;; -hpux*) # Its linker distinguishes data from code symbols - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - ;; -linux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDGIRSTW]' - lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 - (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if grep ' nm_test_var$' "$nlist" >/dev/null; then - if grep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' - - cat <> conftest.$ac_ext -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[] = -{ -EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext - cat <<\EOF >> conftest.$ac_ext - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -f conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { echo "$as_me:$LINENO: result: failed" >&5 -echo "${ECHO_T}failed" >&6; } -else - { echo "$as_me:$LINENO: result: ok" >&5 -echo "${ECHO_T}ok" >&6; } -fi - -{ echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } -if test "${lt_cv_objdir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -echo "${ECHO_T}$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' -sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Constants: -rm="rm -f" - -# Global variables: -default_ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a -ltmain="$ac_aux_dir/ltmain.sh" -ofile="$default_ofile" -with_gnu_ld="$lt_cv_prog_gnu_ld" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_AR"; then - ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -else - AR="$ac_cv_prog_AR" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -test -z "$AS" && AS=as -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$LD" && LD=ld -test -z "$LN_S" && LN_S="ln -s" -test -z "$MAGIC_CMD" && MAGIC_CMD=file -test -z "$NM" && NM=nm -test -z "$SED" && SED=sed -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$RANLIB" && RANLIB=: -test -z "$STRIP" && STRIP=: -test -z "$ac_objext" && ac_objext=o - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -enable_dlopen=no -enable_win32_dll=no - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then - withval=$with_pic; pic_mode="$withval" -else - pic_mode=default -fi - -test -z "$pic_mode" && pic_mode=default - -# Check if we have a version mismatch between libtool.m4 and ltmain.sh. -# -# Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. -# We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually -# calls AC_LIBTOOL_CONFIG and creates libtool. -# -{ echo "$as_me:$LINENO: checking for correct ltmain.sh version" >&5 -echo $ECHO_N "checking for correct ltmain.sh version... $ECHO_C" >&6; } -if test "x$ltmain" = "x" ; then - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - { { echo "$as_me:$LINENO: error: - -*** [Gentoo] sanity check failed! *** -*** \$ltmain is not defined, please check the patch for consistency! *** -" >&5 -echo "$as_me: error: - -*** [Gentoo] sanity check failed! *** -*** \$ltmain is not defined, please check the patch for consistency! *** -" >&2;} - { (exit 1); exit 1; }; } -fi -gentoo_lt_version="1.5.22" -gentoo_ltmain_version=`sed -n '/^[ ]*VERSION=/{s/^[ ]*VERSION=//;p;q;}' "$ltmain"` -if test "x$gentoo_lt_version" != "x$gentoo_ltmain_version" ; then - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - { { echo "$as_me:$LINENO: error: - -*** [Gentoo] sanity check failed! *** -*** libtool.m4 and ltmain.sh have a version mismatch! *** -*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** - -Please run: - - libtoolize --copy --force - -if appropriate, please contact the maintainer of this -package (or your distribution) for help. -" >&5 -echo "$as_me: error: - -*** [Gentoo] sanity check failed! *** -*** libtool.m4 and ltmain.sh have a version mismatch! *** -*** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** - -Please run: - - libtoolize --copy --force - -if appropriate, please contact the maintainer of this -package (or your distribution) for help. -" >&2;} - { (exit 1); exit 1; }; } -else - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -fi - - -# Use C for the default configuration in the libtool script -tagname= -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}\n' - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' - - -{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6364: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:6368: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - -lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - -{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic='-qnocommon' - lt_prog_compiler_wl='-Wl,' - ;; - esac - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - linux*) - case $cc_basename in - icc* | ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - -{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_pic_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6632: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:6636: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works=yes - fi - fi - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; } - -if test x"$lt_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_static_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_static_works=yes - fi - else - lt_prog_compiler_static_works=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } - -if test x"$lt_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - -{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6736: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:6740: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6; } - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } - - runpath_var= - allow_undefined_flag= - enable_shared_with_static_runtimes=no - archive_cmds= - archive_expsym_cmds= - old_archive_From_new_cmds= - old_archive_from_expsyms_cmds= - export_dynamic_flag_spec= - whole_archive_flag_spec= - thread_safe_flag_spec= - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= - hardcode_libdir_separator= - hardcode_direct=no - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - link_all_deplibs=unknown - hardcode_automatic=no - module_cmds= - module_expsym_cmds= - always_export_symbols=no - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - interix3*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes=yes - ;; - - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='' - link_all_deplibs=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs=no - ;; - esac - fi - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - hardcode_direct=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld='-rpath $libdir' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - link_all_deplibs=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - openbsd*) - hardcode_direct=yes - hardcode_shlibpath_var=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z text' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - *) - whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -echo "${ECHO_T}$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc=no - else - archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -echo "${ECHO_T}$archive_cmds_need_lc" >&6; } - ;; - esac - fi - ;; -esac - -{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - linux*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - $archive_expsym_cmds="$archive_cmds" - fi - else - ld_shlibs=no - fi - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - # Handle Gentoo/FreeBSD as it was Linux - case $host_vendor in - gentoo) - version_type=linux ;; - *) - version_type=freebsd-$objformat ;; - esac - - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - linux) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - need_lib_prefix=no - need_version=no - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - freebsd*) # from 4.6 on - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix3*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - shlibpath_overrides_runpath=no - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - shlibpath_overrides_runpath=yes - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var" || \ - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ echo "$as_me:$LINENO: result: $hardcode_action" >&5 -echo "${ECHO_T}$hardcode_action" >&6; } - -if test "$hardcode_action" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - ;; - *) - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - ;; - esac -fi - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - { echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_shl_load || defined __stub___shl_load -choke me -#endif - -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_shl_load=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_shl_load=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - { echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_dlopen || defined __stub___dlopen -choke me -#endif - -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dl_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_svld_dlopen=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_dld_dld_link=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - else - puts (dlerror ()); - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - else - puts (dlerror ()); - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - -# Report which library types will actually be built -{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6; } - -{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case $host_os in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; -esac -{ echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6; } - -{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -{ echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6; } - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler \ - CC \ - LD \ - lt_prog_compiler_wl \ - lt_prog_compiler_pic \ - lt_prog_compiler_static \ - lt_prog_compiler_no_builtin_flag \ - export_dynamic_flag_spec \ - thread_safe_flag_spec \ - whole_archive_flag_spec \ - enable_shared_with_static_runtimes \ - old_archive_cmds \ - old_archive_from_new_cmds \ - predep_objects \ - postdep_objects \ - predeps \ - postdeps \ - compiler_lib_search_path \ - archive_cmds \ - archive_expsym_cmds \ - postinstall_cmds \ - postuninstall_cmds \ - old_archive_from_expsyms_cmds \ - allow_undefined_flag \ - no_undefined_flag \ - export_symbols_cmds \ - hardcode_libdir_flag_spec \ - hardcode_libdir_flag_spec_ld \ - hardcode_libdir_separator \ - hardcode_automatic \ - module_cmds \ - module_expsym_cmds \ - lt_cv_prog_compiler_c_o \ - exclude_expsyms \ - include_expsyms; do - - case $var in - old_archive_cmds | \ - old_archive_from_new_cmds | \ - archive_cmds | \ - archive_expsym_cmds | \ - module_cmds | \ - module_expsym_cmds | \ - old_archive_from_expsyms_cmds | \ - export_symbols_cmds | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="${ofile}T" - trap "$rm \"$cfgfile\"; exit 1" 1 2 15 - $rm -f "$cfgfile" - { echo "$as_me:$LINENO: creating $ofile" >&5 -echo "$as_me: creating $ofile" >&6;} - - cat <<__EOF__ >> "$cfgfile" -#! $SHELL - -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# -# This file is part of GNU Libtool: -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="$SED -e 1s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# The names of the tagged configurations supported by this script. -available_tags= - -# ### BEGIN LIBTOOL CONFIG - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - -# A language-specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU C compiler? -with_gcc=$GCC - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# ### END LIBTOOL CONFIG - -__EOF__ - - - case $host_os in - aix3*) - cat <<\EOF >> "$cfgfile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || \ - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - -# Check whether --with-tags was given. -if test "${with_tags+set}" = set; then - withval=$with_tags; tagnames="$withval" -fi - - -if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} - else - { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 -echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} - fi - fi - if test -z "$LTCFLAGS"; then - eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" - fi - - # Extract list of available tagged configurations in $ofile. - # Note that this assumes the entire list is on one line. - available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` - - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for tagname in $tagnames; do - IFS="$lt_save_ifs" - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in - "") ;; - *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 -echo "$as_me: error: invalid tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then - { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 -echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} - { (exit 1); exit 1; }; } - fi - - # Update the list of available tags. - if test -n "$tagname"; then - echo appending configuration tag \"$tagname\" to $ofile - - case $tagname in - CXX) - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_flag_spec_ld_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - $as_unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - $as_unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -compiler_CXX=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' -else - lt_prog_compiler_no_builtin_flag_CXX= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } -else - { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } -fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -echo "${ECHO_T}$LD" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } -ld_shlibs_CXX=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_CXX=yes - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - whole_archive_flag_spec_CXX='' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_CXX=no - ;; - esac - fi - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - ld_shlibs_CXX=no - ;; - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - gnu*) - ;; - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_libdir_flag_spec_ld_CXX='+b $libdir' - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - interix3*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - ;; - linux*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc*) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC*) - # Portland Group C++ compiler - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - openbsd*) - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd='echo' - ;; - osf3*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ - $rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='echo' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - # So that behaviour is only enabled if SCOABSPATH is set to a - # non-empty value in the environment. Most likely only useful for - # creating official distributions of packages. - # This is a hack until libtool officially supports absolute path - # names for shared libraries. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; -esac -{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -GCC_CXX="$GXX" -LD_CXX="$LD" - - -cat > conftest.$ac_ext <&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - # The `*' in the case matches for architectures that use `case' in - # $output_verbose_cmd can trigger glob expansion during the loop - # eval without this substitution. - output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` - - for p in `eval $output_verbose_link_cmd`; do - case $p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" \ - || test $p = "-R"; then - prev=$p - continue - else - prev= - fi - - if test "$pre_test_object_deps_done" = no; then - case $p in - -L* | -R*) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - ;; - - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$rm -f confest.$objext - -# PORTME: override above test on systems where it is broken -case $host_os in -interix3*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -solaris*) - case $cc_basename in - CC*) - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - postdeps_CXX='-lCstd -lCrun' - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - -lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - -{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_CXX='-qnocommon' - lt_prog_compiler_wl_CXX='-Wl,' - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - icpc* | ecpc*) - # Intel C++ - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC*) - # Portland Group C++ compiler. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - -{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11517: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:11521: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_CXX=yes - fi - fi - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_static_works_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_static_works_CXX=yes - fi - else - lt_prog_compiler_static_works_CXX=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - -{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } -if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11621: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:11625: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6; } - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw*) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_CXX=no - else - archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } - ;; - esac - fi - ;; -esac - -{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - linux*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - $archive_expsym_cmds="$archive_cmds" - fi - else - ld_shlibs=no - fi - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - # Handle Gentoo/FreeBSD as it was Linux - case $host_vendor in - gentoo) - version_type=linux ;; - *) - version_type=freebsd-$objformat ;; - esac - - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - linux) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - need_lib_prefix=no - need_version=no - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - freebsd*) # from 4.6 on - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix3*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - shlibpath_overrides_runpath=no - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - shlibpath_overrides_runpath=yes - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || \ - test -n "$runpath_var_CXX" || \ - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -echo "${ECHO_T}$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_CXX \ - CC_CXX \ - LD_CXX \ - lt_prog_compiler_wl_CXX \ - lt_prog_compiler_pic_CXX \ - lt_prog_compiler_static_CXX \ - lt_prog_compiler_no_builtin_flag_CXX \ - export_dynamic_flag_spec_CXX \ - thread_safe_flag_spec_CXX \ - whole_archive_flag_spec_CXX \ - enable_shared_with_static_runtimes_CXX \ - old_archive_cmds_CXX \ - old_archive_from_new_cmds_CXX \ - predep_objects_CXX \ - postdep_objects_CXX \ - predeps_CXX \ - postdeps_CXX \ - compiler_lib_search_path_CXX \ - archive_cmds_CXX \ - archive_expsym_cmds_CXX \ - postinstall_cmds_CXX \ - postuninstall_cmds_CXX \ - old_archive_from_expsyms_cmds_CXX \ - allow_undefined_flag_CXX \ - no_undefined_flag_CXX \ - export_symbols_cmds_CXX \ - hardcode_libdir_flag_spec_CXX \ - hardcode_libdir_flag_spec_ld_CXX \ - hardcode_libdir_separator_CXX \ - hardcode_automatic_CXX \ - module_cmds_CXX \ - module_expsym_cmds_CXX \ - lt_cv_prog_compiler_c_o_CXX \ - exclude_expsyms_CXX \ - include_expsyms_CXX; do - - case $var in - old_archive_cmds_CXX | \ - old_archive_from_new_cmds_CXX | \ - archive_cmds_CXX | \ - archive_expsym_cmds_CXX | \ - module_cmds_CXX | \ - module_expsym_cmds_CXX | \ - old_archive_from_expsyms_cmds_CXX | \ - export_symbols_cmds_CXX | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - -# A language-specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_CXX - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_CXX -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_CXX - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_CXX" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld - - else - tagname="" - fi - ;; - - F77) - if test -n "$F77" && test "X$F77" != "Xno"; then - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu - - -archive_cmds_need_lc_F77=no -allow_undefined_flag_F77= -always_export_symbols_F77=no -archive_expsym_cmds_F77= -export_dynamic_flag_spec_F77= -hardcode_direct_F77=no -hardcode_libdir_flag_spec_F77= -hardcode_libdir_flag_spec_ld_F77= -hardcode_libdir_separator_F77= -hardcode_minus_L_F77=no -hardcode_automatic_F77=no -module_cmds_F77= -module_expsym_cmds_F77= -link_all_deplibs_F77=unknown -old_archive_cmds_F77=$old_archive_cmds -no_undefined_flag_F77= -whole_archive_flag_spec_F77= -enable_shared_with_static_runtimes_F77=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -objext_F77=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code=" subroutine t\n return\n end\n" - -# Code to be used in simple link tests -lt_simple_link_test_code=" program t\n end\n" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${F77-"f77"} -compiler=$CC -compiler_F77=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6; } - -{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case $host_os in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; -aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; -esac -{ echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6; } - -{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -{ echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6; } - -GCC_F77="$G77" -LD_F77="$LD" - -lt_prog_compiler_wl_F77= -lt_prog_compiler_pic_F77= -lt_prog_compiler_static_F77= - -{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_static_F77='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_F77='-fno-common' - ;; - - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared_F77=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_F77=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl_F77='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - else - lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' - fi - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_F77='-qnocommon' - lt_prog_compiler_wl_F77='-Wl,' - ;; - esac - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static_F77='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static_F77='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - linux*) - case $cc_basename in - icc* | ecc*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-fpic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl_F77='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl_F77='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl_F77='-Qoption ld ';; - *) - lt_prog_compiler_wl_F77='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl_F77='-Qoption ld ' - lt_prog_compiler_pic_F77='-PIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic_F77='-Kconform_pic' - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_can_build_shared_F77=no - ;; - - uts4*) - lt_prog_compiler_pic_F77='-pic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared_F77=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; } - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_F77"; then - -{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_pic_works_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_F77=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_F77" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13228: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:13232: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_F77=yes - fi - fi - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6; } - -if test x"$lt_prog_compiler_pic_works_F77" = xyes; then - case $lt_prog_compiler_pic_F77 in - "" | " "*) ;; - *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; - esac -else - lt_prog_compiler_pic_F77= - lt_prog_compiler_can_build_shared_F77=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_F77= - ;; - *) - lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" - ;; -esac - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" -{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_static_works_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_static_works_F77=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_static_works_F77=yes - fi - else - lt_prog_compiler_static_works_F77=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6; } - -if test x"$lt_prog_compiler_static_works_F77" = xyes; then - : -else - lt_prog_compiler_static_F77= -fi - - -{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } -if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_F77=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13332: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:13336: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_F77=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; } - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6; } - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } - - runpath_var= - allow_undefined_flag_F77= - enable_shared_with_static_runtimes_F77=no - archive_cmds_F77= - archive_expsym_cmds_F77= - old_archive_From_new_cmds_F77= - old_archive_from_expsyms_cmds_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - thread_safe_flag_spec_F77= - hardcode_libdir_flag_spec_F77= - hardcode_libdir_flag_spec_ld_F77= - hardcode_libdir_separator_F77= - hardcode_direct_F77=no - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=unsupported - link_all_deplibs_F77=unknown - hardcode_automatic_F77=no - module_cmds_F77= - module_expsym_cmds_F77= - always_export_symbols_F77=no - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms_F77= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs_F77=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_F77='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_F77= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs_F77=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_F77=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_F77='-L$libdir' - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=no - enable_shared_with_static_runtimes_F77=yes - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_F77=no - fi - ;; - - interix3*) - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - export_dynamic_flag_spec_F77='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - else - ld_shlibs_F77=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs_F77=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - esac - - if test "$ld_shlibs_F77" = no; then - runpath_var= - hardcode_libdir_flag_spec_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=yes - archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L_F77=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct_F77=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_F77='' - hardcode_direct_F77=yes - hardcode_libdir_separator_F77=':' - link_all_deplibs_F77=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_F77=yes - else - # We have old collect2 - hardcode_direct_F77=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_F77=yes - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_libdir_separator_F77= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_F77=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_F77='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_f77_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_F77="-z nodefs" - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_f77_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_F77=' ${wl}-bernotok' - allow_undefined_flag_F77=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_F77='$convenience' - archive_cmds_need_lc_F77=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - # see comment about different semantics on the GNU ld section - ld_shlibs_F77=no - ;; - - bsdi[45]*) - export_dynamic_flag_spec_F77=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_F77=' ' - allow_undefined_flag_F77=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds_F77='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path_F77='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes_F77=yes - ;; - - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_F77=no - hardcode_direct_F77=no - hardcode_automatic_F77=yes - hardcode_shlibpath_var_F77=unsupported - whole_archive_flag_spec_F77='' - link_all_deplibs_F77=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_F77=no - ;; - esac - fi - ;; - - dgux*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - freebsd1*) - ld_shlibs_F77=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) - archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - - hardcode_direct_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_libdir_flag_spec_ld_F77='+b $libdir' - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - ;; - *) - hardcode_direct_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - link_all_deplibs_F77=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - newsos6) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_shlibpath_var_F77=no - ;; - - openbsd*) - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - export_dynamic_flag_spec_F77='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - ;; - *) - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - allow_undefined_flag_F77=unsupported - archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec_F77='-rpath $libdir' - fi - hardcode_libdir_separator_F77=: - ;; - - solaris*) - no_undefined_flag_F77=' -z text' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - wlarc='' - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_shlibpath_var_F77=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; - *) - whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; - esac - link_all_deplibs_F77=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds_F77='$CC -r -o $output$reload_objs' - hardcode_direct_F77=no - ;; - motorola) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv4.3*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs_F77=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) - no_undefined_flag_F77='${wl}-z,text' - archive_cmds_need_lc_F77=no - hardcode_shlibpath_var_F77=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_F77='${wl}-z,text' - allow_undefined_flag_F77='${wl}-z,nodefs' - archive_cmds_need_lc_F77=no - hardcode_shlibpath_var_F77=no - hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - hardcode_libdir_separator_F77=':' - link_all_deplibs_F77=yes - export_dynamic_flag_spec_F77='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - *) - ld_shlibs_F77=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -echo "${ECHO_T}$ld_shlibs_F77" >&6; } -test "$ld_shlibs_F77" = no && can_build_shared=no - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_F77" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_F77=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_F77 in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_F77 - pic_flag=$lt_prog_compiler_pic_F77 - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_F77 - allow_undefined_flag_F77= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_F77=no - else - archive_cmds_need_lc_F77=yes - fi - allow_undefined_flag_F77=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; } - ;; - esac - fi - ;; -esac - -{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - linux*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - $archive_expsym_cmds="$archive_cmds" - fi - else - ld_shlibs=no - fi - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - # Handle Gentoo/FreeBSD as it was Linux - case $host_vendor in - gentoo) - version_type=linux ;; - *) - version_type=freebsd-$objformat ;; - esac - - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - linux) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - need_lib_prefix=no - need_version=no - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - freebsd*) # from 4.6 on - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix3*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - shlibpath_overrides_runpath=no - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - shlibpath_overrides_runpath=yes - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } -hardcode_action_F77= -if test -n "$hardcode_libdir_flag_spec_F77" || \ - test -n "$runpath_var_F77" || \ - test "X$hardcode_automatic_F77" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_F77" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && - test "$hardcode_minus_L_F77" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_F77=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_F77=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_F77=unsupported -fi -{ echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -echo "${ECHO_T}$hardcode_action_F77" >&6; } - -if test "$hardcode_action_F77" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_F77 \ - CC_F77 \ - LD_F77 \ - lt_prog_compiler_wl_F77 \ - lt_prog_compiler_pic_F77 \ - lt_prog_compiler_static_F77 \ - lt_prog_compiler_no_builtin_flag_F77 \ - export_dynamic_flag_spec_F77 \ - thread_safe_flag_spec_F77 \ - whole_archive_flag_spec_F77 \ - enable_shared_with_static_runtimes_F77 \ - old_archive_cmds_F77 \ - old_archive_from_new_cmds_F77 \ - predep_objects_F77 \ - postdep_objects_F77 \ - predeps_F77 \ - postdeps_F77 \ - compiler_lib_search_path_F77 \ - archive_cmds_F77 \ - archive_expsym_cmds_F77 \ - postinstall_cmds_F77 \ - postuninstall_cmds_F77 \ - old_archive_from_expsyms_cmds_F77 \ - allow_undefined_flag_F77 \ - no_undefined_flag_F77 \ - export_symbols_cmds_F77 \ - hardcode_libdir_flag_spec_F77 \ - hardcode_libdir_flag_spec_ld_F77 \ - hardcode_libdir_separator_F77 \ - hardcode_automatic_F77 \ - module_cmds_F77 \ - module_expsym_cmds_F77 \ - lt_cv_prog_compiler_c_o_F77 \ - exclude_expsyms_F77 \ - include_expsyms_F77; do - - case $var in - old_archive_cmds_F77 | \ - old_archive_from_new_cmds_F77 | \ - archive_cmds_F77 | \ - archive_expsym_cmds_F77 | \ - module_cmds_F77 | \ - module_expsym_cmds_F77 | \ - old_archive_from_expsyms_cmds_F77 | \ - export_symbols_cmds_F77 | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_F77 - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - -# A language-specific compiler. -CC=$lt_compiler_F77 - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_F77 - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_F77 - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_F77 - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_F77 -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_F77 - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_F77 -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_F77 -archive_expsym_cmds=$lt_archive_expsym_cmds_F77 -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_F77 -module_expsym_cmds=$lt_module_expsym_cmds_F77 - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_F77 - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_F77 - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_F77 - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_F77 - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_F77 - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_F77 - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_F77 - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_F77 - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_F77 - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_F77 - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_F77" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_F77 - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_F77 - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_F77 - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_F77 - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - else - tagname="" - fi - ;; - - GCJ) - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -objext_GCJ=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${GCJ-"gcj"} -compiler=$CC -compiler_GCJ=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -archive_cmds_need_lc_GCJ=no - -old_archive_cmds_GCJ=$old_archive_cmds - - -lt_prog_compiler_no_builtin_flag_GCJ= - -if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' - - -{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15567: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:15571: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" -else - : -fi - -fi - -lt_prog_compiler_wl_GCJ= -lt_prog_compiler_pic_GCJ= -lt_prog_compiler_static_GCJ= - -{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_static_GCJ='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_GCJ='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_GCJ='-fno-common' - ;; - - interix3*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared_GCJ=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_GCJ=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_GCJ='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic_GCJ='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl_GCJ='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_GCJ='-Bstatic' - else - lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' - fi - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_GCJ='-qnocommon' - lt_prog_compiler_wl_GCJ='-Wl,' - ;; - esac - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl_GCJ='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_GCJ='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl_GCJ='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static_GCJ='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - linux*) - case $cc_basename in - icc* | ecc*) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-fpic' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl_GCJ='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static_GCJ='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl_GCJ='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static_GCJ='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl_GCJ='-Qoption ld ';; - *) - lt_prog_compiler_wl_GCJ='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl_GCJ='-Qoption ld ' - lt_prog_compiler_pic_GCJ='-PIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic_GCJ='-Kconform_pic' - lt_prog_compiler_static_GCJ='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_pic_GCJ='-KPIC' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl_GCJ='-Wl,' - lt_prog_compiler_can_build_shared_GCJ=no - ;; - - uts4*) - lt_prog_compiler_pic_GCJ='-pic' - lt_prog_compiler_static_GCJ='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared_GCJ=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; } - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_GCJ"; then - -{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_GCJ=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_GCJ" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15835: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:15839: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_GCJ=yes - fi - fi - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6; } - -if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then - case $lt_prog_compiler_pic_GCJ in - "" | " "*) ;; - *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; - esac -else - lt_prog_compiler_pic_GCJ= - lt_prog_compiler_can_build_shared_GCJ=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_GCJ= - ;; - *) - lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" - ;; -esac - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" -{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } -if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_static_works_GCJ=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - printf "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_static_works_GCJ=yes - fi - else - lt_prog_compiler_static_works_GCJ=yes - fi - fi - $rm conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6; } - -if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then - : -else - lt_prog_compiler_static_GCJ= -fi - - -{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } -if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_GCJ=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15939: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:15943: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_GCJ=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; } - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6; } - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } - - runpath_var= - allow_undefined_flag_GCJ= - enable_shared_with_static_runtimes_GCJ=no - archive_cmds_GCJ= - archive_expsym_cmds_GCJ= - old_archive_From_new_cmds_GCJ= - old_archive_from_expsyms_cmds_GCJ= - export_dynamic_flag_spec_GCJ= - whole_archive_flag_spec_GCJ= - thread_safe_flag_spec_GCJ= - hardcode_libdir_flag_spec_GCJ= - hardcode_libdir_flag_spec_ld_GCJ= - hardcode_libdir_separator_GCJ= - hardcode_direct_GCJ=no - hardcode_minus_L_GCJ=no - hardcode_shlibpath_var_GCJ=unsupported - link_all_deplibs_GCJ=unknown - hardcode_automatic_GCJ=no - module_cmds_GCJ= - module_expsym_cmds_GCJ= - always_export_symbols_GCJ=no - export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms_GCJ= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs_GCJ=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_GCJ= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs_GCJ=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_minus_L_GCJ=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs_GCJ=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_GCJ=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_GCJ='-L$libdir' - allow_undefined_flag_GCJ=unsupported - always_export_symbols_GCJ=no - enable_shared_with_static_runtimes_GCJ=yes - export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_GCJ=no - fi - ;; - - interix3*) - hardcode_direct_GCJ=no - hardcode_shlibpath_var_GCJ=no - hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' - export_dynamic_flag_spec_GCJ='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - else - ld_shlibs_GCJ=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs_GCJ=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs_GCJ=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_GCJ=no - fi - ;; - esac - - if test "$ld_shlibs_GCJ" = no; then - runpath_var= - hardcode_libdir_flag_spec_GCJ= - export_dynamic_flag_spec_GCJ= - whole_archive_flag_spec_GCJ= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag_GCJ=unsupported - always_export_symbols_GCJ=yes - archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L_GCJ=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct_GCJ=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_GCJ='' - hardcode_direct_GCJ=yes - hardcode_libdir_separator_GCJ=':' - link_all_deplibs_GCJ=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_GCJ=yes - else - # We have old collect2 - hardcode_direct_GCJ=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_GCJ=yes - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_libdir_separator_GCJ= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_GCJ=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_GCJ='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_GCJ="-z nodefs" - archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_GCJ=' ${wl}-bernotok' - allow_undefined_flag_GCJ=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_GCJ='$convenience' - archive_cmds_need_lc_GCJ=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_minus_L_GCJ=yes - # see comment about different semantics on the GNU ld section - ld_shlibs_GCJ=no - ;; - - bsdi[45]*) - export_dynamic_flag_spec_GCJ=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_GCJ=' ' - allow_undefined_flag_GCJ=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds_GCJ='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes_GCJ=yes - ;; - - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_GCJ=no - hardcode_direct_GCJ=no - hardcode_automatic_GCJ=yes - hardcode_shlibpath_var_GCJ=unsupported - whole_archive_flag_spec_GCJ='' - link_all_deplibs_GCJ=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_GCJ=no - ;; - esac - fi - ;; - - dgux*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_shlibpath_var_GCJ=no - ;; - - freebsd1*) - ld_shlibs_GCJ=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes - hardcode_minus_L_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) - archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - hardcode_direct_GCJ=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes - export_dynamic_flag_spec_GCJ='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - - hardcode_direct_GCJ=yes - export_dynamic_flag_spec_GCJ='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' - hardcode_direct_GCJ=no - hardcode_shlibpath_var_GCJ=no - ;; - *) - hardcode_direct_GCJ=yes - export_dynamic_flag_spec_GCJ='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_GCJ=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' - fi - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - link_all_deplibs_GCJ=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - newsos6) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - hardcode_shlibpath_var_GCJ=no - ;; - - openbsd*) - hardcode_direct_GCJ=yes - hardcode_shlibpath_var_GCJ=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' - export_dynamic_flag_spec_GCJ='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_GCJ='-R$libdir' - ;; - *) - archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_minus_L_GCJ=yes - allow_undefined_flag_GCJ=unsupported - archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag_GCJ=' -expect_unresolved \*' - archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_GCJ=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag_GCJ=' -expect_unresolved \*' - archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec_GCJ='-rpath $libdir' - fi - hardcode_libdir_separator_GCJ=: - ;; - - solaris*) - no_undefined_flag_GCJ=' -z text' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - wlarc='' - archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec_GCJ='-R$libdir' - hardcode_shlibpath_var_GCJ=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; - *) - whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; - esac - link_all_deplibs_GCJ=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_direct_GCJ=yes - hardcode_minus_L_GCJ=yes - hardcode_shlibpath_var_GCJ=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds_GCJ='$CC -r -o $output$reload_objs' - hardcode_direct_GCJ=no - ;; - motorola) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_GCJ=no - ;; - - sysv4.3*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_GCJ=no - export_dynamic_flag_spec_GCJ='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_GCJ=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs_GCJ=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) - no_undefined_flag_GCJ='${wl}-z,text' - archive_cmds_need_lc_GCJ=no - hardcode_shlibpath_var_GCJ=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_GCJ='${wl}-z,text' - allow_undefined_flag_GCJ='${wl}-z,nodefs' - archive_cmds_need_lc_GCJ=no - hardcode_shlibpath_var_GCJ=no - hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' - hardcode_libdir_separator_GCJ=':' - link_all_deplibs_GCJ=yes - export_dynamic_flag_spec_GCJ='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_GCJ='-L$libdir' - hardcode_shlibpath_var_GCJ=no - ;; - - *) - ld_shlibs_GCJ=no - ;; - esac - fi - -{ echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } -test "$ld_shlibs_GCJ" = no && can_build_shared=no - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_GCJ" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_GCJ=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_GCJ in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_GCJ - pic_flag=$lt_prog_compiler_pic_GCJ - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ - allow_undefined_flag_GCJ= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_GCJ=no - else - archive_cmds_need_lc_GCJ=yes - fi - allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; } - ;; - esac - fi - ;; -esac - -{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - linux*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - if test $supports_anon_versioning = yes; then - archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ -cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -$echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - else - $archive_expsym_cmds="$archive_cmds" - fi - else - ld_shlibs=no - fi - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - # Handle Gentoo/FreeBSD as it was Linux - case $host_vendor in - gentoo) - version_type=linux ;; - *) - version_type=freebsd-$objformat ;; - esac - - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - linux) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - need_lib_prefix=no - need_version=no - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - freebsd*) # from 4.6 on - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix3*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - shlibpath_overrides_runpath=no - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - shlibpath_overrides_runpath=yes - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } -hardcode_action_GCJ= -if test -n "$hardcode_libdir_flag_spec_GCJ" || \ - test -n "$runpath_var_GCJ" || \ - test "X$hardcode_automatic_GCJ" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_GCJ" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && - test "$hardcode_minus_L_GCJ" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_GCJ=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_GCJ=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_GCJ=unsupported -fi -{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -echo "${ECHO_T}$hardcode_action_GCJ" >&6; } - -if test "$hardcode_action_GCJ" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_GCJ \ - CC_GCJ \ - LD_GCJ \ - lt_prog_compiler_wl_GCJ \ - lt_prog_compiler_pic_GCJ \ - lt_prog_compiler_static_GCJ \ - lt_prog_compiler_no_builtin_flag_GCJ \ - export_dynamic_flag_spec_GCJ \ - thread_safe_flag_spec_GCJ \ - whole_archive_flag_spec_GCJ \ - enable_shared_with_static_runtimes_GCJ \ - old_archive_cmds_GCJ \ - old_archive_from_new_cmds_GCJ \ - predep_objects_GCJ \ - postdep_objects_GCJ \ - predeps_GCJ \ - postdeps_GCJ \ - compiler_lib_search_path_GCJ \ - archive_cmds_GCJ \ - archive_expsym_cmds_GCJ \ - postinstall_cmds_GCJ \ - postuninstall_cmds_GCJ \ - old_archive_from_expsyms_cmds_GCJ \ - allow_undefined_flag_GCJ \ - no_undefined_flag_GCJ \ - export_symbols_cmds_GCJ \ - hardcode_libdir_flag_spec_GCJ \ - hardcode_libdir_flag_spec_ld_GCJ \ - hardcode_libdir_separator_GCJ \ - hardcode_automatic_GCJ \ - module_cmds_GCJ \ - module_expsym_cmds_GCJ \ - lt_cv_prog_compiler_c_o_GCJ \ - exclude_expsyms_GCJ \ - include_expsyms_GCJ; do - - case $var in - old_archive_cmds_GCJ | \ - old_archive_from_new_cmds_GCJ | \ - archive_cmds_GCJ | \ - archive_expsym_cmds_GCJ | \ - module_cmds_GCJ | \ - module_expsym_cmds_GCJ | \ - old_archive_from_expsyms_cmds_GCJ | \ - export_symbols_cmds_GCJ | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_GCJ - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - -# A language-specific compiler. -CC=$lt_compiler_GCJ - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_GCJ - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_GCJ - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_GCJ - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_GCJ -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_GCJ - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_GCJ -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_GCJ -archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_GCJ -module_expsym_cmds=$lt_module_expsym_cmds_GCJ - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_GCJ - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_GCJ - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_GCJ - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_GCJ - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_GCJ - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_GCJ - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_GCJ - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_GCJ - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_GCJ - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_GCJ - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_GCJ - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_GCJ" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_GCJ - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_GCJ - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_GCJ - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_GCJ - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - else - tagname="" - fi - ;; - - RC) - - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -objext_RC=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${RC-"windres"} -compiler=$CC -compiler_RC=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - -lt_cv_prog_compiler_c_o_RC=yes - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_RC \ - CC_RC \ - LD_RC \ - lt_prog_compiler_wl_RC \ - lt_prog_compiler_pic_RC \ - lt_prog_compiler_static_RC \ - lt_prog_compiler_no_builtin_flag_RC \ - export_dynamic_flag_spec_RC \ - thread_safe_flag_spec_RC \ - whole_archive_flag_spec_RC \ - enable_shared_with_static_runtimes_RC \ - old_archive_cmds_RC \ - old_archive_from_new_cmds_RC \ - predep_objects_RC \ - postdep_objects_RC \ - predeps_RC \ - postdeps_RC \ - compiler_lib_search_path_RC \ - archive_cmds_RC \ - archive_expsym_cmds_RC \ - postinstall_cmds_RC \ - postuninstall_cmds_RC \ - old_archive_from_expsyms_cmds_RC \ - allow_undefined_flag_RC \ - no_undefined_flag_RC \ - export_symbols_cmds_RC \ - hardcode_libdir_flag_spec_RC \ - hardcode_libdir_flag_spec_ld_RC \ - hardcode_libdir_separator_RC \ - hardcode_automatic_RC \ - module_cmds_RC \ - module_expsym_cmds_RC \ - lt_cv_prog_compiler_c_o_RC \ - exclude_expsyms_RC \ - include_expsyms_RC; do - - case $var in - old_archive_cmds_RC | \ - old_archive_from_new_cmds_RC | \ - archive_cmds_RC | \ - archive_expsym_cmds_RC | \ - module_cmds_RC | \ - module_expsym_cmds_RC | \ - old_archive_from_expsyms_cmds_RC | \ - export_symbols_cmds_RC | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_RC - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# LTCC compiler flags. -LTCFLAGS=$lt_LTCFLAGS - -# A language-specific compiler. -CC=$lt_compiler_RC - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_RC - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_RC - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_RC - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_RC -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_RC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_RC -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_RC -archive_expsym_cmds=$lt_archive_expsym_cmds_RC -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_RC -module_expsym_cmds=$lt_module_expsym_cmds_RC - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_RC - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_RC - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_RC - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_RC - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_RC - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_RC - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_RC - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_RC - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_RC - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_RC - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_RC - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_RC - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_RC - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_RC" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_RC - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_RC - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_RC - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_RC - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - ;; - - *) - { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 -echo "$as_me: error: Unsupported tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } - ;; - esac - - # Append the new tag name to the list of available tags. - if test -n "$tagname" ; then - available_tags="$available_tags $tagname" - fi - fi - done - IFS="$lt_save_ifs" - - # Now substitute the updated list of available tags. - if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then - mv "${ofile}T" "$ofile" - chmod +x "$ofile" - else - rm -f "${ofile}T" - { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 -echo "$as_me: error: unable to update list of available tagged configurations." >&2;} - { (exit 1); exit 1; }; } - fi -fi - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - -# Prevent multiple expansion - - - - - - - - - - - - - - - - - - - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done -IFS=$as_save_IFS - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$AWK" && break -done - - -######### -# Set up an appropriate program prefix -# -if test "$program_prefix" = "NONE"; then - program_prefix="" -fi - - -VERSION=`cat $srcdir/VERSION | sed 's/^\([0-9]*\.*[0-9]*\).*/\1/'` -echo "Version set to $VERSION" - -RELEASE=`cat $srcdir/VERSION` -echo "Release set to $RELEASE" - -VERSION_NUMBER=`cat $srcdir/VERSION \ - | sed 's/[^0-9]/ /g' \ - | awk '{printf "%d%03d%03d",$1,$2,$3}'` -echo "Version number set to $VERSION_NUMBER" - - -######### -# Check to see if the --with-hints=FILE option is used. If there is none, -# then check for a files named "$host.hints" and ../$hosts.hints where -# $host is the hostname of the build system. If still no hints are -# found, try looking in $system.hints and ../$system.hints where -# $system is the result of uname -s. -# - -# Check whether --with-hints was given. -if test "${with_hints+set}" = set; then - withval=$with_hints; hints=$withval -fi - -if test "$hints" = ""; then - host=`hostname | sed 's/\..*//'` - if test -r $host.hints; then - hints=$host.hints - else - if test -r ../$host.hints; then - hints=../$host.hints - fi - fi -fi -if test "$hints" = ""; then - sys=`uname -s` - if test -r $sys.hints; then - hints=$sys.hints - else - if test -r ../$sys.hints; then - hints=../$sys.hints - fi - fi -fi -if test "$hints" != ""; then - { echo "$as_me:$LINENO: result: reading hints from $hints" >&5 -echo "${ECHO_T}reading hints from $hints" >&6; } - . $hints -fi - -######### -# Locate a compiler for the build machine. This compiler should -# generate command-line programs that run on the build machine. -# -if test x"$cross_compiling" = xno; then - BUILD_CC=$CC - BUILD_CFLAGS=$CFLAGS -else - if test "${BUILD_CC+set}" != set; then - for ac_prog in gcc cc cl -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_BUILD_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$BUILD_CC"; then - ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_BUILD_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -BUILD_CC=$ac_cv_prog_BUILD_CC -if test -n "$BUILD_CC"; then - { echo "$as_me:$LINENO: result: $BUILD_CC" >&5 -echo "${ECHO_T}$BUILD_CC" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$BUILD_CC" && break -done - - fi - if test "${BUILD_CFLAGS+set}" != set; then - BUILD_CFLAGS="-g" - fi -fi - - - -########## -# Do we want to support multithreaded use of sqlite -# -# Check whether --enable-threadsafe was given. -if test "${enable_threadsafe+set}" = set; then - enableval=$enable_threadsafe; -else - enable_threadsafe=yes -fi - -{ echo "$as_me:$LINENO: checking whether to support threadsafe operation" >&5 -echo $ECHO_N "checking whether to support threadsafe operation... $ECHO_C" >&6; } -if test "$enable_threadsafe" = "no"; then - SQLITE_THREADSAFE=0 - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -else - SQLITE_THREADSAFE=1 - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -fi - - -if test "$SQLITE_THREADSAFE" = "1"; then - LIBS="" - -{ echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 -echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6; } -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_pthread_pthread_create=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_pthread_create=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 -echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6; } -if test $ac_cv_lib_pthread_pthread_create = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -fi - - TARGET_THREAD_LIB="$LIBS" - LIBS="" -else - TARGET_THREAD_LIB="" -fi - - -########## -# Do we want to allow a connection created in one thread to be used -# in another thread. This does not work on many Linux systems (ex: RedHat 9) -# due to bugs in the threading implementations. This is thus off by default. -# -# Check whether --enable-cross-thread-connections was given. -if test "${enable_cross_thread_connections+set}" = set; then - enableval=$enable_cross_thread_connections; -else - enable_xthreadconnect=no -fi - -{ echo "$as_me:$LINENO: checking whether to allow connections to be shared across threads" >&5 -echo $ECHO_N "checking whether to allow connections to be shared across threads... $ECHO_C" >&6; } -if test "$enable_xthreadconnect" = "no"; then - XTHREADCONNECT='' - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -else - XTHREADCONNECT='-DSQLITE_ALLOW_XTHREAD_CONNECT=1' - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -fi - - -########## -# Do we want to set threadsOverrideEachOthersLocks variable to be 1 (true) by -# default. Normally, a test at runtime is performed to determine the -# appropriate value of this variable. Use this option only if you're sure that -# threads can safely override each others locks in all runtime situations. -# -# Check whether --enable-threads-override-locks was given. -if test "${enable_threads_override_locks+set}" = set; then - enableval=$enable_threads_override_locks; -else - enable_threads_override_locks=no -fi - -{ echo "$as_me:$LINENO: checking whether threads can override each others locks" >&5 -echo $ECHO_N "checking whether threads can override each others locks... $ECHO_C" >&6; } -if test "$enable_threads_override_locks" = "no"; then - THREADSOVERRIDELOCKS='-1' - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -else - THREADSOVERRIDELOCKS='1' - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -fi - - -########## -# Do we want to support release -# -# Check whether --enable-releasemode was given. -if test "${enable_releasemode+set}" = set; then - enableval=$enable_releasemode; -else - enable_releasemode=no -fi - -{ echo "$as_me:$LINENO: checking whether to support shared library linked as release mode or not" >&5 -echo $ECHO_N "checking whether to support shared library linked as release mode or not... $ECHO_C" >&6; } -if test "$enable_releasemode" = "no"; then - ALLOWRELEASE="" - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -else - ALLOWRELEASE="-release `cat VERSION`" - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -fi - - -########## -# Do we want temporary databases in memory -# -# Check whether --enable-tempstore was given. -if test "${enable_tempstore+set}" = set; then - enableval=$enable_tempstore; -else - enable_tempstore=no -fi - -{ echo "$as_me:$LINENO: checking whether to use an in-ram database for temporary tables" >&5 -echo $ECHO_N "checking whether to use an in-ram database for temporary tables... $ECHO_C" >&6; } -case "$enable_tempstore" in - never ) - TEMP_STORE=0 - { echo "$as_me:$LINENO: result: never" >&5 -echo "${ECHO_T}never" >&6; } - ;; - no ) - TEMP_STORE=1 - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - ;; - always ) - TEMP_STORE=3 - { echo "$as_me:$LINENO: result: always" >&5 -echo "${ECHO_T}always" >&6; } - ;; - yes ) - TEMP_STORE=3 - { echo "$as_me:$LINENO: result: always" >&5 -echo "${ECHO_T}always" >&6; } - ;; - * ) - TEMP_STORE=1 - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - ;; -esac - - - -########### -# Lots of things are different if we are compiling for Windows using -# the CYGWIN environment. So check for that special case and handle -# things accordingly. -# -{ echo "$as_me:$LINENO: checking if executables have the .exe suffix" >&5 -echo $ECHO_N "checking if executables have the .exe suffix... $ECHO_C" >&6; } -if test "$config_BUILD_EXEEXT" = ".exe"; then - CYGWIN=yes - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -else - { echo "$as_me:$LINENO: result: unknown" >&5 -echo "${ECHO_T}unknown" >&6; } -fi -if test "$CYGWIN" != "yes"; then - { echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6; } -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -case $host_os in - *cygwin* ) CYGWIN=yes;; - * ) CYGWIN=no;; -esac - -fi -if test "$CYGWIN" = "yes"; then - BUILD_EXEEXT=.exe -else - BUILD_EXEEXT=$EXEEXT -fi -if test x"$cross_compiling" = xno; then - TARGET_EXEEXT=$BUILD_EXEEXT -else - TARGET_EXEEXT=$config_TARGET_EXEEXT -fi -if test "$TARGET_EXEEXT" = ".exe"; then - if test $OS2_SHELL ; then - OS_UNIX=0 - OS_WIN=0 - OS_OS2=1 - TARGET_CFLAGS="$TARGET_CFLAGS -DOS_OS2=1" - if test "$ac_compiler_gnu" == "yes" ; then - TARGET_CFLAGS="$TARGET_CFLAGS -Zomf -Zexe -Zmap" - BUILD_CFLAGS="$BUILD_CFLAGS -Zomf -Zexe" - fi - else - OS_UNIX=0 - OS_WIN=1 - OS_OS2=0 - tclsubdir=win - TARGET_CFLAGS="$TARGET_CFLAGS -DOS_WIN=1" - fi -else - OS_UNIX=1 - OS_WIN=0 - OS_OS2=0 - tclsubdir=unix - TARGET_CFLAGS="$TARGET_CFLAGS -DOS_UNIX=1" -fi - - - - - - - -########## -# Figure out all the parameters needed to compile against Tcl. -# -# This code is derived from the SC_PATH_TCLCONFIG and SC_LOAD_TCLCONFIG -# macros in the in the tcl.m4 file of the standard TCL distribution. -# Those macros could not be used directly since we have to make some -# minor changes to accomodate systems that do not have TCL installed. -# -# Check whether --enable-tcl was given. -if test "${enable_tcl+set}" = set; then - enableval=$enable_tcl; use_tcl=$enableval -else - use_tcl=yes -fi - -if test "${use_tcl}" = "yes" ; then - -# Check whether --with-tcl was given. -if test "${with_tcl+set}" = set; then - withval=$with_tcl; with_tclconfig=${withval} -fi - - { echo "$as_me:$LINENO: checking for Tcl configuration" >&5 -echo $ECHO_N "checking for Tcl configuration... $ECHO_C" >&6; } - if test "${ac_cv_c_tclconfig+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - - # First check to see if --with-tcl was specified. - if test x"${with_tclconfig}" != x ; then - if test -f "${with_tclconfig}/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` - else - { { echo "$as_me:$LINENO: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&5 -echo "$as_me: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&2;} - { (exit 1); exit 1; }; } - fi - fi - # then check for a private Tcl installation - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - ../tcl \ - `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ - `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ - `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ - ../../tcl \ - `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ - `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ - `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ - ../../../tcl \ - `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ - `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ - `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` - do - if test -f "$i/unix/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - - # check in a few common install locations - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - `ls -d ${libdir} 2>/dev/null` \ - `ls -d /usr/local/lib 2>/dev/null` \ - `ls -d /usr/contrib/lib 2>/dev/null` \ - `ls -d /usr/lib 2>/dev/null` - do - if test -f "$i/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i; pwd)` - break - fi - done - fi - - # check in a few other private locations - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - ${srcdir}/../tcl \ - `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ - `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ - `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` - do - if test -f "$i/unix/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - -fi - - - if test x"${ac_cv_c_tclconfig}" = x ; then - use_tcl=no - { echo "$as_me:$LINENO: WARNING: Can't find Tcl configuration definitions" >&5 -echo "$as_me: WARNING: Can't find Tcl configuration definitions" >&2;} - { echo "$as_me:$LINENO: WARNING: *** Without Tcl the regression tests cannot be executed ***" >&5 -echo "$as_me: WARNING: *** Without Tcl the regression tests cannot be executed ***" >&2;} - { echo "$as_me:$LINENO: WARNING: *** Consider using --with-tcl=... to define location of Tcl ***" >&5 -echo "$as_me: WARNING: *** Consider using --with-tcl=... to define location of Tcl ***" >&2;} - else - TCL_BIN_DIR=${ac_cv_c_tclconfig} - { echo "$as_me:$LINENO: result: found $TCL_BIN_DIR/tclConfig.sh" >&5 -echo "${ECHO_T}found $TCL_BIN_DIR/tclConfig.sh" >&6; } - - { echo "$as_me:$LINENO: checking for existence of $TCL_BIN_DIR/tclConfig.sh" >&5 -echo $ECHO_N "checking for existence of $TCL_BIN_DIR/tclConfig.sh... $ECHO_C" >&6; } - if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then - { echo "$as_me:$LINENO: result: loading" >&5 -echo "${ECHO_T}loading" >&6; } - . $TCL_BIN_DIR/tclConfig.sh - else - { echo "$as_me:$LINENO: result: file not found" >&5 -echo "${ECHO_T}file not found" >&6; } - fi - - # - # If the TCL_BIN_DIR is the build directory (not the install directory), - # then set the common variable name to the value of the build variables. - # For example, the variable TCL_LIB_SPEC will be set to the value - # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC - # instead of TCL_BUILD_LIB_SPEC since it will work with both an - # installed and uninstalled version of Tcl. - # - - if test -f $TCL_BIN_DIR/Makefile ; then - TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} - TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} - TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} - fi - - # - # eval is required to do the TCL_DBGX substitution - # - - eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" - eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" - eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" - - eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" - eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" - eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" - - - - - - - - - - - - - - - fi -fi -if test "${use_tcl}" = "no" ; then - HAVE_TCL="" -else - HAVE_TCL=1 -fi - - -########## -# Figure out what C libraries are required to compile programs -# that use "readline()" library. -# -TARGET_READLINE_LIBS="" -TARGET_READLINE_INC="" -TARGET_HAVE_READLINE=0 -# Check whether --enable-readline was given. -if test "${enable_readline+set}" = set; then - enableval=$enable_readline; with_readline=$enableval -else - with_readline=auto -fi - - -if test x"$with_readline" != xno; then - found="yes" - - -# Check whether --with-readline-lib was given. -if test "${with_readline_lib+set}" = set; then - withval=$with_readline_lib; with_readline_lib=$withval -else - with_readline_lib="auto" -fi - - if test "x$with_readline_lib" = xauto; then - save_LIBS="$LIBS" - LIBS="" - { echo "$as_me:$LINENO: checking for library containing tgetent" >&5 -echo $ECHO_N "checking for library containing tgetent... $ECHO_C" >&6; } -if test "${ac_cv_search_tgetent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char tgetent (); -int -main () -{ -return tgetent (); - ; - return 0; -} -_ACEOF -for ac_lib in '' readline ncurses curses termcap; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_search_tgetent=$ac_res -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_tgetent+set}" = set; then - break -fi -done -if test "${ac_cv_search_tgetent+set}" = set; then - : -else - ac_cv_search_tgetent=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_search_tgetent" >&5 -echo "${ECHO_T}$ac_cv_search_tgetent" >&6; } -ac_res=$ac_cv_search_tgetent -if test "$ac_res" != no; then - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - term_LIBS="$LIBS" -else - term_LIBS="" -fi - - { echo "$as_me:$LINENO: checking for readline in -lreadline" >&5 -echo $ECHO_N "checking for readline in -lreadline... $ECHO_C" >&6; } -if test "${ac_cv_lib_readline_readline+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lreadline $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char readline (); -int -main () -{ -return readline (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_lib_readline_readline=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_readline_readline=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_lib_readline_readline" >&5 -echo "${ECHO_T}$ac_cv_lib_readline_readline" >&6; } -if test $ac_cv_lib_readline_readline = yes; then - TARGET_READLINE_LIBS="-lreadline" -else - found="no" -fi - - TARGET_READLINE_LIBS="$TARGET_READLINE_LIBS $term_LIBS" - LIBS="$save_LIBS" - else - TARGET_READLINE_LIBS="$with_readline_lib" - fi - - -# Check whether --with-readline-inc was given. -if test "${with_readline_inc+set}" = set; then - withval=$with_readline_inc; with_readline_inc=$withval -else - with_readline_inc="auto" -fi - - if test "x$with_readline_inc" = xauto; then - if test "${ac_cv_header_readline_h+set}" = set; then - { echo "$as_me:$LINENO: checking for readline.h" >&5 -echo $ECHO_N "checking for readline.h... $ECHO_C" >&6; } -if test "${ac_cv_header_readline_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_readline_h" >&5 -echo "${ECHO_T}$ac_cv_header_readline_h" >&6; } -else - # Is the header compilable? -{ echo "$as_me:$LINENO: checking readline.h usability" >&5 -echo $ECHO_N "checking readline.h usability... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6; } - -# Is the header present? -{ echo "$as_me:$LINENO: checking readline.h presence" >&5 -echo $ECHO_N "checking readline.h presence... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: readline.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: readline.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: readline.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: readline.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: readline.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: readline.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: readline.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: readline.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: readline.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: readline.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: readline.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: readline.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: readline.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: readline.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: readline.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: readline.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ echo "$as_me:$LINENO: checking for readline.h" >&5 -echo $ECHO_N "checking for readline.h... $ECHO_C" >&6; } -if test "${ac_cv_header_readline_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_readline_h=$ac_header_preproc -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_readline_h" >&5 -echo "${ECHO_T}$ac_cv_header_readline_h" >&6; } - -fi -if test $ac_cv_header_readline_h = yes; then - found="yes" -else - - found="no" - if test "$cross_compiling" != yes; then - for dir in /usr /usr/local /usr/local/readline /usr/contrib /mingw; do - for subdir in include include/readline; do - as_ac_File=`echo "ac_cv_file_$dir/$subdir/readline.h" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $dir/$subdir/readline.h" >&5 -echo $ECHO_N "checking for $dir/$subdir/readline.h... $ECHO_C" >&6; } -if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - test "$cross_compiling" = yes && - { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 -echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} - { (exit 1); exit 1; }; } -if test -r "$dir/$subdir/readline.h"; then - eval "$as_ac_File=yes" -else - eval "$as_ac_File=no" -fi -fi -ac_res=`eval echo '${'$as_ac_File'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_File'}'` = yes; then - found=yes -fi - - if test "$found" = "yes"; then - TARGET_READLINE_INC="-I$dir/$subdir" - break - fi - done - test "$found" = "yes" && break - done - fi - -fi - - - else - TARGET_READLINE_INC="$with_readline_inc" - fi - - if test x"$found" = xno; then - TARGET_READLINE_LIBS="" - TARGET_READLINE_INC="" - TARGET_HAVE_READLINE=0 - else - TARGET_HAVE_READLINE=1 - fi -fi - - - - - -########## -# Figure out what C libraries are required to compile programs -# that use "fdatasync()" function. -# -{ echo "$as_me:$LINENO: checking for library containing fdatasync" >&5 -echo $ECHO_N "checking for library containing fdatasync... $ECHO_C" >&6; } -if test "${ac_cv_search_fdatasync+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char fdatasync (); -int -main () -{ -return fdatasync (); - ; - return 0; -} -_ACEOF -for ac_lib in '' rt; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_search_fdatasync=$ac_res -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_fdatasync+set}" = set; then - break -fi -done -if test "${ac_cv_search_fdatasync+set}" = set; then - : -else - ac_cv_search_fdatasync=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ echo "$as_me:$LINENO: result: $ac_cv_search_fdatasync" >&5 -echo "${ECHO_T}$ac_cv_search_fdatasync" >&6; } -ac_res=$ac_cv_search_fdatasync -if test "$ac_res" != no; then - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - - -######### -# check for debug enabled -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then - enableval=$enable_debug; use_debug=$enableval -else - use_debug=no -fi - -if test "${use_debug}" = "yes" ; then - TARGET_DEBUG="-DSQLITE_DEBUG=1" -else - TARGET_DEBUG="-DNDEBUG" -fi - - -######### -# Figure out whether or not we have a "usleep()" function. -# -{ echo "$as_me:$LINENO: checking for usleep" >&5 -echo $ECHO_N "checking for usleep... $ECHO_C" >&6; } -if test "${ac_cv_func_usleep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define usleep to an innocuous variant, in case declares usleep. - For example, HP-UX 11i declares gettimeofday. */ -#define usleep innocuous_usleep - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char usleep (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef usleep - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char usleep (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_usleep || defined __stub___usleep -choke me -#endif - -int -main () -{ -return usleep (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_usleep=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_usleep=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_usleep" >&5 -echo "${ECHO_T}$ac_cv_func_usleep" >&6; } -if test $ac_cv_func_usleep = yes; then - TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_USLEEP=1" -fi - - -#-------------------------------------------------------------------- -# Redefine fdatasync as fsync on systems that lack fdatasync -#-------------------------------------------------------------------- - -{ echo "$as_me:$LINENO: checking for fdatasync" >&5 -echo $ECHO_N "checking for fdatasync... $ECHO_C" >&6; } -if test "${ac_cv_func_fdatasync+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define fdatasync to an innocuous variant, in case declares fdatasync. - For example, HP-UX 11i declares gettimeofday. */ -#define fdatasync innocuous_fdatasync - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char fdatasync (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef fdatasync - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char fdatasync (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_fdatasync || defined __stub___fdatasync -choke me -#endif - -int -main () -{ -return fdatasync (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - ac_cv_func_fdatasync=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_fdatasync=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_func_fdatasync" >&5 -echo "${ECHO_T}$ac_cv_func_fdatasync" >&6; } -if test $ac_cv_func_fdatasync = yes; then - TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_FDATASYNC=1" -fi - - -######### -# Generate the output files. -# -ac_config_files="$ac_config_files Makefile sqlite3.pc" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { echo "$as_me:$LINENO: updating cache $cache_file" >&5 -echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: ${CONFIG_STATUS=./config.status} -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -as_nl=' -' -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 - -# Save the log message, to keep $[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.61. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF -# Files that config.status was made for. -config_files="$ac_config_files" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTIONS] [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.61, - with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - -Copyright (C) 2006 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - echo "$ac_cs_version"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -if \$ac_cs_recheck; then - echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - CONFIG_SHELL=$SHELL - export CONFIG_SHELL - exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "sqlite3.pc") CONFIG_FILES="$CONFIG_FILES sqlite3.pc" ;; - - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || -{ - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -# -# Set up the sed scripts for CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "$CONFIG_FILES"; then - -_ACEOF - - - -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - cat >conf$$subs.sed <<_ACEOF -SHELL!$SHELL$ac_delim -PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim -PACKAGE_NAME!$PACKAGE_NAME$ac_delim -PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim -PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim -PACKAGE_STRING!$PACKAGE_STRING$ac_delim -PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim -exec_prefix!$exec_prefix$ac_delim -prefix!$prefix$ac_delim -program_transform_name!$program_transform_name$ac_delim -bindir!$bindir$ac_delim -sbindir!$sbindir$ac_delim -libexecdir!$libexecdir$ac_delim -datarootdir!$datarootdir$ac_delim -datadir!$datadir$ac_delim -sysconfdir!$sysconfdir$ac_delim -sharedstatedir!$sharedstatedir$ac_delim -localstatedir!$localstatedir$ac_delim -includedir!$includedir$ac_delim -oldincludedir!$oldincludedir$ac_delim -docdir!$docdir$ac_delim -infodir!$infodir$ac_delim -htmldir!$htmldir$ac_delim -dvidir!$dvidir$ac_delim -pdfdir!$pdfdir$ac_delim -psdir!$psdir$ac_delim -libdir!$libdir$ac_delim -localedir!$localedir$ac_delim -mandir!$mandir$ac_delim -DEFS!$DEFS$ac_delim -ECHO_C!$ECHO_C$ac_delim -ECHO_N!$ECHO_N$ac_delim -ECHO_T!$ECHO_T$ac_delim -LIBS!$LIBS$ac_delim -build_alias!$build_alias$ac_delim -host_alias!$host_alias$ac_delim -target_alias!$target_alias$ac_delim -build!$build$ac_delim -build_cpu!$build_cpu$ac_delim -build_vendor!$build_vendor$ac_delim -build_os!$build_os$ac_delim -host!$host$ac_delim -host_cpu!$host_cpu$ac_delim -host_vendor!$host_vendor$ac_delim -host_os!$host_os$ac_delim -CC!$CC$ac_delim -CFLAGS!$CFLAGS$ac_delim -LDFLAGS!$LDFLAGS$ac_delim -CPPFLAGS!$CPPFLAGS$ac_delim -ac_ct_CC!$ac_ct_CC$ac_delim -EXEEXT!$EXEEXT$ac_delim -OBJEXT!$OBJEXT$ac_delim -GREP!$GREP$ac_delim -EGREP!$EGREP$ac_delim -LN_S!$LN_S$ac_delim -ECHO!$ECHO$ac_delim -AR!$AR$ac_delim -RANLIB!$RANLIB$ac_delim -STRIP!$STRIP$ac_delim -CPP!$CPP$ac_delim -CXX!$CXX$ac_delim -CXXFLAGS!$CXXFLAGS$ac_delim -ac_ct_CXX!$ac_ct_CXX$ac_delim -CXXCPP!$CXXCPP$ac_delim -F77!$F77$ac_delim -FFLAGS!$FFLAGS$ac_delim -ac_ct_F77!$ac_ct_F77$ac_delim -LIBTOOL!$LIBTOOL$ac_delim -INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim -INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim -INSTALL_DATA!$INSTALL_DATA$ac_delim -AWK!$AWK$ac_delim -program_prefix!$program_prefix$ac_delim -VERSION!$VERSION$ac_delim -RELEASE!$RELEASE$ac_delim -VERSION_NUMBER!$VERSION_NUMBER$ac_delim -BUILD_CC!$BUILD_CC$ac_delim -BUILD_CFLAGS!$BUILD_CFLAGS$ac_delim -SQLITE_THREADSAFE!$SQLITE_THREADSAFE$ac_delim -TARGET_THREAD_LIB!$TARGET_THREAD_LIB$ac_delim -XTHREADCONNECT!$XTHREADCONNECT$ac_delim -THREADSOVERRIDELOCKS!$THREADSOVERRIDELOCKS$ac_delim -ALLOWRELEASE!$ALLOWRELEASE$ac_delim -TEMP_STORE!$TEMP_STORE$ac_delim -BUILD_EXEEXT!$BUILD_EXEEXT$ac_delim -OS_UNIX!$OS_UNIX$ac_delim -OS_WIN!$OS_WIN$ac_delim -OS_OS2!$OS_OS2$ac_delim -TARGET_EXEEXT!$TARGET_EXEEXT$ac_delim -TCL_VERSION!$TCL_VERSION$ac_delim -TCL_BIN_DIR!$TCL_BIN_DIR$ac_delim -TCL_SRC_DIR!$TCL_SRC_DIR$ac_delim -TCL_LIBS!$TCL_LIBS$ac_delim -TCL_INCLUDE_SPEC!$TCL_INCLUDE_SPEC$ac_delim -TCL_LIB_FILE!$TCL_LIB_FILE$ac_delim -TCL_LIB_FLAG!$TCL_LIB_FLAG$ac_delim -TCL_LIB_SPEC!$TCL_LIB_SPEC$ac_delim -_ACEOF - - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then - break - elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` -fi - -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -_ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF -CEOF$ac_eof -_ACEOF - - -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - cat >conf$$subs.sed <<_ACEOF -TCL_STUB_LIB_FILE!$TCL_STUB_LIB_FILE$ac_delim -TCL_STUB_LIB_FLAG!$TCL_STUB_LIB_FLAG$ac_delim -TCL_STUB_LIB_SPEC!$TCL_STUB_LIB_SPEC$ac_delim -HAVE_TCL!$HAVE_TCL$ac_delim -TARGET_READLINE_LIBS!$TARGET_READLINE_LIBS$ac_delim -TARGET_READLINE_INC!$TARGET_READLINE_INC$ac_delim -TARGET_HAVE_READLINE!$TARGET_HAVE_READLINE$ac_delim -TARGET_DEBUG!$TARGET_DEBUG$ac_delim -LIBOBJS!$LIBOBJS$ac_delim -LTLIBOBJS!$LTLIBOBJS$ac_delim -_ACEOF - - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 10; then - break - elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` -fi - -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end -_ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF -:end -s/|#_!!_#|//g -CEOF$ac_eof -_ACEOF - - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF -fi # test -n "$CONFIG_FILES" - - -for ac_tag in :F $CONFIG_FILES -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 -echo "$as_me: error: Invalid tag $ac_tag." >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; - esac - ac_file_inputs="$ac_file_inputs $ac_f" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input="Generated from "`IFS=: - echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - fi - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin";; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= - -case `sed -n '/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p -' $ac_file_inputs` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s&@configure_input@&$configure_input&;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out"; rm -f "$tmp/out";; - *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; - esac - ;; - - - - esac - -done # for ac_tag - - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi diff --git a/libraries/sqlite/unix/sqlite-3.5.1/configure.ac b/libraries/sqlite/unix/sqlite-3.5.1/configure.ac deleted file mode 100644 index 311459af0e..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/configure.ac +++ /dev/null @@ -1,582 +0,0 @@ -# -# The build process allows for using a cross-compiler. But the default -# action is to target the same platform that we are running on. The -# configure script needs to discover the following properties of the -# build and target systems: -# -# srcdir -# -# The is the name of the directory that contains the -# "configure" shell script. All source files are -# located relative to this directory. -# -# bindir -# -# The name of the directory where executables should be -# written by the "install" target of the makefile. -# -# program_prefix -# -# Add this prefix to the names of all executables that run -# on the target machine. Default: "" -# -# ENABLE_SHARED -# -# True if shared libraries should be generated. -# -# BUILD_CC -# -# The name of a command that is used to convert C -# source files into executables that run on the build -# platform. -# -# BUILD_CFLAGS -# -# Switches that the build compiler needs in order to construct -# command-line programs. -# -# BUILD_LIBS -# -# Libraries that the build compiler needs in order to construct -# command-line programs. -# -# BUILD_EXEEXT -# -# The filename extension for executables on the build -# platform. "" for Unix and ".exe" for Windows. -# -# TCL_* -# -# Lots of values are read in from the tclConfig.sh script, -# if that script is available. This values are used for -# constructing and installing the TCL extension. -# -# TARGET_READLINE_LIBS -# -# This is the library directives passed to the target linker -# that cause the executable to link against the readline library. -# This might be a switch like "-lreadline" or pathnames of library -# file like "../../src/libreadline.a". -# -# TARGET_READLINE_INC -# -# This variables define the directory that contain header -# files for the readline library. If the compiler is able -# to find on its own, then this can be blank. -# -# TARGET_EXEEXT -# -# The filename extension for executables on the -# target platform. "" for Unix and ".exe" for windows. -# -# The generated configure script will make an attempt to guess -# at all of the above parameters. You can override any of -# the guesses by setting the environment variable named -# "config_AAAA" where "AAAA" is the name of the parameter -# described above. (Exception: srcdir cannot be set this way.) -# If you have a file that sets one or more of these environment -# variables, you can invoke configure as follows: -# -# configure --with-hints=FILE -# -# where FILE is the name of the file that sets the environment -# variables. FILE should be an absolute pathname. -# -# This configure.in file is easy to reuse on other projects. Just -# change the argument to AC_INIT(). And disable any features that -# you don't need (for example BLT) by erasing or commenting out -# the corresponding code. -# -AC_INIT(src/sqlite.h.in) - -dnl Put the RCS revision string after AC_INIT so that it will also -dnl show in in configure. -# The following RCS revision string applies to configure.in -# $Revision: 1.30 $ - -######### -# Programs needed -# -AC_PROG_LIBTOOL -AC_PROG_INSTALL -AC_PROG_AWK - -######### -# Set up an appropriate program prefix -# -if test "$program_prefix" = "NONE"; then - program_prefix="" -fi -AC_SUBST(program_prefix) - -VERSION=[`cat $srcdir/VERSION | sed 's/^\([0-9]*\.*[0-9]*\).*/\1/'`] -echo "Version set to $VERSION" -AC_SUBST(VERSION) -RELEASE=`cat $srcdir/VERSION` -echo "Release set to $RELEASE" -AC_SUBST(RELEASE) -VERSION_NUMBER=[`cat $srcdir/VERSION \ - | sed 's/[^0-9]/ /g' \ - | awk '{printf "%d%03d%03d",$1,$2,$3}'`] -echo "Version number set to $VERSION_NUMBER" -AC_SUBST(VERSION_NUMBER) - -######### -# Check to see if the --with-hints=FILE option is used. If there is none, -# then check for a files named "$host.hints" and ../$hosts.hints where -# $host is the hostname of the build system. If still no hints are -# found, try looking in $system.hints and ../$system.hints where -# $system is the result of uname -s. -# -AC_ARG_WITH(hints, - AC_HELP_STRING([--with-hints=FILE],[Read configuration options from FILE]), - hints=$withval) -if test "$hints" = ""; then - host=`hostname | sed 's/\..*//'` - if test -r $host.hints; then - hints=$host.hints - else - if test -r ../$host.hints; then - hints=../$host.hints - fi - fi -fi -if test "$hints" = ""; then - sys=`uname -s` - if test -r $sys.hints; then - hints=$sys.hints - else - if test -r ../$sys.hints; then - hints=../$sys.hints - fi - fi -fi -if test "$hints" != ""; then - AC_MSG_RESULT(reading hints from $hints) - . $hints -fi - -######### -# Locate a compiler for the build machine. This compiler should -# generate command-line programs that run on the build machine. -# -if test x"$cross_compiling" = xno; then - BUILD_CC=$CC - BUILD_CFLAGS=$CFLAGS -else - if test "${BUILD_CC+set}" != set; then - AC_CHECK_PROGS(BUILD_CC, gcc cc cl) - fi - if test "${BUILD_CFLAGS+set}" != set; then - BUILD_CFLAGS="-g" - fi -fi -AC_SUBST(BUILD_CC) -AC_SUBST(BUILD_CFLAGS) - -########## -# Do we want to support multithreaded use of sqlite -# -AC_ARG_ENABLE(threadsafe, -AC_HELP_STRING([--enable-threadsafe],[Support threadsafe operation]),,enable_threadsafe=yes) -AC_MSG_CHECKING([whether to support threadsafe operation]) -if test "$enable_threadsafe" = "no"; then - SQLITE_THREADSAFE=0 - AC_MSG_RESULT([no]) -else - SQLITE_THREADSAFE=1 - AC_MSG_RESULT([yes]) -fi -AC_SUBST(SQLITE_THREADSAFE) - -if test "$SQLITE_THREADSAFE" = "1"; then - LIBS="" - AC_CHECK_LIB(pthread, pthread_create) - TARGET_THREAD_LIB="$LIBS" - LIBS="" -else - TARGET_THREAD_LIB="" -fi -AC_SUBST(TARGET_THREAD_LIB) - -########## -# Do we want to allow a connection created in one thread to be used -# in another thread. This does not work on many Linux systems (ex: RedHat 9) -# due to bugs in the threading implementations. This is thus off by default. -# -AC_ARG_ENABLE(cross-thread-connections, -AC_HELP_STRING([--enable-cross-thread-connections],[Allow connection sharing across threads]),,enable_xthreadconnect=no) -AC_MSG_CHECKING([whether to allow connections to be shared across threads]) -if test "$enable_xthreadconnect" = "no"; then - XTHREADCONNECT='' - AC_MSG_RESULT([no]) -else - XTHREADCONNECT='-DSQLITE_ALLOW_XTHREAD_CONNECT=1' - AC_MSG_RESULT([yes]) -fi -AC_SUBST(XTHREADCONNECT) - -########## -# Do we want to set threadsOverrideEachOthersLocks variable to be 1 (true) by -# default. Normally, a test at runtime is performed to determine the -# appropriate value of this variable. Use this option only if you're sure that -# threads can safely override each others locks in all runtime situations. -# -AC_ARG_ENABLE(threads-override-locks, -AC_HELP_STRING([--enable-threads-override-locks],[Threads can override each others locks]),,enable_threads_override_locks=no) -AC_MSG_CHECKING([whether threads can override each others locks]) -if test "$enable_threads_override_locks" = "no"; then - THREADSOVERRIDELOCKS='-1' - AC_MSG_RESULT([no]) -else - THREADSOVERRIDELOCKS='1' - AC_MSG_RESULT([yes]) -fi -AC_SUBST(THREADSOVERRIDELOCKS) - -########## -# Do we want to support release -# -AC_ARG_ENABLE(releasemode, -AC_HELP_STRING([--enable-releasemode],[Support libtool link to release mode]),,enable_releasemode=no) -AC_MSG_CHECKING([whether to support shared library linked as release mode or not]) -if test "$enable_releasemode" = "no"; then - ALLOWRELEASE="" - AC_MSG_RESULT([no]) -else - ALLOWRELEASE="-release `cat VERSION`" - AC_MSG_RESULT([yes]) -fi -AC_SUBST(ALLOWRELEASE) - -########## -# Do we want temporary databases in memory -# -AC_ARG_ENABLE(tempstore, -AC_HELP_STRING([--enable-tempstore],[Use an in-ram database for temporary tables (never,no,yes,always)]),,enable_tempstore=no) -AC_MSG_CHECKING([whether to use an in-ram database for temporary tables]) -case "$enable_tempstore" in - never ) - TEMP_STORE=0 - AC_MSG_RESULT([never]) - ;; - no ) - TEMP_STORE=1 - AC_MSG_RESULT([no]) - ;; - always ) - TEMP_STORE=3 - AC_MSG_RESULT([always]) - ;; - yes ) - TEMP_STORE=3 - AC_MSG_RESULT([always]) - ;; - * ) - TEMP_STORE=1 - AC_MSG_RESULT([yes]) - ;; -esac - -AC_SUBST(TEMP_STORE) - -########### -# Lots of things are different if we are compiling for Windows using -# the CYGWIN environment. So check for that special case and handle -# things accordingly. -# -AC_MSG_CHECKING([if executables have the .exe suffix]) -if test "$config_BUILD_EXEEXT" = ".exe"; then - CYGWIN=yes - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(unknown) -fi -if test "$CYGWIN" != "yes"; then - AC_CYGWIN -fi -if test "$CYGWIN" = "yes"; then - BUILD_EXEEXT=.exe -else - BUILD_EXEEXT=$EXEEXT -fi -if test x"$cross_compiling" = xno; then - TARGET_EXEEXT=$BUILD_EXEEXT -else - TARGET_EXEEXT=$config_TARGET_EXEEXT -fi -if test "$TARGET_EXEEXT" = ".exe"; then - if test $OS2_SHELL ; then - OS_UNIX=0 - OS_WIN=0 - OS_OS2=1 - TARGET_CFLAGS="$TARGET_CFLAGS -DOS_OS2=1" - if test "$ac_compiler_gnu" == "yes" ; then - TARGET_CFLAGS="$TARGET_CFLAGS -Zomf -Zexe -Zmap" - BUILD_CFLAGS="$BUILD_CFLAGS -Zomf -Zexe" - fi - else - OS_UNIX=0 - OS_WIN=1 - OS_OS2=0 - tclsubdir=win - TARGET_CFLAGS="$TARGET_CFLAGS -DOS_WIN=1" - fi -else - OS_UNIX=1 - OS_WIN=0 - OS_OS2=0 - tclsubdir=unix - TARGET_CFLAGS="$TARGET_CFLAGS -DOS_UNIX=1" -fi - -AC_SUBST(BUILD_EXEEXT) -AC_SUBST(OS_UNIX) -AC_SUBST(OS_WIN) -AC_SUBST(OS_OS2) -AC_SUBST(TARGET_EXEEXT) - -########## -# Figure out all the parameters needed to compile against Tcl. -# -# This code is derived from the SC_PATH_TCLCONFIG and SC_LOAD_TCLCONFIG -# macros in the in the tcl.m4 file of the standard TCL distribution. -# Those macros could not be used directly since we have to make some -# minor changes to accomodate systems that do not have TCL installed. -# -AC_ARG_ENABLE(tcl, AC_HELP_STRING([--disable-tcl],[do not build TCL extension]), - [use_tcl=$enableval],[use_tcl=yes]) -if test "${use_tcl}" = "yes" ; then - AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl=DIR],[directory containing tcl configuration (tclConfig.sh)]), with_tclconfig=${withval}) - AC_MSG_CHECKING([for Tcl configuration]) - AC_CACHE_VAL(ac_cv_c_tclconfig,[ - # First check to see if --with-tcl was specified. - if test x"${with_tclconfig}" != x ; then - if test -f "${with_tclconfig}/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` - else - AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) - fi - fi - # then check for a private Tcl installation - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - ../tcl \ - `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ - ../../tcl \ - `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ - ../../../tcl \ - `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` - do - if test -f "$i/unix/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - - # check in a few common install locations - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - `ls -d ${libdir} 2>/dev/null` \ - `ls -d /usr/local/lib 2>/dev/null` \ - `ls -d /usr/contrib/lib 2>/dev/null` \ - `ls -d /usr/lib 2>/dev/null` - do - if test -f "$i/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i; pwd)` - break - fi - done - fi - - # check in a few other private locations - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - ${srcdir}/../tcl \ - `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` - do - if test -f "$i/unix/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - ]) - - if test x"${ac_cv_c_tclconfig}" = x ; then - use_tcl=no - AC_MSG_WARN(Can't find Tcl configuration definitions) - AC_MSG_WARN(*** Without Tcl the regression tests cannot be executed ***) - AC_MSG_WARN(*** Consider using --with-tcl=... to define location of Tcl ***) - else - TCL_BIN_DIR=${ac_cv_c_tclconfig} - AC_MSG_RESULT(found $TCL_BIN_DIR/tclConfig.sh) - - AC_MSG_CHECKING([for existence of $TCL_BIN_DIR/tclConfig.sh]) - if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then - AC_MSG_RESULT([loading]) - . $TCL_BIN_DIR/tclConfig.sh - else - AC_MSG_RESULT([file not found]) - fi - - # - # If the TCL_BIN_DIR is the build directory (not the install directory), - # then set the common variable name to the value of the build variables. - # For example, the variable TCL_LIB_SPEC will be set to the value - # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC - # instead of TCL_BUILD_LIB_SPEC since it will work with both an - # installed and uninstalled version of Tcl. - # - - if test -f $TCL_BIN_DIR/Makefile ; then - TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} - TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} - TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} - fi - - # - # eval is required to do the TCL_DBGX substitution - # - - eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" - eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" - eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" - - eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" - eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" - eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" - - AC_SUBST(TCL_VERSION) - AC_SUBST(TCL_BIN_DIR) - AC_SUBST(TCL_SRC_DIR) - AC_SUBST(TCL_LIBS) - AC_SUBST(TCL_INCLUDE_SPEC) - - AC_SUBST(TCL_LIB_FILE) - AC_SUBST(TCL_LIB_FLAG) - AC_SUBST(TCL_LIB_SPEC) - - AC_SUBST(TCL_STUB_LIB_FILE) - AC_SUBST(TCL_STUB_LIB_FLAG) - AC_SUBST(TCL_STUB_LIB_SPEC) - fi -fi -if test "${use_tcl}" = "no" ; then - HAVE_TCL="" -else - HAVE_TCL=1 -fi -AC_SUBST(HAVE_TCL) - -########## -# Figure out what C libraries are required to compile programs -# that use "readline()" library. -# -TARGET_READLINE_LIBS="" -TARGET_READLINE_INC="" -TARGET_HAVE_READLINE=0 -AC_ARG_ENABLE([readline], - [AC_HELP_STRING([--disable-readline],[disable readline support [default=detect]])], - [with_readline=$enableval], - [with_readline=auto]) - -if test x"$with_readline" != xno; then - found="yes" - - AC_ARG_WITH([readline-lib], - [AC_HELP_STRING([--with-readline-lib],[specify readline library])], - [with_readline_lib=$withval], - [with_readline_lib="auto"]) - if test "x$with_readline_lib" = xauto; then - save_LIBS="$LIBS" - LIBS="" - AC_SEARCH_LIBS(tgetent, [readline ncurses curses termcap], [term_LIBS="$LIBS"], [term_LIBS=""]) - AC_CHECK_LIB([readline], [readline], [TARGET_READLINE_LIBS="-lreadline"], [found="no"]) - TARGET_READLINE_LIBS="$TARGET_READLINE_LIBS $term_LIBS" - LIBS="$save_LIBS" - else - TARGET_READLINE_LIBS="$with_readline_lib" - fi - - AC_ARG_WITH([readline-inc], - [AC_HELP_STRING([--with-readline-inc],[specify readline include paths])], - [with_readline_inc=$withval], - [with_readline_inc="auto"]) - if test "x$with_readline_inc" = xauto; then - AC_CHECK_HEADER(readline.h, [found="yes"], [ - found="no" - if test "$cross_compiling" != yes; then - for dir in /usr /usr/local /usr/local/readline /usr/contrib /mingw; do - for subdir in include include/readline; do - AC_CHECK_FILE($dir/$subdir/readline.h, found=yes) - if test "$found" = "yes"; then - TARGET_READLINE_INC="-I$dir/$subdir" - break - fi - done - test "$found" = "yes" && break - done - fi - ]) - else - TARGET_READLINE_INC="$with_readline_inc" - fi - - if test x"$found" = xno; then - TARGET_READLINE_LIBS="" - TARGET_READLINE_INC="" - TARGET_HAVE_READLINE=0 - else - TARGET_HAVE_READLINE=1 - fi -fi - -AC_SUBST(TARGET_READLINE_LIBS) -AC_SUBST(TARGET_READLINE_INC) -AC_SUBST(TARGET_HAVE_READLINE) - -########## -# Figure out what C libraries are required to compile programs -# that use "fdatasync()" function. -# -AC_SEARCH_LIBS(fdatasync, [rt]) - -######### -# check for debug enabled -AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[enable debugging & verbose explain]), - [use_debug=$enableval],[use_debug=no]) -if test "${use_debug}" = "yes" ; then - TARGET_DEBUG="-DSQLITE_DEBUG=1" -else - TARGET_DEBUG="-DNDEBUG" -fi -AC_SUBST(TARGET_DEBUG) - -######### -# Figure out whether or not we have a "usleep()" function. -# -AC_CHECK_FUNC(usleep, [TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_USLEEP=1"]) - -#-------------------------------------------------------------------- -# Redefine fdatasync as fsync on systems that lack fdatasync -#-------------------------------------------------------------------- - -AC_CHECK_FUNC(fdatasync, [TARGET_CFLAGS="$TARGET_CFLAGS -DHAVE_FDATASYNC=1"]) - -######### -# Generate the output files. -# -AC_OUTPUT([ -Makefile -sqlite3.pc -]) diff --git a/libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl b/libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl deleted file mode 100644 index b5dbcafc2a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/contrib/sqlitecon.tcl +++ /dev/null @@ -1,679 +0,0 @@ -# A Tk console widget for SQLite. Invoke sqlitecon::create with a window name, -# a prompt string, a title to set a new top-level window, and the SQLite -# database handle. For example: -# -# sqlitecon::create .sqlcon {sql:- } {SQL Console} db -# -# A toplevel window is created that allows you to type in SQL commands to -# be processed on the spot. -# -# A limited set of dot-commands are supported: -# -# .table -# .schema ?TABLE? -# .mode list|column|multicolumn|line -# .exit -# -# In addition, a new SQL function named "edit()" is created. This function -# takes a single text argument and returns a text result. Whenever the -# the function is called, it pops up a new toplevel window containing a -# text editor screen initialized to the argument. When the "OK" button -# is pressed, whatever revised text is in the text editor is returned as -# the result of the edit() function. This allows text fields of SQL tables -# to be edited quickly and easily as follows: -# -# UPDATE table1 SET dscr = edit(dscr) WHERE rowid=15; -# - - -# Create a namespace to work in -# -namespace eval ::sqlitecon { - # do nothing -} - -# Create a console widget named $w. The prompt string is $prompt. -# The title at the top of the window is $title. The database connection -# object is $db -# -proc sqlitecon::create {w prompt title db} { - upvar #0 $w.t v - if {[winfo exists $w]} {destroy $w} - if {[info exists v]} {unset v} - toplevel $w - wm title $w $title - wm iconname $w $title - frame $w.mb -bd 2 -relief raised - pack $w.mb -side top -fill x - menubutton $w.mb.file -text File -menu $w.mb.file.m - menubutton $w.mb.edit -text Edit -menu $w.mb.edit.m - pack $w.mb.file $w.mb.edit -side left -padx 8 -pady 1 - set m [menu $w.mb.file.m -tearoff 0] - $m add command -label {Close} -command "destroy $w" - sqlitecon::create_child $w $prompt $w.mb.edit.m - set v(db) $db - $db function edit ::sqlitecon::_edit -} - -# This routine creates a console as a child window within a larger -# window. It also creates an edit menu named "$editmenu" if $editmenu!="". -# The calling function is responsible for posting the edit menu. -# -proc sqlitecon::create_child {w prompt editmenu} { - upvar #0 $w.t v - if {$editmenu!=""} { - set m [menu $editmenu -tearoff 0] - $m add command -label Cut -command "sqlitecon::Cut $w.t" - $m add command -label Copy -command "sqlitecon::Copy $w.t" - $m add command -label Paste -command "sqlitecon::Paste $w.t" - $m add command -label {Clear Screen} -command "sqlitecon::Clear $w.t" - $m add separator - $m add command -label {Save As...} -command "sqlitecon::SaveFile $w.t" - catch {$editmenu config -postcommand "sqlitecon::EnableEditMenu $w"} - } - scrollbar $w.sb -orient vertical -command "$w.t yview" - pack $w.sb -side right -fill y - text $w.t -font fixed -yscrollcommand "$w.sb set" - pack $w.t -side right -fill both -expand 1 - bindtags $w.t Sqlitecon - set v(editmenu) $editmenu - set v(history) 0 - set v(historycnt) 0 - set v(current) -1 - set v(prompt) $prompt - set v(prior) {} - set v(plength) [string length $v(prompt)] - set v(x) 0 - set v(y) 0 - set v(mode) column - set v(header) on - $w.t mark set insert end - $w.t tag config ok -foreground blue - $w.t tag config err -foreground red - $w.t insert end $v(prompt) - $w.t mark set out 1.0 - after idle "focus $w.t" -} - -bind Sqlitecon <1> {sqlitecon::Button1 %W %x %y} -bind Sqlitecon {sqlitecon::B1Motion %W %x %y} -bind Sqlitecon {sqlitecon::B1Leave %W %x %y} -bind Sqlitecon {sqlitecon::cancelMotor %W} -bind Sqlitecon {sqlitecon::cancelMotor %W} -bind Sqlitecon {sqlitecon::Insert %W %A} -bind Sqlitecon {sqlitecon::Left %W} -bind Sqlitecon {sqlitecon::Left %W} -bind Sqlitecon {sqlitecon::Right %W} -bind Sqlitecon {sqlitecon::Right %W} -bind Sqlitecon {sqlitecon::Backspace %W} -bind Sqlitecon {sqlitecon::Backspace %W} -bind Sqlitecon {sqlitecon::Delete %W} -bind Sqlitecon {sqlitecon::Delete %W} -bind Sqlitecon {sqlitecon::Home %W} -bind Sqlitecon {sqlitecon::Home %W} -bind Sqlitecon {sqlitecon::End %W} -bind Sqlitecon {sqlitecon::End %W} -bind Sqlitecon {sqlitecon::Enter %W} -bind Sqlitecon {sqlitecon::Enter %W} -bind Sqlitecon {sqlitecon::Prior %W} -bind Sqlitecon {sqlitecon::Prior %W} -bind Sqlitecon {sqlitecon::Next %W} -bind Sqlitecon {sqlitecon::Next %W} -bind Sqlitecon {sqlitecon::EraseEOL %W} -bind Sqlitecon <> {sqlitecon::Cut %W} -bind Sqlitecon <> {sqlitecon::Copy %W} -bind Sqlitecon <> {sqlitecon::Paste %W} -bind Sqlitecon <> {sqlitecon::Clear %W} - -# Insert a single character at the insertion cursor -# -proc sqlitecon::Insert {w a} { - $w insert insert $a - $w yview insert -} - -# Move the cursor one character to the left -# -proc sqlitecon::Left {w} { - upvar #0 $w v - scan [$w index insert] %d.%d row col - if {$col>$v(plength)} { - $w mark set insert "insert -1c" - } -} - -# Erase the character to the left of the cursor -# -proc sqlitecon::Backspace {w} { - upvar #0 $w v - scan [$w index insert] %d.%d row col - if {$col>$v(plength)} { - $w delete {insert -1c} - } -} - -# Erase to the end of the line -# -proc sqlitecon::EraseEOL {w} { - upvar #0 $w v - scan [$w index insert] %d.%d row col - if {$col>=$v(plength)} { - $w delete insert {insert lineend} - } -} - -# Move the cursor one character to the right -# -proc sqlitecon::Right {w} { - $w mark set insert "insert +1c" -} - -# Erase the character to the right of the cursor -# -proc sqlitecon::Delete w { - $w delete insert -} - -# Move the cursor to the beginning of the current line -# -proc sqlitecon::Home w { - upvar #0 $w v - scan [$w index insert] %d.%d row col - $w mark set insert $row.$v(plength) -} - -# Move the cursor to the end of the current line -# -proc sqlitecon::End w { - $w mark set insert {insert lineend} -} - -# Add a line to the history -# -proc sqlitecon::addHistory {w line} { - upvar #0 $w v - if {$v(historycnt)>0} { - set last [lindex $v(history) [expr $v(historycnt)-1]] - if {[string compare $last $line]} { - lappend v(history) $line - incr v(historycnt) - } - } else { - set v(history) [list $line] - set v(historycnt) 1 - } - set v(current) $v(historycnt) -} - -# Called when "Enter" is pressed. Do something with the line -# of text that was entered. -# -proc sqlitecon::Enter w { - upvar #0 $w v - scan [$w index insert] %d.%d row col - set start $row.$v(plength) - set line [$w get $start "$start lineend"] - $w insert end \n - $w mark set out end - if {$v(prior)==""} { - set cmd $line - } else { - set cmd $v(prior)\n$line - } - if {[string index $cmd 0]=="." || [$v(db) complete $cmd]} { - regsub -all {\n} [string trim $cmd] { } cmd2 - addHistory $w $cmd2 - set rc [catch {DoCommand $w $cmd} res] - if {![winfo exists $w]} return - if {$rc} { - $w insert end $res\n err - } elseif {[string length $res]>0} { - $w insert end $res\n ok - } - set v(prior) {} - $w insert end $v(prompt) - } else { - set v(prior) $cmd - regsub -all {[^ ]} $v(prompt) . x - $w insert end $x - } - $w mark set insert end - $w mark set out {insert linestart} - $w yview insert -} - -# Execute a single SQL command. Pay special attention to control -# directives that begin with "." -# -# The return value is the text output from the command, properly -# formatted. -# -proc sqlitecon::DoCommand {w cmd} { - upvar #0 $w v - set mode $v(mode) - set header $v(header) - if {[regexp {^(\.[a-z]+)} $cmd all word]} { - if {$word==".mode"} { - regexp {^.[a-z]+ +([a-z]+)} $cmd all v(mode) - return {} - } elseif {$word==".exit"} { - destroy [winfo toplevel $w] - return {} - } elseif {$word==".header"} { - regexp {^.[a-z]+ +([a-z]+)} $cmd all v(header) - return {} - } elseif {$word==".tables"} { - set mode multicolumn - set cmd {SELECT name FROM sqlite_master WHERE type='table' - UNION ALL - SELECT name FROM sqlite_temp_master WHERE type='table'} - $v(db) eval {PRAGMA database_list} { - if {$name!="temp" && $name!="main"} { - append cmd "UNION ALL SELECT name FROM $name.sqlite_master\ - WHERE type='table'" - } - } - append cmd { ORDER BY 1} - } elseif {$word==".fullschema"} { - set pattern % - regexp {^.[a-z]+ +([^ ]+)} $cmd all pattern - set mode list - set header 0 - set cmd "SELECT sql FROM sqlite_master WHERE tbl_name LIKE '$pattern' - AND sql NOT NULL UNION ALL SELECT sql FROM sqlite_temp_master - WHERE tbl_name LIKE '$pattern' AND sql NOT NULL" - $v(db) eval {PRAGMA database_list} { - if {$name!="temp" && $name!="main"} { - append cmd " UNION ALL SELECT sql FROM $name.sqlite_master\ - WHERE tbl_name LIKE '$pattern' AND sql NOT NULL" - } - } - } elseif {$word==".schema"} { - set pattern % - regexp {^.[a-z]+ +([^ ]+)} $cmd all pattern - set mode list - set header 0 - set cmd "SELECT sql FROM sqlite_master WHERE name LIKE '$pattern' - AND sql NOT NULL UNION ALL SELECT sql FROM sqlite_temp_master - WHERE name LIKE '$pattern' AND sql NOT NULL" - $v(db) eval {PRAGMA database_list} { - if {$name!="temp" && $name!="main"} { - append cmd " UNION ALL SELECT sql FROM $name.sqlite_master\ - WHERE name LIKE '$pattern' AND sql NOT NULL" - } - } - } else { - return \ - ".exit\n.mode line|list|column\n.schema ?TABLENAME?\n.tables" - } - } - set res {} - if {$mode=="list"} { - $v(db) eval $cmd x { - set sep {} - foreach col $x(*) { - append res $sep$x($col) - set sep | - } - append res \n - } - if {[info exists x(*)] && $header} { - set sep {} - set hdr {} - foreach col $x(*) { - append hdr $sep$col - set sep | - } - set res $hdr\n$res - } - } elseif {[string range $mode 0 2]=="col"} { - set y {} - $v(db) eval $cmd x { - foreach col $x(*) { - if {![info exists cw($col)] || $cw($col)<[string length $x($col)]} { - set cw($col) [string length $x($col)] - } - lappend y $x($col) - } - } - if {[info exists x(*)] && $header} { - set hdr {} - set ln {} - set dash --------------------------------------------------------------- - append dash ------------------------------------------------------------ - foreach col $x(*) { - if {![info exists cw($col)] || $cw($col)<[string length $col]} { - set cw($col) [string length $col] - } - lappend hdr $col - lappend ln [string range $dash 1 $cw($col)] - } - set y [concat $hdr $ln $y] - } - if {[info exists x(*)]} { - set format {} - set arglist {} - set arglist2 {} - set i 0 - foreach col $x(*) { - lappend arglist x$i - append arglist2 " \$x$i" - incr i - append format " %-$cw($col)s" - } - set format [string trimleft $format]\n - if {[llength $arglist]>0} { - foreach $arglist $y "append res \[format [list $format] $arglist2\]" - } - } - } elseif {$mode=="multicolumn"} { - set y [$v(db) eval $cmd] - set max 0 - foreach e $y { - if {$max<[string length $e]} {set max [string length $e]} - } - set ncol [expr {int(80/($max+2))}] - if {$ncol<1} {set ncol 1} - set nelem [llength $y] - set nrow [expr {($nelem+$ncol-1)/$ncol}] - set format "%-${max}s" - for {set i 0} {$i<$nrow} {incr i} { - set j $i - while 1 { - append res [format $format [lindex $y $j]] - incr j $nrow - if {$j>=$nelem} break - append res { } - } - append res \n - } - } else { - $v(db) eval $cmd x { - foreach col $x(*) {append res "$col = $x($col)\n"} - append res \n - } - } - return [string trimright $res] -} - -# Change the line to the previous line -# -proc sqlitecon::Prior w { - upvar #0 $w v - if {$v(current)<=0} return - incr v(current) -1 - set line [lindex $v(history) $v(current)] - sqlitecon::SetLine $w $line -} - -# Change the line to the next line -# -proc sqlitecon::Next w { - upvar #0 $w v - if {$v(current)>=$v(historycnt)} return - incr v(current) 1 - set line [lindex $v(history) $v(current)] - sqlitecon::SetLine $w $line -} - -# Change the contents of the entry line -# -proc sqlitecon::SetLine {w line} { - upvar #0 $w v - scan [$w index insert] %d.%d row col - set start $row.$v(plength) - $w delete $start end - $w insert end $line - $w mark set insert end - $w yview insert -} - -# Called when the mouse button is pressed at position $x,$y on -# the console widget. -# -proc sqlitecon::Button1 {w x y} { - global tkPriv - upvar #0 $w v - set v(mouseMoved) 0 - set v(pressX) $x - set p [sqlitecon::nearestBoundry $w $x $y] - scan [$w index insert] %d.%d ix iy - scan $p %d.%d px py - if {$px==$ix} { - $w mark set insert $p - } - $w mark set anchor $p - focus $w -} - -# Find the boundry between characters that is nearest -# to $x,$y -# -proc sqlitecon::nearestBoundry {w x y} { - set p [$w index @$x,$y] - set bb [$w bbox $p] - if {![string compare $bb ""]} {return $p} - if {($x-[lindex $bb 0])<([lindex $bb 2]/2)} {return $p} - $w index "$p + 1 char" -} - -# This routine extends the selection to the point specified by $x,$y -# -proc sqlitecon::SelectTo {w x y} { - upvar #0 $w v - set cur [sqlitecon::nearestBoundry $w $x $y] - if {[catch {$w index anchor}]} { - $w mark set anchor $cur - } - set anchor [$w index anchor] - if {[$w compare $cur != $anchor] || (abs($v(pressX) - $x) >= 3)} { - if {$v(mouseMoved)==0} { - $w tag remove sel 0.0 end - } - set v(mouseMoved) 1 - } - if {[$w compare $cur < anchor]} { - set first $cur - set last anchor - } else { - set first anchor - set last $cur - } - if {$v(mouseMoved)} { - $w tag remove sel 0.0 $first - $w tag add sel $first $last - $w tag remove sel $last end - update idletasks - } -} - -# Called whenever the mouse moves while button-1 is held down. -# -proc sqlitecon::B1Motion {w x y} { - upvar #0 $w v - set v(y) $y - set v(x) $x - sqlitecon::SelectTo $w $x $y -} - -# Called whenever the mouse leaves the boundries of the widget -# while button 1 is held down. -# -proc sqlitecon::B1Leave {w x y} { - upvar #0 $w v - set v(y) $y - set v(x) $x - sqlitecon::motor $w -} - -# This routine is called to automatically scroll the window when -# the mouse drags offscreen. -# -proc sqlitecon::motor w { - upvar #0 $w v - if {![winfo exists $w]} return - if {$v(y)>=[winfo height $w]} { - $w yview scroll 1 units - } elseif {$v(y)<0} { - $w yview scroll -1 units - } else { - return - } - sqlitecon::SelectTo $w $v(x) $v(y) - set v(timer) [after 50 sqlitecon::motor $w] -} - -# This routine cancels the scrolling motor if it is active -# -proc sqlitecon::cancelMotor w { - upvar #0 $w v - catch {after cancel $v(timer)} - catch {unset v(timer)} -} - -# Do a Copy operation on the stuff currently selected. -# -proc sqlitecon::Copy w { - if {![catch {set text [$w get sel.first sel.last]}]} { - clipboard clear -displayof $w - clipboard append -displayof $w $text - } -} - -# Return 1 if the selection exists and is contained -# entirely on the input line. Return 2 if the selection -# exists but is not entirely on the input line. Return 0 -# if the selection does not exist. -# -proc sqlitecon::canCut w { - set r [catch { - scan [$w index sel.first] %d.%d s1x s1y - scan [$w index sel.last] %d.%d s2x s2y - scan [$w index insert] %d.%d ix iy - }] - if {$r==1} {return 0} - if {$s1x==$ix && $s2x==$ix} {return 1} - return 2 -} - -# Do a Cut operation if possible. Cuts are only allowed -# if the current selection is entirely contained on the -# current input line. -# -proc sqlitecon::Cut w { - if {[sqlitecon::canCut $w]==1} { - sqlitecon::Copy $w - $w delete sel.first sel.last - } -} - -# Do a paste opeation. -# -proc sqlitecon::Paste w { - if {[sqlitecon::canCut $w]==1} { - $w delete sel.first sel.last - } - if {[catch {selection get -displayof $w -selection CLIPBOARD} topaste] - && [catch {selection get -displayof $w -selection PRIMARY} topaste]} { - return - } - if {[info exists ::$w]} { - set prior 0 - foreach line [split $topaste \n] { - if {$prior} { - sqlitecon::Enter $w - update - } - set prior 1 - $w insert insert $line - } - } else { - $w insert insert $topaste - } -} - -# Enable or disable entries in the Edit menu -# -proc sqlitecon::EnableEditMenu w { - upvar #0 $w.t v - set m $v(editmenu) - if {$m=="" || ![winfo exists $m]} return - switch [sqlitecon::canCut $w.t] { - 0 { - $m entryconf Copy -state disabled - $m entryconf Cut -state disabled - } - 1 { - $m entryconf Copy -state normal - $m entryconf Cut -state normal - } - 2 { - $m entryconf Copy -state normal - $m entryconf Cut -state disabled - } - } -} - -# Prompt the user for the name of a writable file. Then write the -# entire contents of the console screen to that file. -# -proc sqlitecon::SaveFile w { - set types { - {{Text Files} {.txt}} - {{All Files} *} - } - set f [tk_getSaveFile -filetypes $types -title "Write Screen To..."] - if {$f!=""} { - if {[catch {open $f w} fd]} { - tk_messageBox -type ok -icon error -message $fd - } else { - puts $fd [string trimright [$w get 1.0 end] \n] - close $fd - } - } -} - -# Erase everything from the console above the insertion line. -# -proc sqlitecon::Clear w { - $w delete 1.0 {insert linestart} -} - -# An in-line editor for SQL -# -proc sqlitecon::_edit {origtxt {title {}}} { - for {set i 0} {[winfo exists .ed$i]} {incr i} continue - set w .ed$i - toplevel $w - wm protocol $w WM_DELETE_WINDOW "$w.b.can invoke" - wm title $w {Inline SQL Editor} - frame $w.b - pack $w.b -side bottom -fill x - button $w.b.can -text Cancel -width 6 -command [list set ::$w 0] - button $w.b.ok -text OK -width 6 -command [list set ::$w 1] - button $w.b.cut -text Cut -width 6 -command [list ::sqlitecon::Cut $w.t] - button $w.b.copy -text Copy -width 6 -command [list ::sqlitecon::Copy $w.t] - button $w.b.paste -text Paste -width 6 -command [list ::sqlitecon::Paste $w.t] - set ::$w {} - pack $w.b.cut $w.b.copy $w.b.paste $w.b.can $w.b.ok\ - -side left -padx 5 -pady 5 -expand 1 - if {$title!=""} { - label $w.title -text $title - pack $w.title -side top -padx 5 -pady 5 - } - text $w.t -bg white -fg black -yscrollcommand [list $w.sb set] - pack $w.t -side left -fill both -expand 1 - scrollbar $w.sb -orient vertical -command [list $w.t yview] - pack $w.sb -side left -fill y - $w.t insert end $origtxt - - vwait ::$w - - if {[set ::$w]} { - set txt [string trimright [$w.t get 1.0 end]] - } else { - set txt $origtxt - } - destroy $w - return $txt -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html b/libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html deleted file mode 100644 index 6a4d6dbd2c..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/doc/lemon.html +++ /dev/null @@ -1,892 +0,0 @@ - - -The Lemon Parser Generator - - -

    The Lemon Parser Generator

    - -

    Lemon is an LALR(1) parser generator for C or C++. -It does the same job as ``bison'' and ``yacc''. -But lemon is not another bison or yacc clone. It -uses a different grammar syntax which is designed to -reduce the number of coding errors. Lemon also uses a more -sophisticated parsing engine that is faster than yacc and -bison and which is both reentrant and thread-safe. -Furthermore, Lemon implements features that can be used -to eliminate resource leaks, making is suitable for use -in long-running programs such as graphical user interfaces -or embedded controllers.

    - -

    This document is an introduction to the Lemon -parser generator.

    - -

    Theory of Operation

    - -

    The main goal of Lemon is to translate a context free grammar (CFG) -for a particular language into C code that implements a parser for -that language. -The program has two inputs: -

      -
    • The grammar specification. -
    • A parser template file. -
    -Typically, only the grammar specification is supplied by the programmer. -Lemon comes with a default parser template which works fine for most -applications. But the user is free to substitute a different parser -template if desired.

    - -

    Depending on command-line options, Lemon will generate between -one and three files of outputs. -

      -
    • C code to implement the parser. -
    • A header file defining an integer ID for each terminal symbol. -
    • An information file that describes the states of the generated parser - automaton. -
    -By default, all three of these output files are generated. -The header file is suppressed if the ``-m'' command-line option is -used and the report file is omitted when ``-q'' is selected.

    - -

    The grammar specification file uses a ``.y'' suffix, by convention. -In the examples used in this document, we'll assume the name of the -grammar file is ``gram.y''. A typical use of Lemon would be the -following command: -

    -   lemon gram.y
    -
    -This command will generate three output files named ``gram.c'', -``gram.h'' and ``gram.out''. -The first is C code to implement the parser. The second -is the header file that defines numerical values for all -terminal symbols, and the last is the report that explains -the states used by the parser automaton.

    - -

    Command Line Options

    - -

    The behavior of Lemon can be modified using command-line options. -You can obtain a list of the available command-line options together -with a brief explanation of what each does by typing -

    -   lemon -?
    -
    -As of this writing, the following command-line options are supported: -
      -
    • -b -
    • -c -
    • -g -
    • -m -
    • -q -
    • -s -
    • -x -
    -The ``-b'' option reduces the amount of text in the report file by -printing only the basis of each parser state, rather than the full -configuration. -The ``-c'' option suppresses action table compression. Using -c -will make the parser a little larger and slower but it will detect -syntax errors sooner. -The ``-g'' option causes no output files to be generated at all. -Instead, the input grammar file is printed on standard output but -with all comments, actions and other extraneous text deleted. This -is a useful way to get a quick summary of a grammar. -The ``-m'' option causes the output C source file to be compatible -with the ``makeheaders'' program. -Makeheaders is a program that automatically generates header files -from C source code. When the ``-m'' option is used, the header -file is not output since the makeheaders program will take care -of generated all header files automatically. -The ``-q'' option suppresses the report file. -Using ``-s'' causes a brief summary of parser statistics to be -printed. Like this: -
    -   Parser statistics: 74 terminals, 70 nonterminals, 179 rules
    -                      340 states, 2026 parser table entries, 0 conflicts
    -
    -Finally, the ``-x'' option causes Lemon to print its version number -and then stops without attempting to read the grammar or generate a parser.

    - -

    The Parser Interface

    - -

    Lemon doesn't generate a complete, working program. It only generates -a few subroutines that implement a parser. This section describes -the interface to those subroutines. It is up to the programmer to -call these subroutines in an appropriate way in order to produce a -complete system.

    - -

    Before a program begins using a Lemon-generated parser, the program -must first create the parser. -A new parser is created as follows: -

    -   void *pParser = ParseAlloc( malloc );
    -
    -The ParseAlloc() routine allocates and initializes a new parser and -returns a pointer to it. -The actual data structure used to represent a parser is opaque -- -its internal structure is not visible or usable by the calling routine. -For this reason, the ParseAlloc() routine returns a pointer to void -rather than a pointer to some particular structure. -The sole argument to the ParseAlloc() routine is a pointer to the -subroutine used to allocate memory. Typically this means ``malloc()''.

    - -

    After a program is finished using a parser, it can reclaim all -memory allocated by that parser by calling -

    -   ParseFree(pParser, free);
    -
    -The first argument is the same pointer returned by ParseAlloc(). The -second argument is a pointer to the function used to release bulk -memory back to the system.

    - -

    After a parser has been allocated using ParseAlloc(), the programmer -must supply the parser with a sequence of tokens (terminal symbols) to -be parsed. This is accomplished by calling the following function -once for each token: -

    -   Parse(pParser, hTokenID, sTokenData, pArg);
    -
    -The first argument to the Parse() routine is the pointer returned by -ParseAlloc(). -The second argument is a small positive integer that tells the parse the -type of the next token in the data stream. -There is one token type for each terminal symbol in the grammar. -The gram.h file generated by Lemon contains #define statements that -map symbolic terminal symbol names into appropriate integer values. -(A value of 0 for the second argument is a special flag to the -parser to indicate that the end of input has been reached.) -The third argument is the value of the given token. By default, -the type of the third argument is integer, but the grammar will -usually redefine this type to be some kind of structure. -Typically the second argument will be a broad category of tokens -such as ``identifier'' or ``number'' and the third argument will -be the name of the identifier or the value of the number.

    - -

    The Parse() function may have either three or four arguments, -depending on the grammar. If the grammar specification file request -it, the Parse() function will have a fourth parameter that can be -of any type chosen by the programmer. The parser doesn't do anything -with this argument except to pass it through to action routines. -This is a convenient mechanism for passing state information down -to the action routines without having to use global variables.

    - -

    A typical use of a Lemon parser might look something like the -following: -

    -   01 ParseTree *ParseFile(const char *zFilename){
    -   02    Tokenizer *pTokenizer;
    -   03    void *pParser;
    -   04    Token sToken;
    -   05    int hTokenId;
    -   06    ParserState sState;
    -   07
    -   08    pTokenizer = TokenizerCreate(zFilename);
    -   09    pParser = ParseAlloc( malloc );
    -   10    InitParserState(&sState);
    -   11    while( GetNextToken(pTokenizer, &hTokenId, &sToken) ){
    -   12       Parse(pParser, hTokenId, sToken, &sState);
    -   13    }
    -   14    Parse(pParser, 0, sToken, &sState);
    -   15    ParseFree(pParser, free );
    -   16    TokenizerFree(pTokenizer);
    -   17    return sState.treeRoot;
    -   18 }
    -
    -This example shows a user-written routine that parses a file of -text and returns a pointer to the parse tree. -(We've omitted all error-handling from this example to keep it -simple.) -We assume the existence of some kind of tokenizer which is created -using TokenizerCreate() on line 8 and deleted by TokenizerFree() -on line 16. The GetNextToken() function on line 11 retrieves the -next token from the input file and puts its type in the -integer variable hTokenId. The sToken variable is assumed to be -some kind of structure that contains details about each token, -such as its complete text, what line it occurs on, etc.

    - -

    This example also assumes the existence of structure of type -ParserState that holds state information about a particular parse. -An instance of such a structure is created on line 6 and initialized -on line 10. A pointer to this structure is passed into the Parse() -routine as the optional 4th argument. -The action routine specified by the grammar for the parser can use -the ParserState structure to hold whatever information is useful and -appropriate. In the example, we note that the treeRoot field of -the ParserState structure is left pointing to the root of the parse -tree.

    - -

    The core of this example as it relates to Lemon is as follows: -

    -   ParseFile(){
    -      pParser = ParseAlloc( malloc );
    -      while( GetNextToken(pTokenizer,&hTokenId, &sToken) ){
    -         Parse(pParser, hTokenId, sToken);
    -      }
    -      Parse(pParser, 0, sToken);
    -      ParseFree(pParser, free );
    -   }
    -
    -Basically, what a program has to do to use a Lemon-generated parser -is first create the parser, then send it lots of tokens obtained by -tokenizing an input source. When the end of input is reached, the -Parse() routine should be called one last time with a token type -of 0. This step is necessary to inform the parser that the end of -input has been reached. Finally, we reclaim memory used by the -parser by calling ParseFree().

    - -

    There is one other interface routine that should be mentioned -before we move on. -The ParseTrace() function can be used to generate debugging output -from the parser. A prototype for this routine is as follows: -

    -   ParseTrace(FILE *stream, char *zPrefix);
    -
    -After this routine is called, a short (one-line) message is written -to the designated output stream every time the parser changes states -or calls an action routine. Each such message is prefaced using -the text given by zPrefix. This debugging output can be turned off -by calling ParseTrace() again with a first argument of NULL (0).

    - -

    Differences With YACC and BISON

    - -

    Programmers who have previously used the yacc or bison parser -generator will notice several important differences between yacc and/or -bison and Lemon. -

      -
    • In yacc and bison, the parser calls the tokenizer. In Lemon, - the tokenizer calls the parser. -
    • Lemon uses no global variables. Yacc and bison use global variables - to pass information between the tokenizer and parser. -
    • Lemon allows multiple parsers to be running simultaneously. Yacc - and bison do not. -
    -These differences may cause some initial confusion for programmers -with prior yacc and bison experience. -But after years of experience using Lemon, I firmly -believe that the Lemon way of doing things is better.

    - -

    Input File Syntax

    - -

    The main purpose of the grammar specification file for Lemon is -to define the grammar for the parser. But the input file also -specifies additional information Lemon requires to do its job. -Most of the work in using Lemon is in writing an appropriate -grammar file.

    - -

    The grammar file for lemon is, for the most part, free format. -It does not have sections or divisions like yacc or bison. Any -declaration can occur at any point in the file. -Lemon ignores whitespace (except where it is needed to separate -tokens) and it honors the same commenting conventions as C and C++.

    - -

    Terminals and Nonterminals

    - -

    A terminal symbol (token) is any string of alphanumeric -and underscore characters -that begins with an upper case letter. -A terminal can contain lower class letters after the first character, -but the usual convention is to make terminals all upper case. -A nonterminal, on the other hand, is any string of alphanumeric -and underscore characters than begins with a lower case letter. -Again, the usual convention is to make nonterminals use all lower -case letters.

    - -

    In Lemon, terminal and nonterminal symbols do not need to -be declared or identified in a separate section of the grammar file. -Lemon is able to generate a list of all terminals and nonterminals -by examining the grammar rules, and it can always distinguish a -terminal from a nonterminal by checking the case of the first -character of the name.

    - -

    Yacc and bison allow terminal symbols to have either alphanumeric -names or to be individual characters included in single quotes, like -this: ')' or '$'. Lemon does not allow this alternative form for -terminal symbols. With Lemon, all symbols, terminals and nonterminals, -must have alphanumeric names.

    - -

    Grammar Rules

    - -

    The main component of a Lemon grammar file is a sequence of grammar -rules. -Each grammar rule consists of a nonterminal symbol followed by -the special symbol ``::='' and then a list of terminals and/or nonterminals. -The rule is terminated by a period. -The list of terminals and nonterminals on the right-hand side of the -rule can be empty. -Rules can occur in any order, except that the left-hand side of the -first rule is assumed to be the start symbol for the grammar (unless -specified otherwise using the %start directive described below.) -A typical sequence of grammar rules might look something like this: -

    -  expr ::= expr PLUS expr.
    -  expr ::= expr TIMES expr.
    -  expr ::= LPAREN expr RPAREN.
    -  expr ::= VALUE.
    -
    -

    - -

    There is one non-terminal in this example, ``expr'', and five -terminal symbols or tokens: ``PLUS'', ``TIMES'', ``LPAREN'', -``RPAREN'' and ``VALUE''.

    - -

    Like yacc and bison, Lemon allows the grammar to specify a block -of C code that will be executed whenever a grammar rule is reduced -by the parser. -In Lemon, this action is specified by putting the C code (contained -within curly braces {...}) immediately after the -period that closes the rule. -For example: -

    -  expr ::= expr PLUS expr.   { printf("Doing an addition...\n"); }
    -
    -

    - -

    In order to be useful, grammar actions must normally be linked to -their associated grammar rules. -In yacc and bison, this is accomplished by embedding a ``$$'' in the -action to stand for the value of the left-hand side of the rule and -symbols ``$1'', ``$2'', and so forth to stand for the value of -the terminal or nonterminal at position 1, 2 and so forth on the -right-hand side of the rule. -This idea is very powerful, but it is also very error-prone. The -single most common source of errors in a yacc or bison grammar is -to miscount the number of symbols on the right-hand side of a grammar -rule and say ``$7'' when you really mean ``$8''.

    - -

    Lemon avoids the need to count grammar symbols by assigning symbolic -names to each symbol in a grammar rule and then using those symbolic -names in the action. -In yacc or bison, one would write this: -

    -  expr -> expr PLUS expr  { $$ = $1 + $3; };
    -
    -But in Lemon, the same rule becomes the following: -
    -  expr(A) ::= expr(B) PLUS expr(C).  { A = B+C; }
    -
    -In the Lemon rule, any symbol in parentheses after a grammar rule -symbol becomes a place holder for that symbol in the grammar rule. -This place holder can then be used in the associated C action to -stand for the value of that symbol.

    - -

    The Lemon notation for linking a grammar rule with its reduce -action is superior to yacc/bison on several counts. -First, as mentioned above, the Lemon method avoids the need to -count grammar symbols. -Secondly, if a terminal or nonterminal in a Lemon grammar rule -includes a linking symbol in parentheses but that linking symbol -is not actually used in the reduce action, then an error message -is generated. -For example, the rule -

    -  expr(A) ::= expr(B) PLUS expr(C).  { A = B; }
    -
    -will generate an error because the linking symbol ``C'' is used -in the grammar rule but not in the reduce action.

    - -

    The Lemon notation for linking grammar rules to reduce actions -also facilitates the use of destructors for reclaiming memory -allocated by the values of terminals and nonterminals on the -right-hand side of a rule.

    - -

    Precedence Rules

    - -

    Lemon resolves parsing ambiguities in exactly the same way as -yacc and bison. A shift-reduce conflict is resolved in favor -of the shift, and a reduce-reduce conflict is resolved by reducing -whichever rule comes first in the grammar file.

    - -

    Just like in -yacc and bison, Lemon allows a measure of control -over the resolution of paring conflicts using precedence rules. -A precedence value can be assigned to any terminal symbol -using the %left, %right or %nonassoc directives. Terminal symbols -mentioned in earlier directives have a lower precedence that -terminal symbols mentioned in later directives. For example:

    - -

    -   %left AND.
    -   %left OR.
    -   %nonassoc EQ NE GT GE LT LE.
    -   %left PLUS MINUS.
    -   %left TIMES DIVIDE MOD.
    -   %right EXP NOT.
    -

    - -

    In the preceding sequence of directives, the AND operator is -defined to have the lowest precedence. The OR operator is one -precedence level higher. And so forth. Hence, the grammar would -attempt to group the ambiguous expression -

    -     a AND b OR c
    -
    -like this -
    -     a AND (b OR c).
    -
    -The associativity (left, right or nonassoc) is used to determine -the grouping when the precedence is the same. AND is left-associative -in our example, so -
    -     a AND b AND c
    -
    -is parsed like this -
    -     (a AND b) AND c.
    -
    -The EXP operator is right-associative, though, so -
    -     a EXP b EXP c
    -
    -is parsed like this -
    -     a EXP (b EXP c).
    -
    -The nonassoc precedence is used for non-associative operators. -So -
    -     a EQ b EQ c
    -
    -is an error.

    - -

    The precedence of non-terminals is transferred to rules as follows: -The precedence of a grammar rule is equal to the precedence of the -left-most terminal symbol in the rule for which a precedence is -defined. This is normally what you want, but in those cases where -you want to precedence of a grammar rule to be something different, -you can specify an alternative precedence symbol by putting the -symbol in square braces after the period at the end of the rule and -before any C-code. For example:

    - -

    -   expr = MINUS expr.  [NOT]
    -

    - -

    This rule has a precedence equal to that of the NOT symbol, not the -MINUS symbol as would have been the case by default.

    - -

    With the knowledge of how precedence is assigned to terminal -symbols and individual -grammar rules, we can now explain precisely how parsing conflicts -are resolved in Lemon. Shift-reduce conflicts are resolved -as follows: -

      -
    • If either the token to be shifted or the rule to be reduced - lacks precedence information, then resolve in favor of the - shift, but report a parsing conflict. -
    • If the precedence of the token to be shifted is greater than - the precedence of the rule to reduce, then resolve in favor - of the shift. No parsing conflict is reported. -
    • If the precedence of the token it be shifted is less than the - precedence of the rule to reduce, then resolve in favor of the - reduce action. No parsing conflict is reported. -
    • If the precedences are the same and the shift token is - right-associative, then resolve in favor of the shift. - No parsing conflict is reported. -
    • If the precedences are the same the the shift token is - left-associative, then resolve in favor of the reduce. - No parsing conflict is reported. -
    • Otherwise, resolve the conflict by doing the shift and - report the parsing conflict. -
    -Reduce-reduce conflicts are resolved this way: -
      -
    • If either reduce rule - lacks precedence information, then resolve in favor of the - rule that appears first in the grammar and report a parsing - conflict. -
    • If both rules have precedence and the precedence is different - then resolve the dispute in favor of the rule with the highest - precedence and do not report a conflict. -
    • Otherwise, resolve the conflict by reducing by the rule that - appears first in the grammar and report a parsing conflict. -
    - -

    Special Directives

    - -

    The input grammar to Lemon consists of grammar rules and special -directives. We've described all the grammar rules, so now we'll -talk about the special directives.

    - -

    Directives in lemon can occur in any order. You can put them before -the grammar rules, or after the grammar rules, or in the mist of the -grammar rules. It doesn't matter. The relative order of -directives used to assign precedence to terminals is important, but -other than that, the order of directives in Lemon is arbitrary.

    - -

    Lemon supports the following special directives: -

      -
    • %code -
    • %default_destructor -
    • %default_type -
    • %destructor -
    • %extra_argument -
    • %include -
    • %left -
    • %name -
    • %nonassoc -
    • %parse_accept -
    • %parse_failure -
    • %right -
    • %stack_overflow -
    • %stack_size -
    • %start_symbol -
    • %syntax_error -
    • %token_destructor -
    • %token_prefix -
    • %token_type -
    • %type -
    -Each of these directives will be described separately in the -following sections:

    - -

    The %code directive

    - -

    The %code directive is used to specify addition C/C++ code that -is added to the end of the main output file. This is similar to -the %include directive except that %include is inserted at the -beginning of the main output file.

    - -

    %code is typically used to include some action routines or perhaps -a tokenizer as part of the output file.

    - -

    The %default_destructor directive

    - -

    The %default_destructor directive specifies a destructor to -use for non-terminals that do not have their own destructor -specified by a separate %destructor directive. See the documentation -on the %destructor directive below for additional information.

    - -

    In some grammers, many different non-terminal symbols have the -same datatype and hence the same destructor. This directive is -a convenience way to specify the same destructor for all those -non-terminals using a single statement.

    - -

    The %default_type directive

    - -

    The %default_type directive specifies the datatype of non-terminal -symbols that do no have their own datatype defined using a separate -%type directive. See the documentation on %type below for addition -information.

    - -

    The %destructor directive

    - -

    The %destructor directive is used to specify a destructor for -a non-terminal symbol. -(See also the %token_destructor directive which is used to -specify a destructor for terminal symbols.)

    - -

    A non-terminal's destructor is called to dispose of the -non-terminal's value whenever the non-terminal is popped from -the stack. This includes all of the following circumstances: -

      -
    • When a rule reduces and the value of a non-terminal on - the right-hand side is not linked to C code. -
    • When the stack is popped during error processing. -
    • When the ParseFree() function runs. -
    -The destructor can do whatever it wants with the value of -the non-terminal, but its design is to deallocate memory -or other resources held by that non-terminal.

    - -

    Consider an example: -

    -   %type nt {void*}
    -   %destructor nt { free($$); }
    -   nt(A) ::= ID NUM.   { A = malloc( 100 ); }
    -
    -This example is a bit contrived but it serves to illustrate how -destructors work. The example shows a non-terminal named -``nt'' that holds values of type ``void*''. When the rule for -an ``nt'' reduces, it sets the value of the non-terminal to -space obtained from malloc(). Later, when the nt non-terminal -is popped from the stack, the destructor will fire and call -free() on this malloced space, thus avoiding a memory leak. -(Note that the symbol ``$$'' in the destructor code is replaced -by the value of the non-terminal.)

    - -

    It is important to note that the value of a non-terminal is passed -to the destructor whenever the non-terminal is removed from the -stack, unless the non-terminal is used in a C-code action. If -the non-terminal is used by C-code, then it is assumed that the -C-code will take care of destroying it if it should really -be destroyed. More commonly, the value is used to build some -larger structure and we don't want to destroy it, which is why -the destructor is not called in this circumstance.

    - -

    By appropriate use of destructors, it is possible to -build a parser using Lemon that can be used within a long-running -program, such as a GUI, that will not leak memory or other resources. -To do the same using yacc or bison is much more difficult.

    - -

    The %extra_argument directive

    - -The %extra_argument directive instructs Lemon to add a 4th parameter -to the parameter list of the Parse() function it generates. Lemon -doesn't do anything itself with this extra argument, but it does -make the argument available to C-code action routines, destructors, -and so forth. For example, if the grammar file contains:

    - -

    -    %extra_argument { MyStruct *pAbc }
    -

    - -

    Then the Parse() function generated will have an 4th parameter -of type ``MyStruct*'' and all action routines will have access to -a variable named ``pAbc'' that is the value of the 4th parameter -in the most recent call to Parse().

    - -

    The %include directive

    - -

    The %include directive specifies C code that is included at the -top of the generated parser. You can include any text you want -- -the Lemon parser generator copies it blindly. If you have multiple -%include directives in your grammar file the value of the last -%include directive overwrites all the others.The %include directive is very handy for getting some extra #include -preprocessor statements at the beginning of the generated parser. -For example:

    - -

    -   %include {#include <unistd.h>}
    -

    - -

    This might be needed, for example, if some of the C actions in the -grammar call functions that are prototyed in unistd.h.

    - -

    The %left directive

    - -The %left directive is used (along with the %right and -%nonassoc directives) to declare precedences of terminal -symbols. Every terminal symbol whose name appears after -a %left directive but before the next period (``.'') is -given the same left-associative precedence value. Subsequent -%left directives have higher precedence. For example:

    - -

    -   %left AND.
    -   %left OR.
    -   %nonassoc EQ NE GT GE LT LE.
    -   %left PLUS MINUS.
    -   %left TIMES DIVIDE MOD.
    -   %right EXP NOT.
    -

    - -

    Note the period that terminates each %left, %right or %nonassoc -directive.

    - -

    LALR(1) grammars can get into a situation where they require -a large amount of stack space if you make heavy use or right-associative -operators. For this reason, it is recommended that you use %left -rather than %right whenever possible.

    - -

    The %name directive

    - -

    By default, the functions generated by Lemon all begin with the -five-character string ``Parse''. You can change this string to something -different using the %name directive. For instance:

    - -

    -   %name Abcde
    -

    - -

    Putting this directive in the grammar file will cause Lemon to generate -functions named -

      -
    • AbcdeAlloc(), -
    • AbcdeFree(), -
    • AbcdeTrace(), and -
    • Abcde(). -
    -The %name directive allows you to generator two or more different -parsers and link them all into the same executable. -

    - -

    The %nonassoc directive

    - -

    This directive is used to assign non-associative precedence to -one or more terminal symbols. See the section on precedence rules -or on the %left directive for additional information.

    - -

    The %parse_accept directive

    - -

    The %parse_accept directive specifies a block of C code that is -executed whenever the parser accepts its input string. To ``accept'' -an input string means that the parser was able to process all tokens -without error.

    - -

    For example:

    - -

    -   %parse_accept {
    -      printf("parsing complete!\n");
    -   }
    -

    - - -

    The %parse_failure directive

    - -

    The %parse_failure directive specifies a block of C code that -is executed whenever the parser fails complete. This code is not -executed until the parser has tried and failed to resolve an input -error using is usual error recovery strategy. The routine is -only invoked when parsing is unable to continue.

    - -

    -   %parse_failure {
    -     fprintf(stderr,"Giving up.  Parser is hopelessly lost...\n");
    -   }
    -

    - -

    The %right directive

    - -

    This directive is used to assign right-associative precedence to -one or more terminal symbols. See the section on precedence rules -or on the %left directive for additional information.

    - -

    The %stack_overflow directive

    - -

    The %stack_overflow directive specifies a block of C code that -is executed if the parser's internal stack ever overflows. Typically -this just prints an error message. After a stack overflow, the parser -will be unable to continue and must be reset.

    - -

    -   %stack_overflow {
    -     fprintf(stderr,"Giving up.  Parser stack overflow\n");
    -   }
    -

    - -

    You can help prevent parser stack overflows by avoiding the use -of right recursion and right-precedence operators in your grammar. -Use left recursion and and left-precedence operators instead, to -encourage rules to reduce sooner and keep the stack size down. -For example, do rules like this: -

    -   list ::= list element.      // left-recursion.  Good!
    -   list ::= .
    -
    -Not like this: -
    -   list ::= element list.      // right-recursion.  Bad!
    -   list ::= .
    -
    - -

    The %stack_size directive

    - -

    If stack overflow is a problem and you can't resolve the trouble -by using left-recursion, then you might want to increase the size -of the parser's stack using this directive. Put an positive integer -after the %stack_size directive and Lemon will generate a parse -with a stack of the requested size. The default value is 100.

    - -

    -   %stack_size 2000
    -

    - -

    The %start_symbol directive

    - -

    By default, the start-symbol for the grammar that Lemon generates -is the first non-terminal that appears in the grammar file. But you -can choose a different start-symbol using the %start_symbol directive.

    - -

    -   %start_symbol  prog
    -

    - -

    The %token_destructor directive

    - -

    The %destructor directive assigns a destructor to a non-terminal -symbol. (See the description of the %destructor directive above.) -This directive does the same thing for all terminal symbols.

    - -

    Unlike non-terminal symbols which may each have a different data type -for their values, terminals all use the same data type (defined by -the %token_type directive) and so they use a common destructor. Other -than that, the token destructor works just like the non-terminal -destructors.

    - -

    The %token_prefix directive

    - -

    Lemon generates #defines that assign small integer constants -to each terminal symbol in the grammar. If desired, Lemon will -add a prefix specified by this directive -to each of the #defines it generates. -So if the default output of Lemon looked like this: -

    -    #define AND              1
    -    #define MINUS            2
    -    #define OR               3
    -    #define PLUS             4
    -
    -You can insert a statement into the grammar like this: -
    -    %token_prefix    TOKEN_
    -
    -to cause Lemon to produce these symbols instead: -
    -    #define TOKEN_AND        1
    -    #define TOKEN_MINUS      2
    -    #define TOKEN_OR         3
    -    #define TOKEN_PLUS       4
    -
    - -

    The %token_type and %type directives

    - -

    These directives are used to specify the data types for values -on the parser's stack associated with terminal and non-terminal -symbols. The values of all terminal symbols must be of the same -type. This turns out to be the same data type as the 3rd parameter -to the Parse() function generated by Lemon. Typically, you will -make the value of a terminal symbol by a pointer to some kind of -token structure. Like this:

    - -

    -   %token_type    {Token*}
    -

    - -

    If the data type of terminals is not specified, the default value -is ``int''.

    - -

    Non-terminal symbols can each have their own data types. Typically -the data type of a non-terminal is a pointer to the root of a parse-tree -structure that contains all information about that non-terminal. -For example:

    - -

    -   %type   expr  {Expr*}
    -

    - -

    Each entry on the parser's stack is actually a union containing -instances of all data types for every non-terminal and terminal symbol. -Lemon will automatically use the correct element of this union depending -on what the corresponding non-terminal or terminal symbol is. But -the grammar designer should keep in mind that the size of the union -will be the size of its largest element. So if you have a single -non-terminal whose data type requires 1K of storage, then your 100 -entry parser stack will require 100K of heap space. If you are willing -and able to pay that price, fine. You just need to know.

    - -

    Error Processing

    - -

    After extensive experimentation over several years, it has been -discovered that the error recovery strategy used by yacc is about -as good as it gets. And so that is what Lemon uses.

    - -

    When a Lemon-generated parser encounters a syntax error, it -first invokes the code specified by the %syntax_error directive, if -any. It then enters its error recovery strategy. The error recovery -strategy is to begin popping the parsers stack until it enters a -state where it is permitted to shift a special non-terminal symbol -named ``error''. It then shifts this non-terminal and continues -parsing. But the %syntax_error routine will not be called again -until at least three new tokens have been successfully shifted.

    - -

    If the parser pops its stack until the stack is empty, and it still -is unable to shift the error symbol, then the %parse_failed routine -is invoked and the parser resets itself to its start state, ready -to begin parsing a new file. This is what will happen at the very -first syntax error, of course, if there are no instances of the -``error'' non-terminal in your grammar.

    - - - diff --git a/libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt b/libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt deleted file mode 100644 index a236e7cedf..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/doc/report1.txt +++ /dev/null @@ -1,121 +0,0 @@ -An SQLite (version 1.0) database was used in a large military application -where the database contained 105 tables and indices. The following is -a breakdown on the sizes of keys and data within these tables and indices: - -Entries: 967089 -Size: 45896104 -Avg Size: 48 -Key Size: 11112265 -Avg Key Size: 12 -Max Key Size: 99 - - 0..8 263 0% - 9..12 5560 0% - 13..16 71394 7% - 17..24 180717 26% - 25..32 215442 48% - 33..40 151118 64% - 41..48 77479 72% - 49..56 13983 74% - 57..64 14481 75% - 65..80 41342 79% - 81..96 127098 92% - 97..112 38054 96% - 113..128 14197 98% - 129..144 8208 99% - 145..160 3326 99% - 161..176 1242 99% - 177..192 604 99% - 193..208 222 99% - 209..224 213 99% - 225..240 132 99% - 241..256 58 99% - 257..288 515 99% - 289..320 64 99% - 321..352 39 99% - 353..384 44 99% - 385..416 25 99% - 417..448 24 99% - 449..480 26 99% - 481..512 27 99% - 513..1024 470 99% - 1025..2048 396 99% - 2049..4096 187 99% - 4097..8192 78 99% - 8193..16384 35 99% -16385..32768 17 99% -32769..65536 6 99% -65537..65541 3 100% - -If the indices are omitted, the statistics for the 49 tables -become the following: - -Entries: 451103 -Size: 30930282 -Avg Size: 69 -Key Size: 1804412 -Avg Key Size: 4 -Max Key Size: 4 - - 0..24 89 0% - 25..32 9417 2% - 33..40 119162 28% - 41..48 68710 43% - 49..56 9539 45% - 57..64 12435 48% - 65..80 38650 57% - 81..96 126877 85% - 97..112 38030 93% - 113..128 14183 96% - 129..144 7668 98% - 145..160 3302 99% - 161..176 1238 99% - 177..192 597 99% - 193..208 217 99% - 209..224 211 99% - 225..240 130 99% - 241..256 57 99% - 257..288 100 99% - 289..320 62 99% - 321..352 34 99% - 353..384 43 99% - 385..416 24 99% - 417..448 24 99% - 449..480 25 99% - 481..512 27 99% - 513..1024 153 99% - 1025..2048 92 99% - 2049..4096 7 100% - -The 56 indices have these statistics: - -Entries: 512422 -Size: 14879828 -Avg Size: 30 -Key Size: 9253204 -Avg Key Size: 19 -Max Key Size: 99 - - 0..8 246 0% - 9..12 5486 1% - 13..16 70717 14% - 17..24 178246 49% - 25..32 205722 89% - 33..40 31951 96% - 41..48 8768 97% - 49..56 4444 98% - 57..64 2046 99% - 65..80 2691 99% - 81..96 202 99% - 97..112 11 99% - 113..144 527 99% - 145..160 20 99% - 161..288 406 99% - 289..1024 316 99% - 1025..2048 304 99% - 2049..4096 180 99% - 4097..8192 78 99% - 8193..16384 35 99% -16385..32768 17 99% -32769..65536 6 99% -65537..65541 3 100% diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt deleted file mode 100644 index 009495f59d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Version loadable extensions to SQLite are found in subfolders -of this folder. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt deleted file mode 100644 index 292b7daa0b..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -This folder contains source code to the first full-text search -extension for SQLite. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c deleted file mode 100644 index 5a69965d47..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.c +++ /dev/null @@ -1,3344 +0,0 @@ -/* fts1 has a design flaw which can lead to database corruption (see -** below). It is recommended not to use it any longer, instead use -** fts3 (or higher). If you believe that your use of fts1 is safe, -** add -DSQLITE_ENABLE_BROKEN_FTS1=1 to your CFLAGS. -*/ -#ifndef SQLITE_ENABLE_BROKEN_FTS1 -#error fts1 has a design flaw and has been deprecated. -#endif -/* The flaw is that fts1 uses the content table's unaliased rowid as -** the unique docid. fts1 embeds the rowid in the index it builds, -** and expects the rowid to not change. The SQLite VACUUM operation -** will renumber such rowids, thereby breaking fts1. If you are using -** fts1 in a system which has disabled VACUUM, then you can continue -** to use it safely. Note that PRAGMA auto_vacuum does NOT disable -** VACUUM, though systems using auto_vacuum are unlikely to invoke -** VACUUM. -** -** fts1 should be safe even across VACUUM if you only insert documents -** and never delete. -*/ - -/* The author disclaims copyright to this source code. - * - * This is an SQLite module implementing full-text search. - */ - -/* -** The code in this file is only compiled if: -** -** * The FTS1 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS1 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) - -#if defined(SQLITE_ENABLE_FTS1) && !defined(SQLITE_CORE) -# define SQLITE_CORE 1 -#endif - -#include -#include -#include -#include -#include - -#include "fts1.h" -#include "fts1_hash.h" -#include "fts1_tokenizer.h" -#include "sqlite3.h" -#include "sqlite3ext.h" -SQLITE_EXTENSION_INIT1 - - -#if 0 -# define TRACE(A) printf A; fflush(stdout) -#else -# define TRACE(A) -#endif - -/* utility functions */ - -typedef struct StringBuffer { - int len; /* length, not including null terminator */ - int alloced; /* Space allocated for s[] */ - char *s; /* Content of the string */ -} StringBuffer; - -static void initStringBuffer(StringBuffer *sb){ - sb->len = 0; - sb->alloced = 100; - sb->s = malloc(100); - sb->s[0] = '\0'; -} - -static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ - if( sb->len + nFrom >= sb->alloced ){ - sb->alloced = sb->len + nFrom + 100; - sb->s = realloc(sb->s, sb->alloced+1); - if( sb->s==0 ){ - initStringBuffer(sb); - return; - } - } - memcpy(sb->s + sb->len, zFrom, nFrom); - sb->len += nFrom; - sb->s[sb->len] = 0; -} -static void append(StringBuffer *sb, const char *zFrom){ - nappend(sb, zFrom, strlen(zFrom)); -} - -/* We encode variable-length integers in little-endian order using seven bits - * per byte as follows: -** -** KEY: -** A = 0xxxxxxx 7 bits of data and one flag bit -** B = 1xxxxxxx 7 bits of data and one flag bit -** -** 7 bits - A -** 14 bits - BA -** 21 bits - BBA -** and so on. -*/ - -/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ -#define VARINT_MAX 10 - -/* Write a 64-bit variable-length integer to memory starting at p[0]. - * The length of data written will be between 1 and VARINT_MAX bytes. - * The number of bytes written is returned. */ -static int putVarint(char *p, sqlite_int64 v){ - unsigned char *q = (unsigned char *) p; - sqlite_uint64 vu = v; - do{ - *q++ = (unsigned char) ((vu & 0x7f) | 0x80); - vu >>= 7; - }while( vu!=0 ); - q[-1] &= 0x7f; /* turn off high bit in final byte */ - assert( q - (unsigned char *)p <= VARINT_MAX ); - return (int) (q - (unsigned char *)p); -} - -/* Read a 64-bit variable-length integer from memory starting at p[0]. - * Return the number of bytes read, or 0 on error. - * The value is stored in *v. */ -static int getVarint(const char *p, sqlite_int64 *v){ - const unsigned char *q = (const unsigned char *) p; - sqlite_uint64 x = 0, y = 1; - while( (*q & 0x80) == 0x80 ){ - x += y * (*q++ & 0x7f); - y <<= 7; - if( q - (unsigned char *)p >= VARINT_MAX ){ /* bad data */ - assert( 0 ); - return 0; - } - } - x += y * (*q++); - *v = (sqlite_int64) x; - return (int) (q - (unsigned char *)p); -} - -static int getVarint32(const char *p, int *pi){ - sqlite_int64 i; - int ret = getVarint(p, &i); - *pi = (int) i; - assert( *pi==i ); - return ret; -} - -/*** Document lists *** - * - * A document list holds a sorted list of varint-encoded document IDs. - * - * A doclist with type DL_POSITIONS_OFFSETS is stored like this: - * - * array { - * varint docid; - * array { - * varint position; (delta from previous position plus POS_BASE) - * varint startOffset; (delta from previous startOffset) - * varint endOffset; (delta from startOffset) - * } - * } - * - * Here, array { X } means zero or more occurrences of X, adjacent in memory. - * - * A position list may hold positions for text in multiple columns. A position - * POS_COLUMN is followed by a varint containing the index of the column for - * following positions in the list. Any positions appearing before any - * occurrences of POS_COLUMN are for column 0. - * - * A doclist with type DL_POSITIONS is like the above, but holds only docids - * and positions without offset information. - * - * A doclist with type DL_DOCIDS is like the above, but holds only docids - * without positions or offset information. - * - * On disk, every document list has positions and offsets, so we don't bother - * to serialize a doclist's type. - * - * We don't yet delta-encode document IDs; doing so will probably be a - * modest win. - * - * NOTE(shess) I've thought of a slightly (1%) better offset encoding. - * After the first offset, estimate the next offset by using the - * current token position and the previous token position and offset, - * offset to handle some variance. So the estimate would be - * (iPosition*w->iStartOffset/w->iPosition-64), which is delta-encoded - * as normal. Offsets more than 64 chars from the estimate are - * encoded as the delta to the previous start offset + 128. An - * additional tiny increment can be gained by using the end offset of - * the previous token to make the estimate a tiny bit more precise. -*/ - -/* It is not safe to call isspace(), tolower(), or isalnum() on -** hi-bit-set characters. This is the same solution used in the -** tokenizer. -*/ -/* TODO(shess) The snippet-generation code should be using the -** tokenizer-generated tokens rather than doing its own local -** tokenization. -*/ -/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ -static int safe_isspace(char c){ - return (c&0x80)==0 ? isspace(c) : 0; -} -static int safe_tolower(char c){ - return (c&0x80)==0 ? tolower(c) : c; -} -static int safe_isalnum(char c){ - return (c&0x80)==0 ? isalnum(c) : 0; -} - -typedef enum DocListType { - DL_DOCIDS, /* docids only */ - DL_POSITIONS, /* docids + positions */ - DL_POSITIONS_OFFSETS /* docids + positions + offsets */ -} DocListType; - -/* -** By default, only positions and not offsets are stored in the doclists. -** To change this so that offsets are stored too, compile with -** -** -DDL_DEFAULT=DL_POSITIONS_OFFSETS -** -*/ -#ifndef DL_DEFAULT -# define DL_DEFAULT DL_POSITIONS -#endif - -typedef struct DocList { - char *pData; - int nData; - DocListType iType; - int iLastColumn; /* the last column written */ - int iLastPos; /* the last position written */ - int iLastOffset; /* the last start offset written */ -} DocList; - -enum { - POS_END = 0, /* end of this position list */ - POS_COLUMN, /* followed by new column number */ - POS_BASE -}; - -/* Initialize a new DocList to hold the given data. */ -static void docListInit(DocList *d, DocListType iType, - const char *pData, int nData){ - d->nData = nData; - if( nData>0 ){ - d->pData = malloc(nData); - memcpy(d->pData, pData, nData); - } else { - d->pData = NULL; - } - d->iType = iType; - d->iLastColumn = 0; - d->iLastPos = d->iLastOffset = 0; -} - -/* Create a new dynamically-allocated DocList. */ -static DocList *docListNew(DocListType iType){ - DocList *d = (DocList *) malloc(sizeof(DocList)); - docListInit(d, iType, 0, 0); - return d; -} - -static void docListDestroy(DocList *d){ - free(d->pData); -#ifndef NDEBUG - memset(d, 0x55, sizeof(*d)); -#endif -} - -static void docListDelete(DocList *d){ - docListDestroy(d); - free(d); -} - -static char *docListEnd(DocList *d){ - return d->pData + d->nData; -} - -/* Append a varint to a DocList's data. */ -static void appendVarint(DocList *d, sqlite_int64 i){ - char c[VARINT_MAX]; - int n = putVarint(c, i); - d->pData = realloc(d->pData, d->nData + n); - memcpy(d->pData + d->nData, c, n); - d->nData += n; -} - -static void docListAddDocid(DocList *d, sqlite_int64 iDocid){ - appendVarint(d, iDocid); - if( d->iType>=DL_POSITIONS ){ - appendVarint(d, POS_END); /* initially empty position list */ - d->iLastColumn = 0; - d->iLastPos = d->iLastOffset = 0; - } -} - -/* helper function for docListAddPos and docListAddPosOffset */ -static void addPos(DocList *d, int iColumn, int iPos){ - assert( d->nData>0 ); - --d->nData; /* remove previous terminator */ - if( iColumn!=d->iLastColumn ){ - assert( iColumn>d->iLastColumn ); - appendVarint(d, POS_COLUMN); - appendVarint(d, iColumn); - d->iLastColumn = iColumn; - d->iLastPos = d->iLastOffset = 0; - } - assert( iPos>=d->iLastPos ); - appendVarint(d, iPos-d->iLastPos+POS_BASE); - d->iLastPos = iPos; -} - -/* Add a position to the last position list in a doclist. */ -static void docListAddPos(DocList *d, int iColumn, int iPos){ - assert( d->iType==DL_POSITIONS ); - addPos(d, iColumn, iPos); - appendVarint(d, POS_END); /* add new terminator */ -} - -/* -** Add a position and starting and ending offsets to a doclist. -** -** If the doclist is setup to handle only positions, then insert -** the position only and ignore the offsets. -*/ -static void docListAddPosOffset( - DocList *d, /* Doclist under construction */ - int iColumn, /* Column the inserted term is part of */ - int iPos, /* Position of the inserted term */ - int iStartOffset, /* Starting offset of inserted term */ - int iEndOffset /* Ending offset of inserted term */ -){ - assert( d->iType>=DL_POSITIONS ); - addPos(d, iColumn, iPos); - if( d->iType==DL_POSITIONS_OFFSETS ){ - assert( iStartOffset>=d->iLastOffset ); - appendVarint(d, iStartOffset-d->iLastOffset); - d->iLastOffset = iStartOffset; - assert( iEndOffset>=iStartOffset ); - appendVarint(d, iEndOffset-iStartOffset); - } - appendVarint(d, POS_END); /* add new terminator */ -} - -/* -** A DocListReader object is a cursor into a doclist. Initialize -** the cursor to the beginning of the doclist by calling readerInit(). -** Then use routines -** -** peekDocid() -** readDocid() -** readPosition() -** skipPositionList() -** and so forth... -** -** to read information out of the doclist. When we reach the end -** of the doclist, atEnd() returns TRUE. -*/ -typedef struct DocListReader { - DocList *pDoclist; /* The document list we are stepping through */ - char *p; /* Pointer to next unread byte in the doclist */ - int iLastColumn; - int iLastPos; /* the last position read, or -1 when not in a position list */ -} DocListReader; - -/* -** Initialize the DocListReader r to point to the beginning of pDoclist. -*/ -static void readerInit(DocListReader *r, DocList *pDoclist){ - r->pDoclist = pDoclist; - if( pDoclist!=NULL ){ - r->p = pDoclist->pData; - } - r->iLastColumn = -1; - r->iLastPos = -1; -} - -/* -** Return TRUE if we have reached then end of pReader and there is -** nothing else left to read. -*/ -static int atEnd(DocListReader *pReader){ - return pReader->pDoclist==0 || (pReader->p >= docListEnd(pReader->pDoclist)); -} - -/* Peek at the next docid without advancing the read pointer. -*/ -static sqlite_int64 peekDocid(DocListReader *pReader){ - sqlite_int64 ret; - assert( !atEnd(pReader) ); - assert( pReader->iLastPos==-1 ); - getVarint(pReader->p, &ret); - return ret; -} - -/* Read the next docid. See also nextDocid(). -*/ -static sqlite_int64 readDocid(DocListReader *pReader){ - sqlite_int64 ret; - assert( !atEnd(pReader) ); - assert( pReader->iLastPos==-1 ); - pReader->p += getVarint(pReader->p, &ret); - if( pReader->pDoclist->iType>=DL_POSITIONS ){ - pReader->iLastColumn = 0; - pReader->iLastPos = 0; - } - return ret; -} - -/* Read the next position and column index from a position list. - * Returns the position, or -1 at the end of the list. */ -static int readPosition(DocListReader *pReader, int *iColumn){ - int i; - int iType = pReader->pDoclist->iType; - - if( pReader->iLastPos==-1 ){ - return -1; - } - assert( !atEnd(pReader) ); - - if( iTypep += getVarint32(pReader->p, &i); - if( i==POS_END ){ - pReader->iLastColumn = pReader->iLastPos = -1; - *iColumn = -1; - return -1; - } - if( i==POS_COLUMN ){ - pReader->p += getVarint32(pReader->p, &pReader->iLastColumn); - pReader->iLastPos = 0; - pReader->p += getVarint32(pReader->p, &i); - assert( i>=POS_BASE ); - } - pReader->iLastPos += ((int) i)-POS_BASE; - if( iType>=DL_POSITIONS_OFFSETS ){ - /* Skip over offsets, ignoring them for now. */ - int iStart, iEnd; - pReader->p += getVarint32(pReader->p, &iStart); - pReader->p += getVarint32(pReader->p, &iEnd); - } - *iColumn = pReader->iLastColumn; - return pReader->iLastPos; -} - -/* Skip past the end of a position list. */ -static void skipPositionList(DocListReader *pReader){ - DocList *p = pReader->pDoclist; - if( p && p->iType>=DL_POSITIONS ){ - int iColumn; - while( readPosition(pReader, &iColumn)!=-1 ){} - } -} - -/* Skip over a docid, including its position list if the doclist has - * positions. */ -static void skipDocument(DocListReader *pReader){ - readDocid(pReader); - skipPositionList(pReader); -} - -/* Skip past all docids which are less than [iDocid]. Returns 1 if a docid - * matching [iDocid] was found. */ -static int skipToDocid(DocListReader *pReader, sqlite_int64 iDocid){ - sqlite_int64 d = 0; - while( !atEnd(pReader) && (d=peekDocid(pReader))iType>=DL_POSITIONS ){ - int iPos, iCol; - const char *zDiv = ""; - printf("("); - while( (iPos = readPosition(&r, &iCol))>=0 ){ - printf("%s%d:%d", zDiv, iCol, iPos); - zDiv = ":"; - } - printf(")"); - } - } - printf("\n"); - fflush(stdout); -} -#endif /* SQLITE_DEBUG */ - -/* Trim the given doclist to contain only positions in column - * [iRestrictColumn]. */ -static void docListRestrictColumn(DocList *in, int iRestrictColumn){ - DocListReader r; - DocList out; - - assert( in->iType>=DL_POSITIONS ); - readerInit(&r, in); - docListInit(&out, DL_POSITIONS, NULL, 0); - - while( !atEnd(&r) ){ - sqlite_int64 iDocid = readDocid(&r); - int iPos, iColumn; - - docListAddDocid(&out, iDocid); - while( (iPos = readPosition(&r, &iColumn)) != -1 ){ - if( iColumn==iRestrictColumn ){ - docListAddPos(&out, iColumn, iPos); - } - } - } - - docListDestroy(in); - *in = out; -} - -/* Trim the given doclist by discarding any docids without any remaining - * positions. */ -static void docListDiscardEmpty(DocList *in) { - DocListReader r; - DocList out; - - /* TODO: It would be nice to implement this operation in place; that - * could save a significant amount of memory in queries with long doclists. */ - assert( in->iType>=DL_POSITIONS ); - readerInit(&r, in); - docListInit(&out, DL_POSITIONS, NULL, 0); - - while( !atEnd(&r) ){ - sqlite_int64 iDocid = readDocid(&r); - int match = 0; - int iPos, iColumn; - while( (iPos = readPosition(&r, &iColumn)) != -1 ){ - if( !match ){ - docListAddDocid(&out, iDocid); - match = 1; - } - docListAddPos(&out, iColumn, iPos); - } - } - - docListDestroy(in); - *in = out; -} - -/* Helper function for docListUpdate() and docListAccumulate(). -** Splices a doclist element into the doclist represented by r, -** leaving r pointing after the newly spliced element. -*/ -static void docListSpliceElement(DocListReader *r, sqlite_int64 iDocid, - const char *pSource, int nSource){ - DocList *d = r->pDoclist; - char *pTarget; - int nTarget, found; - - found = skipToDocid(r, iDocid); - - /* Describe slice in d to place pSource/nSource. */ - pTarget = r->p; - if( found ){ - skipDocument(r); - nTarget = r->p-pTarget; - }else{ - nTarget = 0; - } - - /* The sense of the following is that there are three possibilities. - ** If nTarget==nSource, we should not move any memory nor realloc. - ** If nTarget>nSource, trim target and realloc. - ** If nTargetnSource ){ - memmove(pTarget+nSource, pTarget+nTarget, docListEnd(d)-(pTarget+nTarget)); - } - if( nTarget!=nSource ){ - int iDoclist = pTarget-d->pData; - d->pData = realloc(d->pData, d->nData+nSource-nTarget); - pTarget = d->pData+iDoclist; - } - if( nTargetnData += nSource-nTarget; - r->p = pTarget+nSource; -} - -/* Insert/update pUpdate into the doclist. */ -static void docListUpdate(DocList *d, DocList *pUpdate){ - DocListReader reader; - - assert( d!=NULL && pUpdate!=NULL ); - assert( d->iType==pUpdate->iType); - - readerInit(&reader, d); - docListSpliceElement(&reader, firstDocid(pUpdate), - pUpdate->pData, pUpdate->nData); -} - -/* Propagate elements from pUpdate to pAcc, overwriting elements with -** matching docids. -*/ -static void docListAccumulate(DocList *pAcc, DocList *pUpdate){ - DocListReader accReader, updateReader; - - /* Handle edge cases where one doclist is empty. */ - assert( pAcc!=NULL ); - if( pUpdate==NULL || pUpdate->nData==0 ) return; - if( pAcc->nData==0 ){ - pAcc->pData = malloc(pUpdate->nData); - memcpy(pAcc->pData, pUpdate->pData, pUpdate->nData); - pAcc->nData = pUpdate->nData; - return; - } - - readerInit(&accReader, pAcc); - readerInit(&updateReader, pUpdate); - - while( !atEnd(&updateReader) ){ - char *pSource = updateReader.p; - sqlite_int64 iDocid = readDocid(&updateReader); - skipPositionList(&updateReader); - docListSpliceElement(&accReader, iDocid, pSource, updateReader.p-pSource); - } -} - -/* -** Read the next docid off of pIn. Return 0 if we reach the end. -* -* TODO: This assumes that docids are never 0, but they may actually be 0 since -* users can choose docids when inserting into a full-text table. Fix this. -*/ -static sqlite_int64 nextDocid(DocListReader *pIn){ - skipPositionList(pIn); - return atEnd(pIn) ? 0 : readDocid(pIn); -} - -/* -** pLeft and pRight are two DocListReaders that are pointing to -** positions lists of the same document: iDocid. -** -** If there are no instances in pLeft or pRight where the position -** of pLeft is one less than the position of pRight, then this -** routine adds nothing to pOut. -** -** If there are one or more instances where positions from pLeft -** are exactly one less than positions from pRight, then add a new -** document record to pOut. If pOut wants to hold positions, then -** include the positions from pRight that are one more than a -** position in pLeft. In other words: pRight.iPos==pLeft.iPos+1. -** -** pLeft and pRight are left pointing at the next document record. -*/ -static void mergePosList( - DocListReader *pLeft, /* Left position list */ - DocListReader *pRight, /* Right position list */ - sqlite_int64 iDocid, /* The docid from pLeft and pRight */ - DocList *pOut /* Write the merged document record here */ -){ - int iLeftCol, iLeftPos = readPosition(pLeft, &iLeftCol); - int iRightCol, iRightPos = readPosition(pRight, &iRightCol); - int match = 0; - - /* Loop until we've reached the end of both position lists. */ - while( iLeftPos!=-1 && iRightPos!=-1 ){ - if( iLeftCol==iRightCol && iLeftPos+1==iRightPos ){ - if( !match ){ - docListAddDocid(pOut, iDocid); - match = 1; - } - if( pOut->iType>=DL_POSITIONS ){ - docListAddPos(pOut, iRightCol, iRightPos); - } - iLeftPos = readPosition(pLeft, &iLeftCol); - iRightPos = readPosition(pRight, &iRightCol); - }else if( iRightCol=0 ) skipPositionList(pLeft); - if( iRightPos>=0 ) skipPositionList(pRight); -} - -/* We have two doclists: pLeft and pRight. -** Write the phrase intersection of these two doclists into pOut. -** -** A phrase intersection means that two documents only match -** if pLeft.iPos+1==pRight.iPos. -** -** The output pOut may or may not contain positions. If pOut -** does contain positions, they are the positions of pRight. -*/ -static void docListPhraseMerge( - DocList *pLeft, /* Doclist resulting from the words on the left */ - DocList *pRight, /* Doclist for the next word to the right */ - DocList *pOut /* Write the combined doclist here */ -){ - DocListReader left, right; - sqlite_int64 docidLeft, docidRight; - - readerInit(&left, pLeft); - readerInit(&right, pRight); - docidLeft = nextDocid(&left); - docidRight = nextDocid(&right); - - while( docidLeft>0 && docidRight>0 ){ - if( docidLeftiType0 && docidRight>0 ){ - if( docidLeft0 && docidRight>0 ){ - if( docidLeft<=docidRight ){ - docListAddDocid(pOut, docidLeft); - }else{ - docListAddDocid(pOut, docidRight); - } - priorLeft = docidLeft; - if( docidLeft<=docidRight ){ - docidLeft = nextDocid(&left); - } - if( docidRight>0 && docidRight<=priorLeft ){ - docidRight = nextDocid(&right); - } - } - while( docidLeft>0 ){ - docListAddDocid(pOut, docidLeft); - docidLeft = nextDocid(&left); - } - while( docidRight>0 ){ - docListAddDocid(pOut, docidRight); - docidRight = nextDocid(&right); - } -} - -/* We have two doclists: pLeft and pRight. -** Write into pOut all documents that occur in pLeft but not -** in pRight. -** -** Only docids are matched. Position information is ignored. -** -** The output pOut never holds positions. -*/ -static void docListExceptMerge( - DocList *pLeft, /* Doclist resulting from the words on the left */ - DocList *pRight, /* Doclist for the next word to the right */ - DocList *pOut /* Write the combined doclist here */ -){ - DocListReader left, right; - sqlite_int64 docidLeft, docidRight, priorLeft; - - readerInit(&left, pLeft); - readerInit(&right, pRight); - docidLeft = nextDocid(&left); - docidRight = nextDocid(&right); - - while( docidLeft>0 && docidRight>0 ){ - priorLeft = docidLeft; - if( docidLeft0 && docidRight<=priorLeft ){ - docidRight = nextDocid(&right); - } - } - while( docidLeft>0 ){ - docListAddDocid(pOut, docidLeft); - docidLeft = nextDocid(&left); - } -} - -static char *string_dup_n(const char *s, int n){ - char *str = malloc(n + 1); - memcpy(str, s, n); - str[n] = '\0'; - return str; -} - -/* Duplicate a string; the caller must free() the returned string. - * (We don't use strdup() since it's not part of the standard C library and - * may not be available everywhere.) */ -static char *string_dup(const char *s){ - return string_dup_n(s, strlen(s)); -} - -/* Format a string, replacing each occurrence of the % character with - * zDb.zName. This may be more convenient than sqlite_mprintf() - * when one string is used repeatedly in a format string. - * The caller must free() the returned string. */ -static char *string_format(const char *zFormat, - const char *zDb, const char *zName){ - const char *p; - size_t len = 0; - size_t nDb = strlen(zDb); - size_t nName = strlen(zName); - size_t nFullTableName = nDb+1+nName; - char *result; - char *r; - - /* first compute length needed */ - for(p = zFormat ; *p ; ++p){ - len += (*p=='%' ? nFullTableName : 1); - } - len += 1; /* for null terminator */ - - r = result = malloc(len); - for(p = zFormat; *p; ++p){ - if( *p=='%' ){ - memcpy(r, zDb, nDb); - r += nDb; - *r++ = '.'; - memcpy(r, zName, nName); - r += nName; - } else { - *r++ = *p; - } - } - *r++ = '\0'; - assert( r == result + len ); - return result; -} - -static int sql_exec(sqlite3 *db, const char *zDb, const char *zName, - const char *zFormat){ - char *zCommand = string_format(zFormat, zDb, zName); - int rc; - TRACE(("FTS1 sql: %s\n", zCommand)); - rc = sqlite3_exec(db, zCommand, NULL, 0, NULL); - free(zCommand); - return rc; -} - -static int sql_prepare(sqlite3 *db, const char *zDb, const char *zName, - sqlite3_stmt **ppStmt, const char *zFormat){ - char *zCommand = string_format(zFormat, zDb, zName); - int rc; - TRACE(("FTS1 prepare: %s\n", zCommand)); - rc = sqlite3_prepare(db, zCommand, -1, ppStmt, NULL); - free(zCommand); - return rc; -} - -/* end utility functions */ - -/* Forward reference */ -typedef struct fulltext_vtab fulltext_vtab; - -/* A single term in a query is represented by an instances of -** the following structure. -*/ -typedef struct QueryTerm { - short int nPhrase; /* How many following terms are part of the same phrase */ - short int iPhrase; /* This is the i-th term of a phrase. */ - short int iColumn; /* Column of the index that must match this term */ - signed char isOr; /* this term is preceded by "OR" */ - signed char isNot; /* this term is preceded by "-" */ - char *pTerm; /* text of the term. '\000' terminated. malloced */ - int nTerm; /* Number of bytes in pTerm[] */ -} QueryTerm; - - -/* A query string is parsed into a Query structure. - * - * We could, in theory, allow query strings to be complicated - * nested expressions with precedence determined by parentheses. - * But none of the major search engines do this. (Perhaps the - * feeling is that an parenthesized expression is two complex of - * an idea for the average user to grasp.) Taking our lead from - * the major search engines, we will allow queries to be a list - * of terms (with an implied AND operator) or phrases in double-quotes, - * with a single optional "-" before each non-phrase term to designate - * negation and an optional OR connector. - * - * OR binds more tightly than the implied AND, which is what the - * major search engines seem to do. So, for example: - * - * [one two OR three] ==> one AND (two OR three) - * [one OR two three] ==> (one OR two) AND three - * - * A "-" before a term matches all entries that lack that term. - * The "-" must occur immediately before the term with in intervening - * space. This is how the search engines do it. - * - * A NOT term cannot be the right-hand operand of an OR. If this - * occurs in the query string, the NOT is ignored: - * - * [one OR -two] ==> one OR two - * - */ -typedef struct Query { - fulltext_vtab *pFts; /* The full text index */ - int nTerms; /* Number of terms in the query */ - QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */ - int nextIsOr; /* Set the isOr flag on the next inserted term */ - int nextColumn; /* Next word parsed must be in this column */ - int dfltColumn; /* The default column */ -} Query; - - -/* -** An instance of the following structure keeps track of generated -** matching-word offset information and snippets. -*/ -typedef struct Snippet { - int nMatch; /* Total number of matches */ - int nAlloc; /* Space allocated for aMatch[] */ - struct snippetMatch { /* One entry for each matching term */ - char snStatus; /* Status flag for use while constructing snippets */ - short int iCol; /* The column that contains the match */ - short int iTerm; /* The index in Query.pTerms[] of the matching term */ - short int nByte; /* Number of bytes in the term */ - int iStart; /* The offset to the first character of the term */ - } *aMatch; /* Points to space obtained from malloc */ - char *zOffset; /* Text rendering of aMatch[] */ - int nOffset; /* strlen(zOffset) */ - char *zSnippet; /* Snippet text */ - int nSnippet; /* strlen(zSnippet) */ -} Snippet; - - -typedef enum QueryType { - QUERY_GENERIC, /* table scan */ - QUERY_ROWID, /* lookup by rowid */ - QUERY_FULLTEXT /* QUERY_FULLTEXT + [i] is a full-text search for column i*/ -} QueryType; - -/* TODO(shess) CHUNK_MAX controls how much data we allow in segment 0 -** before we start aggregating into larger segments. Lower CHUNK_MAX -** means that for a given input we have more individual segments per -** term, which means more rows in the table and a bigger index (due to -** both more rows and bigger rowids). But it also reduces the average -** cost of adding new elements to the segment 0 doclist, and it seems -** to reduce the number of pages read and written during inserts. 256 -** was chosen by measuring insertion times for a certain input (first -** 10k documents of Enron corpus), though including query performance -** in the decision may argue for a larger value. -*/ -#define CHUNK_MAX 256 - -typedef enum fulltext_statement { - CONTENT_INSERT_STMT, - CONTENT_SELECT_STMT, - CONTENT_UPDATE_STMT, - CONTENT_DELETE_STMT, - - TERM_SELECT_STMT, - TERM_SELECT_ALL_STMT, - TERM_INSERT_STMT, - TERM_UPDATE_STMT, - TERM_DELETE_STMT, - - MAX_STMT /* Always at end! */ -} fulltext_statement; - -/* These must exactly match the enum above. */ -/* TODO(adam): Is there some risk that a statement (in particular, -** pTermSelectStmt) will be used in two cursors at once, e.g. if a -** query joins a virtual table to itself? If so perhaps we should -** move some of these to the cursor object. -*/ -static const char *const fulltext_zStatement[MAX_STMT] = { - /* CONTENT_INSERT */ NULL, /* generated in contentInsertStatement() */ - /* CONTENT_SELECT */ "select * from %_content where rowid = ?", - /* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */ - /* CONTENT_DELETE */ "delete from %_content where rowid = ?", - - /* TERM_SELECT */ - "select rowid, doclist from %_term where term = ? and segment = ?", - /* TERM_SELECT_ALL */ - "select doclist from %_term where term = ? order by segment", - /* TERM_INSERT */ - "insert into %_term (rowid, term, segment, doclist) values (?, ?, ?, ?)", - /* TERM_UPDATE */ "update %_term set doclist = ? where rowid = ?", - /* TERM_DELETE */ "delete from %_term where rowid = ?", -}; - -/* -** A connection to a fulltext index is an instance of the following -** structure. The xCreate and xConnect methods create an instance -** of this structure and xDestroy and xDisconnect free that instance. -** All other methods receive a pointer to the structure as one of their -** arguments. -*/ -struct fulltext_vtab { - sqlite3_vtab base; /* Base class used by SQLite core */ - sqlite3 *db; /* The database connection */ - const char *zDb; /* logical database name */ - const char *zName; /* virtual table name */ - int nColumn; /* number of columns in virtual table */ - char **azColumn; /* column names. malloced */ - char **azContentColumn; /* column names in content table; malloced */ - sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ - - /* Precompiled statements which we keep as long as the table is - ** open. - */ - sqlite3_stmt *pFulltextStatements[MAX_STMT]; -}; - -/* -** When the core wants to do a query, it create a cursor using a -** call to xOpen. This structure is an instance of a cursor. It -** is destroyed by xClose. -*/ -typedef struct fulltext_cursor { - sqlite3_vtab_cursor base; /* Base class used by SQLite core */ - QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ - sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ - int eof; /* True if at End Of Results */ - Query q; /* Parsed query string */ - Snippet snippet; /* Cached snippet for the current row */ - int iColumn; /* Column being searched */ - DocListReader result; /* used when iCursorType == QUERY_FULLTEXT */ -} fulltext_cursor; - -static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){ - return (fulltext_vtab *) c->base.pVtab; -} - -static const sqlite3_module fulltextModule; /* forward declaration */ - -/* Append a list of strings separated by commas to a StringBuffer. */ -static void appendList(StringBuffer *sb, int nString, char **azString){ - int i; - for(i=0; i0 ) append(sb, ", "); - append(sb, azString[i]); - } -} - -/* Return a dynamically generated statement of the form - * insert into %_content (rowid, ...) values (?, ...) - */ -static const char *contentInsertStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "insert into %_content (rowid, "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, ") values (?"); - for(i=0; inColumn; ++i) - append(&sb, ", ?"); - append(&sb, ")"); - return sb.s; -} - -/* Return a dynamically generated statement of the form - * update %_content set [col_0] = ?, [col_1] = ?, ... - * where rowid = ? - */ -static const char *contentUpdateStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "update %_content set "); - for(i=0; inColumn; ++i) { - if( i>0 ){ - append(&sb, ", "); - } - append(&sb, v->azContentColumn[i]); - append(&sb, " = ?"); - } - append(&sb, " where rowid = ?"); - return sb.s; -} - -/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. -** If the indicated statement has never been prepared, it is prepared -** and cached, otherwise the cached version is reset. -*/ -static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, - sqlite3_stmt **ppStmt){ - assert( iStmtpFulltextStatements[iStmt]==NULL ){ - const char *zStmt; - int rc; - switch( iStmt ){ - case CONTENT_INSERT_STMT: - zStmt = contentInsertStatement(v); break; - case CONTENT_UPDATE_STMT: - zStmt = contentUpdateStatement(v); break; - default: - zStmt = fulltext_zStatement[iStmt]; - } - rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], - zStmt); - if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt); - if( rc!=SQLITE_OK ) return rc; - } else { - int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); - if( rc!=SQLITE_OK ) return rc; - } - - *ppStmt = v->pFulltextStatements[iStmt]; - return SQLITE_OK; -} - -/* Step the indicated statement, handling errors SQLITE_BUSY (by -** retrying) and SQLITE_SCHEMA (by re-preparing and transferring -** bindings to the new statement). -** TODO(adam): We should extend this function so that it can work with -** statements declared locally, not only globally cached statements. -*/ -static int sql_step_statement(fulltext_vtab *v, fulltext_statement iStmt, - sqlite3_stmt **ppStmt){ - int rc; - sqlite3_stmt *s = *ppStmt; - assert( iStmtpFulltextStatements[iStmt] ); - - while( (rc=sqlite3_step(s))!=SQLITE_DONE && rc!=SQLITE_ROW ){ - if( rc==SQLITE_BUSY ) continue; - if( rc!=SQLITE_ERROR ) return rc; - - /* If an SQLITE_SCHEMA error has occured, then finalizing this - * statement is going to delete the fulltext_vtab structure. If - * the statement just executed is in the pFulltextStatements[] - * array, it will be finalized twice. So remove it before - * calling sqlite3_finalize(). - */ - v->pFulltextStatements[iStmt] = NULL; - rc = sqlite3_finalize(s); - break; - } - return rc; - - err: - sqlite3_finalize(s); - return rc; -} - -/* Like sql_step_statement(), but convert SQLITE_DONE to SQLITE_OK. -** Useful for statements like UPDATE, where we expect no results. -*/ -static int sql_single_step_statement(fulltext_vtab *v, - fulltext_statement iStmt, - sqlite3_stmt **ppStmt){ - int rc = sql_step_statement(v, iStmt, ppStmt); - return (rc==SQLITE_DONE) ? SQLITE_OK : rc; -} - -/* insert into %_content (rowid, ...) values ([rowid], [pValues]) */ -static int content_insert(fulltext_vtab *v, sqlite3_value *rowid, - sqlite3_value **pValues){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_value(s, 1, rowid); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 2+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; - } - - return sql_single_step_statement(v, CONTENT_INSERT_STMT, &s); -} - -/* update %_content set col0 = pValues[0], col1 = pValues[1], ... - * where rowid = [iRowid] */ -static int content_update(fulltext_vtab *v, sqlite3_value **pValues, - sqlite_int64 iRowid){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 1+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; - } - - rc = sqlite3_bind_int64(s, 1+v->nColumn, iRowid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step_statement(v, CONTENT_UPDATE_STMT, &s); -} - -static void freeStringArray(int nString, const char **pString){ - int i; - - for (i=0 ; i < nString ; ++i) { - if( pString[i]!=NULL ) free((void *) pString[i]); - } - free((void *) pString); -} - -/* select * from %_content where rowid = [iRow] - * The caller must delete the returned array and all strings in it. - * null fields will be NULL in the returned array. - * - * TODO: Perhaps we should return pointer/length strings here for consistency - * with other code which uses pointer/length. */ -static int content_select(fulltext_vtab *v, sqlite_int64 iRow, - const char ***pValues){ - sqlite3_stmt *s; - const char **values; - int i; - int rc; - - *pValues = NULL; - - rc = sql_get_statement(v, CONTENT_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = sql_step_statement(v, CONTENT_SELECT_STMT, &s); - if( rc!=SQLITE_ROW ) return rc; - - values = (const char **) malloc(v->nColumn * sizeof(const char *)); - for(i=0; inColumn; ++i){ - if( sqlite3_column_type(s, i)==SQLITE_NULL ){ - values[i] = NULL; - }else{ - values[i] = string_dup((char*)sqlite3_column_text(s, i)); - } - } - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - *pValues = values; - return SQLITE_OK; - } - - freeStringArray(v->nColumn, values); - return rc; -} - -/* delete from %_content where rowid = [iRow ] */ -static int content_delete(fulltext_vtab *v, sqlite_int64 iRow){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iRow); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step_statement(v, CONTENT_DELETE_STMT, &s); -} - -/* select rowid, doclist from %_term - * where term = [pTerm] and segment = [iSegment] - * If found, returns SQLITE_ROW; the caller must free the - * returned doclist. If no rows found, returns SQLITE_DONE. */ -static int term_select(fulltext_vtab *v, const char *pTerm, int nTerm, - int iSegment, - sqlite_int64 *rowid, DocList *out){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, TERM_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_text(s, 1, pTerm, nTerm, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 2, iSegment); - if( rc!=SQLITE_OK ) return rc; - - rc = sql_step_statement(v, TERM_SELECT_STMT, &s); - if( rc!=SQLITE_ROW ) return rc; - - *rowid = sqlite3_column_int64(s, 0); - docListInit(out, DL_DEFAULT, - sqlite3_column_blob(s, 1), sqlite3_column_bytes(s, 1)); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - return rc==SQLITE_DONE ? SQLITE_ROW : rc; -} - -/* Load the segment doclists for term pTerm and merge them in -** appropriate order into out. Returns SQLITE_OK if successful. If -** there are no segments for pTerm, successfully returns an empty -** doclist in out. -** -** Each document consists of 1 or more "columns". The number of -** columns is v->nColumn. If iColumn==v->nColumn, then return -** position information about all columns. If iColumnnColumn, -** then only return position information about the iColumn-th column -** (where the first column is 0). -*/ -static int term_select_all( - fulltext_vtab *v, /* The fulltext index we are querying against */ - int iColumn, /* If nColumn ){ /* querying a single column */ - docListRestrictColumn(&old, iColumn); - } - - /* doclist contains the newer data, so write it over old. Then - ** steal accumulated result for doclist. - */ - docListAccumulate(&old, &doclist); - docListDestroy(&doclist); - doclist = old; - } - if( rc!=SQLITE_DONE ){ - docListDestroy(&doclist); - return rc; - } - - docListDiscardEmpty(&doclist); - *out = doclist; - return SQLITE_OK; -} - -/* insert into %_term (rowid, term, segment, doclist) - values ([piRowid], [pTerm], [iSegment], [doclist]) -** Lets sqlite select rowid if piRowid is NULL, else uses *piRowid. -** -** NOTE(shess) piRowid is IN, with values of "space of int64" plus -** null, it is not used to pass data back to the caller. -*/ -static int term_insert(fulltext_vtab *v, sqlite_int64 *piRowid, - const char *pTerm, int nTerm, - int iSegment, DocList *doclist){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, TERM_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - if( piRowid==NULL ){ - rc = sqlite3_bind_null(s, 1); - }else{ - rc = sqlite3_bind_int64(s, 1, *piRowid); - } - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_text(s, 2, pTerm, nTerm, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 3, iSegment); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_blob(s, 4, doclist->pData, doclist->nData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step_statement(v, TERM_INSERT_STMT, &s); -} - -/* update %_term set doclist = [doclist] where rowid = [rowid] */ -static int term_update(fulltext_vtab *v, sqlite_int64 rowid, - DocList *doclist){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, TERM_UPDATE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_blob(s, 1, doclist->pData, doclist->nData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, rowid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step_statement(v, TERM_UPDATE_STMT, &s); -} - -static int term_delete(fulltext_vtab *v, sqlite_int64 rowid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, TERM_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, rowid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step_statement(v, TERM_DELETE_STMT, &s); -} - -/* -** Free the memory used to contain a fulltext_vtab structure. -*/ -static void fulltext_vtab_destroy(fulltext_vtab *v){ - int iStmt, i; - - TRACE(("FTS1 Destroy %p\n", v)); - for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ - sqlite3_finalize(v->pFulltextStatements[iStmt]); - v->pFulltextStatements[iStmt] = NULL; - } - } - - if( v->pTokenizer!=NULL ){ - v->pTokenizer->pModule->xDestroy(v->pTokenizer); - v->pTokenizer = NULL; - } - - free(v->azColumn); - for(i = 0; i < v->nColumn; ++i) { - sqlite3_free(v->azContentColumn[i]); - } - free(v->azContentColumn); - free(v); -} - -/* -** Token types for parsing the arguments to xConnect or xCreate. -*/ -#define TOKEN_EOF 0 /* End of file */ -#define TOKEN_SPACE 1 /* Any kind of whitespace */ -#define TOKEN_ID 2 /* An identifier */ -#define TOKEN_STRING 3 /* A string literal */ -#define TOKEN_PUNCT 4 /* A single punctuation character */ - -/* -** If X is a character that can be used in an identifier then -** IdChar(X) will be true. Otherwise it is false. -** -** For ASCII, any character with the high-order bit set is -** allowed in an identifier. For 7-bit characters, -** sqlite3IsIdChar[X] must be 1. -** -** Ticket #1066. the SQL standard does not allow '$' in the -** middle of identfiers. But many SQL implementations do. -** SQLite will allow '$' in identifiers for compatibility. -** But the feature is undocumented. -*/ -static const char isIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isIdChar[c-0x20])) - - -/* -** Return the length of the token that begins at z[0]. -** Store the token type in *tokenType before returning. -*/ -static int getToken(const char *z, int *tokenType){ - int i, c; - switch( *z ){ - case 0: { - *tokenType = TOKEN_EOF; - return 0; - } - case ' ': case '\t': case '\n': case '\f': case '\r': { - for(i=1; safe_isspace(z[i]); i++){} - *tokenType = TOKEN_SPACE; - return i; - } - case '`': - case '\'': - case '"': { - int delim = z[0]; - for(i=1; (c=z[i])!=0; i++){ - if( c==delim ){ - if( z[i+1]==delim ){ - i++; - }else{ - break; - } - } - } - *tokenType = TOKEN_STRING; - return i + (c!=0); - } - case '[': { - for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} - *tokenType = TOKEN_ID; - return i; - } - default: { - if( !IdChar(*z) ){ - break; - } - for(i=1; IdChar(z[i]); i++){} - *tokenType = TOKEN_ID; - return i; - } - } - *tokenType = TOKEN_PUNCT; - return 1; -} - -/* -** A token extracted from a string is an instance of the following -** structure. -*/ -typedef struct Token { - const char *z; /* Pointer to token text. Not '\000' terminated */ - short int n; /* Length of the token text in bytes. */ -} Token; - -/* -** Given a input string (which is really one of the argv[] parameters -** passed into xConnect or xCreate) split the string up into tokens. -** Return an array of pointers to '\000' terminated strings, one string -** for each non-whitespace token. -** -** The returned array is terminated by a single NULL pointer. -** -** Space to hold the returned array is obtained from a single -** malloc and should be freed by passing the return value to free(). -** The individual strings within the token list are all a part of -** the single memory allocation and will all be freed at once. -*/ -static char **tokenizeString(const char *z, int *pnToken){ - int nToken = 0; - Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) ); - int n = 1; - int e, i; - int totalSize = 0; - char **azToken; - char *zCopy; - while( n>0 ){ - n = getToken(z, &e); - if( e!=TOKEN_SPACE ){ - aToken[nToken].z = z; - aToken[nToken].n = n; - nToken++; - totalSize += n+1; - } - z += n; - } - azToken = (char**)malloc( nToken*sizeof(char*) + totalSize ); - zCopy = (char*)&azToken[nToken]; - nToken--; - for(i=0; i=0 ){ - azIn[j] = azIn[i]; - } - j++; - } - } - azIn[j] = 0; - } -} - - -/* -** Find the first alphanumeric token in the string zIn. Null-terminate -** this token. Remove any quotation marks. And return a pointer to -** the result. -*/ -static char *firstToken(char *zIn, char **pzTail){ - int n, ttype; - while(1){ - n = getToken(zIn, &ttype); - if( ttype==TOKEN_SPACE ){ - zIn += n; - }else if( ttype==TOKEN_EOF ){ - *pzTail = zIn; - return 0; - }else{ - zIn[n] = 0; - *pzTail = &zIn[1]; - dequoteString(zIn); - return zIn; - } - } - /*NOTREACHED*/ -} - -/* Return true if... -** -** * s begins with the string t, ignoring case -** * s is longer than t -** * The first character of s beyond t is not a alphanumeric -** -** Ignore leading space in *s. -** -** To put it another way, return true if the first token of -** s[] is t[]. -*/ -static int startsWith(const char *s, const char *t){ - while( safe_isspace(*s) ){ s++; } - while( *t ){ - if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; - } - return *s!='_' && !safe_isalnum(*s); -} - -/* -** An instance of this structure defines the "spec" of a -** full text index. This structure is populated by parseSpec -** and use by fulltextConnect and fulltextCreate. -*/ -typedef struct TableSpec { - const char *zDb; /* Logical database name */ - const char *zName; /* Name of the full-text index */ - int nColumn; /* Number of columns to be indexed */ - char **azColumn; /* Original names of columns to be indexed */ - char **azContentColumn; /* Column names for %_content */ - char **azTokenizer; /* Name of tokenizer and its arguments */ -} TableSpec; - -/* -** Reclaim all of the memory used by a TableSpec -*/ -static void clearTableSpec(TableSpec *p) { - free(p->azColumn); - free(p->azContentColumn); - free(p->azTokenizer); -} - -/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: - * - * CREATE VIRTUAL TABLE email - * USING fts1(subject, body, tokenize mytokenizer(myarg)) - * - * We return parsed information in a TableSpec structure. - * - */ -static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, - char**pzErr){ - int i, n; - char *z, *zDummy; - char **azArg; - const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ - - assert( argc>=3 ); - /* Current interface: - ** argv[0] - module name - ** argv[1] - database name - ** argv[2] - table name - ** argv[3..] - columns, optionally followed by tokenizer specification - ** and snippet delimiters specification. - */ - - /* Make a copy of the complete argv[][] array in a single allocation. - ** The argv[][] array is read-only and transient. We can write to the - ** copy in order to modify things and the copy is persistent. - */ - memset(pSpec, 0, sizeof(*pSpec)); - for(i=n=0; izDb = azArg[1]; - pSpec->zName = azArg[2]; - pSpec->nColumn = 0; - pSpec->azColumn = azArg; - zTokenizer = "tokenize simple"; - for(i=3; inColumn] = firstToken(azArg[i], &zDummy); - pSpec->nColumn++; - } - } - if( pSpec->nColumn==0 ){ - azArg[0] = "content"; - pSpec->nColumn = 1; - } - - /* - ** Construct the list of content column names. - ** - ** Each content column name will be of the form cNNAAAA - ** where NN is the column number and AAAA is the sanitized - ** column name. "sanitized" means that special characters are - ** converted to "_". The cNN prefix guarantees that all column - ** names are unique. - ** - ** The AAAA suffix is not strictly necessary. It is included - ** for the convenience of people who might examine the generated - ** %_content table and wonder what the columns are used for. - */ - pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) ); - if( pSpec->azContentColumn==0 ){ - clearTableSpec(pSpec); - return SQLITE_NOMEM; - } - for(i=0; inColumn; i++){ - char *p; - pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); - for (p = pSpec->azContentColumn[i]; *p ; ++p) { - if( !safe_isalnum(*p) ) *p = '_'; - } - } - - /* - ** Parse the tokenizer specification string. - */ - pSpec->azTokenizer = tokenizeString(zTokenizer, &n); - tokenListToIdList(pSpec->azTokenizer); - - return SQLITE_OK; -} - -/* -** Generate a CREATE TABLE statement that describes the schema of -** the virtual table. Return a pointer to this schema string. -** -** Space is obtained from sqlite3_mprintf() and should be freed -** using sqlite3_free(). -*/ -static char *fulltextSchema( - int nColumn, /* Number of columns */ - const char *const* azColumn, /* List of columns */ - const char *zTableName /* Name of the table */ -){ - int i; - char *zSchema, *zNext; - const char *zSep = "("; - zSchema = sqlite3_mprintf("CREATE TABLE x"); - for(i=0; ibase */ - v->db = db; - v->zDb = spec->zDb; /* Freed when azColumn is freed */ - v->zName = spec->zName; /* Freed when azColumn is freed */ - v->nColumn = spec->nColumn; - v->azContentColumn = spec->azContentColumn; - spec->azContentColumn = 0; - v->azColumn = spec->azColumn; - spec->azColumn = 0; - - if( spec->azTokenizer==0 ){ - return SQLITE_NOMEM; - } - /* TODO(shess) For now, add new tokenizers as else if clauses. */ - if( spec->azTokenizer[0]==0 || startsWith(spec->azTokenizer[0], "simple") ){ - sqlite3Fts1SimpleTokenizerModule(&m); - }else if( startsWith(spec->azTokenizer[0], "porter") ){ - sqlite3Fts1PorterTokenizerModule(&m); - }else{ - *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); - rc = SQLITE_ERROR; - goto err; - } - for(n=0; spec->azTokenizer[n]; n++){} - if( n ){ - rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], - &v->pTokenizer); - }else{ - rc = m->xCreate(0, 0, &v->pTokenizer); - } - if( rc!=SQLITE_OK ) goto err; - v->pTokenizer->pModule = m; - - /* TODO: verify the existence of backing tables foo_content, foo_term */ - - schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, - spec->zName); - rc = sqlite3_declare_vtab(db, schema); - sqlite3_free(schema); - if( rc!=SQLITE_OK ) goto err; - - memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); - - *ppVTab = &v->base; - TRACE(("FTS1 Connect %p\n", v)); - - return rc; - -err: - fulltext_vtab_destroy(v); - return rc; -} - -static int fulltextConnect( - sqlite3 *db, - void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, - char **pzErr -){ - TableSpec spec; - int rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - rc = constructVtab(db, &spec, ppVTab, pzErr); - clearTableSpec(&spec); - return rc; -} - - /* The %_content table holds the text of each document, with - ** the rowid used as the docid. - ** - ** The %_term table maps each term to a document list blob - ** containing elements sorted by ascending docid, each element - ** encoded as: - ** - ** docid varint-encoded - ** token elements: - ** position+1 varint-encoded as delta from previous position - ** start offset varint-encoded as delta from previous start offset - ** end offset varint-encoded as delta from start offset - ** - ** The sentinel position of 0 indicates the end of the token list. - ** - ** Additionally, doclist blobs are chunked into multiple segments, - ** using segment to order the segments. New elements are added to - ** the segment at segment 0, until it exceeds CHUNK_MAX. Then - ** segment 0 is deleted, and the doclist is inserted at segment 1. - ** If there is already a doclist at segment 1, the segment 0 doclist - ** is merged with it, the segment 1 doclist is deleted, and the - ** merged doclist is inserted at segment 2, repeating those - ** operations until an insert succeeds. - ** - ** Since this structure doesn't allow us to update elements in place - ** in case of deletion or update, these are simply written to - ** segment 0 (with an empty token list in case of deletion), with - ** docListAccumulate() taking care to retain lower-segment - ** information in preference to higher-segment information. - */ - /* TODO(shess) Provide a VACUUM type operation which both removes - ** deleted elements which are no longer necessary, and duplicated - ** elements. I suspect this will probably not be necessary in - ** practice, though. - */ -static int fulltextCreate(sqlite3 *db, void *pAux, - int argc, const char * const *argv, - sqlite3_vtab **ppVTab, char **pzErr){ - int rc; - TableSpec spec; - StringBuffer schema; - TRACE(("FTS1 Create\n")); - - rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - initStringBuffer(&schema); - append(&schema, "CREATE TABLE %_content("); - appendList(&schema, spec.nColumn, spec.azContentColumn); - append(&schema, ")"); - rc = sql_exec(db, spec.zDb, spec.zName, schema.s); - free(schema.s); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_term(term text, segment integer, doclist blob, " - "primary key(term, segment));"); - if( rc!=SQLITE_OK ) goto out; - - rc = constructVtab(db, &spec, ppVTab, pzErr); - -out: - clearTableSpec(&spec); - return rc; -} - -/* Decide how to handle an SQL query. */ -static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ - int i; - TRACE(("FTS1 BestIndex\n")); - - for(i=0; inConstraint; ++i){ - const struct sqlite3_index_constraint *pConstraint; - pConstraint = &pInfo->aConstraint[i]; - if( pConstraint->usable ) { - if( pConstraint->iColumn==-1 && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ - pInfo->idxNum = QUERY_ROWID; /* lookup by rowid */ - TRACE(("FTS1 QUERY_ROWID\n")); - } else if( pConstraint->iColumn>=0 && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ - /* full-text search */ - pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; - TRACE(("FTS1 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); - } else continue; - - pInfo->aConstraintUsage[i].argvIndex = 1; - pInfo->aConstraintUsage[i].omit = 1; - - /* An arbitrary value for now. - * TODO: Perhaps rowid matches should be considered cheaper than - * full-text searches. */ - pInfo->estimatedCost = 1.0; - - return SQLITE_OK; - } - } - pInfo->idxNum = QUERY_GENERIC; - return SQLITE_OK; -} - -static int fulltextDisconnect(sqlite3_vtab *pVTab){ - TRACE(("FTS1 Disconnect %p\n", pVTab)); - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} - -static int fulltextDestroy(sqlite3_vtab *pVTab){ - fulltext_vtab *v = (fulltext_vtab *)pVTab; - int rc; - - TRACE(("FTS1 Destroy %p\n", pVTab)); - rc = sql_exec(v->db, v->zDb, v->zName, - "drop table if exists %_content;" - "drop table if exists %_term;" - ); - if( rc!=SQLITE_OK ) return rc; - - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} - -static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ - fulltext_cursor *c; - - c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1); - /* sqlite will initialize c->base */ - *ppCursor = &c->base; - TRACE(("FTS1 Open %p: %p\n", pVTab, c)); - - return SQLITE_OK; -} - - -/* Free all of the dynamically allocated memory held by *q -*/ -static void queryClear(Query *q){ - int i; - for(i = 0; i < q->nTerms; ++i){ - free(q->pTerms[i].pTerm); - } - free(q->pTerms); - memset(q, 0, sizeof(*q)); -} - -/* Free all of the dynamically allocated memory held by the -** Snippet -*/ -static void snippetClear(Snippet *p){ - free(p->aMatch); - free(p->zOffset); - free(p->zSnippet); - memset(p, 0, sizeof(*p)); -} -/* -** Append a single entry to the p->aMatch[] log. -*/ -static void snippetAppendMatch( - Snippet *p, /* Append the entry to this snippet */ - int iCol, int iTerm, /* The column and query term */ - int iStart, int nByte /* Offset and size of the match */ -){ - int i; - struct snippetMatch *pMatch; - if( p->nMatch+1>=p->nAlloc ){ - p->nAlloc = p->nAlloc*2 + 10; - p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); - if( p->aMatch==0 ){ - p->nMatch = 0; - p->nAlloc = 0; - return; - } - } - i = p->nMatch++; - pMatch = &p->aMatch[i]; - pMatch->iCol = iCol; - pMatch->iTerm = iTerm; - pMatch->iStart = iStart; - pMatch->nByte = nByte; -} - -/* -** Sizing information for the circular buffer used in snippetOffsetsOfColumn() -*/ -#define FTS1_ROTOR_SZ (32) -#define FTS1_ROTOR_MASK (FTS1_ROTOR_SZ-1) - -/* -** Add entries to pSnippet->aMatch[] for every match that occurs against -** document zDoc[0..nDoc-1] which is stored in column iColumn. -*/ -static void snippetOffsetsOfColumn( - Query *pQuery, - Snippet *pSnippet, - int iColumn, - const char *zDoc, - int nDoc -){ - const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ - sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ - sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ - fulltext_vtab *pVtab; /* The full text index */ - int nColumn; /* Number of columns in the index */ - const QueryTerm *aTerm; /* Query string terms */ - int nTerm; /* Number of query string terms */ - int i, j; /* Loop counters */ - int rc; /* Return code */ - unsigned int match, prevMatch; /* Phrase search bitmasks */ - const char *zToken; /* Next token from the tokenizer */ - int nToken; /* Size of zToken */ - int iBegin, iEnd, iPos; /* Offsets of beginning and end */ - - /* The following variables keep a circular buffer of the last - ** few tokens */ - unsigned int iRotor = 0; /* Index of current token */ - int iRotorBegin[FTS1_ROTOR_SZ]; /* Beginning offset of token */ - int iRotorLen[FTS1_ROTOR_SZ]; /* Length of token */ - - pVtab = pQuery->pFts; - nColumn = pVtab->nColumn; - pTokenizer = pVtab->pTokenizer; - pTModule = pTokenizer->pModule; - rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); - if( rc ) return; - pTCursor->pTokenizer = pTokenizer; - aTerm = pQuery->pTerms; - nTerm = pQuery->nTerms; - if( nTerm>=FTS1_ROTOR_SZ ){ - nTerm = FTS1_ROTOR_SZ - 1; - } - prevMatch = 0; - while(1){ - rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); - if( rc ) break; - iRotorBegin[iRotor&FTS1_ROTOR_MASK] = iBegin; - iRotorLen[iRotor&FTS1_ROTOR_MASK] = iEnd-iBegin; - match = 0; - for(i=0; i=0 && iCol1 && (prevMatch & (1<=0; j--){ - int k = (iRotor-j) & FTS1_ROTOR_MASK; - snippetAppendMatch(pSnippet, iColumn, i-j, - iRotorBegin[k], iRotorLen[k]); - } - } - } - prevMatch = match<<1; - iRotor++; - } - pTModule->xClose(pTCursor); -} - - -/* -** Compute all offsets for the current row of the query. -** If the offsets have already been computed, this routine is a no-op. -*/ -static void snippetAllOffsets(fulltext_cursor *p){ - int nColumn; - int iColumn, i; - int iFirst, iLast; - fulltext_vtab *pFts; - - if( p->snippet.nMatch ) return; - if( p->q.nTerms==0 ) return; - pFts = p->q.pFts; - nColumn = pFts->nColumn; - iColumn = p->iCursorType - QUERY_FULLTEXT; - if( iColumn<0 || iColumn>=nColumn ){ - iFirst = 0; - iLast = nColumn-1; - }else{ - iFirst = iColumn; - iLast = iColumn; - } - for(i=iFirst; i<=iLast; i++){ - const char *zDoc; - int nDoc; - zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); - nDoc = sqlite3_column_bytes(p->pStmt, i+1); - snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc); - } -} - -/* -** Convert the information in the aMatch[] array of the snippet -** into the string zOffset[0..nOffset-1]. -*/ -static void snippetOffsetText(Snippet *p){ - int i; - int cnt = 0; - StringBuffer sb; - char zBuf[200]; - if( p->zOffset ) return; - initStringBuffer(&sb); - for(i=0; inMatch; i++){ - struct snippetMatch *pMatch = &p->aMatch[i]; - zBuf[0] = ' '; - sprintf(&zBuf[cnt>0], "%d %d %d %d", pMatch->iCol, - pMatch->iTerm, pMatch->iStart, pMatch->nByte); - append(&sb, zBuf); - cnt++; - } - p->zOffset = sb.s; - p->nOffset = sb.len; -} - -/* -** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set -** of matching words some of which might be in zDoc. zDoc is column -** number iCol. -** -** iBreak is suggested spot in zDoc where we could begin or end an -** excerpt. Return a value similar to iBreak but possibly adjusted -** to be a little left or right so that the break point is better. -*/ -static int wordBoundary( - int iBreak, /* The suggested break point */ - const char *zDoc, /* Document text */ - int nDoc, /* Number of bytes in zDoc[] */ - struct snippetMatch *aMatch, /* Matching words */ - int nMatch, /* Number of entries in aMatch[] */ - int iCol /* The column number for zDoc[] */ -){ - int i; - if( iBreak<=10 ){ - return 0; - } - if( iBreak>=nDoc-10 ){ - return nDoc; - } - for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ - return aMatch[i-1].iStart; - } - } - for(i=1; i<=10; i++){ - if( safe_isspace(zDoc[iBreak-i]) ){ - return iBreak - i + 1; - } - if( safe_isspace(zDoc[iBreak+i]) ){ - return iBreak + i + 1; - } - } - return iBreak; -} - -/* -** If the StringBuffer does not end in white space, add a single -** space character to the end. -*/ -static void appendWhiteSpace(StringBuffer *p){ - if( p->len==0 ) return; - if( safe_isspace(p->s[p->len-1]) ) return; - append(p, " "); -} - -/* -** Remove white space from teh end of the StringBuffer -*/ -static void trimWhiteSpace(StringBuffer *p){ - while( p->len>0 && safe_isspace(p->s[p->len-1]) ){ - p->len--; - } -} - - - -/* -** Allowed values for Snippet.aMatch[].snStatus -*/ -#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ -#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ - -/* -** Generate the text of a snippet. -*/ -static void snippetText( - fulltext_cursor *pCursor, /* The cursor we need the snippet for */ - const char *zStartMark, /* Markup to appear before each match */ - const char *zEndMark, /* Markup to appear after each match */ - const char *zEllipsis /* Ellipsis mark */ -){ - int i, j; - struct snippetMatch *aMatch; - int nMatch; - int nDesired; - StringBuffer sb; - int tailCol; - int tailOffset; - int iCol; - int nDoc; - const char *zDoc; - int iStart, iEnd; - int tailEllipsis = 0; - int iMatch; - - - free(pCursor->snippet.zSnippet); - pCursor->snippet.zSnippet = 0; - aMatch = pCursor->snippet.aMatch; - nMatch = pCursor->snippet.nMatch; - initStringBuffer(&sb); - - for(i=0; iq.nTerms; i++){ - for(j=0; j0; i++){ - if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; - nDesired--; - iCol = aMatch[i].iCol; - zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); - nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); - iStart = aMatch[i].iStart - 40; - iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); - if( iStart<=10 ){ - iStart = 0; - } - if( iCol==tailCol && iStart<=tailOffset+20 ){ - iStart = tailOffset; - } - if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ - trimWhiteSpace(&sb); - appendWhiteSpace(&sb); - append(&sb, zEllipsis); - appendWhiteSpace(&sb); - } - iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; - iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); - if( iEnd>=nDoc-10 ){ - iEnd = nDoc; - tailEllipsis = 0; - }else{ - tailEllipsis = 1; - } - while( iMatchsnippet.zSnippet = sb.s; - pCursor->snippet.nSnippet = sb.len; -} - - -/* -** Close the cursor. For additional information see the documentation -** on the xClose method of the virtual table interface. -*/ -static int fulltextClose(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - TRACE(("FTS1 Close %p\n", c)); - sqlite3_finalize(c->pStmt); - queryClear(&c->q); - snippetClear(&c->snippet); - if( c->result.pDoclist!=NULL ){ - docListDelete(c->result.pDoclist); - } - free(c); - return SQLITE_OK; -} - -static int fulltextNext(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - sqlite_int64 iDocid; - int rc; - - TRACE(("FTS1 Next %p\n", pCursor)); - snippetClear(&c->snippet); - if( c->iCursorType < QUERY_FULLTEXT ){ - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - switch( rc ){ - case SQLITE_ROW: - c->eof = 0; - return SQLITE_OK; - case SQLITE_DONE: - c->eof = 1; - return SQLITE_OK; - default: - c->eof = 1; - return rc; - } - } else { /* full-text query */ - rc = sqlite3_reset(c->pStmt); - if( rc!=SQLITE_OK ) return rc; - - iDocid = nextDocid(&c->result); - if( iDocid==0 ){ - c->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_bind_int64(c->pStmt, 1, iDocid); - if( rc!=SQLITE_OK ) return rc; - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - if( rc==SQLITE_ROW ){ /* the case we expect */ - c->eof = 0; - return SQLITE_OK; - } - /* an error occurred; abort */ - return rc==SQLITE_DONE ? SQLITE_ERROR : rc; - } -} - - -/* Return a DocList corresponding to the query term *pTerm. If *pTerm -** is the first term of a phrase query, go ahead and evaluate the phrase -** query and return the doclist for the entire phrase query. -** -** The result is stored in pTerm->doclist. -*/ -static int docListOfTerm( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* column to restrict to. No restrition if >=nColumn */ - QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */ - DocList **ppResult /* Write the result here */ -){ - DocList *pLeft, *pRight, *pNew; - int i, rc; - - pLeft = docListNew(DL_POSITIONS); - rc = term_select_all(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pLeft); - if( rc ){ - docListDelete(pLeft); - return rc; - } - for(i=1; i<=pQTerm->nPhrase; i++){ - pRight = docListNew(DL_POSITIONS); - rc = term_select_all(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm, pRight); - if( rc ){ - docListDelete(pLeft); - return rc; - } - pNew = docListNew(inPhrase ? DL_POSITIONS : DL_DOCIDS); - docListPhraseMerge(pLeft, pRight, pNew); - docListDelete(pLeft); - docListDelete(pRight); - pLeft = pNew; - } - *ppResult = pLeft; - return SQLITE_OK; -} - -/* Add a new term pTerm[0..nTerm-1] to the query *q. -*/ -static void queryAdd(Query *q, const char *pTerm, int nTerm){ - QueryTerm *t; - ++q->nTerms; - q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0])); - if( q->pTerms==0 ){ - q->nTerms = 0; - return; - } - t = &q->pTerms[q->nTerms - 1]; - memset(t, 0, sizeof(*t)); - t->pTerm = malloc(nTerm+1); - memcpy(t->pTerm, pTerm, nTerm); - t->pTerm[nTerm] = 0; - t->nTerm = nTerm; - t->isOr = q->nextIsOr; - q->nextIsOr = 0; - t->iColumn = q->nextColumn; - q->nextColumn = q->dfltColumn; -} - -/* -** Check to see if the string zToken[0...nToken-1] matches any -** column name in the virtual table. If it does, -** return the zero-indexed column number. If not, return -1. -*/ -static int checkColumnSpecifier( - fulltext_vtab *pVtab, /* The virtual table */ - const char *zToken, /* Text of the token */ - int nToken /* Number of characters in the token */ -){ - int i; - for(i=0; inColumn; i++){ - if( memcmp(pVtab->azColumn[i], zToken, nToken)==0 - && pVtab->azColumn[i][nToken]==0 ){ - return i; - } - } - return -1; -} - -/* -** Parse the text at pSegment[0..nSegment-1]. Add additional terms -** to the query being assemblied in pQuery. -** -** inPhrase is true if pSegment[0..nSegement-1] is contained within -** double-quotes. If inPhrase is true, then the first term -** is marked with the number of terms in the phrase less one and -** OR and "-" syntax is ignored. If inPhrase is false, then every -** term found is marked with nPhrase=0 and OR and "-" syntax is significant. -*/ -static int tokenizeSegment( - sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */ - const char *pSegment, int nSegment, /* Query expression being parsed */ - int inPhrase, /* True if within "..." */ - Query *pQuery /* Append results here */ -){ - const sqlite3_tokenizer_module *pModule = pTokenizer->pModule; - sqlite3_tokenizer_cursor *pCursor; - int firstIndex = pQuery->nTerms; - int iCol; - int nTerm = 1; - - int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor); - if( rc!=SQLITE_OK ) return rc; - pCursor->pTokenizer = pTokenizer; - - while( 1 ){ - const char *pToken; - int nToken, iBegin, iEnd, iPos; - - rc = pModule->xNext(pCursor, - &pToken, &nToken, - &iBegin, &iEnd, &iPos); - if( rc!=SQLITE_OK ) break; - if( !inPhrase && - pSegment[iEnd]==':' && - (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){ - pQuery->nextColumn = iCol; - continue; - } - if( !inPhrase && pQuery->nTerms>0 && nToken==2 - && pSegment[iBegin]=='O' && pSegment[iBegin+1]=='R' ){ - pQuery->nextIsOr = 1; - continue; - } - queryAdd(pQuery, pToken, nToken); - if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){ - pQuery->pTerms[pQuery->nTerms-1].isNot = 1; - } - pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm; - if( inPhrase ){ - nTerm++; - } - } - - if( inPhrase && pQuery->nTerms>firstIndex ){ - pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1; - } - - return pModule->xClose(pCursor); -} - -/* Parse a query string, yielding a Query object pQuery. -** -** The calling function will need to queryClear() to clean up -** the dynamically allocated memory held by pQuery. -*/ -static int parseQuery( - fulltext_vtab *v, /* The fulltext index */ - const char *zInput, /* Input text of the query string */ - int nInput, /* Size of the input text */ - int dfltColumn, /* Default column of the index to match against */ - Query *pQuery /* Write the parse results here. */ -){ - int iInput, inPhrase = 0; - - if( zInput==0 ) nInput = 0; - if( nInput<0 ) nInput = strlen(zInput); - pQuery->nTerms = 0; - pQuery->pTerms = NULL; - pQuery->nextIsOr = 0; - pQuery->nextColumn = dfltColumn; - pQuery->dfltColumn = dfltColumn; - pQuery->pFts = v; - - for(iInput=0; iInputiInput ){ - tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase, - pQuery); - } - iInput = i; - if( i=nColumn -** they are allowed to match against any column. -*/ -static int fulltextQuery( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* Match against this column by default */ - const char *zInput, /* The query string */ - int nInput, /* Number of bytes in zInput[] */ - DocList **pResult, /* Write the result doclist here */ - Query *pQuery /* Put parsed query string here */ -){ - int i, iNext, rc; - DocList *pLeft = NULL; - DocList *pRight, *pNew, *pOr; - int nNot = 0; - QueryTerm *aTerm; - - rc = parseQuery(v, zInput, nInput, iColumn, pQuery); - if( rc!=SQLITE_OK ) return rc; - - /* Merge AND terms. */ - aTerm = pQuery->pTerms; - for(i = 0; inTerms; i=iNext){ - if( aTerm[i].isNot ){ - /* Handle all NOT terms in a separate pass */ - nNot++; - iNext = i + aTerm[i].nPhrase+1; - continue; - } - iNext = i + aTerm[i].nPhrase + 1; - rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &pRight); - if( rc ){ - queryClear(pQuery); - return rc; - } - while( iNextnTerms && aTerm[iNext].isOr ){ - rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &pOr); - iNext += aTerm[iNext].nPhrase + 1; - if( rc ){ - queryClear(pQuery); - return rc; - } - pNew = docListNew(DL_DOCIDS); - docListOrMerge(pRight, pOr, pNew); - docListDelete(pRight); - docListDelete(pOr); - pRight = pNew; - } - if( pLeft==0 ){ - pLeft = pRight; - }else{ - pNew = docListNew(DL_DOCIDS); - docListAndMerge(pLeft, pRight, pNew); - docListDelete(pRight); - docListDelete(pLeft); - pLeft = pNew; - } - } - - if( nNot && pLeft==0 ){ - /* We do not yet know how to handle a query of only NOT terms */ - return SQLITE_ERROR; - } - - /* Do the EXCEPT terms */ - for(i=0; inTerms; i += aTerm[i].nPhrase + 1){ - if( !aTerm[i].isNot ) continue; - rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &pRight); - if( rc ){ - queryClear(pQuery); - docListDelete(pLeft); - return rc; - } - pNew = docListNew(DL_DOCIDS); - docListExceptMerge(pLeft, pRight, pNew); - docListDelete(pRight); - docListDelete(pLeft); - pLeft = pNew; - } - - *pResult = pLeft; - return rc; -} - -/* -** This is the xFilter interface for the virtual table. See -** the virtual table xFilter method documentation for additional -** information. -** -** If idxNum==QUERY_GENERIC then do a full table scan against -** the %_content table. -** -** If idxNum==QUERY_ROWID then do a rowid lookup for a single entry -** in the %_content table. -** -** If idxNum>=QUERY_FULLTEXT then use the full text index. The -** column on the left-hand side of the MATCH operator is column -** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand -** side of the MATCH operator. -*/ -/* TODO(shess) Upgrade the cursor initialization and destruction to -** account for fulltextFilter() being called multiple times on the -** same cursor. The current solution is very fragile. Apply fix to -** fts2 as appropriate. -*/ -static int fulltextFilter( - sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ - int idxNum, const char *idxStr, /* Which indexing scheme to use */ - int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ -){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - int rc; - char *zSql; - - TRACE(("FTS1 Filter %p\n",pCursor)); - - zSql = sqlite3_mprintf("select rowid, * from %%_content %s", - idxNum==QUERY_GENERIC ? "" : "where rowid=?"); - sqlite3_finalize(c->pStmt); - rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, zSql); - sqlite3_free(zSql); - if( rc!=SQLITE_OK ) return rc; - - c->iCursorType = idxNum; - switch( idxNum ){ - case QUERY_GENERIC: - break; - - case QUERY_ROWID: - rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); - if( rc!=SQLITE_OK ) return rc; - break; - - default: /* full-text search */ - { - const char *zQuery = (const char *)sqlite3_value_text(argv[0]); - DocList *pResult; - assert( idxNum<=QUERY_FULLTEXT+v->nColumn); - assert( argc==1 ); - queryClear(&c->q); - rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &pResult, &c->q); - if( rc!=SQLITE_OK ) return rc; - if( c->result.pDoclist!=NULL ) docListDelete(c->result.pDoclist); - readerInit(&c->result, pResult); - break; - } - } - - return fulltextNext(pCursor); -} - -/* This is the xEof method of the virtual table. The SQLite core -** calls this routine to find out if it has reached the end of -** a query's results set. -*/ -static int fulltextEof(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - return c->eof; -} - -/* This is the xColumn method of the virtual table. The SQLite -** core calls this method during a query when it needs the value -** of a column from the virtual table. This method needs to use -** one of the sqlite3_result_*() routines to store the requested -** value back in the pContext. -*/ -static int fulltextColumn(sqlite3_vtab_cursor *pCursor, - sqlite3_context *pContext, int idxCol){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - - if( idxColnColumn ){ - sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); - sqlite3_result_value(pContext, pVal); - }else if( idxCol==v->nColumn ){ - /* The extra column whose name is the same as the table. - ** Return a blob which is a pointer to the cursor - */ - sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); - } - return SQLITE_OK; -} - -/* This is the xRowid method. The SQLite core calls this routine to -** retrive the rowid for the current row of the result set. The -** rowid should be written to *pRowid. -*/ -static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - - *pRowid = sqlite3_column_int64(c->pStmt, 0); - return SQLITE_OK; -} - -/* Add all terms in [zText] to the given hash table. If [iColumn] > 0, - * we also store positions and offsets in the hash table using the given - * column number. */ -static int buildTerms(fulltext_vtab *v, fts1Hash *terms, sqlite_int64 iDocid, - const char *zText, int iColumn){ - sqlite3_tokenizer *pTokenizer = v->pTokenizer; - sqlite3_tokenizer_cursor *pCursor; - const char *pToken; - int nTokenBytes; - int iStartOffset, iEndOffset, iPosition; - int rc; - - rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); - if( rc!=SQLITE_OK ) return rc; - - pCursor->pTokenizer = pTokenizer; - while( SQLITE_OK==pTokenizer->pModule->xNext(pCursor, - &pToken, &nTokenBytes, - &iStartOffset, &iEndOffset, - &iPosition) ){ - DocList *p; - - /* Positions can't be negative; we use -1 as a terminator internally. */ - if( iPosition<0 ){ - pTokenizer->pModule->xClose(pCursor); - return SQLITE_ERROR; - } - - p = fts1HashFind(terms, pToken, nTokenBytes); - if( p==NULL ){ - p = docListNew(DL_DEFAULT); - docListAddDocid(p, iDocid); - fts1HashInsert(terms, pToken, nTokenBytes, p); - } - if( iColumn>=0 ){ - docListAddPosOffset(p, iColumn, iPosition, iStartOffset, iEndOffset); - } - } - - /* TODO(shess) Check return? Should this be able to cause errors at - ** this point? Actually, same question about sqlite3_finalize(), - ** though one could argue that failure there means that the data is - ** not durable. *ponder* - */ - pTokenizer->pModule->xClose(pCursor); - return rc; -} - -/* Update the %_terms table to map the term [pTerm] to the given rowid. */ -static int index_insert_term(fulltext_vtab *v, const char *pTerm, int nTerm, - DocList *d){ - sqlite_int64 iIndexRow; - DocList doclist; - int iSegment = 0, rc; - - rc = term_select(v, pTerm, nTerm, iSegment, &iIndexRow, &doclist); - if( rc==SQLITE_DONE ){ - docListInit(&doclist, DL_DEFAULT, 0, 0); - docListUpdate(&doclist, d); - /* TODO(shess) Consider length(doclist)>CHUNK_MAX? */ - rc = term_insert(v, NULL, pTerm, nTerm, iSegment, &doclist); - goto err; - } - if( rc!=SQLITE_ROW ) return SQLITE_ERROR; - - docListUpdate(&doclist, d); - if( doclist.nData<=CHUNK_MAX ){ - rc = term_update(v, iIndexRow, &doclist); - goto err; - } - - /* Doclist doesn't fit, delete what's there, and accumulate - ** forward. - */ - rc = term_delete(v, iIndexRow); - if( rc!=SQLITE_OK ) goto err; - - /* Try to insert the doclist into a higher segment bucket. On - ** failure, accumulate existing doclist with the doclist from that - ** bucket, and put results in the next bucket. - */ - iSegment++; - while( (rc=term_insert(v, &iIndexRow, pTerm, nTerm, iSegment, - &doclist))!=SQLITE_OK ){ - sqlite_int64 iSegmentRow; - DocList old; - int rc2; - - /* Retain old error in case the term_insert() error was really an - ** error rather than a bounced insert. - */ - rc2 = term_select(v, pTerm, nTerm, iSegment, &iSegmentRow, &old); - if( rc2!=SQLITE_ROW ) goto err; - - rc = term_delete(v, iSegmentRow); - if( rc!=SQLITE_OK ) goto err; - - /* Reusing lowest-number deleted row keeps the index smaller. */ - if( iSegmentRownColumn ; ++i){ - char *zText = (char*)sqlite3_value_text(pValues[i]); - int rc = buildTerms(v, terms, iRowid, zText, i); - if( rc!=SQLITE_OK ) return rc; - } - return SQLITE_OK; -} - -/* Add empty doclists for all terms in the given row's content to the hash - * table [pTerms]. */ -static int deleteTerms(fulltext_vtab *v, fts1Hash *pTerms, sqlite_int64 iRowid){ - const char **pValues; - int i; - - int rc = content_select(v, iRowid, &pValues); - if( rc!=SQLITE_OK ) return rc; - - for(i = 0 ; i < v->nColumn; ++i) { - rc = buildTerms(v, pTerms, iRowid, pValues[i], -1); - if( rc!=SQLITE_OK ) break; - } - - freeStringArray(v->nColumn, pValues); - return SQLITE_OK; -} - -/* Insert a row into the %_content table; set *piRowid to be the ID of the - * new row. Fill [pTerms] with new doclists for the %_term table. */ -static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestRowid, - sqlite3_value **pValues, - sqlite_int64 *piRowid, fts1Hash *pTerms){ - int rc; - - rc = content_insert(v, pRequestRowid, pValues); /* execute an SQL INSERT */ - if( rc!=SQLITE_OK ) return rc; - *piRowid = sqlite3_last_insert_rowid(v->db); - return insertTerms(v, pTerms, *piRowid, pValues); -} - -/* Delete a row from the %_content table; fill [pTerms] with empty doclists - * to be written to the %_term table. */ -static int index_delete(fulltext_vtab *v, sqlite_int64 iRow, fts1Hash *pTerms){ - int rc = deleteTerms(v, pTerms, iRow); - if( rc!=SQLITE_OK ) return rc; - return content_delete(v, iRow); /* execute an SQL DELETE */ -} - -/* Update a row in the %_content table; fill [pTerms] with new doclists for the - * %_term table. */ -static int index_update(fulltext_vtab *v, sqlite_int64 iRow, - sqlite3_value **pValues, fts1Hash *pTerms){ - /* Generate an empty doclist for each term that previously appeared in this - * row. */ - int rc = deleteTerms(v, pTerms, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ - if( rc!=SQLITE_OK ) return rc; - - /* Now add positions for terms which appear in the updated row. */ - return insertTerms(v, pTerms, iRow, pValues); -} - -/* This function implements the xUpdate callback; it's the top-level entry - * point for inserting, deleting or updating a row in a full-text table. */ -static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, - sqlite_int64 *pRowid){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - fts1Hash terms; /* maps term string -> PosList */ - int rc; - fts1HashElem *e; - - TRACE(("FTS1 Update %p\n", pVtab)); - - fts1HashInit(&terms, FTS1_HASH_STRING, 1); - - if( nArg<2 ){ - rc = index_delete(v, sqlite3_value_int64(ppArg[0]), &terms); - } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ - /* An update: - * ppArg[0] = old rowid - * ppArg[1] = new rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - */ - sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); - if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || - sqlite3_value_int64(ppArg[1]) != rowid ){ - rc = SQLITE_ERROR; /* we don't allow changing the rowid */ - } else { - assert( nArg==2+v->nColumn+1); - rc = index_update(v, rowid, &ppArg[2], &terms); - } - } else { - /* An insert: - * ppArg[1] = requested rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - */ - assert( nArg==2+v->nColumn+1); - rc = index_insert(v, ppArg[1], &ppArg[2], pRowid, &terms); - } - - if( rc==SQLITE_OK ){ - /* Write updated doclists to disk. */ - for(e=fts1HashFirst(&terms); e; e=fts1HashNext(e)){ - DocList *p = fts1HashData(e); - rc = index_insert_term(v, fts1HashKey(e), fts1HashKeysize(e), p); - if( rc!=SQLITE_OK ) break; - } - } - - /* clean up */ - for(e=fts1HashFirst(&terms); e; e=fts1HashNext(e)){ - DocList *p = fts1HashData(e); - docListDelete(p); - } - fts1HashClear(&terms); - - return rc; -} - -/* -** Implementation of the snippet() function for FTS1 -*/ -static void snippetFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); - }else{ - const char *zStart = ""; - const char *zEnd = ""; - const char *zEllipsis = "..."; - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - if( argc>=2 ){ - zStart = (const char*)sqlite3_value_text(argv[1]); - if( argc>=3 ){ - zEnd = (const char*)sqlite3_value_text(argv[2]); - if( argc>=4 ){ - zEllipsis = (const char*)sqlite3_value_text(argv[3]); - } - } - } - snippetAllOffsets(pCursor); - snippetText(pCursor, zStart, zEnd, zEllipsis); - sqlite3_result_text(pContext, pCursor->snippet.zSnippet, - pCursor->snippet.nSnippet, SQLITE_STATIC); - } -} - -/* -** Implementation of the offsets() function for FTS1 -*/ -static void snippetOffsetsFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to offsets",-1); - }else{ - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - snippetAllOffsets(pCursor); - snippetOffsetText(&pCursor->snippet); - sqlite3_result_text(pContext, - pCursor->snippet.zOffset, pCursor->snippet.nOffset, - SQLITE_STATIC); - } -} - -/* -** This routine implements the xFindFunction method for the FTS1 -** virtual table. -*/ -static int fulltextFindFunction( - sqlite3_vtab *pVtab, - int nArg, - const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg -){ - if( strcmp(zName,"snippet")==0 ){ - *pxFunc = snippetFunc; - return 1; - }else if( strcmp(zName,"offsets")==0 ){ - *pxFunc = snippetOffsetsFunc; - return 1; - } - return 0; -} - -/* -** Rename an fts1 table. -*/ -static int fulltextRename( - sqlite3_vtab *pVtab, - const char *zName -){ - fulltext_vtab *p = (fulltext_vtab *)pVtab; - int rc = SQLITE_NOMEM; - char *zSql = sqlite3_mprintf( - "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" - "ALTER TABLE %Q.'%q_term' RENAME TO '%q_term';" - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - ); - if( zSql ){ - rc = sqlite3_exec(p->db, zSql, 0, 0, 0); - sqlite3_free(zSql); - } - return rc; -} - -static const sqlite3_module fulltextModule = { - /* iVersion */ 0, - /* xCreate */ fulltextCreate, - /* xConnect */ fulltextConnect, - /* xBestIndex */ fulltextBestIndex, - /* xDisconnect */ fulltextDisconnect, - /* xDestroy */ fulltextDestroy, - /* xOpen */ fulltextOpen, - /* xClose */ fulltextClose, - /* xFilter */ fulltextFilter, - /* xNext */ fulltextNext, - /* xEof */ fulltextEof, - /* xColumn */ fulltextColumn, - /* xRowid */ fulltextRowid, - /* xUpdate */ fulltextUpdate, - /* xBegin */ 0, - /* xSync */ 0, - /* xCommit */ 0, - /* xRollback */ 0, - /* xFindFunction */ fulltextFindFunction, - /* xRename */ fulltextRename, -}; - -int sqlite3Fts1Init(sqlite3 *db){ - sqlite3_overload_function(db, "snippet", -1); - sqlite3_overload_function(db, "offsets", -1); - return sqlite3_create_module(db, "fts1", &fulltextModule, 0); -} - -#if !SQLITE_CORE -int sqlite3_extension_init(sqlite3 *db, char **pzErrMsg, - const sqlite3_api_routines *pApi){ - SQLITE_EXTENSION_INIT2(pApi) - return sqlite3Fts1Init(db); -} -#endif - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h deleted file mode 100644 index d55e689733..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1.h +++ /dev/null @@ -1,11 +0,0 @@ -#include "sqlite3.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int sqlite3Fts1Init(sqlite3 *db); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c deleted file mode 100644 index 463a52b645..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the implementation of generic hash-tables used in SQLite. -** We've modified it slightly to serve as a standalone hash table -** implementation for the full-text indexing module. -*/ -#include -#include -#include - -/* -** The code in this file is only compiled if: -** -** * The FTS1 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS1 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) - - -#include "fts1_hash.h" - -static void *malloc_and_zero(int n){ - void *p = malloc(n); - if( p ){ - memset(p, 0, n); - } - return p; -} - -/* Turn bulk memory into a hash table object by initializing the -** fields of the Hash structure. -** -** "pNew" is a pointer to the hash table that is to be initialized. -** keyClass is one of the constants -** FTS1_HASH_BINARY or FTS1_HASH_STRING. The value of keyClass -** determines what kind of key the hash table will use. "copyKey" is -** true if the hash table should make its own private copy of keys and -** false if it should just use the supplied pointer. -*/ -void sqlite3Fts1HashInit(fts1Hash *pNew, int keyClass, int copyKey){ - assert( pNew!=0 ); - assert( keyClass>=FTS1_HASH_STRING && keyClass<=FTS1_HASH_BINARY ); - pNew->keyClass = keyClass; - pNew->copyKey = copyKey; - pNew->first = 0; - pNew->count = 0; - pNew->htsize = 0; - pNew->ht = 0; - pNew->xMalloc = malloc_and_zero; - pNew->xFree = free; -} - -/* Remove all entries from a hash table. Reclaim all memory. -** Call this routine to delete a hash table or to reset a hash table -** to the empty state. -*/ -void sqlite3Fts1HashClear(fts1Hash *pH){ - fts1HashElem *elem; /* For looping over all elements of the table */ - - assert( pH!=0 ); - elem = pH->first; - pH->first = 0; - if( pH->ht ) pH->xFree(pH->ht); - pH->ht = 0; - pH->htsize = 0; - while( elem ){ - fts1HashElem *next_elem = elem->next; - if( pH->copyKey && elem->pKey ){ - pH->xFree(elem->pKey); - } - pH->xFree(elem); - elem = next_elem; - } - pH->count = 0; -} - -/* -** Hash and comparison functions when the mode is FTS1_HASH_STRING -*/ -static int strHash(const void *pKey, int nKey){ - const char *z = (const char *)pKey; - int h = 0; - if( nKey<=0 ) nKey = (int) strlen(z); - while( nKey > 0 ){ - h = (h<<3) ^ h ^ *z++; - nKey--; - } - return h & 0x7fffffff; -} -static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return strncmp((const char*)pKey1,(const char*)pKey2,n1); -} - -/* -** Hash and comparison functions when the mode is FTS1_HASH_BINARY -*/ -static int binHash(const void *pKey, int nKey){ - int h = 0; - const char *z = (const char *)pKey; - while( nKey-- > 0 ){ - h = (h<<3) ^ h ^ *(z++); - } - return h & 0x7fffffff; -} -static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return memcmp(pKey1,pKey2,n1); -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** The C syntax in this function definition may be unfamilar to some -** programmers, so we provide the following additional explanation: -** -** The name of the function is "hashFunction". The function takes a -** single parameter "keyClass". The return value of hashFunction() -** is a pointer to another function. Specifically, the return value -** of hashFunction() is a pointer to a function that takes two parameters -** with types "const void*" and "int" and returns an "int". -*/ -static int (*hashFunction(int keyClass))(const void*,int){ - if( keyClass==FTS1_HASH_STRING ){ - return &strHash; - }else{ - assert( keyClass==FTS1_HASH_BINARY ); - return &binHash; - } -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** For help in interpreted the obscure C code in the function definition, -** see the header comment on the previous function. -*/ -static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ - if( keyClass==FTS1_HASH_STRING ){ - return &strCompare; - }else{ - assert( keyClass==FTS1_HASH_BINARY ); - return &binCompare; - } -} - -/* Link an element into the hash table -*/ -static void insertElement( - fts1Hash *pH, /* The complete hash table */ - struct _fts1ht *pEntry, /* The entry into which pNew is inserted */ - fts1HashElem *pNew /* The element to be inserted */ -){ - fts1HashElem *pHead; /* First element already in pEntry */ - pHead = pEntry->chain; - if( pHead ){ - pNew->next = pHead; - pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } - pHead->prev = pNew; - }else{ - pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } - pNew->prev = 0; - pH->first = pNew; - } - pEntry->count++; - pEntry->chain = pNew; -} - - -/* Resize the hash table so that it cantains "new_size" buckets. -** "new_size" must be a power of 2. The hash table might fail -** to resize if sqliteMalloc() fails. -*/ -static void rehash(fts1Hash *pH, int new_size){ - struct _fts1ht *new_ht; /* The new hash table */ - fts1HashElem *elem, *next_elem; /* For looping over existing elements */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( (new_size & (new_size-1))==0 ); - new_ht = (struct _fts1ht *)pH->xMalloc( new_size*sizeof(struct _fts1ht) ); - if( new_ht==0 ) return; - if( pH->ht ) pH->xFree(pH->ht); - pH->ht = new_ht; - pH->htsize = new_size; - xHash = hashFunction(pH->keyClass); - for(elem=pH->first, pH->first=0; elem; elem = next_elem){ - int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); - next_elem = elem->next; - insertElement(pH, &new_ht[h], elem); - } -} - -/* This function (for internal use only) locates an element in an -** hash table that matches the given key. The hash for this key has -** already been computed and is passed as the 4th parameter. -*/ -static fts1HashElem *findElementGivenHash( - const fts1Hash *pH, /* The pH to be searched */ - const void *pKey, /* The key we are searching for */ - int nKey, - int h /* The hash for this key. */ -){ - fts1HashElem *elem; /* Used to loop thru the element list */ - int count; /* Number of elements left to test */ - int (*xCompare)(const void*,int,const void*,int); /* comparison function */ - - if( pH->ht ){ - struct _fts1ht *pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - xCompare = compareFunction(pH->keyClass); - while( count-- && elem ){ - if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ - return elem; - } - elem = elem->next; - } - } - return 0; -} - -/* Remove a single entry from the hash table given a pointer to that -** element and a hash on the element's key. -*/ -static void removeElementGivenHash( - fts1Hash *pH, /* The pH containing "elem" */ - fts1HashElem* elem, /* The element to be removed from the pH */ - int h /* Hash value for the element */ -){ - struct _fts1ht *pEntry; - if( elem->prev ){ - elem->prev->next = elem->next; - }else{ - pH->first = elem->next; - } - if( elem->next ){ - elem->next->prev = elem->prev; - } - pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ - pEntry->chain = elem->next; - } - pEntry->count--; - if( pEntry->count<=0 ){ - pEntry->chain = 0; - } - if( pH->copyKey && elem->pKey ){ - pH->xFree(elem->pKey); - } - pH->xFree( elem ); - pH->count--; - if( pH->count<=0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); - fts1HashClear(pH); - } -} - -/* Attempt to locate an element of the hash table pH with a key -** that matches pKey,nKey. Return the data for this element if it is -** found, or NULL if there is no match. -*/ -void *sqlite3Fts1HashFind(const fts1Hash *pH, const void *pKey, int nKey){ - int h; /* A hash on key */ - fts1HashElem *elem; /* The element that matches key */ - int (*xHash)(const void*,int); /* The hash function */ - - if( pH==0 || pH->ht==0 ) return 0; - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - h = (*xHash)(pKey,nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - elem = findElementGivenHash(pH,pKey,nKey, h & (pH->htsize-1)); - return elem ? elem->data : 0; -} - -/* Insert an element into the hash table pH. The key is pKey,nKey -** and the data is "data". -** -** If no element exists with a matching key, then a new -** element is created. A copy of the key is made if the copyKey -** flag is set. NULL is returned. -** -** If another element already exists with the same key, then the -** new data replaces the old data and the old data is returned. -** The key is not copied in this instance. If a malloc fails, then -** the new data is returned and the hash table is unchanged. -** -** If the "data" parameter to this function is NULL, then the -** element corresponding to "key" is removed from the hash table. -*/ -void *sqlite3Fts1HashInsert( - fts1Hash *pH, /* The hash table to insert into */ - const void *pKey, /* The key */ - int nKey, /* Number of bytes in the key */ - void *data /* The data */ -){ - int hraw; /* Raw hash value of the key */ - int h; /* the hash of the key modulo hash table size */ - fts1HashElem *elem; /* Used to loop thru the element list */ - fts1HashElem *new_elem; /* New element added to the pH */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( pH!=0 ); - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - hraw = (*xHash)(pKey, nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - elem = findElementGivenHash(pH,pKey,nKey,h); - if( elem ){ - void *old_data = elem->data; - if( data==0 ){ - removeElementGivenHash(pH,elem,h); - }else{ - elem->data = data; - } - return old_data; - } - if( data==0 ) return 0; - new_elem = (fts1HashElem*)pH->xMalloc( sizeof(fts1HashElem) ); - if( new_elem==0 ) return data; - if( pH->copyKey && pKey!=0 ){ - new_elem->pKey = pH->xMalloc( nKey ); - if( new_elem->pKey==0 ){ - pH->xFree(new_elem); - return data; - } - memcpy((void*)new_elem->pKey, pKey, nKey); - }else{ - new_elem->pKey = (void*)pKey; - } - new_elem->nKey = nKey; - pH->count++; - if( pH->htsize==0 ){ - rehash(pH,8); - if( pH->htsize==0 ){ - pH->count = 0; - pH->xFree(new_elem); - return data; - } - } - if( pH->count > pH->htsize ){ - rehash(pH,pH->htsize*2); - } - assert( pH->htsize>0 ); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - insertElement(pH, &pH->ht[h], new_elem); - new_elem->data = data; - return 0; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h deleted file mode 100644 index c31c430f7c..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_hash.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implemenation -** used in SQLite. We've modified it slightly to serve as a standalone -** hash table implementation for the full-text indexing module. -** -*/ -#ifndef _FTS1_HASH_H_ -#define _FTS1_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct fts1Hash fts1Hash; -typedef struct fts1HashElem fts1HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, many of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -*/ -struct fts1Hash { - char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ - char copyKey; /* True if copy of key made on insert */ - int count; /* Number of entries in this table */ - fts1HashElem *first; /* The first element of the array */ - void *(*xMalloc)(int); /* malloc() function to use */ - void (*xFree)(void *); /* free() function to use */ - int htsize; /* Number of buckets in the hash table */ - struct _fts1ht { /* the hash table */ - int count; /* Number of entries with this hash */ - fts1HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct fts1HashElem { - fts1HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - void *pKey; int nKey; /* Key associated with this element */ -}; - -/* -** There are 2 different modes of operation for a hash table: -** -** FTS1_HASH_STRING pKey points to a string that is nKey bytes long -** (including the null-terminator, if any). Case -** is respected in comparisons. -** -** FTS1_HASH_BINARY pKey points to binary data nKey bytes long. -** memcmp() is used to compare keys. -** -** A copy of the key is made if the copyKey parameter to fts1HashInit is 1. -*/ -#define FTS1_HASH_STRING 1 -#define FTS1_HASH_BINARY 2 - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -void sqlite3Fts1HashInit(fts1Hash*, int keytype, int copyKey); -void *sqlite3Fts1HashInsert(fts1Hash*, const void *pKey, int nKey, void *pData); -void *sqlite3Fts1HashFind(const fts1Hash*, const void *pKey, int nKey); -void sqlite3Fts1HashClear(fts1Hash*); - -/* -** Shorthand for the functions above -*/ -#define fts1HashInit sqlite3Fts1HashInit -#define fts1HashInsert sqlite3Fts1HashInsert -#define fts1HashFind sqlite3Fts1HashFind -#define fts1HashClear sqlite3Fts1HashClear - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** fts1Hash h; -** fts1HashElem *p; -** ... -** for(p=fts1HashFirst(&h); p; p=fts1HashNext(p)){ -** SomeStructure *pData = fts1HashData(p); -** // do something with pData -** } -*/ -#define fts1HashFirst(H) ((H)->first) -#define fts1HashNext(E) ((E)->next) -#define fts1HashData(E) ((E)->data) -#define fts1HashKey(E) ((E)->pKey) -#define fts1HashKeysize(E) ((E)->nKey) - -/* -** Number of entries in a hash table -*/ -#define fts1HashCount(H) ((H)->count) - -#endif /* _FTS1_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c deleted file mode 100644 index 1d26236681..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_porter.c +++ /dev/null @@ -1,643 +0,0 @@ -/* -** 2006 September 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Implementation of the full-text-search tokenizer that implements -** a Porter stemmer. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS1 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS1 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) - - -#include -#include -#include -#include -#include - -#include "fts1_tokenizer.h" - -/* -** Class derived from sqlite3_tokenizer -*/ -typedef struct porter_tokenizer { - sqlite3_tokenizer base; /* Base class */ -} porter_tokenizer; - -/* -** Class derived from sqlit3_tokenizer_cursor -*/ -typedef struct porter_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *zInput; /* input we are tokenizing */ - int nInput; /* size of the input */ - int iOffset; /* current position in zInput */ - int iToken; /* index of next token to be returned */ - char *zToken; /* storage for current token */ - int nAllocated; /* space allocated to zToken buffer */ -} porter_tokenizer_cursor; - - -/* Forward declaration */ -static const sqlite3_tokenizer_module porterTokenizerModule; - - -/* -** Create a new tokenizer instance. -*/ -static int porterCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - porter_tokenizer *t; - t = (porter_tokenizer *) calloc(sizeof(*t), 1); - if( t==NULL ) return SQLITE_NOMEM; - - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int porterDestroy(sqlite3_tokenizer *pTokenizer){ - free(pTokenizer); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is zInput[0..nInput-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int porterOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *zInput, int nInput, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - porter_tokenizer_cursor *c; - - c = (porter_tokenizer_cursor *) malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; - - c->zInput = zInput; - if( zInput==0 ){ - c->nInput = 0; - }else if( nInput<0 ){ - c->nInput = (int)strlen(zInput); - }else{ - c->nInput = nInput; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->zToken = NULL; /* no space allocated, yet. */ - c->nAllocated = 0; - - *ppCursor = &c->base; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to -** porterOpen() above. -*/ -static int porterClose(sqlite3_tokenizer_cursor *pCursor){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - free(c->zToken); - free(c); - return SQLITE_OK; -} -/* -** Vowel or consonant -*/ -static const char cType[] = { - 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 2, 1 -}; - -/* -** isConsonant() and isVowel() determine if their first character in -** the string they point to is a consonant or a vowel, according -** to Porter ruls. -** -** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. -** 'Y' is a consonant unless it follows another consonant, -** in which case it is a vowel. -** -** In these routine, the letters are in reverse order. So the 'y' rule -** is that 'y' is a consonant unless it is followed by another -** consonent. -*/ -static int isVowel(const char*); -static int isConsonant(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return j; - return z[1]==0 || isVowel(z + 1); -} -static int isVowel(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return 1-j; - return isConsonant(z + 1); -} - -/* -** Let any sequence of one or more vowels be represented by V and let -** C be sequence of one or more consonants. Then every word can be -** represented as: -** -** [C] (VC){m} [V] -** -** In prose: A word is an optional consonant followed by zero or -** vowel-consonant pairs followed by an optional vowel. "m" is the -** number of vowel consonant pairs. This routine computes the value -** of m for the first i bytes of a word. -** -** Return true if the m-value for z is 1 or more. In other words, -** return true if z contains at least one vowel that is followed -** by a consonant. -** -** In this routine z[] is in reverse order. So we are really looking -** for an instance of of a consonant followed by a vowel. -*/ -static int m_gt_0(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* Like mgt0 above except we are looking for a value of m which is -** exactly 1 -*/ -static int m_eq_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 1; - while( isConsonant(z) ){ z++; } - return *z==0; -} - -/* Like mgt0 above except we are looking for a value of m>1 instead -** or m>0 -*/ -static int m_gt_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* -** Return TRUE if there is a vowel anywhere within z[0..n-1] -*/ -static int hasVowel(const char *z){ - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* -** Return TRUE if the word ends in a double consonant. -** -** The text is reversed here. So we are really looking at -** the first two characters of z[]. -*/ -static int doubleConsonant(const char *z){ - return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); -} - -/* -** Return TRUE if the word ends with three letters which -** are consonant-vowel-consonent and where the final consonant -** is not 'w', 'x', or 'y'. -** -** The word is reversed here. So we are really checking the -** first three letters and the first one cannot be in [wxy]. -*/ -static int star_oh(const char *z){ - return - z[0]!=0 && isConsonant(z) && - z[0]!='w' && z[0]!='x' && z[0]!='y' && - z[1]!=0 && isVowel(z+1) && - z[2]!=0 && isConsonant(z+2); -} - -/* -** If the word ends with zFrom and xCond() is true for the stem -** of the word that preceeds the zFrom ending, then change the -** ending to zTo. -** -** The input word *pz and zFrom are both in reverse order. zTo -** is in normal order. -** -** Return TRUE if zFrom matches. Return FALSE if zFrom does not -** match. Not that TRUE is returned even if xCond() fails and -** no substitution occurs. -*/ -static int stem( - char **pz, /* The word being stemmed (Reversed) */ - const char *zFrom, /* If the ending matches this... (Reversed) */ - const char *zTo, /* ... change the ending to this (not reversed) */ - int (*xCond)(const char*) /* Condition that must be true */ -){ - char *z = *pz; - while( *zFrom && *zFrom==*z ){ z++; zFrom++; } - if( *zFrom!=0 ) return 0; - if( xCond && !xCond(z) ) return 1; - while( *zTo ){ - *(--z) = *(zTo++); - } - *pz = z; - return 1; -} - -/* -** This is the fallback stemmer used when the porter stemmer is -** inappropriate. The input word is copied into the output with -** US-ASCII case folding. If the input word is too long (more -** than 20 bytes if it contains no digits or more than 6 bytes if -** it contains digits) then word is truncated to 20 or 6 bytes -** by taking 10 or 3 bytes from the beginning and end. -*/ -static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ - int i, mx, j; - int hasDigit = 0; - for(i=0; i='A' && c<='Z' ){ - zOut[i] = c - 'A' + 'a'; - }else{ - if( c>='0' && c<='9' ) hasDigit = 1; - zOut[i] = c; - } - } - mx = hasDigit ? 3 : 10; - if( nIn>mx*2 ){ - for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ - /* The word is too big or too small for the porter stemmer. - ** Fallback to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ - zReverse[j] = c + 'a' - 'A'; - }else if( c>='a' && c<='z' ){ - zReverse[j] = c; - }else{ - /* The use of a character not in [a-zA-Z] means that we fallback - ** to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - } - memset(&zReverse[sizeof(zReverse)-5], 0, 5); - z = &zReverse[j+1]; - - - /* Step 1a */ - if( z[0]=='s' ){ - if( - !stem(&z, "sess", "ss", 0) && - !stem(&z, "sei", "i", 0) && - !stem(&z, "ss", "ss", 0) - ){ - z++; - } - } - - /* Step 1b */ - z2 = z; - if( stem(&z, "dee", "ee", m_gt_0) ){ - /* Do nothing. The work was all in the test */ - }else if( - (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) - && z!=z2 - ){ - if( stem(&z, "ta", "ate", 0) || - stem(&z, "lb", "ble", 0) || - stem(&z, "zi", "ize", 0) ){ - /* Do nothing. The work was all in the test */ - }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ - z++; - }else if( m_eq_1(z) && star_oh(z) ){ - *(--z) = 'e'; - } - } - - /* Step 1c */ - if( z[0]=='y' && hasVowel(z+1) ){ - z[0] = 'i'; - } - - /* Step 2 */ - switch( z[1] ){ - case 'a': - stem(&z, "lanoita", "ate", m_gt_0) || - stem(&z, "lanoit", "tion", m_gt_0); - break; - case 'c': - stem(&z, "icne", "ence", m_gt_0) || - stem(&z, "icna", "ance", m_gt_0); - break; - case 'e': - stem(&z, "rezi", "ize", m_gt_0); - break; - case 'g': - stem(&z, "igol", "log", m_gt_0); - break; - case 'l': - stem(&z, "ilb", "ble", m_gt_0) || - stem(&z, "illa", "al", m_gt_0) || - stem(&z, "iltne", "ent", m_gt_0) || - stem(&z, "ile", "e", m_gt_0) || - stem(&z, "ilsuo", "ous", m_gt_0); - break; - case 'o': - stem(&z, "noitazi", "ize", m_gt_0) || - stem(&z, "noita", "ate", m_gt_0) || - stem(&z, "rota", "ate", m_gt_0); - break; - case 's': - stem(&z, "msila", "al", m_gt_0) || - stem(&z, "ssenevi", "ive", m_gt_0) || - stem(&z, "ssenluf", "ful", m_gt_0) || - stem(&z, "ssensuo", "ous", m_gt_0); - break; - case 't': - stem(&z, "itila", "al", m_gt_0) || - stem(&z, "itivi", "ive", m_gt_0) || - stem(&z, "itilib", "ble", m_gt_0); - break; - } - - /* Step 3 */ - switch( z[0] ){ - case 'e': - stem(&z, "etaci", "ic", m_gt_0) || - stem(&z, "evita", "", m_gt_0) || - stem(&z, "ezila", "al", m_gt_0); - break; - case 'i': - stem(&z, "itici", "ic", m_gt_0); - break; - case 'l': - stem(&z, "laci", "ic", m_gt_0) || - stem(&z, "luf", "", m_gt_0); - break; - case 's': - stem(&z, "ssen", "", m_gt_0); - break; - } - - /* Step 4 */ - switch( z[1] ){ - case 'a': - if( z[0]=='l' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'c': - if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'e': - if( z[0]=='r' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'i': - if( z[0]=='c' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'l': - if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'n': - if( z[0]=='t' ){ - if( z[2]=='a' ){ - if( m_gt_1(z+3) ){ - z += 3; - } - }else if( z[2]=='e' ){ - stem(&z, "tneme", "", m_gt_1) || - stem(&z, "tnem", "", m_gt_1) || - stem(&z, "tne", "", m_gt_1); - } - } - break; - case 'o': - if( z[0]=='u' ){ - if( m_gt_1(z+2) ){ - z += 2; - } - }else if( z[3]=='s' || z[3]=='t' ){ - stem(&z, "noi", "", m_gt_1); - } - break; - case 's': - if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 't': - stem(&z, "eta", "", m_gt_1) || - stem(&z, "iti", "", m_gt_1); - break; - case 'u': - if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 'v': - case 'z': - if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - } - - /* Step 5a */ - if( z[0]=='e' ){ - if( m_gt_1(z+1) ){ - z++; - }else if( m_eq_1(z+1) && !star_oh(z+1) ){ - z++; - } - } - - /* Step 5b */ - if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ - z++; - } - - /* z[] is now the stemmed word in reverse order. Flip it back - ** around into forward order and return. - */ - *pnOut = i = strlen(z); - zOut[i] = 0; - while( *z ){ - zOut[--i] = *(z++); - } -} - -/* -** Characters that can be part of a token. We assume any character -** whose value is greater than 0x80 (any UTF character) can be -** part of a token. In other words, delimiters all must have -** values of 0x7f or lower. -*/ -static const char isIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define idChar(C) (((ch=C)&0x80)!=0 || (ch>0x2f && isIdChar[ch-0x30])) -#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !isIdChar[ch-0x30])) - -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to porterOpen(). -*/ -static int porterNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ - const char **pzToken, /* OUT: *pzToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - const char *z = c->zInput; - - while( c->iOffsetnInput ){ - int iStartOffset, ch; - - /* Scan past delimiter characters */ - while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ - c->iOffset++; - } - - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ - c->iOffset++; - } - - if( c->iOffset>iStartOffset ){ - int n = c->iOffset-iStartOffset; - if( n>c->nAllocated ){ - c->nAllocated = n+20; - c->zToken = realloc(c->zToken, c->nAllocated); - if( c->zToken==NULL ) return SQLITE_NOMEM; - } - porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); - *pzToken = c->zToken; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - return SQLITE_OK; - } - } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the porter-stemmer tokenizer -*/ -static const sqlite3_tokenizer_module porterTokenizerModule = { - 0, - porterCreate, - porterDestroy, - porterOpen, - porterClose, - porterNext, -}; - -/* -** Allocate a new porter tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -void sqlite3Fts1PorterTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &porterTokenizerModule; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h deleted file mode 100644 index a48cb74519..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -** 2006 July 10 -** -** The author disclaims copyright to this source code. -** -************************************************************************* -** Defines the interface to tokenizers used by fulltext-search. There -** are three basic components: -** -** sqlite3_tokenizer_module is a singleton defining the tokenizer -** interface functions. This is essentially the class structure for -** tokenizers. -** -** sqlite3_tokenizer is used to define a particular tokenizer, perhaps -** including customization information defined at creation time. -** -** sqlite3_tokenizer_cursor is generated by a tokenizer to generate -** tokens from a particular input. -*/ -#ifndef _FTS1_TOKENIZER_H_ -#define _FTS1_TOKENIZER_H_ - -/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. -** If tokenizers are to be allowed to call sqlite3_*() functions, then -** we will need a way to register the API consistently. -*/ -#include "sqlite3.h" - -/* -** Structures used by the tokenizer interface. -*/ -typedef struct sqlite3_tokenizer sqlite3_tokenizer; -typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; -typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; - -struct sqlite3_tokenizer_module { - int iVersion; /* currently 0 */ - - /* - ** Create and destroy a tokenizer. argc/argv are passed down from - ** the fulltext virtual table creation to allow customization. - */ - int (*xCreate)(int argc, const char *const*argv, - sqlite3_tokenizer **ppTokenizer); - int (*xDestroy)(sqlite3_tokenizer *pTokenizer); - - /* - ** Tokenize a particular input. Call xOpen() to prepare to - ** tokenize, xNext() repeatedly until it returns SQLITE_DONE, then - ** xClose() to free any internal state. The pInput passed to - ** xOpen() must exist until the cursor is closed. The ppToken - ** result from xNext() is only valid until the next call to xNext() - ** or until xClose() is called. - */ - /* TODO(shess) current implementation requires pInput to be - ** nul-terminated. This should either be fixed, or pInput/nBytes - ** should be converted to zInput. - */ - int (*xOpen)(sqlite3_tokenizer *pTokenizer, - const char *pInput, int nBytes, - sqlite3_tokenizer_cursor **ppCursor); - int (*xClose)(sqlite3_tokenizer_cursor *pCursor); - int (*xNext)(sqlite3_tokenizer_cursor *pCursor, - const char **ppToken, int *pnBytes, - int *piStartOffset, int *piEndOffset, int *piPosition); -}; - -struct sqlite3_tokenizer { - const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ - /* Tokenizer implementations will typically add additional fields */ -}; - -struct sqlite3_tokenizer_cursor { - sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ - /* Tokenizer implementations will typically add additional fields */ -}; - -/* -** Get the module for a tokenizer which generates tokens based on a -** set of non-token characters. The default is to break tokens at any -** non-alnum character, though the set of delimiters can also be -** specified by the first argv argument to xCreate(). -*/ -/* TODO(shess) This doesn't belong here. Need some sort of -** registration process. -*/ -void sqlite3Fts1SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); -void sqlite3Fts1PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); - -#endif /* _FTS1_TOKENIZER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c deleted file mode 100644 index f58fba8f8e..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts1/fts1_tokenizer1.c +++ /dev/null @@ -1,221 +0,0 @@ -/* -** The author disclaims copyright to this source code. -** -************************************************************************* -** Implementation of the "simple" full-text-search tokenizer. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS1 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS1 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS1 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) - - -#include -#include -#include -#include -#include - -#include "fts1_tokenizer.h" - -typedef struct simple_tokenizer { - sqlite3_tokenizer base; - char delim[128]; /* flag ASCII delimiters */ -} simple_tokenizer; - -typedef struct simple_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *pInput; /* input we are tokenizing */ - int nBytes; /* size of the input */ - int iOffset; /* current position in pInput */ - int iToken; /* index of next token to be returned */ - char *pToken; /* storage for current token */ - int nTokenAllocated; /* space allocated to zToken buffer */ -} simple_tokenizer_cursor; - - -/* Forward declaration */ -static const sqlite3_tokenizer_module simpleTokenizerModule; - -static int isDelim(simple_tokenizer *t, unsigned char c){ - return c<0x80 && t->delim[c]; -} - -/* -** Create a new tokenizer instance. -*/ -static int simpleCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - simple_tokenizer *t; - - t = (simple_tokenizer *) calloc(sizeof(*t), 1); - if( t==NULL ) return SQLITE_NOMEM; - - /* TODO(shess) Delimiters need to remain the same from run to run, - ** else we need to reindex. One solution would be a meta-table to - ** track such information in the database, then we'd only want this - ** information on the initial create. - */ - if( argc>1 ){ - int i, n = strlen(argv[1]); - for(i=0; i=0x80 ){ - free(t); - return SQLITE_ERROR; - } - t->delim[ch] = 1; - } - } else { - /* Mark non-alphanumeric ASCII characters as delimiters */ - int i; - for(i=1; i<0x80; i++){ - t->delim[i] = !isalnum(i); - } - } - - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ - free(pTokenizer); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int simpleOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *pInput, int nBytes, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - simple_tokenizer_cursor *c; - - c = (simple_tokenizer_cursor *) malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; - - c->pInput = pInput; - if( pInput==0 ){ - c->nBytes = 0; - }else if( nBytes<0 ){ - c->nBytes = (int)strlen(pInput); - }else{ - c->nBytes = nBytes; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->pToken = NULL; /* no space allocated, yet. */ - c->nTokenAllocated = 0; - - *ppCursor = &c->base; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to -** simpleOpen() above. -*/ -static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - free(c->pToken); - free(c); - return SQLITE_OK; -} - -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to simpleOpen(). -*/ -static int simpleNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ - const char **ppToken, /* OUT: *ppToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; - unsigned char *p = (unsigned char *)c->pInput; - - while( c->iOffsetnBytes ){ - int iStartOffset; - - /* Scan past delimiter characters */ - while( c->iOffsetnBytes && isDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } - - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnBytes && !isDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } - - if( c->iOffset>iStartOffset ){ - int i, n = c->iOffset-iStartOffset; - if( n>c->nTokenAllocated ){ - c->nTokenAllocated = n+20; - c->pToken = realloc(c->pToken, c->nTokenAllocated); - if( c->pToken==NULL ) return SQLITE_NOMEM; - } - for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; - } - *ppToken = c->pToken; - *pnBytes = n; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - - return SQLITE_OK; - } - } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the simple tokenizer -*/ -static const sqlite3_tokenizer_module simpleTokenizerModule = { - 0, - simpleCreate, - simpleDestroy, - simpleOpen, - simpleClose, - simpleNext, -}; - -/* -** Allocate a new simple tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -void sqlite3Fts1SimpleTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &simpleTokenizerModule; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS1) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers deleted file mode 100644 index 6625b316b1..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.tokenizers +++ /dev/null @@ -1,134 +0,0 @@ - -1. FTS2 Tokenizers - - When creating a new full-text table, FTS2 allows the user to select - the text tokenizer implementation to be used when indexing text - by specifying a "tokenizer" clause as part of the CREATE VIRTUAL TABLE - statement: - - CREATE VIRTUAL TABLE USING fts2( - [, tokenizer []] - ); - - The built-in tokenizers (valid values to pass as ) are - "simple" and "porter". - - should consist of zero or more white-space separated - arguments to pass to the selected tokenizer implementation. The - interpretation of the arguments, if any, depends on the individual - tokenizer. - -2. Custom Tokenizers - - FTS2 allows users to provide custom tokenizer implementations. The - interface used to create a new tokenizer is defined and described in - the fts2_tokenizer.h source file. - - Registering a new FTS2 tokenizer is similar to registering a new - virtual table module with SQLite. The user passes a pointer to a - structure containing pointers to various callback functions that - make up the implementation of the new tokenizer type. For tokenizers, - the structure (defined in fts2_tokenizer.h) is called - "sqlite3_tokenizer_module". - - FTS2 does not expose a C-function that users call to register new - tokenizer types with a database handle. Instead, the pointer must - be encoded as an SQL blob value and passed to FTS2 through the SQL - engine by evaluating a special scalar function, "fts2_tokenizer()". - The fts2_tokenizer() function may be called with one or two arguments, - as follows: - - SELECT fts2_tokenizer(); - SELECT fts2_tokenizer(, ); - - Where is a string identifying the tokenizer and - is a pointer to an sqlite3_tokenizer_module - structure encoded as an SQL blob. If the second argument is present, - it is registered as tokenizer and a copy of it - returned. If only one argument is passed, a pointer to the tokenizer - implementation currently registered as is returned, - encoded as a blob. Or, if no such tokenizer exists, an SQL exception - (error) is raised. - - SECURITY: If the fts2 extension is used in an environment where potentially - malicious users may execute arbitrary SQL (i.e. gears), they should be - prevented from invoking the fts2_tokenizer() function, possibly using the - authorisation callback. - - See "Sample code" below for an example of calling the fts2_tokenizer() - function from C code. - -3. ICU Library Tokenizers - - If this extension is compiled with the SQLITE_ENABLE_ICU pre-processor - symbol defined, then there exists a built-in tokenizer named "icu" - implemented using the ICU library. The first argument passed to the - xCreate() method (see fts2_tokenizer.h) of this tokenizer may be - an ICU locale identifier. For example "tr_TR" for Turkish as used - in Turkey, or "en_AU" for English as used in Australia. For example: - - "CREATE VIRTUAL TABLE thai_text USING fts2(text, tokenizer icu th_TH)" - - The ICU tokenizer implementation is very simple. It splits the input - text according to the ICU rules for finding word boundaries and discards - any tokens that consist entirely of white-space. This may be suitable - for some applications in some locales, but not all. If more complex - processing is required, for example to implement stemming or - discard punctuation, this can be done by creating a tokenizer - implementation that uses the ICU tokenizer as part of it's implementation. - - When using the ICU tokenizer this way, it is safe to overwrite the - contents of the strings returned by the xNext() method (see - fts2_tokenizer.h). - -4. Sample code. - - The following two code samples illustrate the way C code should invoke - the fts2_tokenizer() scalar function: - - int registerTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module *p - ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts2_tokenizer(?, ?)"; - - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); - sqlite3_step(pStmt); - - return sqlite3_finalize(pStmt); - } - - int queryTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module **pp - ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts2_tokenizer(?)"; - - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); - } - } - - return sqlite3_finalize(pStmt); - } - diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt deleted file mode 100644 index 517a2a0434..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -This folder contains source code to the second full-text search -extension for SQLite. While the API is the same, this version uses a -substantially different storage schema from fts1, so tables will need -to be rebuilt. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c deleted file mode 100644 index 65ad173abc..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.c +++ /dev/null @@ -1,5936 +0,0 @@ -/* fts2 has a design flaw which can lead to database corruption (see -** below). It is recommended not to use it any longer, instead use -** fts3 (or higher). If you believe that your use of fts2 is safe, -** add -DSQLITE_ENABLE_BROKEN_FTS2=1 to your CFLAGS. -*/ -#ifndef SQLITE_ENABLE_BROKEN_FTS2 -#error fts2 has a design flaw and has been deprecated. -#endif -/* The flaw is that fts2 uses the content table's unaliased rowid as -** the unique docid. fts2 embeds the rowid in the index it builds, -** and expects the rowid to not change. The SQLite VACUUM operation -** will renumber such rowids, thereby breaking fts2. If you are using -** fts2 in a system which has disabled VACUUM, then you can continue -** to use it safely. Note that PRAGMA auto_vacuum does NOT disable -** VACUUM, though systems using auto_vacuum are unlikely to invoke -** VACUUM. -** -** Unlike fts1, which is safe across VACUUM if you never delete -** documents, fts2 has a second exposure to this flaw, in the segments -** table. So fts2 should be considered unsafe across VACUUM in all -** cases. -*/ - -/* -** 2006 Oct 10 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This is an SQLite module implementing full-text search. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS2 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS2 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). -*/ - -/* TODO(shess) Consider exporting this comment to an HTML file or the -** wiki. -*/ -/* The full-text index is stored in a series of b+tree (-like) -** structures called segments which map terms to doclists. The -** structures are like b+trees in layout, but are constructed from the -** bottom up in optimal fashion and are not updatable. Since trees -** are built from the bottom up, things will be described from the -** bottom up. -** -** -**** Varints **** -** The basic unit of encoding is a variable-length integer called a -** varint. We encode variable-length integers in little-endian order -** using seven bits * per byte as follows: -** -** KEY: -** A = 0xxxxxxx 7 bits of data and one flag bit -** B = 1xxxxxxx 7 bits of data and one flag bit -** -** 7 bits - A -** 14 bits - BA -** 21 bits - BBA -** and so on. -** -** This is identical to how sqlite encodes varints (see util.c). -** -** -**** Document lists **** -** A doclist (document list) holds a docid-sorted list of hits for a -** given term. Doclists hold docids, and can optionally associate -** token positions and offsets with docids. -** -** A DL_POSITIONS_OFFSETS doclist is stored like this: -** -** array { -** varint docid; -** array { (position list for column 0) -** varint position; (delta from previous position plus POS_BASE) -** varint startOffset; (delta from previous startOffset) -** varint endOffset; (delta from startOffset) -** } -** array { -** varint POS_COLUMN; (marks start of position list for new column) -** varint column; (index of new column) -** array { -** varint position; (delta from previous position plus POS_BASE) -** varint startOffset;(delta from previous startOffset) -** varint endOffset; (delta from startOffset) -** } -** } -** varint POS_END; (marks end of positions for this document. -** } -** -** Here, array { X } means zero or more occurrences of X, adjacent in -** memory. A "position" is an index of a token in the token stream -** generated by the tokenizer, while an "offset" is a byte offset, -** both based at 0. Note that POS_END and POS_COLUMN occur in the -** same logical place as the position element, and act as sentinals -** ending a position list array. -** -** A DL_POSITIONS doclist omits the startOffset and endOffset -** information. A DL_DOCIDS doclist omits both the position and -** offset information, becoming an array of varint-encoded docids. -** -** On-disk data is stored as type DL_DEFAULT, so we don't serialize -** the type. Due to how deletion is implemented in the segmentation -** system, on-disk doclists MUST store at least positions. -** -** -**** Segment leaf nodes **** -** Segment leaf nodes store terms and doclists, ordered by term. Leaf -** nodes are written using LeafWriter, and read using LeafReader (to -** iterate through a single leaf node's data) and LeavesReader (to -** iterate through a segment's entire leaf layer). Leaf nodes have -** the format: -** -** varint iHeight; (height from leaf level, always 0) -** varint nTerm; (length of first term) -** char pTerm[nTerm]; (content of first term) -** varint nDoclist; (length of term's associated doclist) -** char pDoclist[nDoclist]; (content of doclist) -** array { -** (further terms are delta-encoded) -** varint nPrefix; (length of prefix shared with previous term) -** varint nSuffix; (length of unshared suffix) -** char pTermSuffix[nSuffix];(unshared suffix of next term) -** varint nDoclist; (length of term's associated doclist) -** char pDoclist[nDoclist]; (content of doclist) -** } -** -** Here, array { X } means zero or more occurrences of X, adjacent in -** memory. -** -** Leaf nodes are broken into blocks which are stored contiguously in -** the %_segments table in sorted order. This means that when the end -** of a node is reached, the next term is in the node with the next -** greater node id. -** -** New data is spilled to a new leaf node when the current node -** exceeds LEAF_MAX bytes (default 2048). New data which itself is -** larger than STANDALONE_MIN (default 1024) is placed in a standalone -** node (a leaf node with a single term and doclist). The goal of -** these settings is to pack together groups of small doclists while -** making it efficient to directly access large doclists. The -** assumption is that large doclists represent terms which are more -** likely to be query targets. -** -** TODO(shess) It may be useful for blocking decisions to be more -** dynamic. For instance, it may make more sense to have a 2.5k leaf -** node rather than splitting into 2k and .5k nodes. My intuition is -** that this might extend through 2x or 4x the pagesize. -** -** -**** Segment interior nodes **** -** Segment interior nodes store blockids for subtree nodes and terms -** to describe what data is stored by the each subtree. Interior -** nodes are written using InteriorWriter, and read using -** InteriorReader. InteriorWriters are created as needed when -** SegmentWriter creates new leaf nodes, or when an interior node -** itself grows too big and must be split. The format of interior -** nodes: -** -** varint iHeight; (height from leaf level, always >0) -** varint iBlockid; (block id of node's leftmost subtree) -** optional { -** varint nTerm; (length of first term) -** char pTerm[nTerm]; (content of first term) -** array { -** (further terms are delta-encoded) -** varint nPrefix; (length of shared prefix with previous term) -** varint nSuffix; (length of unshared suffix) -** char pTermSuffix[nSuffix]; (unshared suffix of next term) -** } -** } -** -** Here, optional { X } means an optional element, while array { X } -** means zero or more occurrences of X, adjacent in memory. -** -** An interior node encodes n terms separating n+1 subtrees. The -** subtree blocks are contiguous, so only the first subtree's blockid -** is encoded. The subtree at iBlockid will contain all terms less -** than the first term encoded (or all terms if no term is encoded). -** Otherwise, for terms greater than or equal to pTerm[i] but less -** than pTerm[i+1], the subtree for that term will be rooted at -** iBlockid+i. Interior nodes only store enough term data to -** distinguish adjacent children (if the rightmost term of the left -** child is "something", and the leftmost term of the right child is -** "wicked", only "w" is stored). -** -** New data is spilled to a new interior node at the same height when -** the current node exceeds INTERIOR_MAX bytes (default 2048). -** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing -** interior nodes and making the tree too skinny. The interior nodes -** at a given height are naturally tracked by interior nodes at -** height+1, and so on. -** -** -**** Segment directory **** -** The segment directory in table %_segdir stores meta-information for -** merging and deleting segments, and also the root node of the -** segment's tree. -** -** The root node is the top node of the segment's tree after encoding -** the entire segment, restricted to ROOT_MAX bytes (default 1024). -** This could be either a leaf node or an interior node. If the top -** node requires more than ROOT_MAX bytes, it is flushed to %_segments -** and a new root interior node is generated (which should always fit -** within ROOT_MAX because it only needs space for 2 varints, the -** height and the blockid of the previous root). -** -** The meta-information in the segment directory is: -** level - segment level (see below) -** idx - index within level -** - (level,idx uniquely identify a segment) -** start_block - first leaf node -** leaves_end_block - last leaf node -** end_block - last block (including interior nodes) -** root - contents of root node -** -** If the root node is a leaf node, then start_block, -** leaves_end_block, and end_block are all 0. -** -** -**** Segment merging **** -** To amortize update costs, segments are groups into levels and -** merged in matches. Each increase in level represents exponentially -** more documents. -** -** New documents (actually, document updates) are tokenized and -** written individually (using LeafWriter) to a level 0 segment, with -** incrementing idx. When idx reaches MERGE_COUNT (default 16), all -** level 0 segments are merged into a single level 1 segment. Level 1 -** is populated like level 0, and eventually MERGE_COUNT level 1 -** segments are merged to a single level 2 segment (representing -** MERGE_COUNT^2 updates), and so on. -** -** A segment merge traverses all segments at a given level in -** parallel, performing a straightforward sorted merge. Since segment -** leaf nodes are written in to the %_segments table in order, this -** merge traverses the underlying sqlite disk structures efficiently. -** After the merge, all segment blocks from the merged level are -** deleted. -** -** MERGE_COUNT controls how often we merge segments. 16 seems to be -** somewhat of a sweet spot for insertion performance. 32 and 64 show -** very similar performance numbers to 16 on insertion, though they're -** a tiny bit slower (perhaps due to more overhead in merge-time -** sorting). 8 is about 20% slower than 16, 4 about 50% slower than -** 16, 2 about 66% slower than 16. -** -** At query time, high MERGE_COUNT increases the number of segments -** which need to be scanned and merged. For instance, with 100k docs -** inserted: -** -** MERGE_COUNT segments -** 16 25 -** 8 12 -** 4 10 -** 2 6 -** -** This appears to have only a moderate impact on queries for very -** frequent terms (which are somewhat dominated by segment merge -** costs), and infrequent and non-existent terms still seem to be fast -** even with many segments. -** -** TODO(shess) That said, it would be nice to have a better query-side -** argument for MERGE_COUNT of 16. Also, it's possible/likely that -** optimizations to things like doclist merging will swing the sweet -** spot around. -** -** -** -**** Handling of deletions and updates **** -** Since we're using a segmented structure, with no docid-oriented -** index into the term index, we clearly cannot simply update the term -** index when a document is deleted or updated. For deletions, we -** write an empty doclist (varint(docid) varint(POS_END)), for updates -** we simply write the new doclist. Segment merges overwrite older -** data for a particular docid with newer data, so deletes or updates -** will eventually overtake the earlier data and knock it out. The -** query logic likewise merges doclists so that newer data knocks out -** older data. -** -** TODO(shess) Provide a VACUUM type operation to clear out all -** deletions and duplications. This would basically be a forced merge -** into a single segment. -*/ - -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) - -#if defined(SQLITE_ENABLE_FTS2) && !defined(SQLITE_CORE) -# define SQLITE_CORE 1 -#endif - -#include -#include -#include -#include -#include - -#include "fts2.h" -#include "fts2_hash.h" -#include "fts2_tokenizer.h" -#include "sqlite3.h" -#include "sqlite3ext.h" -SQLITE_EXTENSION_INIT1 - - -/* TODO(shess) MAN, this thing needs some refactoring. At minimum, it -** would be nice to order the file better, perhaps something along the -** lines of: -** -** - utility functions -** - table setup functions -** - table update functions -** - table query functions -** -** Put the query functions last because they're likely to reference -** typedefs or functions from the table update section. -*/ - -#if 0 -# define TRACE(A) printf A; fflush(stdout) -#else -# define TRACE(A) -#endif - -/* It is not safe to call isspace(), tolower(), or isalnum() on -** hi-bit-set characters. This is the same solution used in the -** tokenizer. -*/ -/* TODO(shess) The snippet-generation code should be using the -** tokenizer-generated tokens rather than doing its own local -** tokenization. -*/ -/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ -static int safe_isspace(char c){ - return (c&0x80)==0 ? isspace(c) : 0; -} -static int safe_tolower(char c){ - return (c&0x80)==0 ? tolower(c) : c; -} -static int safe_isalnum(char c){ - return (c&0x80)==0 ? isalnum(c) : 0; -} - -typedef enum DocListType { - DL_DOCIDS, /* docids only */ - DL_POSITIONS, /* docids + positions */ - DL_POSITIONS_OFFSETS /* docids + positions + offsets */ -} DocListType; - -/* -** By default, only positions and not offsets are stored in the doclists. -** To change this so that offsets are stored too, compile with -** -** -DDL_DEFAULT=DL_POSITIONS_OFFSETS -** -** If DL_DEFAULT is set to DL_DOCIDS, your table can only be inserted -** into (no deletes or updates). -*/ -#ifndef DL_DEFAULT -# define DL_DEFAULT DL_POSITIONS -#endif - -enum { - POS_END = 0, /* end of this position list */ - POS_COLUMN, /* followed by new column number */ - POS_BASE -}; - -/* MERGE_COUNT controls how often we merge segments (see comment at -** top of file). -*/ -#define MERGE_COUNT 16 - -/* utility functions */ - -/* CLEAR() and SCRAMBLE() abstract memset() on a pointer to a single -** record to prevent errors of the form: -** -** my_function(SomeType *b){ -** memset(b, '\0', sizeof(b)); // sizeof(b)!=sizeof(*b) -** } -*/ -/* TODO(shess) Obvious candidates for a header file. */ -#define CLEAR(b) memset(b, '\0', sizeof(*(b))) - -#ifndef NDEBUG -# define SCRAMBLE(b) memset(b, 0x55, sizeof(*(b))) -#else -# define SCRAMBLE(b) -#endif - -/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ -#define VARINT_MAX 10 - -/* Write a 64-bit variable-length integer to memory starting at p[0]. - * The length of data written will be between 1 and VARINT_MAX bytes. - * The number of bytes written is returned. */ -static int putVarint(char *p, sqlite_int64 v){ - unsigned char *q = (unsigned char *) p; - sqlite_uint64 vu = v; - do{ - *q++ = (unsigned char) ((vu & 0x7f) | 0x80); - vu >>= 7; - }while( vu!=0 ); - q[-1] &= 0x7f; /* turn off high bit in final byte */ - assert( q - (unsigned char *)p <= VARINT_MAX ); - return (int) (q - (unsigned char *)p); -} - -/* Read a 64-bit variable-length integer from memory starting at p[0]. - * Return the number of bytes read, or 0 on error. - * The value is stored in *v. */ -static int getVarint(const char *p, sqlite_int64 *v){ - const unsigned char *q = (const unsigned char *) p; - sqlite_uint64 x = 0, y = 1; - while( (*q & 0x80) == 0x80 ){ - x += y * (*q++ & 0x7f); - y <<= 7; - if( q - (unsigned char *)p >= VARINT_MAX ){ /* bad data */ - assert( 0 ); - return 0; - } - } - x += y * (*q++); - *v = (sqlite_int64) x; - return (int) (q - (unsigned char *)p); -} - -static int getVarint32(const char *p, int *pi){ - sqlite_int64 i; - int ret = getVarint(p, &i); - *pi = (int) i; - assert( *pi==i ); - return ret; -} - -/*******************************************************************/ -/* DataBuffer is used to collect data into a buffer in piecemeal -** fashion. It implements the usual distinction between amount of -** data currently stored (nData) and buffer capacity (nCapacity). -** -** dataBufferInit - create a buffer with given initial capacity. -** dataBufferReset - forget buffer's data, retaining capacity. -** dataBufferDestroy - free buffer's data. -** dataBufferExpand - expand capacity without adding data. -** dataBufferAppend - append data. -** dataBufferAppend2 - append two pieces of data at once. -** dataBufferReplace - replace buffer's data. -*/ -typedef struct DataBuffer { - char *pData; /* Pointer to malloc'ed buffer. */ - int nCapacity; /* Size of pData buffer. */ - int nData; /* End of data loaded into pData. */ -} DataBuffer; - -static void dataBufferInit(DataBuffer *pBuffer, int nCapacity){ - assert( nCapacity>=0 ); - pBuffer->nData = 0; - pBuffer->nCapacity = nCapacity; - pBuffer->pData = nCapacity==0 ? NULL : malloc(nCapacity); -} -static void dataBufferReset(DataBuffer *pBuffer){ - pBuffer->nData = 0; -} -static void dataBufferDestroy(DataBuffer *pBuffer){ - if( pBuffer->pData!=NULL ) free(pBuffer->pData); - SCRAMBLE(pBuffer); -} -static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){ - assert( nAddCapacity>0 ); - /* TODO(shess) Consider expanding more aggressively. Note that the - ** underlying malloc implementation may take care of such things for - ** us already. - */ - if( pBuffer->nData+nAddCapacity>pBuffer->nCapacity ){ - pBuffer->nCapacity = pBuffer->nData+nAddCapacity; - pBuffer->pData = realloc(pBuffer->pData, pBuffer->nCapacity); - } -} -static void dataBufferAppend(DataBuffer *pBuffer, - const char *pSource, int nSource){ - assert( nSource>0 && pSource!=NULL ); - dataBufferExpand(pBuffer, nSource); - memcpy(pBuffer->pData+pBuffer->nData, pSource, nSource); - pBuffer->nData += nSource; -} -static void dataBufferAppend2(DataBuffer *pBuffer, - const char *pSource1, int nSource1, - const char *pSource2, int nSource2){ - assert( nSource1>0 && pSource1!=NULL ); - assert( nSource2>0 && pSource2!=NULL ); - dataBufferExpand(pBuffer, nSource1+nSource2); - memcpy(pBuffer->pData+pBuffer->nData, pSource1, nSource1); - memcpy(pBuffer->pData+pBuffer->nData+nSource1, pSource2, nSource2); - pBuffer->nData += nSource1+nSource2; -} -static void dataBufferReplace(DataBuffer *pBuffer, - const char *pSource, int nSource){ - dataBufferReset(pBuffer); - dataBufferAppend(pBuffer, pSource, nSource); -} - -/* StringBuffer is a null-terminated version of DataBuffer. */ -typedef struct StringBuffer { - DataBuffer b; /* Includes null terminator. */ -} StringBuffer; - -static void initStringBuffer(StringBuffer *sb){ - dataBufferInit(&sb->b, 100); - dataBufferReplace(&sb->b, "", 1); -} -static int stringBufferLength(StringBuffer *sb){ - return sb->b.nData-1; -} -static char *stringBufferData(StringBuffer *sb){ - return sb->b.pData; -} -static void stringBufferDestroy(StringBuffer *sb){ - dataBufferDestroy(&sb->b); -} - -static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ - assert( sb->b.nData>0 ); - if( nFrom>0 ){ - sb->b.nData--; - dataBufferAppend2(&sb->b, zFrom, nFrom, "", 1); - } -} -static void append(StringBuffer *sb, const char *zFrom){ - nappend(sb, zFrom, strlen(zFrom)); -} - -/* Append a list of strings separated by commas. */ -static void appendList(StringBuffer *sb, int nString, char **azString){ - int i; - for(i=0; i0 ) append(sb, ", "); - append(sb, azString[i]); - } -} - -static int endsInWhiteSpace(StringBuffer *p){ - return stringBufferLength(p)>0 && - safe_isspace(stringBufferData(p)[stringBufferLength(p)-1]); -} - -/* If the StringBuffer ends in something other than white space, add a -** single space character to the end. -*/ -static void appendWhiteSpace(StringBuffer *p){ - if( stringBufferLength(p)==0 ) return; - if( !endsInWhiteSpace(p) ) append(p, " "); -} - -/* Remove white space from the end of the StringBuffer */ -static void trimWhiteSpace(StringBuffer *p){ - while( endsInWhiteSpace(p) ){ - p->b.pData[--p->b.nData-1] = '\0'; - } -} - -/*******************************************************************/ -/* DLReader is used to read document elements from a doclist. The -** current docid is cached, so dlrDocid() is fast. DLReader does not -** own the doclist buffer. -** -** dlrAtEnd - true if there's no more data to read. -** dlrDocid - docid of current document. -** dlrDocData - doclist data for current document (including docid). -** dlrDocDataBytes - length of same. -** dlrAllDataBytes - length of all remaining data. -** dlrPosData - position data for current document. -** dlrPosDataLen - length of pos data for current document (incl POS_END). -** dlrStep - step to current document. -** dlrInit - initial for doclist of given type against given data. -** dlrDestroy - clean up. -** -** Expected usage is something like: -** -** DLReader reader; -** dlrInit(&reader, pData, nData); -** while( !dlrAtEnd(&reader) ){ -** // calls to dlrDocid() and kin. -** dlrStep(&reader); -** } -** dlrDestroy(&reader); -*/ -typedef struct DLReader { - DocListType iType; - const char *pData; - int nData; - - sqlite_int64 iDocid; - int nElement; -} DLReader; - -static int dlrAtEnd(DLReader *pReader){ - assert( pReader->nData>=0 ); - return pReader->nData==0; -} -static sqlite_int64 dlrDocid(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->iDocid; -} -static const char *dlrDocData(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->pData; -} -static int dlrDocDataBytes(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->nElement; -} -static int dlrAllDataBytes(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->nData; -} -/* TODO(shess) Consider adding a field to track iDocid varint length -** to make these two functions faster. This might matter (a tiny bit) -** for queries. -*/ -static const char *dlrPosData(DLReader *pReader){ - sqlite_int64 iDummy; - int n = getVarint(pReader->pData, &iDummy); - assert( !dlrAtEnd(pReader) ); - return pReader->pData+n; -} -static int dlrPosDataLen(DLReader *pReader){ - sqlite_int64 iDummy; - int n = getVarint(pReader->pData, &iDummy); - assert( !dlrAtEnd(pReader) ); - return pReader->nElement-n; -} -static void dlrStep(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - - /* Skip past current doclist element. */ - assert( pReader->nElement<=pReader->nData ); - pReader->pData += pReader->nElement; - pReader->nData -= pReader->nElement; - - /* If there is more data, read the next doclist element. */ - if( pReader->nData!=0 ){ - sqlite_int64 iDocidDelta; - int iDummy, n = getVarint(pReader->pData, &iDocidDelta); - pReader->iDocid += iDocidDelta; - if( pReader->iType>=DL_POSITIONS ){ - assert( nnData ); - while( 1 ){ - n += getVarint32(pReader->pData+n, &iDummy); - assert( n<=pReader->nData ); - if( iDummy==POS_END ) break; - if( iDummy==POS_COLUMN ){ - n += getVarint32(pReader->pData+n, &iDummy); - assert( nnData ); - }else if( pReader->iType==DL_POSITIONS_OFFSETS ){ - n += getVarint32(pReader->pData+n, &iDummy); - n += getVarint32(pReader->pData+n, &iDummy); - assert( nnData ); - } - } - } - pReader->nElement = n; - assert( pReader->nElement<=pReader->nData ); - } -} -static void dlrInit(DLReader *pReader, DocListType iType, - const char *pData, int nData){ - assert( pData!=NULL && nData!=0 ); - pReader->iType = iType; - pReader->pData = pData; - pReader->nData = nData; - pReader->nElement = 0; - pReader->iDocid = 0; - - /* Load the first element's data. There must be a first element. */ - dlrStep(pReader); -} -static void dlrDestroy(DLReader *pReader){ - SCRAMBLE(pReader); -} - -#ifndef NDEBUG -/* Verify that the doclist can be validly decoded. Also returns the -** last docid found because it's convenient in other assertions for -** DLWriter. -*/ -static void docListValidate(DocListType iType, const char *pData, int nData, - sqlite_int64 *pLastDocid){ - sqlite_int64 iPrevDocid = 0; - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - while( nData!=0 ){ - sqlite_int64 iDocidDelta; - int n = getVarint(pData, &iDocidDelta); - iPrevDocid += iDocidDelta; - if( iType>DL_DOCIDS ){ - int iDummy; - while( 1 ){ - n += getVarint32(pData+n, &iDummy); - if( iDummy==POS_END ) break; - if( iDummy==POS_COLUMN ){ - n += getVarint32(pData+n, &iDummy); - }else if( iType>DL_POSITIONS ){ - n += getVarint32(pData+n, &iDummy); - n += getVarint32(pData+n, &iDummy); - } - assert( n<=nData ); - } - } - assert( n<=nData ); - pData += n; - nData -= n; - } - if( pLastDocid ) *pLastDocid = iPrevDocid; -} -#define ASSERT_VALID_DOCLIST(i, p, n, o) docListValidate(i, p, n, o) -#else -#define ASSERT_VALID_DOCLIST(i, p, n, o) assert( 1 ) -#endif - -/*******************************************************************/ -/* DLWriter is used to write doclist data to a DataBuffer. DLWriter -** always appends to the buffer and does not own it. -** -** dlwInit - initialize to write a given type doclistto a buffer. -** dlwDestroy - clear the writer's memory. Does not free buffer. -** dlwAppend - append raw doclist data to buffer. -** dlwCopy - copy next doclist from reader to writer. -** dlwAdd - construct doclist element and append to buffer. -** Only apply dlwAdd() to DL_DOCIDS doclists (else use PLWriter). -*/ -typedef struct DLWriter { - DocListType iType; - DataBuffer *b; - sqlite_int64 iPrevDocid; -#ifndef NDEBUG - int has_iPrevDocid; -#endif -} DLWriter; - -static void dlwInit(DLWriter *pWriter, DocListType iType, DataBuffer *b){ - pWriter->b = b; - pWriter->iType = iType; - pWriter->iPrevDocid = 0; -#ifndef NDEBUG - pWriter->has_iPrevDocid = 0; -#endif -} -static void dlwDestroy(DLWriter *pWriter){ - SCRAMBLE(pWriter); -} -/* iFirstDocid is the first docid in the doclist in pData. It is -** needed because pData may point within a larger doclist, in which -** case the first item would be delta-encoded. -** -** iLastDocid is the final docid in the doclist in pData. It is -** needed to create the new iPrevDocid for future delta-encoding. The -** code could decode the passed doclist to recreate iLastDocid, but -** the only current user (docListMerge) already has decoded this -** information. -*/ -/* TODO(shess) This has become just a helper for docListMerge. -** Consider a refactor to make this cleaner. -*/ -static void dlwAppend(DLWriter *pWriter, - const char *pData, int nData, - sqlite_int64 iFirstDocid, sqlite_int64 iLastDocid){ - sqlite_int64 iDocid = 0; - char c[VARINT_MAX]; - int nFirstOld, nFirstNew; /* Old and new varint len of first docid. */ -#ifndef NDEBUG - sqlite_int64 iLastDocidDelta; -#endif - - /* Recode the initial docid as delta from iPrevDocid. */ - nFirstOld = getVarint(pData, &iDocid); - assert( nFirstOldiType==DL_DOCIDS) ); - nFirstNew = putVarint(c, iFirstDocid-pWriter->iPrevDocid); - - /* Verify that the incoming doclist is valid AND that it ends with - ** the expected docid. This is essential because we'll trust this - ** docid in future delta-encoding. - */ - ASSERT_VALID_DOCLIST(pWriter->iType, pData, nData, &iLastDocidDelta); - assert( iLastDocid==iFirstDocid-iDocid+iLastDocidDelta ); - - /* Append recoded initial docid and everything else. Rest of docids - ** should have been delta-encoded from previous initial docid. - */ - if( nFirstOldb, c, nFirstNew, - pData+nFirstOld, nData-nFirstOld); - }else{ - dataBufferAppend(pWriter->b, c, nFirstNew); - } - pWriter->iPrevDocid = iLastDocid; -} -static void dlwCopy(DLWriter *pWriter, DLReader *pReader){ - dlwAppend(pWriter, dlrDocData(pReader), dlrDocDataBytes(pReader), - dlrDocid(pReader), dlrDocid(pReader)); -} -static void dlwAdd(DLWriter *pWriter, sqlite_int64 iDocid){ - char c[VARINT_MAX]; - int n = putVarint(c, iDocid-pWriter->iPrevDocid); - - /* Docids must ascend. */ - assert( !pWriter->has_iPrevDocid || iDocid>pWriter->iPrevDocid ); - assert( pWriter->iType==DL_DOCIDS ); - - dataBufferAppend(pWriter->b, c, n); - pWriter->iPrevDocid = iDocid; -#ifndef NDEBUG - pWriter->has_iPrevDocid = 1; -#endif -} - -/*******************************************************************/ -/* PLReader is used to read data from a document's position list. As -** the caller steps through the list, data is cached so that varints -** only need to be decoded once. -** -** plrInit, plrDestroy - create/destroy a reader. -** plrColumn, plrPosition, plrStartOffset, plrEndOffset - accessors -** plrAtEnd - at end of stream, only call plrDestroy once true. -** plrStep - step to the next element. -*/ -typedef struct PLReader { - /* These refer to the next position's data. nData will reach 0 when - ** reading the last position, so plrStep() signals EOF by setting - ** pData to NULL. - */ - const char *pData; - int nData; - - DocListType iType; - int iColumn; /* the last column read */ - int iPosition; /* the last position read */ - int iStartOffset; /* the last start offset read */ - int iEndOffset; /* the last end offset read */ -} PLReader; - -static int plrAtEnd(PLReader *pReader){ - return pReader->pData==NULL; -} -static int plrColumn(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iColumn; -} -static int plrPosition(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iPosition; -} -static int plrStartOffset(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iStartOffset; -} -static int plrEndOffset(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iEndOffset; -} -static void plrStep(PLReader *pReader){ - int i, n; - - assert( !plrAtEnd(pReader) ); - - if( pReader->nData==0 ){ - pReader->pData = NULL; - return; - } - - n = getVarint32(pReader->pData, &i); - if( i==POS_COLUMN ){ - n += getVarint32(pReader->pData+n, &pReader->iColumn); - pReader->iPosition = 0; - pReader->iStartOffset = 0; - n += getVarint32(pReader->pData+n, &i); - } - /* Should never see adjacent column changes. */ - assert( i!=POS_COLUMN ); - - if( i==POS_END ){ - pReader->nData = 0; - pReader->pData = NULL; - return; - } - - pReader->iPosition += i-POS_BASE; - if( pReader->iType==DL_POSITIONS_OFFSETS ){ - n += getVarint32(pReader->pData+n, &i); - pReader->iStartOffset += i; - n += getVarint32(pReader->pData+n, &i); - pReader->iEndOffset = pReader->iStartOffset+i; - } - assert( n<=pReader->nData ); - pReader->pData += n; - pReader->nData -= n; -} - -static void plrInit(PLReader *pReader, DLReader *pDLReader){ - pReader->pData = dlrPosData(pDLReader); - pReader->nData = dlrPosDataLen(pDLReader); - pReader->iType = pDLReader->iType; - pReader->iColumn = 0; - pReader->iPosition = 0; - pReader->iStartOffset = 0; - pReader->iEndOffset = 0; - plrStep(pReader); -} -static void plrDestroy(PLReader *pReader){ - SCRAMBLE(pReader); -} - -/*******************************************************************/ -/* PLWriter is used in constructing a document's position list. As a -** convenience, if iType is DL_DOCIDS, PLWriter becomes a no-op. -** PLWriter writes to the associated DLWriter's buffer. -** -** plwInit - init for writing a document's poslist. -** plwDestroy - clear a writer. -** plwAdd - append position and offset information. -** plwCopy - copy next position's data from reader to writer. -** plwTerminate - add any necessary doclist terminator. -** -** Calling plwAdd() after plwTerminate() may result in a corrupt -** doclist. -*/ -/* TODO(shess) Until we've written the second item, we can cache the -** first item's information. Then we'd have three states: -** -** - initialized with docid, no positions. -** - docid and one position. -** - docid and multiple positions. -** -** Only the last state needs to actually write to dlw->b, which would -** be an improvement in the DLCollector case. -*/ -typedef struct PLWriter { - DLWriter *dlw; - - int iColumn; /* the last column written */ - int iPos; /* the last position written */ - int iOffset; /* the last start offset written */ -} PLWriter; - -/* TODO(shess) In the case where the parent is reading these values -** from a PLReader, we could optimize to a copy if that PLReader has -** the same type as pWriter. -*/ -static void plwAdd(PLWriter *pWriter, int iColumn, int iPos, - int iStartOffset, int iEndOffset){ - /* Worst-case space for POS_COLUMN, iColumn, iPosDelta, - ** iStartOffsetDelta, and iEndOffsetDelta. - */ - char c[5*VARINT_MAX]; - int n = 0; - - /* Ban plwAdd() after plwTerminate(). */ - assert( pWriter->iPos!=-1 ); - - if( pWriter->dlw->iType==DL_DOCIDS ) return; - - if( iColumn!=pWriter->iColumn ){ - n += putVarint(c+n, POS_COLUMN); - n += putVarint(c+n, iColumn); - pWriter->iColumn = iColumn; - pWriter->iPos = 0; - pWriter->iOffset = 0; - } - assert( iPos>=pWriter->iPos ); - n += putVarint(c+n, POS_BASE+(iPos-pWriter->iPos)); - pWriter->iPos = iPos; - if( pWriter->dlw->iType==DL_POSITIONS_OFFSETS ){ - assert( iStartOffset>=pWriter->iOffset ); - n += putVarint(c+n, iStartOffset-pWriter->iOffset); - pWriter->iOffset = iStartOffset; - assert( iEndOffset>=iStartOffset ); - n += putVarint(c+n, iEndOffset-iStartOffset); - } - dataBufferAppend(pWriter->dlw->b, c, n); -} -static void plwCopy(PLWriter *pWriter, PLReader *pReader){ - plwAdd(pWriter, plrColumn(pReader), plrPosition(pReader), - plrStartOffset(pReader), plrEndOffset(pReader)); -} -static void plwInit(PLWriter *pWriter, DLWriter *dlw, sqlite_int64 iDocid){ - char c[VARINT_MAX]; - int n; - - pWriter->dlw = dlw; - - /* Docids must ascend. */ - assert( !pWriter->dlw->has_iPrevDocid || iDocid>pWriter->dlw->iPrevDocid ); - n = putVarint(c, iDocid-pWriter->dlw->iPrevDocid); - dataBufferAppend(pWriter->dlw->b, c, n); - pWriter->dlw->iPrevDocid = iDocid; -#ifndef NDEBUG - pWriter->dlw->has_iPrevDocid = 1; -#endif - - pWriter->iColumn = 0; - pWriter->iPos = 0; - pWriter->iOffset = 0; -} -/* TODO(shess) Should plwDestroy() also terminate the doclist? But -** then plwDestroy() would no longer be just a destructor, it would -** also be doing work, which isn't consistent with the overall idiom. -** Another option would be for plwAdd() to always append any necessary -** terminator, so that the output is always correct. But that would -** add incremental work to the common case with the only benefit being -** API elegance. Punt for now. -*/ -static void plwTerminate(PLWriter *pWriter){ - if( pWriter->dlw->iType>DL_DOCIDS ){ - char c[VARINT_MAX]; - int n = putVarint(c, POS_END); - dataBufferAppend(pWriter->dlw->b, c, n); - } -#ifndef NDEBUG - /* Mark as terminated for assert in plwAdd(). */ - pWriter->iPos = -1; -#endif -} -static void plwDestroy(PLWriter *pWriter){ - SCRAMBLE(pWriter); -} - -/*******************************************************************/ -/* DLCollector wraps PLWriter and DLWriter to provide a -** dynamically-allocated doclist area to use during tokenization. -** -** dlcNew - malloc up and initialize a collector. -** dlcDelete - destroy a collector and all contained items. -** dlcAddPos - append position and offset information. -** dlcAddDoclist - add the collected doclist to the given buffer. -** dlcNext - terminate the current document and open another. -*/ -typedef struct DLCollector { - DataBuffer b; - DLWriter dlw; - PLWriter plw; -} DLCollector; - -/* TODO(shess) This could also be done by calling plwTerminate() and -** dataBufferAppend(). I tried that, expecting nominal performance -** differences, but it seemed to pretty reliably be worth 1% to code -** it this way. I suspect it's the incremental malloc overhead (some -** percentage of the plwTerminate() calls will cause a realloc), so -** this might be worth revisiting if the DataBuffer implementation -** changes. -*/ -static void dlcAddDoclist(DLCollector *pCollector, DataBuffer *b){ - if( pCollector->dlw.iType>DL_DOCIDS ){ - char c[VARINT_MAX]; - int n = putVarint(c, POS_END); - dataBufferAppend2(b, pCollector->b.pData, pCollector->b.nData, c, n); - }else{ - dataBufferAppend(b, pCollector->b.pData, pCollector->b.nData); - } -} -static void dlcNext(DLCollector *pCollector, sqlite_int64 iDocid){ - plwTerminate(&pCollector->plw); - plwDestroy(&pCollector->plw); - plwInit(&pCollector->plw, &pCollector->dlw, iDocid); -} -static void dlcAddPos(DLCollector *pCollector, int iColumn, int iPos, - int iStartOffset, int iEndOffset){ - plwAdd(&pCollector->plw, iColumn, iPos, iStartOffset, iEndOffset); -} - -static DLCollector *dlcNew(sqlite_int64 iDocid, DocListType iType){ - DLCollector *pCollector = malloc(sizeof(DLCollector)); - dataBufferInit(&pCollector->b, 0); - dlwInit(&pCollector->dlw, iType, &pCollector->b); - plwInit(&pCollector->plw, &pCollector->dlw, iDocid); - return pCollector; -} -static void dlcDelete(DLCollector *pCollector){ - plwDestroy(&pCollector->plw); - dlwDestroy(&pCollector->dlw); - dataBufferDestroy(&pCollector->b); - SCRAMBLE(pCollector); - free(pCollector); -} - - -/* Copy the doclist data of iType in pData/nData into *out, trimming -** unnecessary data as we go. Only columns matching iColumn are -** copied, all columns copied if iColumn is -1. Elements with no -** matching columns are dropped. The output is an iOutType doclist. -*/ -/* NOTE(shess) This code is only valid after all doclists are merged. -** If this is run before merges, then doclist items which represent -** deletion will be trimmed, and will thus not effect a deletion -** during the merge. -*/ -static void docListTrim(DocListType iType, const char *pData, int nData, - int iColumn, DocListType iOutType, DataBuffer *out){ - DLReader dlReader; - DLWriter dlWriter; - - assert( iOutType<=iType ); - - dlrInit(&dlReader, iType, pData, nData); - dlwInit(&dlWriter, iOutType, out); - - while( !dlrAtEnd(&dlReader) ){ - PLReader plReader; - PLWriter plWriter; - int match = 0; - - plrInit(&plReader, &dlReader); - - while( !plrAtEnd(&plReader) ){ - if( iColumn==-1 || plrColumn(&plReader)==iColumn ){ - if( !match ){ - plwInit(&plWriter, &dlWriter, dlrDocid(&dlReader)); - match = 1; - } - plwAdd(&plWriter, plrColumn(&plReader), plrPosition(&plReader), - plrStartOffset(&plReader), plrEndOffset(&plReader)); - } - plrStep(&plReader); - } - if( match ){ - plwTerminate(&plWriter); - plwDestroy(&plWriter); - } - - plrDestroy(&plReader); - dlrStep(&dlReader); - } - dlwDestroy(&dlWriter); - dlrDestroy(&dlReader); -} - -/* Used by docListMerge() to keep doclists in the ascending order by -** docid, then ascending order by age (so the newest comes first). -*/ -typedef struct OrderedDLReader { - DLReader *pReader; - - /* TODO(shess) If we assume that docListMerge pReaders is ordered by - ** age (which we do), then we could use pReader comparisons to break - ** ties. - */ - int idx; -} OrderedDLReader; - -/* Order eof to end, then by docid asc, idx desc. */ -static int orderedDLReaderCmp(OrderedDLReader *r1, OrderedDLReader *r2){ - if( dlrAtEnd(r1->pReader) ){ - if( dlrAtEnd(r2->pReader) ) return 0; /* Both atEnd(). */ - return 1; /* Only r1 atEnd(). */ - } - if( dlrAtEnd(r2->pReader) ) return -1; /* Only r2 atEnd(). */ - - if( dlrDocid(r1->pReader)pReader) ) return -1; - if( dlrDocid(r1->pReader)>dlrDocid(r2->pReader) ) return 1; - - /* Descending on idx. */ - return r2->idx-r1->idx; -} - -/* Bubble p[0] to appropriate place in p[1..n-1]. Assumes that -** p[1..n-1] is already sorted. -*/ -/* TODO(shess) Is this frequent enough to warrant a binary search? -** Before implementing that, instrument the code to check. In most -** current usage, I expect that p[0] will be less than p[1] a very -** high proportion of the time. -*/ -static void orderedDLReaderReorder(OrderedDLReader *p, int n){ - while( n>1 && orderedDLReaderCmp(p, p+1)>0 ){ - OrderedDLReader tmp = p[0]; - p[0] = p[1]; - p[1] = tmp; - n--; - p++; - } -} - -/* Given an array of doclist readers, merge their doclist elements -** into out in sorted order (by docid), dropping elements from older -** readers when there is a duplicate docid. pReaders is assumed to be -** ordered by age, oldest first. -*/ -/* TODO(shess) nReaders must be <= MERGE_COUNT. This should probably -** be fixed. -*/ -static void docListMerge(DataBuffer *out, - DLReader *pReaders, int nReaders){ - OrderedDLReader readers[MERGE_COUNT]; - DLWriter writer; - int i, n; - const char *pStart = 0; - int nStart = 0; - sqlite_int64 iFirstDocid = 0, iLastDocid = 0; - - assert( nReaders>0 ); - if( nReaders==1 ){ - dataBufferAppend(out, dlrDocData(pReaders), dlrAllDataBytes(pReaders)); - return; - } - - assert( nReaders<=MERGE_COUNT ); - n = 0; - for(i=0; i0 ){ - orderedDLReaderReorder(readers+i, nReaders-i); - } - - dlwInit(&writer, pReaders[0].iType, out); - while( !dlrAtEnd(readers[0].pReader) ){ - sqlite_int64 iDocid = dlrDocid(readers[0].pReader); - - /* If this is a continuation of the current buffer to copy, extend - ** that buffer. memcpy() seems to be more efficient if it has a - ** lots of data to copy. - */ - if( dlrDocData(readers[0].pReader)==pStart+nStart ){ - nStart += dlrDocDataBytes(readers[0].pReader); - }else{ - if( pStart!=0 ){ - dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); - } - pStart = dlrDocData(readers[0].pReader); - nStart = dlrDocDataBytes(readers[0].pReader); - iFirstDocid = iDocid; - } - iLastDocid = iDocid; - dlrStep(readers[0].pReader); - - /* Drop all of the older elements with the same docid. */ - for(i=1; i0 ){ - orderedDLReaderReorder(readers+i, nReaders-i); - } - } - - /* Copy over any remaining elements. */ - if( nStart>0 ) dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); - dlwDestroy(&writer); -} - -/* Helper function for posListUnion(). Compares the current position -** between left and right, returning as standard C idiom of <0 if -** left0 if left>right, and 0 if left==right. "End" always -** compares greater. -*/ -static int posListCmp(PLReader *pLeft, PLReader *pRight){ - assert( pLeft->iType==pRight->iType ); - if( pLeft->iType==DL_DOCIDS ) return 0; - - if( plrAtEnd(pLeft) ) return plrAtEnd(pRight) ? 0 : 1; - if( plrAtEnd(pRight) ) return -1; - - if( plrColumn(pLeft)plrColumn(pRight) ) return 1; - - if( plrPosition(pLeft)plrPosition(pRight) ) return 1; - if( pLeft->iType==DL_POSITIONS ) return 0; - - if( plrStartOffset(pLeft)plrStartOffset(pRight) ) return 1; - - if( plrEndOffset(pLeft)plrEndOffset(pRight) ) return 1; - - return 0; -} - -/* Write the union of position lists in pLeft and pRight to pOut. -** "Union" in this case meaning "All unique position tuples". Should -** work with any doclist type, though both inputs and the output -** should be the same type. -*/ -static void posListUnion(DLReader *pLeft, DLReader *pRight, DLWriter *pOut){ - PLReader left, right; - PLWriter writer; - - assert( dlrDocid(pLeft)==dlrDocid(pRight) ); - assert( pLeft->iType==pRight->iType ); - assert( pLeft->iType==pOut->iType ); - - plrInit(&left, pLeft); - plrInit(&right, pRight); - plwInit(&writer, pOut, dlrDocid(pLeft)); - - while( !plrAtEnd(&left) || !plrAtEnd(&right) ){ - int c = posListCmp(&left, &right); - if( c<0 ){ - plwCopy(&writer, &left); - plrStep(&left); - }else if( c>0 ){ - plwCopy(&writer, &right); - plrStep(&right); - }else{ - plwCopy(&writer, &left); - plrStep(&left); - plrStep(&right); - } - } - - plwTerminate(&writer); - plwDestroy(&writer); - plrDestroy(&left); - plrDestroy(&right); -} - -/* Write the union of doclists in pLeft and pRight to pOut. For -** docids in common between the inputs, the union of the position -** lists is written. Inputs and outputs are always type DL_DEFAULT. -*/ -static void docListUnion( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DataBuffer *pOut /* Write the combined doclist here */ -){ - DLReader left, right; - DLWriter writer; - - if( nLeft==0 ){ - dataBufferAppend(pOut, pRight, nRight); - return; - } - if( nRight==0 ){ - dataBufferAppend(pOut, pLeft, nLeft); - return; - } - - dlrInit(&left, DL_DEFAULT, pLeft, nLeft); - dlrInit(&right, DL_DEFAULT, pRight, nRight); - dlwInit(&writer, DL_DEFAULT, pOut); - - while( !dlrAtEnd(&left) || !dlrAtEnd(&right) ){ - if( dlrAtEnd(&right) ){ - dlwCopy(&writer, &left); - dlrStep(&left); - }else if( dlrAtEnd(&left) ){ - dlwCopy(&writer, &right); - dlrStep(&right); - }else if( dlrDocid(&left)dlrDocid(&right) ){ - dlwCopy(&writer, &right); - dlrStep(&right); - }else{ - posListUnion(&left, &right, &writer); - dlrStep(&left); - dlrStep(&right); - } - } - - dlrDestroy(&left); - dlrDestroy(&right); - dlwDestroy(&writer); -} - -/* pLeft and pRight are DLReaders positioned to the same docid. -** -** If there are no instances in pLeft or pRight where the position -** of pLeft is one less than the position of pRight, then this -** routine adds nothing to pOut. -** -** If there are one or more instances where positions from pLeft -** are exactly one less than positions from pRight, then add a new -** document record to pOut. If pOut wants to hold positions, then -** include the positions from pRight that are one more than a -** position in pLeft. In other words: pRight.iPos==pLeft.iPos+1. -*/ -static void posListPhraseMerge(DLReader *pLeft, DLReader *pRight, - DLWriter *pOut){ - PLReader left, right; - PLWriter writer; - int match = 0; - - assert( dlrDocid(pLeft)==dlrDocid(pRight) ); - assert( pOut->iType!=DL_POSITIONS_OFFSETS ); - - plrInit(&left, pLeft); - plrInit(&right, pRight); - - while( !plrAtEnd(&left) && !plrAtEnd(&right) ){ - if( plrColumn(&left)plrColumn(&right) ){ - plrStep(&right); - }else if( plrPosition(&left)+1plrPosition(&right) ){ - plrStep(&right); - }else{ - if( !match ){ - plwInit(&writer, pOut, dlrDocid(pLeft)); - match = 1; - } - plwAdd(&writer, plrColumn(&right), plrPosition(&right), 0, 0); - plrStep(&left); - plrStep(&right); - } - } - - if( match ){ - plwTerminate(&writer); - plwDestroy(&writer); - } - - plrDestroy(&left); - plrDestroy(&right); -} - -/* We have two doclists with positions: pLeft and pRight. -** Write the phrase intersection of these two doclists into pOut. -** -** A phrase intersection means that two documents only match -** if pLeft.iPos+1==pRight.iPos. -** -** iType controls the type of data written to pOut. If iType is -** DL_POSITIONS, the positions are those from pRight. -*/ -static void docListPhraseMerge( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DocListType iType, - DataBuffer *pOut /* Write the combined doclist here */ -){ - DLReader left, right; - DLWriter writer; - - if( nLeft==0 || nRight==0 ) return; - - assert( iType!=DL_POSITIONS_OFFSETS ); - - dlrInit(&left, DL_POSITIONS, pLeft, nLeft); - dlrInit(&right, DL_POSITIONS, pRight, nRight); - dlwInit(&writer, iType, pOut); - - while( !dlrAtEnd(&left) && !dlrAtEnd(&right) ){ - if( dlrDocid(&left) one AND (two OR three) - * [one OR two three] ==> (one OR two) AND three - * - * A "-" before a term matches all entries that lack that term. - * The "-" must occur immediately before the term with in intervening - * space. This is how the search engines do it. - * - * A NOT term cannot be the right-hand operand of an OR. If this - * occurs in the query string, the NOT is ignored: - * - * [one OR -two] ==> one OR two - * - */ -typedef struct Query { - fulltext_vtab *pFts; /* The full text index */ - int nTerms; /* Number of terms in the query */ - QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */ - int nextIsOr; /* Set the isOr flag on the next inserted term */ - int nextColumn; /* Next word parsed must be in this column */ - int dfltColumn; /* The default column */ -} Query; - - -/* -** An instance of the following structure keeps track of generated -** matching-word offset information and snippets. -*/ -typedef struct Snippet { - int nMatch; /* Total number of matches */ - int nAlloc; /* Space allocated for aMatch[] */ - struct snippetMatch { /* One entry for each matching term */ - char snStatus; /* Status flag for use while constructing snippets */ - short int iCol; /* The column that contains the match */ - short int iTerm; /* The index in Query.pTerms[] of the matching term */ - short int nByte; /* Number of bytes in the term */ - int iStart; /* The offset to the first character of the term */ - } *aMatch; /* Points to space obtained from malloc */ - char *zOffset; /* Text rendering of aMatch[] */ - int nOffset; /* strlen(zOffset) */ - char *zSnippet; /* Snippet text */ - int nSnippet; /* strlen(zSnippet) */ -} Snippet; - - -typedef enum QueryType { - QUERY_GENERIC, /* table scan */ - QUERY_ROWID, /* lookup by rowid */ - QUERY_FULLTEXT /* QUERY_FULLTEXT + [i] is a full-text search for column i*/ -} QueryType; - -typedef enum fulltext_statement { - CONTENT_INSERT_STMT, - CONTENT_SELECT_STMT, - CONTENT_UPDATE_STMT, - CONTENT_DELETE_STMT, - - BLOCK_INSERT_STMT, - BLOCK_SELECT_STMT, - BLOCK_DELETE_STMT, - - SEGDIR_MAX_INDEX_STMT, - SEGDIR_SET_STMT, - SEGDIR_SELECT_STMT, - SEGDIR_SPAN_STMT, - SEGDIR_DELETE_STMT, - SEGDIR_SELECT_ALL_STMT, - - MAX_STMT /* Always at end! */ -} fulltext_statement; - -/* These must exactly match the enum above. */ -/* TODO(shess): Is there some risk that a statement will be used in two -** cursors at once, e.g. if a query joins a virtual table to itself? -** If so perhaps we should move some of these to the cursor object. -*/ -static const char *const fulltext_zStatement[MAX_STMT] = { - /* CONTENT_INSERT */ NULL, /* generated in contentInsertStatement() */ - /* CONTENT_SELECT */ "select * from %_content where rowid = ?", - /* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */ - /* CONTENT_DELETE */ "delete from %_content where rowid = ?", - - /* BLOCK_INSERT */ "insert into %_segments values (?)", - /* BLOCK_SELECT */ "select block from %_segments where rowid = ?", - /* BLOCK_DELETE */ "delete from %_segments where rowid between ? and ?", - - /* SEGDIR_MAX_INDEX */ "select max(idx) from %_segdir where level = ?", - /* SEGDIR_SET */ "insert into %_segdir values (?, ?, ?, ?, ?, ?)", - /* SEGDIR_SELECT */ - "select start_block, leaves_end_block, root from %_segdir " - " where level = ? order by idx", - /* SEGDIR_SPAN */ - "select min(start_block), max(end_block) from %_segdir " - " where level = ? and start_block <> 0", - /* SEGDIR_DELETE */ "delete from %_segdir where level = ?", - /* SEGDIR_SELECT_ALL */ - "select root, leaves_end_block from %_segdir order by level desc, idx", -}; - -/* -** A connection to a fulltext index is an instance of the following -** structure. The xCreate and xConnect methods create an instance -** of this structure and xDestroy and xDisconnect free that instance. -** All other methods receive a pointer to the structure as one of their -** arguments. -*/ -struct fulltext_vtab { - sqlite3_vtab base; /* Base class used by SQLite core */ - sqlite3 *db; /* The database connection */ - const char *zDb; /* logical database name */ - const char *zName; /* virtual table name */ - int nColumn; /* number of columns in virtual table */ - char **azColumn; /* column names. malloced */ - char **azContentColumn; /* column names in content table; malloced */ - sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ - - /* Precompiled statements which we keep as long as the table is - ** open. - */ - sqlite3_stmt *pFulltextStatements[MAX_STMT]; - - /* Precompiled statements used for segment merges. We run a - ** separate select across the leaf level of each tree being merged. - */ - sqlite3_stmt *pLeafSelectStmts[MERGE_COUNT]; - /* The statement used to prepare pLeafSelectStmts. */ -#define LEAF_SELECT \ - "select block from %_segments where rowid between ? and ? order by rowid" - - /* These buffer pending index updates during transactions. - ** nPendingData estimates the memory size of the pending data. It - ** doesn't include the hash-bucket overhead, nor any malloc - ** overhead. When nPendingData exceeds kPendingThreshold, the - ** buffer is flushed even before the transaction closes. - ** pendingTerms stores the data, and is only valid when nPendingData - ** is >=0 (nPendingData<0 means pendingTerms has not been - ** initialized). iPrevDocid is the last docid written, used to make - ** certain we're inserting in sorted order. - */ - int nPendingData; -#define kPendingThreshold (1*1024*1024) - sqlite_int64 iPrevDocid; - fts2Hash pendingTerms; -}; - -/* -** When the core wants to do a query, it create a cursor using a -** call to xOpen. This structure is an instance of a cursor. It -** is destroyed by xClose. -*/ -typedef struct fulltext_cursor { - sqlite3_vtab_cursor base; /* Base class used by SQLite core */ - QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ - sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ - int eof; /* True if at End Of Results */ - Query q; /* Parsed query string */ - Snippet snippet; /* Cached snippet for the current row */ - int iColumn; /* Column being searched */ - DataBuffer result; /* Doclist results from fulltextQuery */ - DLReader reader; /* Result reader if result not empty */ -} fulltext_cursor; - -static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){ - return (fulltext_vtab *) c->base.pVtab; -} - -static const sqlite3_module fts2Module; /* forward declaration */ - -/* Return a dynamically generated statement of the form - * insert into %_content (rowid, ...) values (?, ...) - */ -static const char *contentInsertStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "insert into %_content (rowid, "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, ") values (?"); - for(i=0; inColumn; ++i) - append(&sb, ", ?"); - append(&sb, ")"); - return stringBufferData(&sb); -} - -/* Return a dynamically generated statement of the form - * update %_content set [col_0] = ?, [col_1] = ?, ... - * where rowid = ? - */ -static const char *contentUpdateStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "update %_content set "); - for(i=0; inColumn; ++i) { - if( i>0 ){ - append(&sb, ", "); - } - append(&sb, v->azContentColumn[i]); - append(&sb, " = ?"); - } - append(&sb, " where rowid = ?"); - return stringBufferData(&sb); -} - -/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. -** If the indicated statement has never been prepared, it is prepared -** and cached, otherwise the cached version is reset. -*/ -static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, - sqlite3_stmt **ppStmt){ - assert( iStmtpFulltextStatements[iStmt]==NULL ){ - const char *zStmt; - int rc; - switch( iStmt ){ - case CONTENT_INSERT_STMT: - zStmt = contentInsertStatement(v); break; - case CONTENT_UPDATE_STMT: - zStmt = contentUpdateStatement(v); break; - default: - zStmt = fulltext_zStatement[iStmt]; - } - rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], - zStmt); - if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt); - if( rc!=SQLITE_OK ) return rc; - } else { - int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); - if( rc!=SQLITE_OK ) return rc; - } - - *ppStmt = v->pFulltextStatements[iStmt]; - return SQLITE_OK; -} - -/* Like sqlite3_step(), but convert SQLITE_DONE to SQLITE_OK and -** SQLITE_ROW to SQLITE_ERROR. Useful for statements like UPDATE, -** where we expect no results. -*/ -static int sql_single_step(sqlite3_stmt *s){ - int rc = sqlite3_step(s); - return (rc==SQLITE_DONE) ? SQLITE_OK : rc; -} - -/* Like sql_get_statement(), but for special replicated LEAF_SELECT -** statements. -*/ -/* TODO(shess) Write version for generic statements and then share -** that between the cached-statement functions. -*/ -static int sql_get_leaf_statement(fulltext_vtab *v, int idx, - sqlite3_stmt **ppStmt){ - assert( idx>=0 && idxpLeafSelectStmts[idx]==NULL ){ - int rc = sql_prepare(v->db, v->zDb, v->zName, &v->pLeafSelectStmts[idx], - LEAF_SELECT); - if( rc!=SQLITE_OK ) return rc; - }else{ - int rc = sqlite3_reset(v->pLeafSelectStmts[idx]); - if( rc!=SQLITE_OK ) return rc; - } - - *ppStmt = v->pLeafSelectStmts[idx]; - return SQLITE_OK; -} - -/* insert into %_content (rowid, ...) values ([rowid], [pValues]) */ -static int content_insert(fulltext_vtab *v, sqlite3_value *rowid, - sqlite3_value **pValues){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_value(s, 1, rowid); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 2+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; - } - - return sql_single_step(s); -} - -/* update %_content set col0 = pValues[0], col1 = pValues[1], ... - * where rowid = [iRowid] */ -static int content_update(fulltext_vtab *v, sqlite3_value **pValues, - sqlite_int64 iRowid){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 1+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; - } - - rc = sqlite3_bind_int64(s, 1+v->nColumn, iRowid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -static void freeStringArray(int nString, const char **pString){ - int i; - - for (i=0 ; i < nString ; ++i) { - if( pString[i]!=NULL ) free((void *) pString[i]); - } - free((void *) pString); -} - -/* select * from %_content where rowid = [iRow] - * The caller must delete the returned array and all strings in it. - * null fields will be NULL in the returned array. - * - * TODO: Perhaps we should return pointer/length strings here for consistency - * with other code which uses pointer/length. */ -static int content_select(fulltext_vtab *v, sqlite_int64 iRow, - const char ***pValues){ - sqlite3_stmt *s; - const char **values; - int i; - int rc; - - *pValues = NULL; - - rc = sql_get_statement(v, CONTENT_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc!=SQLITE_ROW ) return rc; - - values = (const char **) malloc(v->nColumn * sizeof(const char *)); - for(i=0; inColumn; ++i){ - if( sqlite3_column_type(s, i)==SQLITE_NULL ){ - values[i] = NULL; - }else{ - values[i] = string_dup((char*)sqlite3_column_text(s, i)); - } - } - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - *pValues = values; - return SQLITE_OK; - } - - freeStringArray(v->nColumn, values); - return rc; -} - -/* delete from %_content where rowid = [iRow ] */ -static int content_delete(fulltext_vtab *v, sqlite_int64 iRow){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iRow); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* insert into %_segments values ([pData]) -** returns assigned rowid in *piBlockid -*/ -static int block_insert(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 *piBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, BLOCK_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_blob(s, 1, pData, nData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - - *piBlockid = sqlite3_last_insert_rowid(v->db); - return SQLITE_OK; -} - -/* delete from %_segments -** where rowid between [iStartBlockid] and [iEndBlockid] -** -** Deletes the range of blocks, inclusive, used to delete the blocks -** which form a segment. -*/ -static int block_delete(fulltext_vtab *v, - sqlite_int64 iStartBlockid, sqlite_int64 iEndBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, BLOCK_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* Returns SQLITE_ROW with *pidx set to the maximum segment idx found -** at iLevel. Returns SQLITE_DONE if there are no segments at -** iLevel. Otherwise returns an error. -*/ -static int segdir_max_index(fulltext_vtab *v, int iLevel, int *pidx){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_MAX_INDEX_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - /* Should always get at least one row due to how max() works. */ - if( rc==SQLITE_DONE ) return SQLITE_DONE; - if( rc!=SQLITE_ROW ) return rc; - - /* NULL means that there were no inputs to max(). */ - if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - return rc; - } - - *pidx = sqlite3_column_int(s, 0); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - return SQLITE_ROW; -} - -/* insert into %_segdir values ( -** [iLevel], [idx], -** [iStartBlockid], [iLeavesEndBlockid], [iEndBlockid], -** [pRootData] -** ) -*/ -static int segdir_set(fulltext_vtab *v, int iLevel, int idx, - sqlite_int64 iStartBlockid, - sqlite_int64 iLeavesEndBlockid, - sqlite_int64 iEndBlockid, - const char *pRootData, int nRootData){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SET_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 2, idx); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 3, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 4, iLeavesEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 5, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_blob(s, 6, pRootData, nRootData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* Queries %_segdir for the block span of the segments in level -** iLevel. Returns SQLITE_DONE if there are no blocks for iLevel, -** SQLITE_ROW if there are blocks, else an error. -*/ -static int segdir_span(fulltext_vtab *v, int iLevel, - sqlite_int64 *piStartBlockid, - sqlite_int64 *piEndBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SPAN_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_DONE; /* Should never happen */ - if( rc!=SQLITE_ROW ) return rc; - - /* This happens if all segments at this level are entirely inline. */ - if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - int rc2 = sqlite3_step(s); - if( rc2==SQLITE_ROW ) return SQLITE_ERROR; - return rc2; - } - - *piStartBlockid = sqlite3_column_int64(s, 0); - *piEndBlockid = sqlite3_column_int64(s, 1); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - return SQLITE_ROW; -} - -/* Delete the segment blocks and segment directory records for all -** segments at iLevel. -*/ -static int segdir_delete(fulltext_vtab *v, int iLevel){ - sqlite3_stmt *s; - sqlite_int64 iStartBlockid, iEndBlockid; - int rc = segdir_span(v, iLevel, &iStartBlockid, &iEndBlockid); - if( rc!=SQLITE_ROW && rc!=SQLITE_DONE ) return rc; - - if( rc==SQLITE_ROW ){ - rc = block_delete(v, iStartBlockid, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - } - - /* Delete the segment directory itself. */ - rc = sql_get_statement(v, SEGDIR_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* TODO(shess) clearPendingTerms() is far down the file because -** writeZeroSegment() is far down the file because LeafWriter is far -** down the file. Consider refactoring the code to move the non-vtab -** code above the vtab code so that we don't need this forward -** reference. -*/ -static int clearPendingTerms(fulltext_vtab *v); - -/* -** Free the memory used to contain a fulltext_vtab structure. -*/ -static void fulltext_vtab_destroy(fulltext_vtab *v){ - int iStmt, i; - - TRACE(("FTS2 Destroy %p\n", v)); - for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ - sqlite3_finalize(v->pFulltextStatements[iStmt]); - v->pFulltextStatements[iStmt] = NULL; - } - } - - for( i=0; ipLeafSelectStmts[i]!=NULL ){ - sqlite3_finalize(v->pLeafSelectStmts[i]); - v->pLeafSelectStmts[i] = NULL; - } - } - - if( v->pTokenizer!=NULL ){ - v->pTokenizer->pModule->xDestroy(v->pTokenizer); - v->pTokenizer = NULL; - } - - clearPendingTerms(v); - - free(v->azColumn); - for(i = 0; i < v->nColumn; ++i) { - sqlite3_free(v->azContentColumn[i]); - } - free(v->azContentColumn); - free(v); -} - -/* -** Token types for parsing the arguments to xConnect or xCreate. -*/ -#define TOKEN_EOF 0 /* End of file */ -#define TOKEN_SPACE 1 /* Any kind of whitespace */ -#define TOKEN_ID 2 /* An identifier */ -#define TOKEN_STRING 3 /* A string literal */ -#define TOKEN_PUNCT 4 /* A single punctuation character */ - -/* -** If X is a character that can be used in an identifier then -** IdChar(X) will be true. Otherwise it is false. -** -** For ASCII, any character with the high-order bit set is -** allowed in an identifier. For 7-bit characters, -** sqlite3IsIdChar[X] must be 1. -** -** Ticket #1066. the SQL standard does not allow '$' in the -** middle of identfiers. But many SQL implementations do. -** SQLite will allow '$' in identifiers for compatibility. -** But the feature is undocumented. -*/ -static const char isIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isIdChar[c-0x20])) - - -/* -** Return the length of the token that begins at z[0]. -** Store the token type in *tokenType before returning. -*/ -static int getToken(const char *z, int *tokenType){ - int i, c; - switch( *z ){ - case 0: { - *tokenType = TOKEN_EOF; - return 0; - } - case ' ': case '\t': case '\n': case '\f': case '\r': { - for(i=1; safe_isspace(z[i]); i++){} - *tokenType = TOKEN_SPACE; - return i; - } - case '`': - case '\'': - case '"': { - int delim = z[0]; - for(i=1; (c=z[i])!=0; i++){ - if( c==delim ){ - if( z[i+1]==delim ){ - i++; - }else{ - break; - } - } - } - *tokenType = TOKEN_STRING; - return i + (c!=0); - } - case '[': { - for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} - *tokenType = TOKEN_ID; - return i; - } - default: { - if( !IdChar(*z) ){ - break; - } - for(i=1; IdChar(z[i]); i++){} - *tokenType = TOKEN_ID; - return i; - } - } - *tokenType = TOKEN_PUNCT; - return 1; -} - -/* -** A token extracted from a string is an instance of the following -** structure. -*/ -typedef struct Token { - const char *z; /* Pointer to token text. Not '\000' terminated */ - short int n; /* Length of the token text in bytes. */ -} Token; - -/* -** Given a input string (which is really one of the argv[] parameters -** passed into xConnect or xCreate) split the string up into tokens. -** Return an array of pointers to '\000' terminated strings, one string -** for each non-whitespace token. -** -** The returned array is terminated by a single NULL pointer. -** -** Space to hold the returned array is obtained from a single -** malloc and should be freed by passing the return value to free(). -** The individual strings within the token list are all a part of -** the single memory allocation and will all be freed at once. -*/ -static char **tokenizeString(const char *z, int *pnToken){ - int nToken = 0; - Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) ); - int n = 1; - int e, i; - int totalSize = 0; - char **azToken; - char *zCopy; - while( n>0 ){ - n = getToken(z, &e); - if( e!=TOKEN_SPACE ){ - aToken[nToken].z = z; - aToken[nToken].n = n; - nToken++; - totalSize += n+1; - } - z += n; - } - azToken = (char**)malloc( nToken*sizeof(char*) + totalSize ); - zCopy = (char*)&azToken[nToken]; - nToken--; - for(i=0; i=0 ){ - azIn[j] = azIn[i]; - } - j++; - } - } - azIn[j] = 0; - } -} - - -/* -** Find the first alphanumeric token in the string zIn. Null-terminate -** this token. Remove any quotation marks. And return a pointer to -** the result. -*/ -static char *firstToken(char *zIn, char **pzTail){ - int n, ttype; - while(1){ - n = getToken(zIn, &ttype); - if( ttype==TOKEN_SPACE ){ - zIn += n; - }else if( ttype==TOKEN_EOF ){ - *pzTail = zIn; - return 0; - }else{ - zIn[n] = 0; - *pzTail = &zIn[1]; - dequoteString(zIn); - return zIn; - } - } - /*NOTREACHED*/ -} - -/* Return true if... -** -** * s begins with the string t, ignoring case -** * s is longer than t -** * The first character of s beyond t is not a alphanumeric -** -** Ignore leading space in *s. -** -** To put it another way, return true if the first token of -** s[] is t[]. -*/ -static int startsWith(const char *s, const char *t){ - while( safe_isspace(*s) ){ s++; } - while( *t ){ - if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; - } - return *s!='_' && !safe_isalnum(*s); -} - -/* -** An instance of this structure defines the "spec" of a -** full text index. This structure is populated by parseSpec -** and use by fulltextConnect and fulltextCreate. -*/ -typedef struct TableSpec { - const char *zDb; /* Logical database name */ - const char *zName; /* Name of the full-text index */ - int nColumn; /* Number of columns to be indexed */ - char **azColumn; /* Original names of columns to be indexed */ - char **azContentColumn; /* Column names for %_content */ - char **azTokenizer; /* Name of tokenizer and its arguments */ -} TableSpec; - -/* -** Reclaim all of the memory used by a TableSpec -*/ -static void clearTableSpec(TableSpec *p) { - free(p->azColumn); - free(p->azContentColumn); - free(p->azTokenizer); -} - -/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: - * - * CREATE VIRTUAL TABLE email - * USING fts2(subject, body, tokenize mytokenizer(myarg)) - * - * We return parsed information in a TableSpec structure. - * - */ -static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, - char**pzErr){ - int i, n; - char *z, *zDummy; - char **azArg; - const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ - - assert( argc>=3 ); - /* Current interface: - ** argv[0] - module name - ** argv[1] - database name - ** argv[2] - table name - ** argv[3..] - columns, optionally followed by tokenizer specification - ** and snippet delimiters specification. - */ - - /* Make a copy of the complete argv[][] array in a single allocation. - ** The argv[][] array is read-only and transient. We can write to the - ** copy in order to modify things and the copy is persistent. - */ - CLEAR(pSpec); - for(i=n=0; izDb = azArg[1]; - pSpec->zName = azArg[2]; - pSpec->nColumn = 0; - pSpec->azColumn = azArg; - zTokenizer = "tokenize simple"; - for(i=3; inColumn] = firstToken(azArg[i], &zDummy); - pSpec->nColumn++; - } - } - if( pSpec->nColumn==0 ){ - azArg[0] = "content"; - pSpec->nColumn = 1; - } - - /* - ** Construct the list of content column names. - ** - ** Each content column name will be of the form cNNAAAA - ** where NN is the column number and AAAA is the sanitized - ** column name. "sanitized" means that special characters are - ** converted to "_". The cNN prefix guarantees that all column - ** names are unique. - ** - ** The AAAA suffix is not strictly necessary. It is included - ** for the convenience of people who might examine the generated - ** %_content table and wonder what the columns are used for. - */ - pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) ); - if( pSpec->azContentColumn==0 ){ - clearTableSpec(pSpec); - return SQLITE_NOMEM; - } - for(i=0; inColumn; i++){ - char *p; - pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); - for (p = pSpec->azContentColumn[i]; *p ; ++p) { - if( !safe_isalnum(*p) ) *p = '_'; - } - } - - /* - ** Parse the tokenizer specification string. - */ - pSpec->azTokenizer = tokenizeString(zTokenizer, &n); - tokenListToIdList(pSpec->azTokenizer); - - return SQLITE_OK; -} - -/* -** Generate a CREATE TABLE statement that describes the schema of -** the virtual table. Return a pointer to this schema string. -** -** Space is obtained from sqlite3_mprintf() and should be freed -** using sqlite3_free(). -*/ -static char *fulltextSchema( - int nColumn, /* Number of columns */ - const char *const* azColumn, /* List of columns */ - const char *zTableName /* Name of the table */ -){ - int i; - char *zSchema, *zNext; - const char *zSep = "("; - zSchema = sqlite3_mprintf("CREATE TABLE x"); - for(i=0; ibase */ - v->db = db; - v->zDb = spec->zDb; /* Freed when azColumn is freed */ - v->zName = spec->zName; /* Freed when azColumn is freed */ - v->nColumn = spec->nColumn; - v->azContentColumn = spec->azContentColumn; - spec->azContentColumn = 0; - v->azColumn = spec->azColumn; - spec->azColumn = 0; - - if( spec->azTokenizer==0 ){ - return SQLITE_NOMEM; - } - - zTok = spec->azTokenizer[0]; - if( !zTok ){ - zTok = "simple"; - } - nTok = strlen(zTok)+1; - - m = (sqlite3_tokenizer_module *)sqlite3Fts2HashFind(pHash, zTok, nTok); - if( !m ){ - *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); - rc = SQLITE_ERROR; - goto err; - } - - for(n=0; spec->azTokenizer[n]; n++){} - if( n ){ - rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], - &v->pTokenizer); - }else{ - rc = m->xCreate(0, 0, &v->pTokenizer); - } - if( rc!=SQLITE_OK ) goto err; - v->pTokenizer->pModule = m; - - /* TODO: verify the existence of backing tables foo_content, foo_term */ - - schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, - spec->zName); - rc = sqlite3_declare_vtab(db, schema); - sqlite3_free(schema); - if( rc!=SQLITE_OK ) goto err; - - memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); - - /* Indicate that the buffer is not live. */ - v->nPendingData = -1; - - *ppVTab = &v->base; - TRACE(("FTS2 Connect %p\n", v)); - - return rc; - -err: - fulltext_vtab_destroy(v); - return rc; -} - -static int fulltextConnect( - sqlite3 *db, - void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, - char **pzErr -){ - TableSpec spec; - int rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - rc = constructVtab(db, (fts2Hash *)pAux, &spec, ppVTab, pzErr); - clearTableSpec(&spec); - return rc; -} - -/* The %_content table holds the text of each document, with -** the rowid used as the docid. -*/ -/* TODO(shess) This comment needs elaboration to match the updated -** code. Work it into the top-of-file comment at that time. -*/ -static int fulltextCreate(sqlite3 *db, void *pAux, - int argc, const char * const *argv, - sqlite3_vtab **ppVTab, char **pzErr){ - int rc; - TableSpec spec; - StringBuffer schema; - TRACE(("FTS2 Create\n")); - - rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - initStringBuffer(&schema); - append(&schema, "CREATE TABLE %_content("); - appendList(&schema, spec.nColumn, spec.azContentColumn); - append(&schema, ")"); - rc = sql_exec(db, spec.zDb, spec.zName, stringBufferData(&schema)); - stringBufferDestroy(&schema); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_segments(block blob);"); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_segdir(" - " level integer," - " idx integer," - " start_block integer," - " leaves_end_block integer," - " end_block integer," - " root blob," - " primary key(level, idx)" - ");"); - if( rc!=SQLITE_OK ) goto out; - - rc = constructVtab(db, (fts2Hash *)pAux, &spec, ppVTab, pzErr); - -out: - clearTableSpec(&spec); - return rc; -} - -/* Decide how to handle an SQL query. */ -static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ - int i; - TRACE(("FTS2 BestIndex\n")); - - for(i=0; inConstraint; ++i){ - const struct sqlite3_index_constraint *pConstraint; - pConstraint = &pInfo->aConstraint[i]; - if( pConstraint->usable ) { - if( pConstraint->iColumn==-1 && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ - pInfo->idxNum = QUERY_ROWID; /* lookup by rowid */ - TRACE(("FTS2 QUERY_ROWID\n")); - } else if( pConstraint->iColumn>=0 && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ - /* full-text search */ - pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; - TRACE(("FTS2 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); - } else continue; - - pInfo->aConstraintUsage[i].argvIndex = 1; - pInfo->aConstraintUsage[i].omit = 1; - - /* An arbitrary value for now. - * TODO: Perhaps rowid matches should be considered cheaper than - * full-text searches. */ - pInfo->estimatedCost = 1.0; - - return SQLITE_OK; - } - } - pInfo->idxNum = QUERY_GENERIC; - return SQLITE_OK; -} - -static int fulltextDisconnect(sqlite3_vtab *pVTab){ - TRACE(("FTS2 Disconnect %p\n", pVTab)); - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} - -static int fulltextDestroy(sqlite3_vtab *pVTab){ - fulltext_vtab *v = (fulltext_vtab *)pVTab; - int rc; - - TRACE(("FTS2 Destroy %p\n", pVTab)); - rc = sql_exec(v->db, v->zDb, v->zName, - "drop table if exists %_content;" - "drop table if exists %_segments;" - "drop table if exists %_segdir;" - ); - if( rc!=SQLITE_OK ) return rc; - - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} - -static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ - fulltext_cursor *c; - - c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1); - /* sqlite will initialize c->base */ - *ppCursor = &c->base; - TRACE(("FTS2 Open %p: %p\n", pVTab, c)); - - return SQLITE_OK; -} - - -/* Free all of the dynamically allocated memory held by *q -*/ -static void queryClear(Query *q){ - int i; - for(i = 0; i < q->nTerms; ++i){ - free(q->pTerms[i].pTerm); - } - free(q->pTerms); - CLEAR(q); -} - -/* Free all of the dynamically allocated memory held by the -** Snippet -*/ -static void snippetClear(Snippet *p){ - free(p->aMatch); - free(p->zOffset); - free(p->zSnippet); - CLEAR(p); -} -/* -** Append a single entry to the p->aMatch[] log. -*/ -static void snippetAppendMatch( - Snippet *p, /* Append the entry to this snippet */ - int iCol, int iTerm, /* The column and query term */ - int iStart, int nByte /* Offset and size of the match */ -){ - int i; - struct snippetMatch *pMatch; - if( p->nMatch+1>=p->nAlloc ){ - p->nAlloc = p->nAlloc*2 + 10; - p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); - if( p->aMatch==0 ){ - p->nMatch = 0; - p->nAlloc = 0; - return; - } - } - i = p->nMatch++; - pMatch = &p->aMatch[i]; - pMatch->iCol = iCol; - pMatch->iTerm = iTerm; - pMatch->iStart = iStart; - pMatch->nByte = nByte; -} - -/* -** Sizing information for the circular buffer used in snippetOffsetsOfColumn() -*/ -#define FTS2_ROTOR_SZ (32) -#define FTS2_ROTOR_MASK (FTS2_ROTOR_SZ-1) - -/* -** Add entries to pSnippet->aMatch[] for every match that occurs against -** document zDoc[0..nDoc-1] which is stored in column iColumn. -*/ -static void snippetOffsetsOfColumn( - Query *pQuery, - Snippet *pSnippet, - int iColumn, - const char *zDoc, - int nDoc -){ - const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ - sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ - sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ - fulltext_vtab *pVtab; /* The full text index */ - int nColumn; /* Number of columns in the index */ - const QueryTerm *aTerm; /* Query string terms */ - int nTerm; /* Number of query string terms */ - int i, j; /* Loop counters */ - int rc; /* Return code */ - unsigned int match, prevMatch; /* Phrase search bitmasks */ - const char *zToken; /* Next token from the tokenizer */ - int nToken; /* Size of zToken */ - int iBegin, iEnd, iPos; /* Offsets of beginning and end */ - - /* The following variables keep a circular buffer of the last - ** few tokens */ - unsigned int iRotor = 0; /* Index of current token */ - int iRotorBegin[FTS2_ROTOR_SZ]; /* Beginning offset of token */ - int iRotorLen[FTS2_ROTOR_SZ]; /* Length of token */ - - pVtab = pQuery->pFts; - nColumn = pVtab->nColumn; - pTokenizer = pVtab->pTokenizer; - pTModule = pTokenizer->pModule; - rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); - if( rc ) return; - pTCursor->pTokenizer = pTokenizer; - aTerm = pQuery->pTerms; - nTerm = pQuery->nTerms; - if( nTerm>=FTS2_ROTOR_SZ ){ - nTerm = FTS2_ROTOR_SZ - 1; - } - prevMatch = 0; - while(1){ - rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); - if( rc ) break; - iRotorBegin[iRotor&FTS2_ROTOR_MASK] = iBegin; - iRotorLen[iRotor&FTS2_ROTOR_MASK] = iEnd-iBegin; - match = 0; - for(i=0; i=0 && iColnToken ) continue; - if( !aTerm[i].isPrefix && aTerm[i].nTerm1 && (prevMatch & (1<=0; j--){ - int k = (iRotor-j) & FTS2_ROTOR_MASK; - snippetAppendMatch(pSnippet, iColumn, i-j, - iRotorBegin[k], iRotorLen[k]); - } - } - } - prevMatch = match<<1; - iRotor++; - } - pTModule->xClose(pTCursor); -} - - -/* -** Compute all offsets for the current row of the query. -** If the offsets have already been computed, this routine is a no-op. -*/ -static void snippetAllOffsets(fulltext_cursor *p){ - int nColumn; - int iColumn, i; - int iFirst, iLast; - fulltext_vtab *pFts; - - if( p->snippet.nMatch ) return; - if( p->q.nTerms==0 ) return; - pFts = p->q.pFts; - nColumn = pFts->nColumn; - iColumn = (p->iCursorType - QUERY_FULLTEXT); - if( iColumn<0 || iColumn>=nColumn ){ - iFirst = 0; - iLast = nColumn-1; - }else{ - iFirst = iColumn; - iLast = iColumn; - } - for(i=iFirst; i<=iLast; i++){ - const char *zDoc; - int nDoc; - zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); - nDoc = sqlite3_column_bytes(p->pStmt, i+1); - snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc); - } -} - -/* -** Convert the information in the aMatch[] array of the snippet -** into the string zOffset[0..nOffset-1]. -*/ -static void snippetOffsetText(Snippet *p){ - int i; - int cnt = 0; - StringBuffer sb; - char zBuf[200]; - if( p->zOffset ) return; - initStringBuffer(&sb); - for(i=0; inMatch; i++){ - struct snippetMatch *pMatch = &p->aMatch[i]; - zBuf[0] = ' '; - sprintf(&zBuf[cnt>0], "%d %d %d %d", pMatch->iCol, - pMatch->iTerm, pMatch->iStart, pMatch->nByte); - append(&sb, zBuf); - cnt++; - } - p->zOffset = stringBufferData(&sb); - p->nOffset = stringBufferLength(&sb); -} - -/* -** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set -** of matching words some of which might be in zDoc. zDoc is column -** number iCol. -** -** iBreak is suggested spot in zDoc where we could begin or end an -** excerpt. Return a value similar to iBreak but possibly adjusted -** to be a little left or right so that the break point is better. -*/ -static int wordBoundary( - int iBreak, /* The suggested break point */ - const char *zDoc, /* Document text */ - int nDoc, /* Number of bytes in zDoc[] */ - struct snippetMatch *aMatch, /* Matching words */ - int nMatch, /* Number of entries in aMatch[] */ - int iCol /* The column number for zDoc[] */ -){ - int i; - if( iBreak<=10 ){ - return 0; - } - if( iBreak>=nDoc-10 ){ - return nDoc; - } - for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ - return aMatch[i-1].iStart; - } - } - for(i=1; i<=10; i++){ - if( safe_isspace(zDoc[iBreak-i]) ){ - return iBreak - i + 1; - } - if( safe_isspace(zDoc[iBreak+i]) ){ - return iBreak + i + 1; - } - } - return iBreak; -} - - - -/* -** Allowed values for Snippet.aMatch[].snStatus -*/ -#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ -#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ - -/* -** Generate the text of a snippet. -*/ -static void snippetText( - fulltext_cursor *pCursor, /* The cursor we need the snippet for */ - const char *zStartMark, /* Markup to appear before each match */ - const char *zEndMark, /* Markup to appear after each match */ - const char *zEllipsis /* Ellipsis mark */ -){ - int i, j; - struct snippetMatch *aMatch; - int nMatch; - int nDesired; - StringBuffer sb; - int tailCol; - int tailOffset; - int iCol; - int nDoc; - const char *zDoc; - int iStart, iEnd; - int tailEllipsis = 0; - int iMatch; - - - free(pCursor->snippet.zSnippet); - pCursor->snippet.zSnippet = 0; - aMatch = pCursor->snippet.aMatch; - nMatch = pCursor->snippet.nMatch; - initStringBuffer(&sb); - - for(i=0; iq.nTerms; i++){ - for(j=0; j0; i++){ - if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; - nDesired--; - iCol = aMatch[i].iCol; - zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); - nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); - iStart = aMatch[i].iStart - 40; - iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); - if( iStart<=10 ){ - iStart = 0; - } - if( iCol==tailCol && iStart<=tailOffset+20 ){ - iStart = tailOffset; - } - if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ - trimWhiteSpace(&sb); - appendWhiteSpace(&sb); - append(&sb, zEllipsis); - appendWhiteSpace(&sb); - } - iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; - iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); - if( iEnd>=nDoc-10 ){ - iEnd = nDoc; - tailEllipsis = 0; - }else{ - tailEllipsis = 1; - } - while( iMatchsnippet.zSnippet = stringBufferData(&sb); - pCursor->snippet.nSnippet = stringBufferLength(&sb); -} - - -/* -** Close the cursor. For additional information see the documentation -** on the xClose method of the virtual table interface. -*/ -static int fulltextClose(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - TRACE(("FTS2 Close %p\n", c)); - sqlite3_finalize(c->pStmt); - queryClear(&c->q); - snippetClear(&c->snippet); - if( c->result.nData!=0 ) dlrDestroy(&c->reader); - dataBufferDestroy(&c->result); - free(c); - return SQLITE_OK; -} - -static int fulltextNext(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - int rc; - - TRACE(("FTS2 Next %p\n", pCursor)); - snippetClear(&c->snippet); - if( c->iCursorType < QUERY_FULLTEXT ){ - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - switch( rc ){ - case SQLITE_ROW: - c->eof = 0; - return SQLITE_OK; - case SQLITE_DONE: - c->eof = 1; - return SQLITE_OK; - default: - c->eof = 1; - return rc; - } - } else { /* full-text query */ - rc = sqlite3_reset(c->pStmt); - if( rc!=SQLITE_OK ) return rc; - - if( c->result.nData==0 || dlrAtEnd(&c->reader) ){ - c->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_bind_int64(c->pStmt, 1, dlrDocid(&c->reader)); - dlrStep(&c->reader); - if( rc!=SQLITE_OK ) return rc; - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - if( rc==SQLITE_ROW ){ /* the case we expect */ - c->eof = 0; - return SQLITE_OK; - } - /* an error occurred; abort */ - return rc==SQLITE_DONE ? SQLITE_ERROR : rc; - } -} - - -/* TODO(shess) If we pushed LeafReader to the top of the file, or to -** another file, term_select() could be pushed above -** docListOfTerm(). -*/ -static int termSelect(fulltext_vtab *v, int iColumn, - const char *pTerm, int nTerm, int isPrefix, - DocListType iType, DataBuffer *out); - -/* Return a DocList corresponding to the query term *pTerm. If *pTerm -** is the first term of a phrase query, go ahead and evaluate the phrase -** query and return the doclist for the entire phrase query. -** -** The resulting DL_DOCIDS doclist is stored in pResult, which is -** overwritten. -*/ -static int docListOfTerm( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* column to restrict to. No restriction if >=nColumn */ - QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */ - DataBuffer *pResult /* Write the result here */ -){ - DataBuffer left, right, new; - int i, rc; - - /* No phrase search if no position info. */ - assert( pQTerm->nPhrase==0 || DL_DEFAULT!=DL_DOCIDS ); - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); - - dataBufferInit(&left, 0); - rc = termSelect(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pQTerm->isPrefix, - 0nPhrase ? DL_POSITIONS : DL_DOCIDS, &left); - if( rc ) return rc; - for(i=1; i<=pQTerm->nPhrase && left.nData>0; i++){ - dataBufferInit(&right, 0); - rc = termSelect(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm, - pQTerm[i].isPrefix, DL_POSITIONS, &right); - if( rc ){ - dataBufferDestroy(&left); - return rc; - } - dataBufferInit(&new, 0); - docListPhraseMerge(left.pData, left.nData, right.pData, right.nData, - inPhrase ? DL_POSITIONS : DL_DOCIDS, &new); - dataBufferDestroy(&left); - dataBufferDestroy(&right); - left = new; - } - *pResult = left; - return SQLITE_OK; -} - -/* Add a new term pTerm[0..nTerm-1] to the query *q. -*/ -static void queryAdd(Query *q, const char *pTerm, int nTerm){ - QueryTerm *t; - ++q->nTerms; - q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0])); - if( q->pTerms==0 ){ - q->nTerms = 0; - return; - } - t = &q->pTerms[q->nTerms - 1]; - CLEAR(t); - t->pTerm = malloc(nTerm+1); - memcpy(t->pTerm, pTerm, nTerm); - t->pTerm[nTerm] = 0; - t->nTerm = nTerm; - t->isOr = q->nextIsOr; - t->isPrefix = 0; - q->nextIsOr = 0; - t->iColumn = q->nextColumn; - q->nextColumn = q->dfltColumn; -} - -/* -** Check to see if the string zToken[0...nToken-1] matches any -** column name in the virtual table. If it does, -** return the zero-indexed column number. If not, return -1. -*/ -static int checkColumnSpecifier( - fulltext_vtab *pVtab, /* The virtual table */ - const char *zToken, /* Text of the token */ - int nToken /* Number of characters in the token */ -){ - int i; - for(i=0; inColumn; i++){ - if( memcmp(pVtab->azColumn[i], zToken, nToken)==0 - && pVtab->azColumn[i][nToken]==0 ){ - return i; - } - } - return -1; -} - -/* -** Parse the text at pSegment[0..nSegment-1]. Add additional terms -** to the query being assemblied in pQuery. -** -** inPhrase is true if pSegment[0..nSegement-1] is contained within -** double-quotes. If inPhrase is true, then the first term -** is marked with the number of terms in the phrase less one and -** OR and "-" syntax is ignored. If inPhrase is false, then every -** term found is marked with nPhrase=0 and OR and "-" syntax is significant. -*/ -static int tokenizeSegment( - sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */ - const char *pSegment, int nSegment, /* Query expression being parsed */ - int inPhrase, /* True if within "..." */ - Query *pQuery /* Append results here */ -){ - const sqlite3_tokenizer_module *pModule = pTokenizer->pModule; - sqlite3_tokenizer_cursor *pCursor; - int firstIndex = pQuery->nTerms; - int iCol; - int nTerm = 1; - - int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor); - if( rc!=SQLITE_OK ) return rc; - pCursor->pTokenizer = pTokenizer; - - while( 1 ){ - const char *pToken; - int nToken, iBegin, iEnd, iPos; - - rc = pModule->xNext(pCursor, - &pToken, &nToken, - &iBegin, &iEnd, &iPos); - if( rc!=SQLITE_OK ) break; - if( !inPhrase && - pSegment[iEnd]==':' && - (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){ - pQuery->nextColumn = iCol; - continue; - } - if( !inPhrase && pQuery->nTerms>0 && nToken==2 - && pSegment[iBegin]=='O' && pSegment[iBegin+1]=='R' ){ - pQuery->nextIsOr = 1; - continue; - } - queryAdd(pQuery, pToken, nToken); - if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){ - pQuery->pTerms[pQuery->nTerms-1].isNot = 1; - } - if( iEndpTerms[pQuery->nTerms-1].isPrefix = 1; - } - pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm; - if( inPhrase ){ - nTerm++; - } - } - - if( inPhrase && pQuery->nTerms>firstIndex ){ - pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1; - } - - return pModule->xClose(pCursor); -} - -/* Parse a query string, yielding a Query object pQuery. -** -** The calling function will need to queryClear() to clean up -** the dynamically allocated memory held by pQuery. -*/ -static int parseQuery( - fulltext_vtab *v, /* The fulltext index */ - const char *zInput, /* Input text of the query string */ - int nInput, /* Size of the input text */ - int dfltColumn, /* Default column of the index to match against */ - Query *pQuery /* Write the parse results here. */ -){ - int iInput, inPhrase = 0; - - if( zInput==0 ) nInput = 0; - if( nInput<0 ) nInput = strlen(zInput); - pQuery->nTerms = 0; - pQuery->pTerms = NULL; - pQuery->nextIsOr = 0; - pQuery->nextColumn = dfltColumn; - pQuery->dfltColumn = dfltColumn; - pQuery->pFts = v; - - for(iInput=0; iInputiInput ){ - tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase, - pQuery); - } - iInput = i; - if( i=nColumn -** they are allowed to match against any column. -*/ -static int fulltextQuery( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* Match against this column by default */ - const char *zInput, /* The query string */ - int nInput, /* Number of bytes in zInput[] */ - DataBuffer *pResult, /* Write the result doclist here */ - Query *pQuery /* Put parsed query string here */ -){ - int i, iNext, rc; - DataBuffer left, right, or, new; - int nNot = 0; - QueryTerm *aTerm; - - /* TODO(shess) Instead of flushing pendingTerms, we could query for - ** the relevant term and merge the doclist into what we receive from - ** the database. Wait and see if this is a common issue, first. - ** - ** A good reason not to flush is to not generate update-related - ** error codes from here. - */ - - /* Flush any buffered updates before executing the query. */ - rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ) return rc; - - /* TODO(shess) I think that the queryClear() calls below are not - ** necessary, because fulltextClose() already clears the query. - */ - rc = parseQuery(v, zInput, nInput, iColumn, pQuery); - if( rc!=SQLITE_OK ) return rc; - - /* Empty or NULL queries return no results. */ - if( pQuery->nTerms==0 ){ - dataBufferInit(pResult, 0); - return SQLITE_OK; - } - - /* Merge AND terms. */ - /* TODO(shess) I think we can early-exit if( i>nNot && left.nData==0 ). */ - aTerm = pQuery->pTerms; - for(i = 0; inTerms; i=iNext){ - if( aTerm[i].isNot ){ - /* Handle all NOT terms in a separate pass */ - nNot++; - iNext = i + aTerm[i].nPhrase+1; - continue; - } - iNext = i + aTerm[i].nPhrase + 1; - rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); - if( rc ){ - if( i!=nNot ) dataBufferDestroy(&left); - queryClear(pQuery); - return rc; - } - while( iNextnTerms && aTerm[iNext].isOr ){ - rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &or); - iNext += aTerm[iNext].nPhrase + 1; - if( rc ){ - if( i!=nNot ) dataBufferDestroy(&left); - dataBufferDestroy(&right); - queryClear(pQuery); - return rc; - } - dataBufferInit(&new, 0); - docListOrMerge(right.pData, right.nData, or.pData, or.nData, &new); - dataBufferDestroy(&right); - dataBufferDestroy(&or); - right = new; - } - if( i==nNot ){ /* first term processed. */ - left = right; - }else{ - dataBufferInit(&new, 0); - docListAndMerge(left.pData, left.nData, right.pData, right.nData, &new); - dataBufferDestroy(&right); - dataBufferDestroy(&left); - left = new; - } - } - - if( nNot==pQuery->nTerms ){ - /* We do not yet know how to handle a query of only NOT terms */ - return SQLITE_ERROR; - } - - /* Do the EXCEPT terms */ - for(i=0; inTerms; i += aTerm[i].nPhrase + 1){ - if( !aTerm[i].isNot ) continue; - rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); - if( rc ){ - queryClear(pQuery); - dataBufferDestroy(&left); - return rc; - } - dataBufferInit(&new, 0); - docListExceptMerge(left.pData, left.nData, right.pData, right.nData, &new); - dataBufferDestroy(&right); - dataBufferDestroy(&left); - left = new; - } - - *pResult = left; - return rc; -} - -/* -** This is the xFilter interface for the virtual table. See -** the virtual table xFilter method documentation for additional -** information. -** -** If idxNum==QUERY_GENERIC then do a full table scan against -** the %_content table. -** -** If idxNum==QUERY_ROWID then do a rowid lookup for a single entry -** in the %_content table. -** -** If idxNum>=QUERY_FULLTEXT then use the full text index. The -** column on the left-hand side of the MATCH operator is column -** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand -** side of the MATCH operator. -*/ -/* TODO(shess) Upgrade the cursor initialization and destruction to -** account for fulltextFilter() being called multiple times on the -** same cursor. The current solution is very fragile. Apply fix to -** fts2 as appropriate. -*/ -static int fulltextFilter( - sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ - int idxNum, const char *idxStr, /* Which indexing scheme to use */ - int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ -){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - int rc; - char *zSql; - - TRACE(("FTS2 Filter %p\n",pCursor)); - - zSql = sqlite3_mprintf("select rowid, * from %%_content %s", - idxNum==QUERY_GENERIC ? "" : "where rowid=?"); - sqlite3_finalize(c->pStmt); - rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, zSql); - sqlite3_free(zSql); - if( rc!=SQLITE_OK ) return rc; - - c->iCursorType = idxNum; - switch( idxNum ){ - case QUERY_GENERIC: - break; - - case QUERY_ROWID: - rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); - if( rc!=SQLITE_OK ) return rc; - break; - - default: /* full-text search */ - { - const char *zQuery = (const char *)sqlite3_value_text(argv[0]); - assert( idxNum<=QUERY_FULLTEXT+v->nColumn); - assert( argc==1 ); - queryClear(&c->q); - if( c->result.nData!=0 ){ - /* This case happens if the same cursor is used repeatedly. */ - dlrDestroy(&c->reader); - dataBufferReset(&c->result); - }else{ - dataBufferInit(&c->result, 0); - } - rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &c->result, &c->q); - if( rc!=SQLITE_OK ) return rc; - if( c->result.nData!=0 ){ - dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData); - } - break; - } - } - - return fulltextNext(pCursor); -} - -/* This is the xEof method of the virtual table. The SQLite core -** calls this routine to find out if it has reached the end of -** a query's results set. -*/ -static int fulltextEof(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - return c->eof; -} - -/* This is the xColumn method of the virtual table. The SQLite -** core calls this method during a query when it needs the value -** of a column from the virtual table. This method needs to use -** one of the sqlite3_result_*() routines to store the requested -** value back in the pContext. -*/ -static int fulltextColumn(sqlite3_vtab_cursor *pCursor, - sqlite3_context *pContext, int idxCol){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - - if( idxColnColumn ){ - sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); - sqlite3_result_value(pContext, pVal); - }else if( idxCol==v->nColumn ){ - /* The extra column whose name is the same as the table. - ** Return a blob which is a pointer to the cursor - */ - sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); - } - return SQLITE_OK; -} - -/* This is the xRowid method. The SQLite core calls this routine to -** retrive the rowid for the current row of the result set. The -** rowid should be written to *pRowid. -*/ -static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - - *pRowid = sqlite3_column_int64(c->pStmt, 0); - return SQLITE_OK; -} - -/* Add all terms in [zText] to pendingTerms table. If [iColumn] > 0, -** we also store positions and offsets in the hash table using that -** column number. -*/ -static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid, - const char *zText, int iColumn){ - sqlite3_tokenizer *pTokenizer = v->pTokenizer; - sqlite3_tokenizer_cursor *pCursor; - const char *pToken; - int nTokenBytes; - int iStartOffset, iEndOffset, iPosition; - int rc; - - rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); - if( rc!=SQLITE_OK ) return rc; - - pCursor->pTokenizer = pTokenizer; - while( SQLITE_OK==pTokenizer->pModule->xNext(pCursor, - &pToken, &nTokenBytes, - &iStartOffset, &iEndOffset, - &iPosition) ){ - DLCollector *p; - int nData; /* Size of doclist before our update. */ - - /* Positions can't be negative; we use -1 as a terminator internally. */ - if( iPosition<0 ){ - pTokenizer->pModule->xClose(pCursor); - return SQLITE_ERROR; - } - - p = fts2HashFind(&v->pendingTerms, pToken, nTokenBytes); - if( p==NULL ){ - nData = 0; - p = dlcNew(iDocid, DL_DEFAULT); - fts2HashInsert(&v->pendingTerms, pToken, nTokenBytes, p); - - /* Overhead for our hash table entry, the key, and the value. */ - v->nPendingData += sizeof(struct fts2HashElem)+sizeof(*p)+nTokenBytes; - }else{ - nData = p->b.nData; - if( p->dlw.iPrevDocid!=iDocid ) dlcNext(p, iDocid); - } - if( iColumn>=0 ){ - dlcAddPos(p, iColumn, iPosition, iStartOffset, iEndOffset); - } - - /* Accumulate data added by dlcNew or dlcNext, and dlcAddPos. */ - v->nPendingData += p->b.nData-nData; - } - - /* TODO(shess) Check return? Should this be able to cause errors at - ** this point? Actually, same question about sqlite3_finalize(), - ** though one could argue that failure there means that the data is - ** not durable. *ponder* - */ - pTokenizer->pModule->xClose(pCursor); - return rc; -} - -/* Add doclists for all terms in [pValues] to pendingTerms table. */ -static int insertTerms(fulltext_vtab *v, sqlite_int64 iRowid, - sqlite3_value **pValues){ - int i; - for(i = 0; i < v->nColumn ; ++i){ - char *zText = (char*)sqlite3_value_text(pValues[i]); - int rc = buildTerms(v, iRowid, zText, i); - if( rc!=SQLITE_OK ) return rc; - } - return SQLITE_OK; -} - -/* Add empty doclists for all terms in the given row's content to -** pendingTerms. -*/ -static int deleteTerms(fulltext_vtab *v, sqlite_int64 iRowid){ - const char **pValues; - int i, rc; - - /* TODO(shess) Should we allow such tables at all? */ - if( DL_DEFAULT==DL_DOCIDS ) return SQLITE_ERROR; - - rc = content_select(v, iRowid, &pValues); - if( rc!=SQLITE_OK ) return rc; - - for(i = 0 ; i < v->nColumn; ++i) { - rc = buildTerms(v, iRowid, pValues[i], -1); - if( rc!=SQLITE_OK ) break; - } - - freeStringArray(v->nColumn, pValues); - return SQLITE_OK; -} - -/* TODO(shess) Refactor the code to remove this forward decl. */ -static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid); - -/* Insert a row into the %_content table; set *piRowid to be the ID of the -** new row. Add doclists for terms to pendingTerms. -*/ -static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestRowid, - sqlite3_value **pValues, sqlite_int64 *piRowid){ - int rc; - - rc = content_insert(v, pRequestRowid, pValues); /* execute an SQL INSERT */ - if( rc!=SQLITE_OK ) return rc; - - *piRowid = sqlite3_last_insert_rowid(v->db); - rc = initPendingTerms(v, *piRowid); - if( rc!=SQLITE_OK ) return rc; - - return insertTerms(v, *piRowid, pValues); -} - -/* Delete a row from the %_content table; add empty doclists for terms -** to pendingTerms. -*/ -static int index_delete(fulltext_vtab *v, sqlite_int64 iRow){ - int rc = initPendingTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = deleteTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - return content_delete(v, iRow); /* execute an SQL DELETE */ -} - -/* Update a row in the %_content table; add delete doclists to -** pendingTerms for old terms not in the new data, add insert doclists -** to pendingTerms for terms in the new data. -*/ -static int index_update(fulltext_vtab *v, sqlite_int64 iRow, - sqlite3_value **pValues){ - int rc = initPendingTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - /* Generate an empty doclist for each term that previously appeared in this - * row. */ - rc = deleteTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ - if( rc!=SQLITE_OK ) return rc; - - /* Now add positions for terms which appear in the updated row. */ - return insertTerms(v, iRow, pValues); -} - -/*******************************************************************/ -/* InteriorWriter is used to collect terms and block references into -** interior nodes in %_segments. See commentary at top of file for -** format. -*/ - -/* How large interior nodes can grow. */ -#define INTERIOR_MAX 2048 - -/* Minimum number of terms per interior node (except the root). This -** prevents large terms from making the tree too skinny - must be >0 -** so that the tree always makes progress. Note that the min tree -** fanout will be INTERIOR_MIN_TERMS+1. -*/ -#define INTERIOR_MIN_TERMS 7 -#if INTERIOR_MIN_TERMS<1 -# error INTERIOR_MIN_TERMS must be greater than 0. -#endif - -/* ROOT_MAX controls how much data is stored inline in the segment -** directory. -*/ -/* TODO(shess) Push ROOT_MAX down to whoever is writing things. It's -** only here so that interiorWriterRootInfo() and leafWriterRootInfo() -** can both see it, but if the caller passed it in, we wouldn't even -** need a define. -*/ -#define ROOT_MAX 1024 -#if ROOT_MAXterm, 0); - dataBufferReplace(&block->term, pTerm, nTerm); - - n = putVarint(c, iHeight); - n += putVarint(c+n, iChildBlock); - dataBufferInit(&block->data, INTERIOR_MAX); - dataBufferReplace(&block->data, c, n); - - return block; -} - -#ifndef NDEBUG -/* Verify that the data is readable as an interior node. */ -static void interiorBlockValidate(InteriorBlock *pBlock){ - const char *pData = pBlock->data.pData; - int nData = pBlock->data.nData; - int n, iDummy; - sqlite_int64 iBlockid; - - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - - /* Must lead with height of node as a varint(n), n>0 */ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>0 ); - assert( n0 ); - assert( n<=nData ); - pData += n; - nData -= n; - - /* Zero or more terms of positive length */ - if( nData!=0 ){ - /* First term is not delta-encoded. */ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>0 ); - assert( n+iDummy>0); - assert( n+iDummy<=nData ); - pData += n+iDummy; - nData -= n+iDummy; - - /* Following terms delta-encoded. */ - while( nData!=0 ){ - /* Length of shared prefix. */ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>=0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0); - assert( n+iDummy<=nData ); - pData += n+iDummy; - nData -= n+iDummy; - } - } -} -#define ASSERT_VALID_INTERIOR_BLOCK(x) interiorBlockValidate(x) -#else -#define ASSERT_VALID_INTERIOR_BLOCK(x) assert( 1 ) -#endif - -typedef struct InteriorWriter { - int iHeight; /* from 0 at leaves. */ - InteriorBlock *first, *last; - struct InteriorWriter *parentWriter; - - DataBuffer term; /* Last term written to block "last". */ - sqlite_int64 iOpeningChildBlock; /* First child block in block "last". */ -#ifndef NDEBUG - sqlite_int64 iLastChildBlock; /* for consistency checks. */ -#endif -} InteriorWriter; - -/* Initialize an interior node where pTerm[nTerm] marks the leftmost -** term in the tree. iChildBlock is the leftmost child block at the -** next level down the tree. -*/ -static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm, - sqlite_int64 iChildBlock, - InteriorWriter *pWriter){ - InteriorBlock *block; - assert( iHeight>0 ); - CLEAR(pWriter); - - pWriter->iHeight = iHeight; - pWriter->iOpeningChildBlock = iChildBlock; -#ifndef NDEBUG - pWriter->iLastChildBlock = iChildBlock; -#endif - block = interiorBlockNew(iHeight, iChildBlock, pTerm, nTerm); - pWriter->last = pWriter->first = block; - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); - dataBufferInit(&pWriter->term, 0); -} - -/* Append the child node rooted at iChildBlock to the interior node, -** with pTerm[nTerm] as the leftmost term in iChildBlock's subtree. -*/ -static void interiorWriterAppend(InteriorWriter *pWriter, - const char *pTerm, int nTerm, - sqlite_int64 iChildBlock){ - char c[VARINT_MAX+VARINT_MAX]; - int n, nPrefix = 0; - - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); - - /* The first term written into an interior node is actually - ** associated with the second child added (the first child was added - ** in interiorWriterInit, or in the if clause at the bottom of this - ** function). That term gets encoded straight up, with nPrefix left - ** at 0. - */ - if( pWriter->term.nData==0 ){ - n = putVarint(c, nTerm); - }else{ - while( nPrefixterm.nData && - pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ - nPrefix++; - } - - n = putVarint(c, nPrefix); - n += putVarint(c+n, nTerm-nPrefix); - } - -#ifndef NDEBUG - pWriter->iLastChildBlock++; -#endif - assert( pWriter->iLastChildBlock==iChildBlock ); - - /* Overflow to a new block if the new term makes the current block - ** too big, and the current block already has enough terms. - */ - if( pWriter->last->data.nData+n+nTerm-nPrefix>INTERIOR_MAX && - iChildBlock-pWriter->iOpeningChildBlock>INTERIOR_MIN_TERMS ){ - pWriter->last->next = interiorBlockNew(pWriter->iHeight, iChildBlock, - pTerm, nTerm); - pWriter->last = pWriter->last->next; - pWriter->iOpeningChildBlock = iChildBlock; - dataBufferReset(&pWriter->term); - }else{ - dataBufferAppend2(&pWriter->last->data, c, n, - pTerm+nPrefix, nTerm-nPrefix); - dataBufferReplace(&pWriter->term, pTerm, nTerm); - } - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); -} - -/* Free the space used by pWriter, including the linked-list of -** InteriorBlocks, and parentWriter, if present. -*/ -static int interiorWriterDestroy(InteriorWriter *pWriter){ - InteriorBlock *block = pWriter->first; - - while( block!=NULL ){ - InteriorBlock *b = block; - block = block->next; - dataBufferDestroy(&b->term); - dataBufferDestroy(&b->data); - free(b); - } - if( pWriter->parentWriter!=NULL ){ - interiorWriterDestroy(pWriter->parentWriter); - free(pWriter->parentWriter); - } - dataBufferDestroy(&pWriter->term); - SCRAMBLE(pWriter); - return SQLITE_OK; -} - -/* If pWriter can fit entirely in ROOT_MAX, return it as the root info -** directly, leaving *piEndBlockid unchanged. Otherwise, flush -** pWriter to %_segments, building a new layer of interior nodes, and -** recursively ask for their root into. -*/ -static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter, - char **ppRootInfo, int *pnRootInfo, - sqlite_int64 *piEndBlockid){ - InteriorBlock *block = pWriter->first; - sqlite_int64 iBlockid = 0; - int rc; - - /* If we can fit the segment inline */ - if( block==pWriter->last && block->data.nDatadata.pData; - *pnRootInfo = block->data.nData; - return SQLITE_OK; - } - - /* Flush the first block to %_segments, and create a new level of - ** interior node. - */ - ASSERT_VALID_INTERIOR_BLOCK(block); - rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - *piEndBlockid = iBlockid; - - pWriter->parentWriter = malloc(sizeof(*pWriter->parentWriter)); - interiorWriterInit(pWriter->iHeight+1, - block->term.pData, block->term.nData, - iBlockid, pWriter->parentWriter); - - /* Flush additional blocks and append to the higher interior - ** node. - */ - for(block=block->next; block!=NULL; block=block->next){ - ASSERT_VALID_INTERIOR_BLOCK(block); - rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - *piEndBlockid = iBlockid; - - interiorWriterAppend(pWriter->parentWriter, - block->term.pData, block->term.nData, iBlockid); - } - - /* Parent node gets the chance to be the root. */ - return interiorWriterRootInfo(v, pWriter->parentWriter, - ppRootInfo, pnRootInfo, piEndBlockid); -} - -/****************************************************************/ -/* InteriorReader is used to read off the data from an interior node -** (see comment at top of file for the format). -*/ -typedef struct InteriorReader { - const char *pData; - int nData; - - DataBuffer term; /* previous term, for decoding term delta. */ - - sqlite_int64 iBlockid; -} InteriorReader; - -static void interiorReaderDestroy(InteriorReader *pReader){ - dataBufferDestroy(&pReader->term); - SCRAMBLE(pReader); -} - -/* TODO(shess) The assertions are great, but what if we're in NDEBUG -** and the blob is empty or otherwise contains suspect data? -*/ -static void interiorReaderInit(const char *pData, int nData, - InteriorReader *pReader){ - int n, nTerm; - - /* Require at least the leading flag byte */ - assert( nData>0 ); - assert( pData[0]!='\0' ); - - CLEAR(pReader); - - /* Decode the base blockid, and set the cursor to the first term. */ - n = getVarint(pData+1, &pReader->iBlockid); - assert( 1+n<=nData ); - pReader->pData = pData+1+n; - pReader->nData = nData-(1+n); - - /* A single-child interior node (such as when a leaf node was too - ** large for the segment directory) won't have any terms. - ** Otherwise, decode the first term. - */ - if( pReader->nData==0 ){ - dataBufferInit(&pReader->term, 0); - }else{ - n = getVarint32(pReader->pData, &nTerm); - dataBufferInit(&pReader->term, nTerm); - dataBufferReplace(&pReader->term, pReader->pData+n, nTerm); - assert( n+nTerm<=pReader->nData ); - pReader->pData += n+nTerm; - pReader->nData -= n+nTerm; - } -} - -static int interiorReaderAtEnd(InteriorReader *pReader){ - return pReader->term.nData==0; -} - -static sqlite_int64 interiorReaderCurrentBlockid(InteriorReader *pReader){ - return pReader->iBlockid; -} - -static int interiorReaderTermBytes(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - return pReader->term.nData; -} -static const char *interiorReaderTerm(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - return pReader->term.pData; -} - -/* Step forward to the next term in the node. */ -static void interiorReaderStep(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - - /* If the last term has been read, signal eof, else construct the - ** next term. - */ - if( pReader->nData==0 ){ - dataBufferReset(&pReader->term); - }else{ - int n, nPrefix, nSuffix; - - n = getVarint32(pReader->pData, &nPrefix); - n += getVarint32(pReader->pData+n, &nSuffix); - - /* Truncate the current term and append suffix data. */ - pReader->term.nData = nPrefix; - dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); - - assert( n+nSuffix<=pReader->nData ); - pReader->pData += n+nSuffix; - pReader->nData -= n+nSuffix; - } - pReader->iBlockid++; -} - -/* Compare the current term to pTerm[nTerm], returning strcmp-style -** results. If isPrefix, equality means equal through nTerm bytes. -*/ -static int interiorReaderTermCmp(InteriorReader *pReader, - const char *pTerm, int nTerm, int isPrefix){ - const char *pReaderTerm = interiorReaderTerm(pReader); - int nReaderTerm = interiorReaderTermBytes(pReader); - int c, n = nReaderTerm0 ) return -1; - if( nTerm>0 ) return 1; - return 0; - } - - c = memcmp(pReaderTerm, pTerm, n); - if( c!=0 ) return c; - if( isPrefix && n==nTerm ) return 0; - return nReaderTerm - nTerm; -} - -/****************************************************************/ -/* LeafWriter is used to collect terms and associated doclist data -** into leaf blocks in %_segments (see top of file for format info). -** Expected usage is: -** -** LeafWriter writer; -** leafWriterInit(0, 0, &writer); -** while( sorted_terms_left_to_process ){ -** // data is doclist data for that term. -** rc = leafWriterStep(v, &writer, pTerm, nTerm, pData, nData); -** if( rc!=SQLITE_OK ) goto err; -** } -** rc = leafWriterFinalize(v, &writer); -**err: -** leafWriterDestroy(&writer); -** return rc; -** -** leafWriterStep() may write a collected leaf out to %_segments. -** leafWriterFinalize() finishes writing any buffered data and stores -** a root node in %_segdir. leafWriterDestroy() frees all buffers and -** InteriorWriters allocated as part of writing this segment. -** -** TODO(shess) Document leafWriterStepMerge(). -*/ - -/* Put terms with data this big in their own block. */ -#define STANDALONE_MIN 1024 - -/* Keep leaf blocks below this size. */ -#define LEAF_MAX 2048 - -typedef struct LeafWriter { - int iLevel; - int idx; - sqlite_int64 iStartBlockid; /* needed to create the root info */ - sqlite_int64 iEndBlockid; /* when we're done writing. */ - - DataBuffer term; /* previous encoded term */ - DataBuffer data; /* encoding buffer */ - - /* bytes of first term in the current node which distinguishes that - ** term from the last term of the previous node. - */ - int nTermDistinct; - - InteriorWriter parentWriter; /* if we overflow */ - int has_parent; -} LeafWriter; - -static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){ - CLEAR(pWriter); - pWriter->iLevel = iLevel; - pWriter->idx = idx; - - dataBufferInit(&pWriter->term, 32); - - /* Start out with a reasonably sized block, though it can grow. */ - dataBufferInit(&pWriter->data, LEAF_MAX); -} - -#ifndef NDEBUG -/* Verify that the data is readable as a leaf node. */ -static void leafNodeValidate(const char *pData, int nData){ - int n, iDummy; - - if( nData==0 ) return; - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - - /* Must lead with a varint(0) */ - n = getVarint32(pData, &iDummy); - assert( iDummy==0 ); - assert( n>0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy<=nData ); - ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); - pData += n+iDummy; - nData -= n+iDummy; - - /* Verify that trailing terms and doclists also are readable. */ - while( nData!=0 ){ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>=0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy<=nData ); - ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); - pData += n+iDummy; - nData -= n+iDummy; - } -} -#define ASSERT_VALID_LEAF_NODE(p, n) leafNodeValidate(p, n) -#else -#define ASSERT_VALID_LEAF_NODE(p, n) assert( 1 ) -#endif - -/* Flush the current leaf node to %_segments, and adding the resulting -** blockid and the starting term to the interior node which will -** contain it. -*/ -static int leafWriterInternalFlush(fulltext_vtab *v, LeafWriter *pWriter, - int iData, int nData){ - sqlite_int64 iBlockid = 0; - const char *pStartingTerm; - int nStartingTerm, rc, n; - - /* Must have the leading varint(0) flag, plus at least some - ** valid-looking data. - */ - assert( nData>2 ); - assert( iData>=0 ); - assert( iData+nData<=pWriter->data.nData ); - ASSERT_VALID_LEAF_NODE(pWriter->data.pData+iData, nData); - - rc = block_insert(v, pWriter->data.pData+iData, nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - assert( iBlockid!=0 ); - - /* Reconstruct the first term in the leaf for purposes of building - ** the interior node. - */ - n = getVarint32(pWriter->data.pData+iData+1, &nStartingTerm); - pStartingTerm = pWriter->data.pData+iData+1+n; - assert( pWriter->data.nData>iData+1+n+nStartingTerm ); - assert( pWriter->nTermDistinct>0 ); - assert( pWriter->nTermDistinct<=nStartingTerm ); - nStartingTerm = pWriter->nTermDistinct; - - if( pWriter->has_parent ){ - interiorWriterAppend(&pWriter->parentWriter, - pStartingTerm, nStartingTerm, iBlockid); - }else{ - interiorWriterInit(1, pStartingTerm, nStartingTerm, iBlockid, - &pWriter->parentWriter); - pWriter->has_parent = 1; - } - - /* Track the span of this segment's leaf nodes. */ - if( pWriter->iEndBlockid==0 ){ - pWriter->iEndBlockid = pWriter->iStartBlockid = iBlockid; - }else{ - pWriter->iEndBlockid++; - assert( iBlockid==pWriter->iEndBlockid ); - } - - return SQLITE_OK; -} -static int leafWriterFlush(fulltext_vtab *v, LeafWriter *pWriter){ - int rc = leafWriterInternalFlush(v, pWriter, 0, pWriter->data.nData); - if( rc!=SQLITE_OK ) return rc; - - /* Re-initialize the output buffer. */ - dataBufferReset(&pWriter->data); - - return SQLITE_OK; -} - -/* Fetch the root info for the segment. If the entire leaf fits -** within ROOT_MAX, then it will be returned directly, otherwise it -** will be flushed and the root info will be returned from the -** interior node. *piEndBlockid is set to the blockid of the last -** interior or leaf node written to disk (0 if none are written at -** all). -*/ -static int leafWriterRootInfo(fulltext_vtab *v, LeafWriter *pWriter, - char **ppRootInfo, int *pnRootInfo, - sqlite_int64 *piEndBlockid){ - /* we can fit the segment entirely inline */ - if( !pWriter->has_parent && pWriter->data.nDatadata.pData; - *pnRootInfo = pWriter->data.nData; - *piEndBlockid = 0; - return SQLITE_OK; - } - - /* Flush remaining leaf data. */ - if( pWriter->data.nData>0 ){ - int rc = leafWriterFlush(v, pWriter); - if( rc!=SQLITE_OK ) return rc; - } - - /* We must have flushed a leaf at some point. */ - assert( pWriter->has_parent ); - - /* Tenatively set the end leaf blockid as the end blockid. If the - ** interior node can be returned inline, this will be the final - ** blockid, otherwise it will be overwritten by - ** interiorWriterRootInfo(). - */ - *piEndBlockid = pWriter->iEndBlockid; - - return interiorWriterRootInfo(v, &pWriter->parentWriter, - ppRootInfo, pnRootInfo, piEndBlockid); -} - -/* Collect the rootInfo data and store it into the segment directory. -** This has the effect of flushing the segment's leaf data to -** %_segments, and also flushing any interior nodes to %_segments. -*/ -static int leafWriterFinalize(fulltext_vtab *v, LeafWriter *pWriter){ - sqlite_int64 iEndBlockid; - char *pRootInfo; - int rc, nRootInfo; - - rc = leafWriterRootInfo(v, pWriter, &pRootInfo, &nRootInfo, &iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - /* Don't bother storing an entirely empty segment. */ - if( iEndBlockid==0 && nRootInfo==0 ) return SQLITE_OK; - - return segdir_set(v, pWriter->iLevel, pWriter->idx, - pWriter->iStartBlockid, pWriter->iEndBlockid, - iEndBlockid, pRootInfo, nRootInfo); -} - -static void leafWriterDestroy(LeafWriter *pWriter){ - if( pWriter->has_parent ) interiorWriterDestroy(&pWriter->parentWriter); - dataBufferDestroy(&pWriter->term); - dataBufferDestroy(&pWriter->data); -} - -/* Encode a term into the leafWriter, delta-encoding as appropriate. -** Returns the length of the new term which distinguishes it from the -** previous term, which can be used to set nTermDistinct when a node -** boundary is crossed. -*/ -static int leafWriterEncodeTerm(LeafWriter *pWriter, - const char *pTerm, int nTerm){ - char c[VARINT_MAX+VARINT_MAX]; - int n, nPrefix = 0; - - assert( nTerm>0 ); - while( nPrefixterm.nData && - pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ - nPrefix++; - /* Failing this implies that the terms weren't in order. */ - assert( nPrefixdata.nData==0 ){ - /* Encode the node header and leading term as: - ** varint(0) - ** varint(nTerm) - ** char pTerm[nTerm] - */ - n = putVarint(c, '\0'); - n += putVarint(c+n, nTerm); - dataBufferAppend2(&pWriter->data, c, n, pTerm, nTerm); - }else{ - /* Delta-encode the term as: - ** varint(nPrefix) - ** varint(nSuffix) - ** char pTermSuffix[nSuffix] - */ - n = putVarint(c, nPrefix); - n += putVarint(c+n, nTerm-nPrefix); - dataBufferAppend2(&pWriter->data, c, n, pTerm+nPrefix, nTerm-nPrefix); - } - dataBufferReplace(&pWriter->term, pTerm, nTerm); - - return nPrefix+1; -} - -/* Used to avoid a memmove when a large amount of doclist data is in -** the buffer. This constructs a node and term header before -** iDoclistData and flushes the resulting complete node using -** leafWriterInternalFlush(). -*/ -static int leafWriterInlineFlush(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - int iDoclistData){ - char c[VARINT_MAX+VARINT_MAX]; - int iData, n = putVarint(c, 0); - n += putVarint(c+n, nTerm); - - /* There should always be room for the header. Even if pTerm shared - ** a substantial prefix with the previous term, the entire prefix - ** could be constructed from earlier data in the doclist, so there - ** should be room. - */ - assert( iDoclistData>=n+nTerm ); - - iData = iDoclistData-(n+nTerm); - memcpy(pWriter->data.pData+iData, c, n); - memcpy(pWriter->data.pData+iData+n, pTerm, nTerm); - - return leafWriterInternalFlush(v, pWriter, iData, pWriter->data.nData-iData); -} - -/* Push pTerm[nTerm] along with the doclist data to the leaf layer of -** %_segments. -*/ -static int leafWriterStepMerge(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - DLReader *pReaders, int nReaders){ - char c[VARINT_MAX+VARINT_MAX]; - int iTermData = pWriter->data.nData, iDoclistData; - int i, nData, n, nActualData, nActual, rc, nTermDistinct; - - ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); - nTermDistinct = leafWriterEncodeTerm(pWriter, pTerm, nTerm); - - /* Remember nTermDistinct if opening a new node. */ - if( iTermData==0 ) pWriter->nTermDistinct = nTermDistinct; - - iDoclistData = pWriter->data.nData; - - /* Estimate the length of the merged doclist so we can leave space - ** to encode it. - */ - for(i=0, nData=0; idata, c, n); - - docListMerge(&pWriter->data, pReaders, nReaders); - ASSERT_VALID_DOCLIST(DL_DEFAULT, - pWriter->data.pData+iDoclistData+n, - pWriter->data.nData-iDoclistData-n, NULL); - - /* The actual amount of doclist data at this point could be smaller - ** than the length we encoded. Additionally, the space required to - ** encode this length could be smaller. For small doclists, this is - ** not a big deal, we can just use memmove() to adjust things. - */ - nActualData = pWriter->data.nData-(iDoclistData+n); - nActual = putVarint(c, nActualData); - assert( nActualData<=nData ); - assert( nActual<=n ); - - /* If the new doclist is big enough for force a standalone leaf - ** node, we can immediately flush it inline without doing the - ** memmove(). - */ - /* TODO(shess) This test matches leafWriterStep(), which does this - ** test before it knows the cost to varint-encode the term and - ** doclist lengths. At some point, change to - ** pWriter->data.nData-iTermData>STANDALONE_MIN. - */ - if( nTerm+nActualData>STANDALONE_MIN ){ - /* Push leaf node from before this term. */ - if( iTermData>0 ){ - rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); - if( rc!=SQLITE_OK ) return rc; - - pWriter->nTermDistinct = nTermDistinct; - } - - /* Fix the encoded doclist length. */ - iDoclistData += n - nActual; - memcpy(pWriter->data.pData+iDoclistData, c, nActual); - - /* Push the standalone leaf node. */ - rc = leafWriterInlineFlush(v, pWriter, pTerm, nTerm, iDoclistData); - if( rc!=SQLITE_OK ) return rc; - - /* Leave the node empty. */ - dataBufferReset(&pWriter->data); - - return rc; - } - - /* At this point, we know that the doclist was small, so do the - ** memmove if indicated. - */ - if( nActualdata.pData+iDoclistData+nActual, - pWriter->data.pData+iDoclistData+n, - pWriter->data.nData-(iDoclistData+n)); - pWriter->data.nData -= n-nActual; - } - - /* Replace written length with actual length. */ - memcpy(pWriter->data.pData+iDoclistData, c, nActual); - - /* If the node is too large, break things up. */ - /* TODO(shess) This test matches leafWriterStep(), which does this - ** test before it knows the cost to varint-encode the term and - ** doclist lengths. At some point, change to - ** pWriter->data.nData>LEAF_MAX. - */ - if( iTermData+nTerm+nActualData>LEAF_MAX ){ - /* Flush out the leading data as a node */ - rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); - if( rc!=SQLITE_OK ) return rc; - - pWriter->nTermDistinct = nTermDistinct; - - /* Rebuild header using the current term */ - n = putVarint(pWriter->data.pData, 0); - n += putVarint(pWriter->data.pData+n, nTerm); - memcpy(pWriter->data.pData+n, pTerm, nTerm); - n += nTerm; - - /* There should always be room, because the previous encoding - ** included all data necessary to construct the term. - */ - assert( ndata.nData-iDoclistDatadata.pData+n, - pWriter->data.pData+iDoclistData, - pWriter->data.nData-iDoclistData); - pWriter->data.nData -= iDoclistData-n; - } - ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); - - return SQLITE_OK; -} - -/* Push pTerm[nTerm] along with the doclist data to the leaf layer of -** %_segments. -*/ -/* TODO(shess) Revise writeZeroSegment() so that doclists are -** constructed directly in pWriter->data. -*/ -static int leafWriterStep(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - const char *pData, int nData){ - int rc; - DLReader reader; - - dlrInit(&reader, DL_DEFAULT, pData, nData); - rc = leafWriterStepMerge(v, pWriter, pTerm, nTerm, &reader, 1); - dlrDestroy(&reader); - - return rc; -} - - -/****************************************************************/ -/* LeafReader is used to iterate over an individual leaf node. */ -typedef struct LeafReader { - DataBuffer term; /* copy of current term. */ - - const char *pData; /* data for current term. */ - int nData; -} LeafReader; - -static void leafReaderDestroy(LeafReader *pReader){ - dataBufferDestroy(&pReader->term); - SCRAMBLE(pReader); -} - -static int leafReaderAtEnd(LeafReader *pReader){ - return pReader->nData<=0; -} - -/* Access the current term. */ -static int leafReaderTermBytes(LeafReader *pReader){ - return pReader->term.nData; -} -static const char *leafReaderTerm(LeafReader *pReader){ - assert( pReader->term.nData>0 ); - return pReader->term.pData; -} - -/* Access the doclist data for the current term. */ -static int leafReaderDataBytes(LeafReader *pReader){ - int nData; - assert( pReader->term.nData>0 ); - getVarint32(pReader->pData, &nData); - return nData; -} -static const char *leafReaderData(LeafReader *pReader){ - int n, nData; - assert( pReader->term.nData>0 ); - n = getVarint32(pReader->pData, &nData); - return pReader->pData+n; -} - -static void leafReaderInit(const char *pData, int nData, - LeafReader *pReader){ - int nTerm, n; - - assert( nData>0 ); - assert( pData[0]=='\0' ); - - CLEAR(pReader); - - /* Read the first term, skipping the header byte. */ - n = getVarint32(pData+1, &nTerm); - dataBufferInit(&pReader->term, nTerm); - dataBufferReplace(&pReader->term, pData+1+n, nTerm); - - /* Position after the first term. */ - assert( 1+n+nTermpData = pData+1+n+nTerm; - pReader->nData = nData-1-n-nTerm; -} - -/* Step the reader forward to the next term. */ -static void leafReaderStep(LeafReader *pReader){ - int n, nData, nPrefix, nSuffix; - assert( !leafReaderAtEnd(pReader) ); - - /* Skip previous entry's data block. */ - n = getVarint32(pReader->pData, &nData); - assert( n+nData<=pReader->nData ); - pReader->pData += n+nData; - pReader->nData -= n+nData; - - if( !leafReaderAtEnd(pReader) ){ - /* Construct the new term using a prefix from the old term plus a - ** suffix from the leaf data. - */ - n = getVarint32(pReader->pData, &nPrefix); - n += getVarint32(pReader->pData+n, &nSuffix); - assert( n+nSuffixnData ); - pReader->term.nData = nPrefix; - dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); - - pReader->pData += n+nSuffix; - pReader->nData -= n+nSuffix; - } -} - -/* strcmp-style comparison of pReader's current term against pTerm. -** If isPrefix, equality means equal through nTerm bytes. -*/ -static int leafReaderTermCmp(LeafReader *pReader, - const char *pTerm, int nTerm, int isPrefix){ - int c, n = pReader->term.nDataterm.nData : nTerm; - if( n==0 ){ - if( pReader->term.nData>0 ) return -1; - if(nTerm>0 ) return 1; - return 0; - } - - c = memcmp(pReader->term.pData, pTerm, n); - if( c!=0 ) return c; - if( isPrefix && n==nTerm ) return 0; - return pReader->term.nData - nTerm; -} - - -/****************************************************************/ -/* LeavesReader wraps LeafReader to allow iterating over the entire -** leaf layer of the tree. -*/ -typedef struct LeavesReader { - int idx; /* Index within the segment. */ - - sqlite3_stmt *pStmt; /* Statement we're streaming leaves from. */ - int eof; /* we've seen SQLITE_DONE from pStmt. */ - - LeafReader leafReader; /* reader for the current leaf. */ - DataBuffer rootData; /* root data for inline. */ -} LeavesReader; - -/* Access the current term. */ -static int leavesReaderTermBytes(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderTermBytes(&pReader->leafReader); -} -static const char *leavesReaderTerm(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderTerm(&pReader->leafReader); -} - -/* Access the doclist data for the current term. */ -static int leavesReaderDataBytes(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderDataBytes(&pReader->leafReader); -} -static const char *leavesReaderData(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderData(&pReader->leafReader); -} - -static int leavesReaderAtEnd(LeavesReader *pReader){ - return pReader->eof; -} - -/* loadSegmentLeaves() may not read all the way to SQLITE_DONE, thus -** leaving the statement handle open, which locks the table. -*/ -/* TODO(shess) This "solution" is not satisfactory. Really, there -** should be check-in function for all statement handles which -** arranges to call sqlite3_reset(). This most likely will require -** modification to control flow all over the place, though, so for now -** just punt. -** -** Note the the current system assumes that segment merges will run to -** completion, which is why this particular probably hasn't arisen in -** this case. Probably a brittle assumption. -*/ -static int leavesReaderReset(LeavesReader *pReader){ - return sqlite3_reset(pReader->pStmt); -} - -static void leavesReaderDestroy(LeavesReader *pReader){ - leafReaderDestroy(&pReader->leafReader); - dataBufferDestroy(&pReader->rootData); - SCRAMBLE(pReader); -} - -/* Initialize pReader with the given root data (if iStartBlockid==0 -** the leaf data was entirely contained in the root), or from the -** stream of blocks between iStartBlockid and iEndBlockid, inclusive. -*/ -static int leavesReaderInit(fulltext_vtab *v, - int idx, - sqlite_int64 iStartBlockid, - sqlite_int64 iEndBlockid, - const char *pRootData, int nRootData, - LeavesReader *pReader){ - CLEAR(pReader); - pReader->idx = idx; - - dataBufferInit(&pReader->rootData, 0); - if( iStartBlockid==0 ){ - /* Entire leaf level fit in root data. */ - dataBufferReplace(&pReader->rootData, pRootData, nRootData); - leafReaderInit(pReader->rootData.pData, pReader->rootData.nData, - &pReader->leafReader); - }else{ - sqlite3_stmt *s; - int rc = sql_get_leaf_statement(v, idx, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - pReader->eof = 1; - return SQLITE_OK; - } - if( rc!=SQLITE_ROW ) return rc; - - pReader->pStmt = s; - leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), - sqlite3_column_bytes(pReader->pStmt, 0), - &pReader->leafReader); - } - return SQLITE_OK; -} - -/* Step the current leaf forward to the next term. If we reach the -** end of the current leaf, step forward to the next leaf block. -*/ -static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){ - assert( !leavesReaderAtEnd(pReader) ); - leafReaderStep(&pReader->leafReader); - - if( leafReaderAtEnd(&pReader->leafReader) ){ - int rc; - if( pReader->rootData.pData ){ - pReader->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_step(pReader->pStmt); - if( rc!=SQLITE_ROW ){ - pReader->eof = 1; - return rc==SQLITE_DONE ? SQLITE_OK : rc; - } - leafReaderDestroy(&pReader->leafReader); - leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), - sqlite3_column_bytes(pReader->pStmt, 0), - &pReader->leafReader); - } - return SQLITE_OK; -} - -/* Order LeavesReaders by their term, ignoring idx. Readers at eof -** always sort to the end. -*/ -static int leavesReaderTermCmp(LeavesReader *lr1, LeavesReader *lr2){ - if( leavesReaderAtEnd(lr1) ){ - if( leavesReaderAtEnd(lr2) ) return 0; - return 1; - } - if( leavesReaderAtEnd(lr2) ) return -1; - - return leafReaderTermCmp(&lr1->leafReader, - leavesReaderTerm(lr2), leavesReaderTermBytes(lr2), - 0); -} - -/* Similar to leavesReaderTermCmp(), with additional ordering by idx -** so that older segments sort before newer segments. -*/ -static int leavesReaderCmp(LeavesReader *lr1, LeavesReader *lr2){ - int c = leavesReaderTermCmp(lr1, lr2); - if( c!=0 ) return c; - return lr1->idx-lr2->idx; -} - -/* Assume that pLr[1]..pLr[nLr] are sorted. Bubble pLr[0] into its -** sorted position. -*/ -static void leavesReaderReorder(LeavesReader *pLr, int nLr){ - while( nLr>1 && leavesReaderCmp(pLr, pLr+1)>0 ){ - LeavesReader tmp = pLr[0]; - pLr[0] = pLr[1]; - pLr[1] = tmp; - nLr--; - pLr++; - } -} - -/* Initializes pReaders with the segments from level iLevel, returning -** the number of segments in *piReaders. Leaves pReaders in sorted -** order. -*/ -static int leavesReadersInit(fulltext_vtab *v, int iLevel, - LeavesReader *pReaders, int *piReaders){ - sqlite3_stmt *s; - int i, rc = sql_get_statement(v, SEGDIR_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - i = 0; - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - sqlite_int64 iStart = sqlite3_column_int64(s, 0); - sqlite_int64 iEnd = sqlite3_column_int64(s, 1); - const char *pRootData = sqlite3_column_blob(s, 2); - int nRootData = sqlite3_column_bytes(s, 2); - - assert( i0 ){ - leavesReaderDestroy(&pReaders[i]); - } - return rc; - } - - *piReaders = i; - - /* Leave our results sorted by term, then age. */ - while( i-- ){ - leavesReaderReorder(pReaders+i, *piReaders-i); - } - return SQLITE_OK; -} - -/* Merge doclists from pReaders[nReaders] into a single doclist, which -** is written to pWriter. Assumes pReaders is ordered oldest to -** newest. -*/ -/* TODO(shess) Consider putting this inline in segmentMerge(). */ -static int leavesReadersMerge(fulltext_vtab *v, - LeavesReader *pReaders, int nReaders, - LeafWriter *pWriter){ - DLReader dlReaders[MERGE_COUNT]; - const char *pTerm = leavesReaderTerm(pReaders); - int i, nTerm = leavesReaderTermBytes(pReaders); - - assert( nReaders<=MERGE_COUNT ); - - for(i=0; i0 ){ - rc = leavesReaderStep(v, lrs+i); - if( rc!=SQLITE_OK ) goto err; - - /* Reorder by term, then by age. */ - leavesReaderReorder(lrs+i, MERGE_COUNT-i); - } - } - - for(i=0; i0 ); - - /* Process while the prefix matches. */ - while( !leavesReaderAtEnd(pReader) ){ - /* TODO(shess) Really want leavesReaderTermCmp(), but that name is - ** already taken to compare the terms of two LeavesReaders. Think - ** on a better name. [Meanwhile, break encapsulation rather than - ** use a confusing name.] - */ - int rc; - int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix); - if( c==0 ){ - const char *pData = leavesReaderData(pReader); - int nData = leavesReaderDataBytes(pReader); - if( out->nData==0 ){ - dataBufferReplace(out, pData, nData); - }else{ - DataBuffer result; - dataBufferInit(&result, out->nData+nData); - docListUnion(out->pData, out->nData, pData, nData, &result); - dataBufferDestroy(out); - *out = result; - /* TODO(shess) Rather than destroy out, we could retain it for - ** later reuse. - */ - } - } - if( c>0 ) break; /* Past any possible matches. */ - - rc = leavesReaderStep(v, pReader); - if( rc!=SQLITE_OK ) return rc; - } - return SQLITE_OK; -} - -/* Call loadSegmentLeavesInt() with pData/nData as input. */ -static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - LeavesReader reader; - int rc; - - assert( nData>1 ); - assert( *pData=='\0' ); - rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader); - if( rc!=SQLITE_OK ) return rc; - - rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); - leavesReaderReset(&reader); - leavesReaderDestroy(&reader); - return rc; -} - -/* Call loadSegmentLeavesInt() with the leaf nodes from iStartLeaf to -** iEndLeaf (inclusive) as input, and merge the resulting doclist into -** out. -*/ -static int loadSegmentLeaves(fulltext_vtab *v, - sqlite_int64 iStartLeaf, sqlite_int64 iEndLeaf, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - int rc; - LeavesReader reader; - - assert( iStartLeaf<=iEndLeaf ); - rc = leavesReaderInit(v, 0, iStartLeaf, iEndLeaf, NULL, 0, &reader); - if( rc!=SQLITE_OK ) return rc; - - rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); - leavesReaderReset(&reader); - leavesReaderDestroy(&reader); - return rc; -} - -/* Taking pData/nData as an interior node, find the sequence of child -** nodes which could include pTerm/nTerm/isPrefix. Note that the -** interior node terms logically come between the blocks, so there is -** one more blockid than there are terms (that block contains terms >= -** the last interior-node term). -*/ -/* TODO(shess) The calling code may already know that the end child is -** not worth calculating, because the end may be in a later sibling -** node. Consider whether breaking symmetry is worthwhile. I suspect -** it's not worthwhile. -*/ -static void getChildrenContaining(const char *pData, int nData, - const char *pTerm, int nTerm, int isPrefix, - sqlite_int64 *piStartChild, - sqlite_int64 *piEndChild){ - InteriorReader reader; - - assert( nData>1 ); - assert( *pData!='\0' ); - interiorReaderInit(pData, nData, &reader); - - /* Scan for the first child which could contain pTerm/nTerm. */ - while( !interiorReaderAtEnd(&reader) ){ - if( interiorReaderTermCmp(&reader, pTerm, nTerm, 0)>0 ) break; - interiorReaderStep(&reader); - } - *piStartChild = interiorReaderCurrentBlockid(&reader); - - /* Keep scanning to find a term greater than our term, using prefix - ** comparison if indicated. If isPrefix is false, this will be the - ** same blockid as the starting block. - */ - while( !interiorReaderAtEnd(&reader) ){ - if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break; - interiorReaderStep(&reader); - } - *piEndChild = interiorReaderCurrentBlockid(&reader); - - interiorReaderDestroy(&reader); - - /* Children must ascend, and if !prefix, both must be the same. */ - assert( *piEndChild>=*piStartChild ); - assert( isPrefix || *piStartChild==*piEndChild ); -} - -/* Read block at iBlockid and pass it with other params to -** getChildrenContaining(). -*/ -static int loadAndGetChildrenContaining( - fulltext_vtab *v, - sqlite_int64 iBlockid, - const char *pTerm, int nTerm, int isPrefix, - sqlite_int64 *piStartChild, sqlite_int64 *piEndChild -){ - sqlite3_stmt *s = NULL; - int rc; - - assert( iBlockid!=0 ); - assert( pTerm!=NULL ); - assert( nTerm!=0 ); /* TODO(shess) Why not allow this? */ - assert( piStartChild!=NULL ); - assert( piEndChild!=NULL ); - - rc = sql_get_statement(v, BLOCK_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_ERROR; - if( rc!=SQLITE_ROW ) return rc; - - getChildrenContaining(sqlite3_column_blob(s, 0), sqlite3_column_bytes(s, 0), - pTerm, nTerm, isPrefix, piStartChild, piEndChild); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain - * locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - - return SQLITE_OK; -} - -/* Traverse the tree represented by pData[nData] looking for -** pTerm[nTerm], placing its doclist into *out. This is internal to -** loadSegment() to make error-handling cleaner. -*/ -static int loadSegmentInt(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 iLeavesEnd, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - /* Special case where root is a leaf. */ - if( *pData=='\0' ){ - return loadSegmentLeaf(v, pData, nData, pTerm, nTerm, isPrefix, out); - }else{ - int rc; - sqlite_int64 iStartChild, iEndChild; - - /* Process pData as an interior node, then loop down the tree - ** until we find the set of leaf nodes to scan for the term. - */ - getChildrenContaining(pData, nData, pTerm, nTerm, isPrefix, - &iStartChild, &iEndChild); - while( iStartChild>iLeavesEnd ){ - sqlite_int64 iNextStart, iNextEnd; - rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix, - &iNextStart, &iNextEnd); - if( rc!=SQLITE_OK ) return rc; - - /* If we've branched, follow the end branch, too. */ - if( iStartChild!=iEndChild ){ - sqlite_int64 iDummy; - rc = loadAndGetChildrenContaining(v, iEndChild, pTerm, nTerm, isPrefix, - &iDummy, &iNextEnd); - if( rc!=SQLITE_OK ) return rc; - } - - assert( iNextStart<=iNextEnd ); - iStartChild = iNextStart; - iEndChild = iNextEnd; - } - assert( iStartChild<=iLeavesEnd ); - assert( iEndChild<=iLeavesEnd ); - - /* Scan through the leaf segments for doclists. */ - return loadSegmentLeaves(v, iStartChild, iEndChild, - pTerm, nTerm, isPrefix, out); - } -} - -/* Call loadSegmentInt() to collect the doclist for pTerm/nTerm, then -** merge its doclist over *out (any duplicate doclists read from the -** segment rooted at pData will overwrite those in *out). -*/ -/* TODO(shess) Consider changing this to determine the depth of the -** leaves using either the first characters of interior nodes (when -** ==1, we're one level above the leaves), or the first character of -** the root (which will describe the height of the tree directly). -** Either feels somewhat tricky to me. -*/ -/* TODO(shess) The current merge is likely to be slow for large -** doclists (though it should process from newest/smallest to -** oldest/largest, so it may not be that bad). It might be useful to -** modify things to allow for N-way merging. This could either be -** within a segment, with pairwise merges across segments, or across -** all segments at once. -*/ -static int loadSegment(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 iLeavesEnd, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - DataBuffer result; - int rc; - - assert( nData>1 ); - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); - - dataBufferInit(&result, 0); - rc = loadSegmentInt(v, pData, nData, iLeavesEnd, - pTerm, nTerm, isPrefix, &result); - if( rc==SQLITE_OK && result.nData>0 ){ - if( out->nData==0 ){ - DataBuffer tmp = *out; - *out = result; - result = tmp; - }else{ - DataBuffer merged; - DLReader readers[2]; - - dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData); - dlrInit(&readers[1], DL_DEFAULT, result.pData, result.nData); - dataBufferInit(&merged, out->nData+result.nData); - docListMerge(&merged, readers, 2); - dataBufferDestroy(out); - *out = merged; - dlrDestroy(&readers[0]); - dlrDestroy(&readers[1]); - } - } - dataBufferDestroy(&result); - return rc; -} - -/* Scan the database and merge together the posting lists for the term -** into *out. -*/ -static int termSelect(fulltext_vtab *v, int iColumn, - const char *pTerm, int nTerm, int isPrefix, - DocListType iType, DataBuffer *out){ - DataBuffer doclist; - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); - - dataBufferInit(&doclist, 0); - - /* Traverse the segments from oldest to newest so that newer doclist - ** elements for given docids overwrite older elements. - */ - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - const char *pData = sqlite3_column_blob(s, 0); - const int nData = sqlite3_column_bytes(s, 0); - const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); - rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix, - &doclist); - if( rc!=SQLITE_OK ) goto err; - } - if( rc==SQLITE_DONE ){ - if( doclist.nData!=0 ){ - /* TODO(shess) The old term_select_all() code applied the column - ** restrict as we merged segments, leading to smaller buffers. - ** This is probably worthwhile to bring back, once the new storage - ** system is checked in. - */ - if( iColumn==v->nColumn) iColumn = -1; - docListTrim(DL_DEFAULT, doclist.pData, doclist.nData, - iColumn, iType, out); - } - rc = SQLITE_OK; - } - - err: - dataBufferDestroy(&doclist); - return rc; -} - -/****************************************************************/ -/* Used to hold hashtable data for sorting. */ -typedef struct TermData { - const char *pTerm; - int nTerm; - DLCollector *pCollector; -} TermData; - -/* Orders TermData elements in strcmp fashion ( <0 for less-than, 0 -** for equal, >0 for greater-than). -*/ -static int termDataCmp(const void *av, const void *bv){ - const TermData *a = (const TermData *)av; - const TermData *b = (const TermData *)bv; - int n = a->nTermnTerm ? a->nTerm : b->nTerm; - int c = memcmp(a->pTerm, b->pTerm, n); - if( c!=0 ) return c; - return a->nTerm-b->nTerm; -} - -/* Order pTerms data by term, then write a new level 0 segment using -** LeafWriter. -*/ -static int writeZeroSegment(fulltext_vtab *v, fts2Hash *pTerms){ - fts2HashElem *e; - int idx, rc, i, n; - TermData *pData; - LeafWriter writer; - DataBuffer dl; - - /* Determine the next index at level 0, merging as necessary. */ - rc = segdirNextIndex(v, 0, &idx); - if( rc!=SQLITE_OK ) return rc; - - n = fts2HashCount(pTerms); - pData = malloc(n*sizeof(TermData)); - - for(i = 0, e = fts2HashFirst(pTerms); e; i++, e = fts2HashNext(e)){ - assert( i1 ) qsort(pData, n, sizeof(*pData), termDataCmp); - - /* TODO(shess) Refactor so that we can write directly to the segment - ** DataBuffer, as happens for segment merges. - */ - leafWriterInit(0, idx, &writer); - dataBufferInit(&dl, 0); - for(i=0; inPendingData>=0 ){ - fts2HashElem *e; - for(e=fts2HashFirst(&v->pendingTerms); e; e=fts2HashNext(e)){ - dlcDelete(fts2HashData(e)); - } - fts2HashClear(&v->pendingTerms); - v->nPendingData = -1; - } - return SQLITE_OK; -} - -/* If pendingTerms has data, flush it to a level-zero segment, and -** free it. -*/ -static int flushPendingTerms(fulltext_vtab *v){ - if( v->nPendingData>=0 ){ - int rc = writeZeroSegment(v, &v->pendingTerms); - if( rc==SQLITE_OK ) clearPendingTerms(v); - return rc; - } - return SQLITE_OK; -} - -/* If pendingTerms is "too big", or docid is out of order, flush it. -** Regardless, be certain that pendingTerms is initialized for use. -*/ -static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid){ - /* TODO(shess) Explore whether partially flushing the buffer on - ** forced-flush would provide better performance. I suspect that if - ** we ordered the doclists by size and flushed the largest until the - ** buffer was half empty, that would let the less frequent terms - ** generate longer doclists. - */ - if( iDocid<=v->iPrevDocid || v->nPendingData>kPendingThreshold ){ - int rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ) return rc; - } - if( v->nPendingData<0 ){ - fts2HashInit(&v->pendingTerms, FTS2_HASH_STRING, 1); - v->nPendingData = 0; - } - v->iPrevDocid = iDocid; - return SQLITE_OK; -} - -/* This function implements the xUpdate callback; it's the top-level entry - * point for inserting, deleting or updating a row in a full-text table. */ -static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, - sqlite_int64 *pRowid){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - int rc; - - TRACE(("FTS2 Update %p\n", pVtab)); - - if( nArg<2 ){ - rc = index_delete(v, sqlite3_value_int64(ppArg[0])); - } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ - /* An update: - * ppArg[0] = old rowid - * ppArg[1] = new rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - */ - sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); - if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || - sqlite3_value_int64(ppArg[1]) != rowid ){ - rc = SQLITE_ERROR; /* we don't allow changing the rowid */ - } else { - assert( nArg==2+v->nColumn+1); - rc = index_update(v, rowid, &ppArg[2]); - } - } else { - /* An insert: - * ppArg[1] = requested rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - */ - assert( nArg==2+v->nColumn+1); - rc = index_insert(v, ppArg[1], &ppArg[2], pRowid); - } - - return rc; -} - -static int fulltextSync(sqlite3_vtab *pVtab){ - TRACE(("FTS2 xSync()\n")); - return flushPendingTerms((fulltext_vtab *)pVtab); -} - -static int fulltextBegin(sqlite3_vtab *pVtab){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - TRACE(("FTS2 xBegin()\n")); - - /* Any buffered updates should have been cleared by the previous - ** transaction. - */ - assert( v->nPendingData<0 ); - return clearPendingTerms(v); -} - -static int fulltextCommit(sqlite3_vtab *pVtab){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - TRACE(("FTS2 xCommit()\n")); - - /* Buffered updates should have been cleared by fulltextSync(). */ - assert( v->nPendingData<0 ); - return clearPendingTerms(v); -} - -static int fulltextRollback(sqlite3_vtab *pVtab){ - TRACE(("FTS2 xRollback()\n")); - return clearPendingTerms((fulltext_vtab *)pVtab); -} - -/* -** Implementation of the snippet() function for FTS2 -*/ -static void snippetFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); - }else{ - const char *zStart = ""; - const char *zEnd = ""; - const char *zEllipsis = "..."; - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - if( argc>=2 ){ - zStart = (const char*)sqlite3_value_text(argv[1]); - if( argc>=3 ){ - zEnd = (const char*)sqlite3_value_text(argv[2]); - if( argc>=4 ){ - zEllipsis = (const char*)sqlite3_value_text(argv[3]); - } - } - } - snippetAllOffsets(pCursor); - snippetText(pCursor, zStart, zEnd, zEllipsis); - sqlite3_result_text(pContext, pCursor->snippet.zSnippet, - pCursor->snippet.nSnippet, SQLITE_STATIC); - } -} - -/* -** Implementation of the offsets() function for FTS2 -*/ -static void snippetOffsetsFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to offsets",-1); - }else{ - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - snippetAllOffsets(pCursor); - snippetOffsetText(&pCursor->snippet); - sqlite3_result_text(pContext, - pCursor->snippet.zOffset, pCursor->snippet.nOffset, - SQLITE_STATIC); - } -} - -/* -** This routine implements the xFindFunction method for the FTS2 -** virtual table. -*/ -static int fulltextFindFunction( - sqlite3_vtab *pVtab, - int nArg, - const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg -){ - if( strcmp(zName,"snippet")==0 ){ - *pxFunc = snippetFunc; - return 1; - }else if( strcmp(zName,"offsets")==0 ){ - *pxFunc = snippetOffsetsFunc; - return 1; - } - return 0; -} - -/* -** Rename an fts2 table. -*/ -static int fulltextRename( - sqlite3_vtab *pVtab, - const char *zName -){ - fulltext_vtab *p = (fulltext_vtab *)pVtab; - int rc = SQLITE_NOMEM; - char *zSql = sqlite3_mprintf( - "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" - "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';" - "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';" - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - ); - if( zSql ){ - rc = sqlite3_exec(p->db, zSql, 0, 0, 0); - sqlite3_free(zSql); - } - return rc; -} - -static const sqlite3_module fts2Module = { - /* iVersion */ 0, - /* xCreate */ fulltextCreate, - /* xConnect */ fulltextConnect, - /* xBestIndex */ fulltextBestIndex, - /* xDisconnect */ fulltextDisconnect, - /* xDestroy */ fulltextDestroy, - /* xOpen */ fulltextOpen, - /* xClose */ fulltextClose, - /* xFilter */ fulltextFilter, - /* xNext */ fulltextNext, - /* xEof */ fulltextEof, - /* xColumn */ fulltextColumn, - /* xRowid */ fulltextRowid, - /* xUpdate */ fulltextUpdate, - /* xBegin */ fulltextBegin, - /* xSync */ fulltextSync, - /* xCommit */ fulltextCommit, - /* xRollback */ fulltextRollback, - /* xFindFunction */ fulltextFindFunction, - /* xRename */ fulltextRename, -}; - -static void hashDestroy(void *p){ - fts2Hash *pHash = (fts2Hash *)p; - sqlite3Fts2HashClear(pHash); - sqlite3_free(pHash); -} - -/* -** The fts2 built-in tokenizers - "simple" and "porter" - are implemented -** in files fts2_tokenizer1.c and fts2_porter.c respectively. The following -** two forward declarations are for functions declared in these files -** used to retrieve the respective implementations. -** -** Calling sqlite3Fts2SimpleTokenizerModule() sets the value pointed -** to by the argument to point a the "simple" tokenizer implementation. -** Function ...PorterTokenizerModule() sets *pModule to point to the -** porter tokenizer/stemmer implementation. -*/ -void sqlite3Fts2SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); -void sqlite3Fts2PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); -void sqlite3Fts2IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); - -int sqlite3Fts2InitHashTable(sqlite3 *, fts2Hash *, const char *); - -/* -** Initialise the fts2 extension. If this extension is built as part -** of the sqlite library, then this function is called directly by -** SQLite. If fts2 is built as a dynamically loadable extension, this -** function is called by the sqlite3_extension_init() entry point. -*/ -int sqlite3Fts2Init(sqlite3 *db){ - int rc = SQLITE_OK; - fts2Hash *pHash = 0; - const sqlite3_tokenizer_module *pSimple = 0; - const sqlite3_tokenizer_module *pPorter = 0; - const sqlite3_tokenizer_module *pIcu = 0; - - sqlite3Fts2SimpleTokenizerModule(&pSimple); - sqlite3Fts2PorterTokenizerModule(&pPorter); -#ifdef SQLITE_ENABLE_ICU - sqlite3Fts2IcuTokenizerModule(&pIcu); -#endif - - /* Allocate and initialise the hash-table used to store tokenizers. */ - pHash = sqlite3_malloc(sizeof(fts2Hash)); - if( !pHash ){ - rc = SQLITE_NOMEM; - }else{ - sqlite3Fts2HashInit(pHash, FTS2_HASH_STRING, 1); - } - - /* Load the built-in tokenizers into the hash table */ - if( rc==SQLITE_OK ){ - if( sqlite3Fts2HashInsert(pHash, "simple", 7, (void *)pSimple) - || sqlite3Fts2HashInsert(pHash, "porter", 7, (void *)pPorter) - || (pIcu && sqlite3Fts2HashInsert(pHash, "icu", 4, (void *)pIcu)) - ){ - rc = SQLITE_NOMEM; - } - } - - /* Create the virtual table wrapper around the hash-table and overload - ** the two scalar functions. If this is successful, register the - ** module with sqlite. - */ - if( SQLITE_OK==rc - && SQLITE_OK==(rc = sqlite3Fts2InitHashTable(db, pHash, "fts2_tokenizer")) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1)) - ){ - return sqlite3_create_module_v2( - db, "fts2", &fts2Module, (void *)pHash, hashDestroy - ); - } - - /* An error has occured. Delete the hash table and return the error code. */ - assert( rc!=SQLITE_OK ); - if( pHash ){ - sqlite3Fts2HashClear(pHash); - sqlite3_free(pHash); - } - return rc; -} - -#if !SQLITE_CORE -int sqlite3_extension_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - SQLITE_EXTENSION_INIT2(pApi) - return sqlite3Fts2Init(db); -} -#endif - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h deleted file mode 100644 index 4da4c3877b..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -** 2006 Oct 10 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file is used by programs that want to link against the -** FTS2 library. All it does is declare the sqlite3Fts2Init() interface. -*/ -#include "sqlite3.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int sqlite3Fts2Init(sqlite3 *db); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c deleted file mode 100644 index fcd5cc2fd8..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the implementation of generic hash-tables used in SQLite. -** We've modified it slightly to serve as a standalone hash table -** implementation for the full-text indexing module. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS2 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS2 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) - -#include -#include -#include - -#include "fts2_hash.h" - -static void *malloc_and_zero(int n){ - void *p = malloc(n); - if( p ){ - memset(p, 0, n); - } - return p; -} - -/* Turn bulk memory into a hash table object by initializing the -** fields of the Hash structure. -** -** "pNew" is a pointer to the hash table that is to be initialized. -** keyClass is one of the constants -** FTS2_HASH_BINARY or FTS2_HASH_STRING. The value of keyClass -** determines what kind of key the hash table will use. "copyKey" is -** true if the hash table should make its own private copy of keys and -** false if it should just use the supplied pointer. -*/ -void sqlite3Fts2HashInit(fts2Hash *pNew, int keyClass, int copyKey){ - assert( pNew!=0 ); - assert( keyClass>=FTS2_HASH_STRING && keyClass<=FTS2_HASH_BINARY ); - pNew->keyClass = keyClass; - pNew->copyKey = copyKey; - pNew->first = 0; - pNew->count = 0; - pNew->htsize = 0; - pNew->ht = 0; - pNew->xMalloc = malloc_and_zero; - pNew->xFree = free; -} - -/* Remove all entries from a hash table. Reclaim all memory. -** Call this routine to delete a hash table or to reset a hash table -** to the empty state. -*/ -void sqlite3Fts2HashClear(fts2Hash *pH){ - fts2HashElem *elem; /* For looping over all elements of the table */ - - assert( pH!=0 ); - elem = pH->first; - pH->first = 0; - if( pH->ht ) pH->xFree(pH->ht); - pH->ht = 0; - pH->htsize = 0; - while( elem ){ - fts2HashElem *next_elem = elem->next; - if( pH->copyKey && elem->pKey ){ - pH->xFree(elem->pKey); - } - pH->xFree(elem); - elem = next_elem; - } - pH->count = 0; -} - -/* -** Hash and comparison functions when the mode is FTS2_HASH_STRING -*/ -static int strHash(const void *pKey, int nKey){ - const char *z = (const char *)pKey; - int h = 0; - if( nKey<=0 ) nKey = (int) strlen(z); - while( nKey > 0 ){ - h = (h<<3) ^ h ^ *z++; - nKey--; - } - return h & 0x7fffffff; -} -static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return strncmp((const char*)pKey1,(const char*)pKey2,n1); -} - -/* -** Hash and comparison functions when the mode is FTS2_HASH_BINARY -*/ -static int binHash(const void *pKey, int nKey){ - int h = 0; - const char *z = (const char *)pKey; - while( nKey-- > 0 ){ - h = (h<<3) ^ h ^ *(z++); - } - return h & 0x7fffffff; -} -static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return memcmp(pKey1,pKey2,n1); -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** The C syntax in this function definition may be unfamilar to some -** programmers, so we provide the following additional explanation: -** -** The name of the function is "hashFunction". The function takes a -** single parameter "keyClass". The return value of hashFunction() -** is a pointer to another function. Specifically, the return value -** of hashFunction() is a pointer to a function that takes two parameters -** with types "const void*" and "int" and returns an "int". -*/ -static int (*hashFunction(int keyClass))(const void*,int){ - if( keyClass==FTS2_HASH_STRING ){ - return &strHash; - }else{ - assert( keyClass==FTS2_HASH_BINARY ); - return &binHash; - } -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** For help in interpreted the obscure C code in the function definition, -** see the header comment on the previous function. -*/ -static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ - if( keyClass==FTS2_HASH_STRING ){ - return &strCompare; - }else{ - assert( keyClass==FTS2_HASH_BINARY ); - return &binCompare; - } -} - -/* Link an element into the hash table -*/ -static void insertElement( - fts2Hash *pH, /* The complete hash table */ - struct _fts2ht *pEntry, /* The entry into which pNew is inserted */ - fts2HashElem *pNew /* The element to be inserted */ -){ - fts2HashElem *pHead; /* First element already in pEntry */ - pHead = pEntry->chain; - if( pHead ){ - pNew->next = pHead; - pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } - pHead->prev = pNew; - }else{ - pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } - pNew->prev = 0; - pH->first = pNew; - } - pEntry->count++; - pEntry->chain = pNew; -} - - -/* Resize the hash table so that it cantains "new_size" buckets. -** "new_size" must be a power of 2. The hash table might fail -** to resize if sqliteMalloc() fails. -*/ -static void rehash(fts2Hash *pH, int new_size){ - struct _fts2ht *new_ht; /* The new hash table */ - fts2HashElem *elem, *next_elem; /* For looping over existing elements */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( (new_size & (new_size-1))==0 ); - new_ht = (struct _fts2ht *)pH->xMalloc( new_size*sizeof(struct _fts2ht) ); - if( new_ht==0 ) return; - if( pH->ht ) pH->xFree(pH->ht); - pH->ht = new_ht; - pH->htsize = new_size; - xHash = hashFunction(pH->keyClass); - for(elem=pH->first, pH->first=0; elem; elem = next_elem){ - int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); - next_elem = elem->next; - insertElement(pH, &new_ht[h], elem); - } -} - -/* This function (for internal use only) locates an element in an -** hash table that matches the given key. The hash for this key has -** already been computed and is passed as the 4th parameter. -*/ -static fts2HashElem *findElementGivenHash( - const fts2Hash *pH, /* The pH to be searched */ - const void *pKey, /* The key we are searching for */ - int nKey, - int h /* The hash for this key. */ -){ - fts2HashElem *elem; /* Used to loop thru the element list */ - int count; /* Number of elements left to test */ - int (*xCompare)(const void*,int,const void*,int); /* comparison function */ - - if( pH->ht ){ - struct _fts2ht *pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - xCompare = compareFunction(pH->keyClass); - while( count-- && elem ){ - if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ - return elem; - } - elem = elem->next; - } - } - return 0; -} - -/* Remove a single entry from the hash table given a pointer to that -** element and a hash on the element's key. -*/ -static void removeElementGivenHash( - fts2Hash *pH, /* The pH containing "elem" */ - fts2HashElem* elem, /* The element to be removed from the pH */ - int h /* Hash value for the element */ -){ - struct _fts2ht *pEntry; - if( elem->prev ){ - elem->prev->next = elem->next; - }else{ - pH->first = elem->next; - } - if( elem->next ){ - elem->next->prev = elem->prev; - } - pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ - pEntry->chain = elem->next; - } - pEntry->count--; - if( pEntry->count<=0 ){ - pEntry->chain = 0; - } - if( pH->copyKey && elem->pKey ){ - pH->xFree(elem->pKey); - } - pH->xFree( elem ); - pH->count--; - if( pH->count<=0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); - fts2HashClear(pH); - } -} - -/* Attempt to locate an element of the hash table pH with a key -** that matches pKey,nKey. Return the data for this element if it is -** found, or NULL if there is no match. -*/ -void *sqlite3Fts2HashFind(const fts2Hash *pH, const void *pKey, int nKey){ - int h; /* A hash on key */ - fts2HashElem *elem; /* The element that matches key */ - int (*xHash)(const void*,int); /* The hash function */ - - if( pH==0 || pH->ht==0 ) return 0; - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - h = (*xHash)(pKey,nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - elem = findElementGivenHash(pH,pKey,nKey, h & (pH->htsize-1)); - return elem ? elem->data : 0; -} - -/* Insert an element into the hash table pH. The key is pKey,nKey -** and the data is "data". -** -** If no element exists with a matching key, then a new -** element is created. A copy of the key is made if the copyKey -** flag is set. NULL is returned. -** -** If another element already exists with the same key, then the -** new data replaces the old data and the old data is returned. -** The key is not copied in this instance. If a malloc fails, then -** the new data is returned and the hash table is unchanged. -** -** If the "data" parameter to this function is NULL, then the -** element corresponding to "key" is removed from the hash table. -*/ -void *sqlite3Fts2HashInsert( - fts2Hash *pH, /* The hash table to insert into */ - const void *pKey, /* The key */ - int nKey, /* Number of bytes in the key */ - void *data /* The data */ -){ - int hraw; /* Raw hash value of the key */ - int h; /* the hash of the key modulo hash table size */ - fts2HashElem *elem; /* Used to loop thru the element list */ - fts2HashElem *new_elem; /* New element added to the pH */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( pH!=0 ); - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - hraw = (*xHash)(pKey, nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - elem = findElementGivenHash(pH,pKey,nKey,h); - if( elem ){ - void *old_data = elem->data; - if( data==0 ){ - removeElementGivenHash(pH,elem,h); - }else{ - elem->data = data; - } - return old_data; - } - if( data==0 ) return 0; - new_elem = (fts2HashElem*)pH->xMalloc( sizeof(fts2HashElem) ); - if( new_elem==0 ) return data; - if( pH->copyKey && pKey!=0 ){ - new_elem->pKey = pH->xMalloc( nKey ); - if( new_elem->pKey==0 ){ - pH->xFree(new_elem); - return data; - } - memcpy((void*)new_elem->pKey, pKey, nKey); - }else{ - new_elem->pKey = (void*)pKey; - } - new_elem->nKey = nKey; - pH->count++; - if( pH->htsize==0 ){ - rehash(pH,8); - if( pH->htsize==0 ){ - pH->count = 0; - pH->xFree(new_elem); - return data; - } - } - if( pH->count > pH->htsize ){ - rehash(pH,pH->htsize*2); - } - assert( pH->htsize>0 ); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - insertElement(pH, &pH->ht[h], new_elem); - new_elem->data = data; - return 0; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h deleted file mode 100644 index 97f35291cb..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_hash.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implemenation -** used in SQLite. We've modified it slightly to serve as a standalone -** hash table implementation for the full-text indexing module. -** -*/ -#ifndef _FTS2_HASH_H_ -#define _FTS2_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct fts2Hash fts2Hash; -typedef struct fts2HashElem fts2HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, many of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -*/ -struct fts2Hash { - char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ - char copyKey; /* True if copy of key made on insert */ - int count; /* Number of entries in this table */ - fts2HashElem *first; /* The first element of the array */ - void *(*xMalloc)(int); /* malloc() function to use */ - void (*xFree)(void *); /* free() function to use */ - int htsize; /* Number of buckets in the hash table */ - struct _fts2ht { /* the hash table */ - int count; /* Number of entries with this hash */ - fts2HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct fts2HashElem { - fts2HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - void *pKey; int nKey; /* Key associated with this element */ -}; - -/* -** There are 2 different modes of operation for a hash table: -** -** FTS2_HASH_STRING pKey points to a string that is nKey bytes long -** (including the null-terminator, if any). Case -** is respected in comparisons. -** -** FTS2_HASH_BINARY pKey points to binary data nKey bytes long. -** memcmp() is used to compare keys. -** -** A copy of the key is made if the copyKey parameter to fts2HashInit is 1. -*/ -#define FTS2_HASH_STRING 1 -#define FTS2_HASH_BINARY 2 - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -void sqlite3Fts2HashInit(fts2Hash*, int keytype, int copyKey); -void *sqlite3Fts2HashInsert(fts2Hash*, const void *pKey, int nKey, void *pData); -void *sqlite3Fts2HashFind(const fts2Hash*, const void *pKey, int nKey); -void sqlite3Fts2HashClear(fts2Hash*); - -/* -** Shorthand for the functions above -*/ -#define fts2HashInit sqlite3Fts2HashInit -#define fts2HashInsert sqlite3Fts2HashInsert -#define fts2HashFind sqlite3Fts2HashFind -#define fts2HashClear sqlite3Fts2HashClear - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** fts2Hash h; -** fts2HashElem *p; -** ... -** for(p=fts2HashFirst(&h); p; p=fts2HashNext(p)){ -** SomeStructure *pData = fts2HashData(p); -** // do something with pData -** } -*/ -#define fts2HashFirst(H) ((H)->first) -#define fts2HashNext(E) ((E)->next) -#define fts2HashData(E) ((E)->data) -#define fts2HashKey(E) ((E)->pKey) -#define fts2HashKeysize(E) ((E)->nKey) - -/* -** Number of entries in a hash table -*/ -#define fts2HashCount(H) ((H)->count) - -#endif /* _FTS2_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c deleted file mode 100644 index ed15f333d6..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_icu.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -** 2007 June 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file implements a tokenizer for fts2 based on the ICU library. -** -** $Id: fts2_icu.c,v 1.1 2007/06/22 15:21:16 danielk1977 Exp $ -*/ - -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) -#ifdef SQLITE_ENABLE_ICU - -#include -#include -#include "fts2_tokenizer.h" - -#include -#include -#include -#include - -typedef struct IcuTokenizer IcuTokenizer; -typedef struct IcuCursor IcuCursor; - -struct IcuTokenizer { - sqlite3_tokenizer base; - char *zLocale; -}; - -struct IcuCursor { - sqlite3_tokenizer_cursor base; - - UBreakIterator *pIter; /* ICU break-iterator object */ - int nChar; /* Number of UChar elements in pInput */ - UChar *aChar; /* Copy of input using utf-16 encoding */ - int *aOffset; /* Offsets of each character in utf-8 input */ - - int nBuffer; - char *zBuffer; - - int iToken; -}; - -/* -** Create a new tokenizer instance. -*/ -static int icuCreate( - int argc, /* Number of entries in argv[] */ - const char * const *argv, /* Tokenizer creation arguments */ - sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ -){ - IcuTokenizer *p; - int n = 0; - - if( argc>0 ){ - n = strlen(argv[0])+1; - } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); - if( !p ){ - return SQLITE_NOMEM; - } - memset(p, 0, sizeof(IcuTokenizer)); - - if( n ){ - p->zLocale = (char *)&p[1]; - memcpy(p->zLocale, argv[0], n); - } - - *ppTokenizer = (sqlite3_tokenizer *)p; - - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int icuDestroy(sqlite3_tokenizer *pTokenizer){ - IcuTokenizer *p = (IcuTokenizer *)pTokenizer; - sqlite3_free(p); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int icuOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *zInput, /* Input string */ - int nInput, /* Length of zInput in bytes */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - IcuTokenizer *p = (IcuTokenizer *)pTokenizer; - IcuCursor *pCsr; - - const int32_t opt = U_FOLD_CASE_DEFAULT; - UErrorCode status = U_ZERO_ERROR; - int nChar; - - UChar32 c; - int iInput = 0; - int iOut = 0; - - *ppCursor = 0; - - nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( - sizeof(IcuCursor) + /* IcuCursor */ - nChar * sizeof(UChar) + /* IcuCursor.aChar[] */ - (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ - ); - if( !pCsr ){ - return SQLITE_NOMEM; - } - memset(pCsr, 0, sizeof(IcuCursor)); - pCsr->aChar = (UChar *)&pCsr[1]; - pCsr->aOffset = (int *)&pCsr->aChar[nChar]; - - pCsr->aOffset[iOut] = iInput; - U8_NEXT(zInput, iInput, nInput, c); - while( c>0 ){ - int isError = 0; - c = u_foldCase(c, opt); - U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); - if( isError ){ - sqlite3_free(pCsr); - return SQLITE_ERROR; - } - pCsr->aOffset[iOut] = iInput; - - if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); - if( !U_SUCCESS(status) ){ - sqlite3_free(pCsr); - return SQLITE_ERROR; - } - pCsr->nChar = iOut; - - ubrk_first(pCsr->pIter); - *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to icuOpen(). -*/ -static int icuClose(sqlite3_tokenizer_cursor *pCursor){ - IcuCursor *pCsr = (IcuCursor *)pCursor; - ubrk_close(pCsr->pIter); - sqlite3_free(pCsr->zBuffer); - sqlite3_free(pCsr); - return SQLITE_OK; -} - -/* -** Extract the next token from a tokenization cursor. -*/ -static int icuNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ - const char **ppToken, /* OUT: *ppToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - IcuCursor *pCsr = (IcuCursor *)pCursor; - - int iStart = 0; - int iEnd = 0; - int nByte = 0; - - while( iStart==iEnd ){ - UChar32 c; - - iStart = ubrk_current(pCsr->pIter); - iEnd = ubrk_next(pCsr->pIter); - if( iEnd==UBRK_DONE ){ - return SQLITE_DONE; - } - - while( iStartaChar, iWhite, pCsr->nChar, c); - if( u_isspace(c) ){ - iStart = iWhite; - }else{ - break; - } - } - assert(iStart<=iEnd); - } - - do { - UErrorCode status = U_ZERO_ERROR; - if( nByte ){ - char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); - if( !zNew ){ - return SQLITE_NOMEM; - } - pCsr->zBuffer = zNew; - pCsr->nBuffer = nByte; - } - - u_strToUTF8( - pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ - &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ - &status /* Output success/failure */ - ); - } while( nByte>pCsr->nBuffer ); - - *ppToken = pCsr->zBuffer; - *pnBytes = nByte; - *piStartOffset = pCsr->aOffset[iStart]; - *piEndOffset = pCsr->aOffset[iEnd]; - *piPosition = pCsr->iToken++; - - return SQLITE_OK; -} - -/* -** The set of routines that implement the simple tokenizer -*/ -static const sqlite3_tokenizer_module icuTokenizerModule = { - 0, /* iVersion */ - icuCreate, /* xCreate */ - icuDestroy, /* xCreate */ - icuOpen, /* xOpen */ - icuClose, /* xClose */ - icuNext, /* xNext */ -}; - -/* -** Set *ppModule to point at the implementation of the ICU tokenizer. -*/ -void sqlite3Fts2IcuTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &icuTokenizerModule; -} - -#endif /* defined(SQLITE_ENABLE_ICU) */ -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c deleted file mode 100644 index dab1849531..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_porter.c +++ /dev/null @@ -1,642 +0,0 @@ -/* -** 2006 September 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Implementation of the full-text-search tokenizer that implements -** a Porter stemmer. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS2 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS2 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) - - -#include -#include -#include -#include -#include - -#include "fts2_tokenizer.h" - -/* -** Class derived from sqlite3_tokenizer -*/ -typedef struct porter_tokenizer { - sqlite3_tokenizer base; /* Base class */ -} porter_tokenizer; - -/* -** Class derived from sqlit3_tokenizer_cursor -*/ -typedef struct porter_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *zInput; /* input we are tokenizing */ - int nInput; /* size of the input */ - int iOffset; /* current position in zInput */ - int iToken; /* index of next token to be returned */ - char *zToken; /* storage for current token */ - int nAllocated; /* space allocated to zToken buffer */ -} porter_tokenizer_cursor; - - -/* Forward declaration */ -static const sqlite3_tokenizer_module porterTokenizerModule; - - -/* -** Create a new tokenizer instance. -*/ -static int porterCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - porter_tokenizer *t; - t = (porter_tokenizer *) calloc(sizeof(*t), 1); - if( t==NULL ) return SQLITE_NOMEM; - - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int porterDestroy(sqlite3_tokenizer *pTokenizer){ - free(pTokenizer); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is zInput[0..nInput-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int porterOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *zInput, int nInput, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - porter_tokenizer_cursor *c; - - c = (porter_tokenizer_cursor *) malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; - - c->zInput = zInput; - if( zInput==0 ){ - c->nInput = 0; - }else if( nInput<0 ){ - c->nInput = (int)strlen(zInput); - }else{ - c->nInput = nInput; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->zToken = NULL; /* no space allocated, yet. */ - c->nAllocated = 0; - - *ppCursor = &c->base; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to -** porterOpen() above. -*/ -static int porterClose(sqlite3_tokenizer_cursor *pCursor){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - free(c->zToken); - free(c); - return SQLITE_OK; -} -/* -** Vowel or consonant -*/ -static const char cType[] = { - 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 2, 1 -}; - -/* -** isConsonant() and isVowel() determine if their first character in -** the string they point to is a consonant or a vowel, according -** to Porter ruls. -** -** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. -** 'Y' is a consonant unless it follows another consonant, -** in which case it is a vowel. -** -** In these routine, the letters are in reverse order. So the 'y' rule -** is that 'y' is a consonant unless it is followed by another -** consonent. -*/ -static int isVowel(const char*); -static int isConsonant(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return j; - return z[1]==0 || isVowel(z + 1); -} -static int isVowel(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return 1-j; - return isConsonant(z + 1); -} - -/* -** Let any sequence of one or more vowels be represented by V and let -** C be sequence of one or more consonants. Then every word can be -** represented as: -** -** [C] (VC){m} [V] -** -** In prose: A word is an optional consonant followed by zero or -** vowel-consonant pairs followed by an optional vowel. "m" is the -** number of vowel consonant pairs. This routine computes the value -** of m for the first i bytes of a word. -** -** Return true if the m-value for z is 1 or more. In other words, -** return true if z contains at least one vowel that is followed -** by a consonant. -** -** In this routine z[] is in reverse order. So we are really looking -** for an instance of of a consonant followed by a vowel. -*/ -static int m_gt_0(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* Like mgt0 above except we are looking for a value of m which is -** exactly 1 -*/ -static int m_eq_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 1; - while( isConsonant(z) ){ z++; } - return *z==0; -} - -/* Like mgt0 above except we are looking for a value of m>1 instead -** or m>0 -*/ -static int m_gt_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* -** Return TRUE if there is a vowel anywhere within z[0..n-1] -*/ -static int hasVowel(const char *z){ - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* -** Return TRUE if the word ends in a double consonant. -** -** The text is reversed here. So we are really looking at -** the first two characters of z[]. -*/ -static int doubleConsonant(const char *z){ - return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); -} - -/* -** Return TRUE if the word ends with three letters which -** are consonant-vowel-consonent and where the final consonant -** is not 'w', 'x', or 'y'. -** -** The word is reversed here. So we are really checking the -** first three letters and the first one cannot be in [wxy]. -*/ -static int star_oh(const char *z){ - return - z[0]!=0 && isConsonant(z) && - z[0]!='w' && z[0]!='x' && z[0]!='y' && - z[1]!=0 && isVowel(z+1) && - z[2]!=0 && isConsonant(z+2); -} - -/* -** If the word ends with zFrom and xCond() is true for the stem -** of the word that preceeds the zFrom ending, then change the -** ending to zTo. -** -** The input word *pz and zFrom are both in reverse order. zTo -** is in normal order. -** -** Return TRUE if zFrom matches. Return FALSE if zFrom does not -** match. Not that TRUE is returned even if xCond() fails and -** no substitution occurs. -*/ -static int stem( - char **pz, /* The word being stemmed (Reversed) */ - const char *zFrom, /* If the ending matches this... (Reversed) */ - const char *zTo, /* ... change the ending to this (not reversed) */ - int (*xCond)(const char*) /* Condition that must be true */ -){ - char *z = *pz; - while( *zFrom && *zFrom==*z ){ z++; zFrom++; } - if( *zFrom!=0 ) return 0; - if( xCond && !xCond(z) ) return 1; - while( *zTo ){ - *(--z) = *(zTo++); - } - *pz = z; - return 1; -} - -/* -** This is the fallback stemmer used when the porter stemmer is -** inappropriate. The input word is copied into the output with -** US-ASCII case folding. If the input word is too long (more -** than 20 bytes if it contains no digits or more than 6 bytes if -** it contains digits) then word is truncated to 20 or 6 bytes -** by taking 10 or 3 bytes from the beginning and end. -*/ -static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ - int i, mx, j; - int hasDigit = 0; - for(i=0; i='A' && c<='Z' ){ - zOut[i] = c - 'A' + 'a'; - }else{ - if( c>='0' && c<='9' ) hasDigit = 1; - zOut[i] = c; - } - } - mx = hasDigit ? 3 : 10; - if( nIn>mx*2 ){ - for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ - /* The word is too big or too small for the porter stemmer. - ** Fallback to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ - zReverse[j] = c + 'a' - 'A'; - }else if( c>='a' && c<='z' ){ - zReverse[j] = c; - }else{ - /* The use of a character not in [a-zA-Z] means that we fallback - ** to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - } - memset(&zReverse[sizeof(zReverse)-5], 0, 5); - z = &zReverse[j+1]; - - - /* Step 1a */ - if( z[0]=='s' ){ - if( - !stem(&z, "sess", "ss", 0) && - !stem(&z, "sei", "i", 0) && - !stem(&z, "ss", "ss", 0) - ){ - z++; - } - } - - /* Step 1b */ - z2 = z; - if( stem(&z, "dee", "ee", m_gt_0) ){ - /* Do nothing. The work was all in the test */ - }else if( - (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) - && z!=z2 - ){ - if( stem(&z, "ta", "ate", 0) || - stem(&z, "lb", "ble", 0) || - stem(&z, "zi", "ize", 0) ){ - /* Do nothing. The work was all in the test */ - }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ - z++; - }else if( m_eq_1(z) && star_oh(z) ){ - *(--z) = 'e'; - } - } - - /* Step 1c */ - if( z[0]=='y' && hasVowel(z+1) ){ - z[0] = 'i'; - } - - /* Step 2 */ - switch( z[1] ){ - case 'a': - stem(&z, "lanoita", "ate", m_gt_0) || - stem(&z, "lanoit", "tion", m_gt_0); - break; - case 'c': - stem(&z, "icne", "ence", m_gt_0) || - stem(&z, "icna", "ance", m_gt_0); - break; - case 'e': - stem(&z, "rezi", "ize", m_gt_0); - break; - case 'g': - stem(&z, "igol", "log", m_gt_0); - break; - case 'l': - stem(&z, "ilb", "ble", m_gt_0) || - stem(&z, "illa", "al", m_gt_0) || - stem(&z, "iltne", "ent", m_gt_0) || - stem(&z, "ile", "e", m_gt_0) || - stem(&z, "ilsuo", "ous", m_gt_0); - break; - case 'o': - stem(&z, "noitazi", "ize", m_gt_0) || - stem(&z, "noita", "ate", m_gt_0) || - stem(&z, "rota", "ate", m_gt_0); - break; - case 's': - stem(&z, "msila", "al", m_gt_0) || - stem(&z, "ssenevi", "ive", m_gt_0) || - stem(&z, "ssenluf", "ful", m_gt_0) || - stem(&z, "ssensuo", "ous", m_gt_0); - break; - case 't': - stem(&z, "itila", "al", m_gt_0) || - stem(&z, "itivi", "ive", m_gt_0) || - stem(&z, "itilib", "ble", m_gt_0); - break; - } - - /* Step 3 */ - switch( z[0] ){ - case 'e': - stem(&z, "etaci", "ic", m_gt_0) || - stem(&z, "evita", "", m_gt_0) || - stem(&z, "ezila", "al", m_gt_0); - break; - case 'i': - stem(&z, "itici", "ic", m_gt_0); - break; - case 'l': - stem(&z, "laci", "ic", m_gt_0) || - stem(&z, "luf", "", m_gt_0); - break; - case 's': - stem(&z, "ssen", "", m_gt_0); - break; - } - - /* Step 4 */ - switch( z[1] ){ - case 'a': - if( z[0]=='l' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'c': - if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'e': - if( z[0]=='r' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'i': - if( z[0]=='c' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'l': - if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'n': - if( z[0]=='t' ){ - if( z[2]=='a' ){ - if( m_gt_1(z+3) ){ - z += 3; - } - }else if( z[2]=='e' ){ - stem(&z, "tneme", "", m_gt_1) || - stem(&z, "tnem", "", m_gt_1) || - stem(&z, "tne", "", m_gt_1); - } - } - break; - case 'o': - if( z[0]=='u' ){ - if( m_gt_1(z+2) ){ - z += 2; - } - }else if( z[3]=='s' || z[3]=='t' ){ - stem(&z, "noi", "", m_gt_1); - } - break; - case 's': - if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 't': - stem(&z, "eta", "", m_gt_1) || - stem(&z, "iti", "", m_gt_1); - break; - case 'u': - if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 'v': - case 'z': - if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - } - - /* Step 5a */ - if( z[0]=='e' ){ - if( m_gt_1(z+1) ){ - z++; - }else if( m_eq_1(z+1) && !star_oh(z+1) ){ - z++; - } - } - - /* Step 5b */ - if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ - z++; - } - - /* z[] is now the stemmed word in reverse order. Flip it back - ** around into forward order and return. - */ - *pnOut = i = strlen(z); - zOut[i] = 0; - while( *z ){ - zOut[--i] = *(z++); - } -} - -/* -** Characters that can be part of a token. We assume any character -** whose value is greater than 0x80 (any UTF character) can be -** part of a token. In other words, delimiters all must have -** values of 0x7f or lower. -*/ -static const char porterIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) - -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to porterOpen(). -*/ -static int porterNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ - const char **pzToken, /* OUT: *pzToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - const char *z = c->zInput; - - while( c->iOffsetnInput ){ - int iStartOffset, ch; - - /* Scan past delimiter characters */ - while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ - c->iOffset++; - } - - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ - c->iOffset++; - } - - if( c->iOffset>iStartOffset ){ - int n = c->iOffset-iStartOffset; - if( n>c->nAllocated ){ - c->nAllocated = n+20; - c->zToken = realloc(c->zToken, c->nAllocated); - if( c->zToken==NULL ) return SQLITE_NOMEM; - } - porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); - *pzToken = c->zToken; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - return SQLITE_OK; - } - } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the porter-stemmer tokenizer -*/ -static const sqlite3_tokenizer_module porterTokenizerModule = { - 0, - porterCreate, - porterDestroy, - porterOpen, - porterClose, - porterNext, -}; - -/* -** Allocate a new porter tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -void sqlite3Fts2PorterTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &porterTokenizerModule; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c deleted file mode 100644 index cbf771b47f..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.c +++ /dev/null @@ -1,371 +0,0 @@ -/* -** 2007 June 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This is part of an SQLite module implementing full-text search. -** This particular file implements the generic tokenizer interface. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS2 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS2 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) - - -#include "sqlite3.h" -#include "sqlite3ext.h" -SQLITE_EXTENSION_INIT1 - -#include "fts2_hash.h" -#include "fts2_tokenizer.h" -#include - -/* -** Implementation of the SQL scalar function for accessing the underlying -** hash table. This function may be called as follows: -** -** SELECT (); -** SELECT (, ); -** -** where is the name passed as the second argument -** to the sqlite3Fts2InitHashTable() function (e.g. 'fts2_tokenizer'). -** -** If the argument is specified, it must be a blob value -** containing a pointer to be stored as the hash data corresponding -** to the string . If is not specified, then -** the string must already exist in the has table. Otherwise, -** an error is returned. -** -** Whether or not the argument is specified, the value returned -** is a blob containing the pointer stored as the hash data corresponding -** to string (after the hash-table is updated, if applicable). -*/ -static void scalarFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - fts2Hash *pHash; - void *pPtr = 0; - const unsigned char *zName; - int nName; - - assert( argc==1 || argc==2 ); - - pHash = (fts2Hash *)sqlite3_user_data(context); - - zName = sqlite3_value_text(argv[0]); - nName = sqlite3_value_bytes(argv[0])+1; - - if( argc==2 ){ - void *pOld; - int n = sqlite3_value_bytes(argv[1]); - if( n!=sizeof(pPtr) ){ - sqlite3_result_error(context, "argument type mismatch", -1); - return; - } - pPtr = *(void **)sqlite3_value_blob(argv[1]); - pOld = sqlite3Fts2HashInsert(pHash, (void *)zName, nName, pPtr); - if( pOld==pPtr ){ - sqlite3_result_error(context, "out of memory", -1); - return; - } - }else{ - pPtr = sqlite3Fts2HashFind(pHash, zName, nName); - if( !pPtr ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; - } - } - - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); -} - -#ifdef SQLITE_TEST - -#include -#include - -/* -** Implementation of a special SQL scalar function for testing tokenizers -** designed to be used in concert with the Tcl testing framework. This -** function must be called with two arguments: -** -** SELECT (, ); -** SELECT (, ); -** -** where is the name passed as the second argument -** to the sqlite3Fts2InitHashTable() function (e.g. 'fts2_tokenizer') -** concatenated with the string '_test' (e.g. 'fts2_tokenizer_test'). -** -** The return value is a string that may be interpreted as a Tcl -** list. For each token in the , three elements are -** added to the returned list. The first is the token position, the -** second is the token text (folded, stemmed, etc.) and the third is the -** substring of associated with the token. For example, -** using the built-in "simple" tokenizer: -** -** SELECT fts_tokenizer_test('simple', 'I don't see how'); -** -** will return the string: -** -** "{0 i I 1 dont don't 2 see see 3 how how}" -** -*/ -static void testFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - fts2Hash *pHash; - sqlite3_tokenizer_module *p; - sqlite3_tokenizer *pTokenizer = 0; - sqlite3_tokenizer_cursor *pCsr = 0; - - const char *zErr = 0; - - const char *zName; - int nName; - const char *zInput; - int nInput; - - const char *zArg = 0; - - const char *zToken; - int nToken; - int iStart; - int iEnd; - int iPos; - - Tcl_Obj *pRet; - - assert( argc==2 || argc==3 ); - - nName = sqlite3_value_bytes(argv[0]); - zName = (const char *)sqlite3_value_text(argv[0]); - nInput = sqlite3_value_bytes(argv[argc-1]); - zInput = (const char *)sqlite3_value_text(argv[argc-1]); - - if( argc==3 ){ - zArg = (const char *)sqlite3_value_text(argv[1]); - } - - pHash = (fts2Hash *)sqlite3_user_data(context); - p = (sqlite3_tokenizer_module *)sqlite3Fts2HashFind(pHash, zName, nName+1); - - if( !p ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; - } - - pRet = Tcl_NewObj(); - Tcl_IncrRefCount(pRet); - - if( SQLITE_OK!=p->xCreate(zArg ? 1 : 0, &zArg, &pTokenizer) ){ - zErr = "error in xCreate()"; - goto finish; - } - pTokenizer->pModule = p; - if( SQLITE_OK!=p->xOpen(pTokenizer, zInput, nInput, &pCsr) ){ - zErr = "error in xOpen()"; - goto finish; - } - pCsr->pTokenizer = pTokenizer; - - while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ - Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); - Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); - zToken = &zInput[iStart]; - nToken = iEnd-iStart; - Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); - } - - if( SQLITE_OK!=p->xClose(pCsr) ){ - zErr = "error in xClose()"; - goto finish; - } - if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ - zErr = "error in xDestroy()"; - goto finish; - } - -finish: - if( zErr ){ - sqlite3_result_error(context, zErr, -1); - }else{ - sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); - } - Tcl_DecrRefCount(pRet); -} - -static -int registerTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module *p -){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts2_tokenizer(?, ?)"; - - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); - sqlite3_step(pStmt); - - return sqlite3_finalize(pStmt); -} - -static -int queryTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module **pp -){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts2_tokenizer(?)"; - - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); - } - } - - return sqlite3_finalize(pStmt); -} - -void sqlite3Fts2SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); - -/* -** Implementation of the scalar function fts2_tokenizer_internal_test(). -** This function is used for testing only, it is not included in the -** build unless SQLITE_TEST is defined. -** -** The purpose of this is to test that the fts2_tokenizer() function -** can be used as designed by the C-code in the queryTokenizer and -** registerTokenizer() functions above. These two functions are repeated -** in the README.tokenizer file as an example, so it is important to -** test them. -** -** To run the tests, evaluate the fts2_tokenizer_internal_test() scalar -** function with no arguments. An assert() will fail if a problem is -** detected. i.e.: -** -** SELECT fts2_tokenizer_internal_test(); -** -*/ -static void intTestFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int rc; - const sqlite3_tokenizer_module *p1; - const sqlite3_tokenizer_module *p2; - sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); - - /* Test the query function */ - sqlite3Fts2SimpleTokenizerModule(&p1); - rc = queryTokenizer(db, "simple", &p2); - assert( rc==SQLITE_OK ); - assert( p1==p2 ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_ERROR ); - assert( p2==0 ); - assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); - - /* Test the storage function */ - rc = registerTokenizer(db, "nosuchtokenizer", p1); - assert( rc==SQLITE_OK ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_OK ); - assert( p2==p1 ); - - sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); -} - -#endif - -/* -** Set up SQL objects in database db used to access the contents of -** the hash table pointed to by argument pHash. The hash table must -** been initialised to use string keys, and to take a private copy -** of the key when a value is inserted. i.e. by a call similar to: -** -** sqlite3Fts2HashInit(pHash, FTS2_HASH_STRING, 1); -** -** This function adds a scalar function (see header comment above -** scalarFunc() in this file for details) and, if ENABLE_TABLE is -** defined at compilation time, a temporary virtual table (see header -** comment above struct HashTableVtab) to the database schema. Both -** provide read/write access to the contents of *pHash. -** -** The third argument to this function, zName, is used as the name -** of both the scalar and, if created, the virtual table. -*/ -int sqlite3Fts2InitHashTable( - sqlite3 *db, - fts2Hash *pHash, - const char *zName -){ - int rc = SQLITE_OK; - void *p = (void *)pHash; - const int any = SQLITE_ANY; - char *zTest = 0; - char *zTest2 = 0; - -#ifdef SQLITE_TEST - void *pdb = (void *)db; - zTest = sqlite3_mprintf("%s_test", zName); - zTest2 = sqlite3_mprintf("%s_internal_test", zName); - if( !zTest || !zTest2 ){ - rc = SQLITE_NOMEM; - } -#endif - - if( rc!=SQLITE_OK - || (rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0)) -#ifdef SQLITE_TEST - || (rc = sqlite3_create_function(db, zTest, 2, any, p, testFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zTest, 3, any, p, testFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0)) -#endif - ); - - sqlite3_free(zTest); - sqlite3_free(zTest2); - return rc; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h deleted file mode 100644 index 8c256b2bed..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer.h +++ /dev/null @@ -1,145 +0,0 @@ -/* -** 2006 July 10 -** -** The author disclaims copyright to this source code. -** -************************************************************************* -** Defines the interface to tokenizers used by fulltext-search. There -** are three basic components: -** -** sqlite3_tokenizer_module is a singleton defining the tokenizer -** interface functions. This is essentially the class structure for -** tokenizers. -** -** sqlite3_tokenizer is used to define a particular tokenizer, perhaps -** including customization information defined at creation time. -** -** sqlite3_tokenizer_cursor is generated by a tokenizer to generate -** tokens from a particular input. -*/ -#ifndef _FTS2_TOKENIZER_H_ -#define _FTS2_TOKENIZER_H_ - -/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. -** If tokenizers are to be allowed to call sqlite3_*() functions, then -** we will need a way to register the API consistently. -*/ -#include "sqlite3.h" - -/* -** Structures used by the tokenizer interface. When a new tokenizer -** implementation is registered, the caller provides a pointer to -** an sqlite3_tokenizer_module containing pointers to the callback -** functions that make up an implementation. -** -** When an fts2 table is created, it passes any arguments passed to -** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the -** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer -** implementation. The xCreate() function in turn returns an -** sqlite3_tokenizer structure representing the specific tokenizer to -** be used for the fts2 table (customized by the tokenizer clause arguments). -** -** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() -** method is called. It returns an sqlite3_tokenizer_cursor object -** that may be used to tokenize a specific input buffer based on -** the tokenization rules supplied by a specific sqlite3_tokenizer -** object. -*/ -typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; -typedef struct sqlite3_tokenizer sqlite3_tokenizer; -typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; - -struct sqlite3_tokenizer_module { - - /* - ** Structure version. Should always be set to 0. - */ - int iVersion; - - /* - ** Create a new tokenizer. The values in the argv[] array are the - ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL - ** TABLE statement that created the fts2 table. For example, if - ** the following SQL is executed: - ** - ** CREATE .. USING fts2( ... , tokenizer arg1 arg2) - ** - ** then argc is set to 2, and the argv[] array contains pointers - ** to the strings "arg1" and "arg2". - ** - ** This method should return either SQLITE_OK (0), or an SQLite error - ** code. If SQLITE_OK is returned, then *ppTokenizer should be set - ** to point at the newly created tokenizer structure. The generic - ** sqlite3_tokenizer.pModule variable should not be initialised by - ** this callback. The caller will do so. - */ - int (*xCreate)( - int argc, /* Size of argv array */ - const char *const*argv, /* Tokenizer argument strings */ - sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ - ); - - /* - ** Destroy an existing tokenizer. The fts2 module calls this method - ** exactly once for each successful call to xCreate(). - */ - int (*xDestroy)(sqlite3_tokenizer *pTokenizer); - - /* - ** Create a tokenizer cursor to tokenize an input buffer. The caller - ** is responsible for ensuring that the input buffer remains valid - ** until the cursor is closed (using the xClose() method). - */ - int (*xOpen)( - sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ - const char *pInput, int nBytes, /* Input buffer */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ - ); - - /* - ** Destroy an existing tokenizer cursor. The fts2 module calls this - ** method exactly once for each successful call to xOpen(). - */ - int (*xClose)(sqlite3_tokenizer_cursor *pCursor); - - /* - ** Retrieve the next token from the tokenizer cursor pCursor. This - ** method should either return SQLITE_OK and set the values of the - ** "OUT" variables identified below, or SQLITE_DONE to indicate that - ** the end of the buffer has been reached, or an SQLite error code. - ** - ** *ppToken should be set to point at a buffer containing the - ** normalized version of the token (i.e. after any case-folding and/or - ** stemming has been performed). *pnBytes should be set to the length - ** of this buffer in bytes. The input text that generated the token is - ** identified by the byte offsets returned in *piStartOffset and - ** *piEndOffset. - ** - ** The buffer *ppToken is set to point at is managed by the tokenizer - ** implementation. It is only required to be valid until the next call - ** to xNext() or xClose(). - */ - /* TODO(shess) current implementation requires pInput to be - ** nul-terminated. This should either be fixed, or pInput/nBytes - ** should be converted to zInput. - */ - int (*xNext)( - sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ - const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ - int *piStartOffset, /* OUT: Byte offset of token in input buffer */ - int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ - int *piPosition /* OUT: Number of tokens returned before this one */ - ); -}; - -struct sqlite3_tokenizer { - const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ - /* Tokenizer implementations will typically add additional fields */ -}; - -struct sqlite3_tokenizer_cursor { - sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ - /* Tokenizer implementations will typically add additional fields */ -}; - -#endif /* _FTS2_TOKENIZER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c deleted file mode 100644 index 540ba27def..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/fts2_tokenizer1.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** 2006 Oct 10 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** Implementation of the "simple" full-text-search tokenizer. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS2 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS2 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS2 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) - - -#include -#include -#include -#include -#include - -#include "fts2_tokenizer.h" - -typedef struct simple_tokenizer { - sqlite3_tokenizer base; - char delim[128]; /* flag ASCII delimiters */ -} simple_tokenizer; - -typedef struct simple_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *pInput; /* input we are tokenizing */ - int nBytes; /* size of the input */ - int iOffset; /* current position in pInput */ - int iToken; /* index of next token to be returned */ - char *pToken; /* storage for current token */ - int nTokenAllocated; /* space allocated to zToken buffer */ -} simple_tokenizer_cursor; - - -/* Forward declaration */ -static const sqlite3_tokenizer_module simpleTokenizerModule; - -static int simpleDelim(simple_tokenizer *t, unsigned char c){ - return c<0x80 && t->delim[c]; -} - -/* -** Create a new tokenizer instance. -*/ -static int simpleCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - simple_tokenizer *t; - - t = (simple_tokenizer *) calloc(sizeof(*t), 1); - if( t==NULL ) return SQLITE_NOMEM; - - /* TODO(shess) Delimiters need to remain the same from run to run, - ** else we need to reindex. One solution would be a meta-table to - ** track such information in the database, then we'd only want this - ** information on the initial create. - */ - if( argc>1 ){ - int i, n = strlen(argv[1]); - for(i=0; i=0x80 ){ - free(t); - return SQLITE_ERROR; - } - t->delim[ch] = 1; - } - } else { - /* Mark non-alphanumeric ASCII characters as delimiters */ - int i; - for(i=1; i<0x80; i++){ - t->delim[i] = !isalnum(i); - } - } - - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ - free(pTokenizer); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int simpleOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *pInput, int nBytes, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - simple_tokenizer_cursor *c; - - c = (simple_tokenizer_cursor *) malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; - - c->pInput = pInput; - if( pInput==0 ){ - c->nBytes = 0; - }else if( nBytes<0 ){ - c->nBytes = (int)strlen(pInput); - }else{ - c->nBytes = nBytes; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->pToken = NULL; /* no space allocated, yet. */ - c->nTokenAllocated = 0; - - *ppCursor = &c->base; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to -** simpleOpen() above. -*/ -static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - free(c->pToken); - free(c); - return SQLITE_OK; -} - -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to simpleOpen(). -*/ -static int simpleNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ - const char **ppToken, /* OUT: *ppToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; - unsigned char *p = (unsigned char *)c->pInput; - - while( c->iOffsetnBytes ){ - int iStartOffset; - - /* Scan past delimiter characters */ - while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } - - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } - - if( c->iOffset>iStartOffset ){ - int i, n = c->iOffset-iStartOffset; - if( n>c->nTokenAllocated ){ - c->nTokenAllocated = n+20; - c->pToken = realloc(c->pToken, c->nTokenAllocated); - if( c->pToken==NULL ) return SQLITE_NOMEM; - } - for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; - } - *ppToken = c->pToken; - *pnBytes = n; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - - return SQLITE_OK; - } - } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the simple tokenizer -*/ -static const sqlite3_tokenizer_module simpleTokenizerModule = { - 0, - simpleCreate, - simpleDestroy, - simpleOpen, - simpleClose, - simpleNext, -}; - -/* -** Allocate a new simple tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -void sqlite3Fts2SimpleTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &simpleTokenizerModule; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS2) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl deleted file mode 100644 index 5c8d1e93d7..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts2/mkfts2amal.tcl +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/tclsh -# -# This script builds a single C code file holding all of FTS2 code. -# The name of the output file is fts2amal.c. To build this file, -# first do: -# -# make target_source -# -# The make target above moves all of the source code files into -# a subdirectory named "tsrc". (This script expects to find the files -# there and will not work if they are not found.) -# -# After the "tsrc" directory has been created and populated, run -# this script: -# -# tclsh mkfts2amal.tcl -# -# The amalgamated FTS2 code will be written into fts2amal.c -# - -# Open the output file and write a header comment at the beginning -# of the file. -# -set out [open fts2amal.c w] -set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] -puts $out [subst \ -{/****************************************************************************** -** This file is an amalgamation of separate C source files from the SQLite -** Full Text Search extension 2 (fts2). By combining all the individual C -** code files into this single large file, the entire code can be compiled -** as a one translation unit. This allows many compilers to do optimizations -** that would not be possible if the files were compiled separately. It also -** makes the code easier to import into other projects. -** -** This amalgamation was generated on $today. -*/}] - -# These are the header files used by FTS2. The first time any of these -# files are seen in a #include statement in the C code, include the complete -# text of the file in-line. The file only needs to be included once. -# -foreach hdr { - fts2.h - fts2_hash.h - fts2_tokenizer.h - sqlite3.h - sqlite3ext.h -} { - set available_hdr($hdr) 1 -} - -# 78 stars used for comment formatting. -set s78 \ -{*****************************************************************************} - -# Insert a comment into the code -# -proc section_comment {text} { - global out s78 - set n [string length $text] - set nstar [expr {60 - $n}] - set stars [string range $s78 0 $nstar] - puts $out "/************** $text $stars/" -} - -# Read the source file named $filename and write it into the -# sqlite3.c output file. If any #include statements are seen, -# process them approprately. -# -proc copy_file {filename} { - global seen_hdr available_hdr out - set tail [file tail $filename] - section_comment "Begin file $tail" - set in [open $filename r] - while {![eof $in]} { - set line [gets $in] - if {[regexp {^#\s*include\s+["<]([^">]+)[">]} $line all hdr]} { - if {[info exists available_hdr($hdr)]} { - if {$available_hdr($hdr)} { - section_comment "Include $hdr in the middle of $tail" - copy_file tsrc/$hdr - section_comment "Continuing where we left off in $tail" - } - } elseif {![info exists seen_hdr($hdr)]} { - set seen_hdr($hdr) 1 - puts $out $line - } - } elseif {[regexp {^#ifdef __cplusplus} $line]} { - puts $out "#if 0" - } elseif {[regexp {^#line} $line]} { - # Skip #line directives. - } else { - puts $out $line - } - } - close $in - section_comment "End of $tail" -} - - -# Process the source files. Process files containing commonly -# used subroutines first in order to help the compiler find -# inlining opportunities. -# -foreach file { - fts2.c - fts2_hash.c - fts2_porter.c - fts2_tokenizer.c - fts2_tokenizer1.c - fts2_icu.c -} { - copy_file tsrc/$file -} - -close $out diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers deleted file mode 100644 index f214b24552..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.tokenizers +++ /dev/null @@ -1,134 +0,0 @@ - -1. FTS3 Tokenizers - - When creating a new full-text table, FTS3 allows the user to select - the text tokenizer implementation to be used when indexing text - by specifying a "tokenizer" clause as part of the CREATE VIRTUAL TABLE - statement: - - CREATE VIRTUAL TABLE USING fts3( - [, tokenizer []] - ); - - The built-in tokenizers (valid values to pass as ) are - "simple" and "porter". - - should consist of zero or more white-space separated - arguments to pass to the selected tokenizer implementation. The - interpretation of the arguments, if any, depends on the individual - tokenizer. - -2. Custom Tokenizers - - FTS3 allows users to provide custom tokenizer implementations. The - interface used to create a new tokenizer is defined and described in - the fts3_tokenizer.h source file. - - Registering a new FTS3 tokenizer is similar to registering a new - virtual table module with SQLite. The user passes a pointer to a - structure containing pointers to various callback functions that - make up the implementation of the new tokenizer type. For tokenizers, - the structure (defined in fts3_tokenizer.h) is called - "sqlite3_tokenizer_module". - - FTS3 does not expose a C-function that users call to register new - tokenizer types with a database handle. Instead, the pointer must - be encoded as an SQL blob value and passed to FTS3 through the SQL - engine by evaluating a special scalar function, "fts3_tokenizer()". - The fts3_tokenizer() function may be called with one or two arguments, - as follows: - - SELECT fts3_tokenizer(); - SELECT fts3_tokenizer(, ); - - Where is a string identifying the tokenizer and - is a pointer to an sqlite3_tokenizer_module - structure encoded as an SQL blob. If the second argument is present, - it is registered as tokenizer and a copy of it - returned. If only one argument is passed, a pointer to the tokenizer - implementation currently registered as is returned, - encoded as a blob. Or, if no such tokenizer exists, an SQL exception - (error) is raised. - - SECURITY: If the fts3 extension is used in an environment where potentially - malicious users may execute arbitrary SQL (i.e. gears), they should be - prevented from invoking the fts3_tokenizer() function, possibly using the - authorisation callback. - - See "Sample code" below for an example of calling the fts3_tokenizer() - function from C code. - -3. ICU Library Tokenizers - - If this extension is compiled with the SQLITE_ENABLE_ICU pre-processor - symbol defined, then there exists a built-in tokenizer named "icu" - implemented using the ICU library. The first argument passed to the - xCreate() method (see fts3_tokenizer.h) of this tokenizer may be - an ICU locale identifier. For example "tr_TR" for Turkish as used - in Turkey, or "en_AU" for English as used in Australia. For example: - - "CREATE VIRTUAL TABLE thai_text USING fts3(text, tokenizer icu th_TH)" - - The ICU tokenizer implementation is very simple. It splits the input - text according to the ICU rules for finding word boundaries and discards - any tokens that consist entirely of white-space. This may be suitable - for some applications in some locales, but not all. If more complex - processing is required, for example to implement stemming or - discard punctuation, this can be done by creating a tokenizer - implementation that uses the ICU tokenizer as part of it's implementation. - - When using the ICU tokenizer this way, it is safe to overwrite the - contents of the strings returned by the xNext() method (see - fts3_tokenizer.h). - -4. Sample code. - - The following two code samples illustrate the way C code should invoke - the fts3_tokenizer() scalar function: - - int registerTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module *p - ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; - - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); - sqlite3_step(pStmt); - - return sqlite3_finalize(pStmt); - } - - int queryTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module **pp - ){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?)"; - - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); - } - } - - return sqlite3_finalize(pStmt); - } - diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt deleted file mode 100644 index 517a2a0434..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -This folder contains source code to the second full-text search -extension for SQLite. While the API is the same, this version uses a -substantially different storage schema from fts1, so tables will need -to be rebuilt. diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c deleted file mode 100644 index b39291975a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.c +++ /dev/null @@ -1,5971 +0,0 @@ -/* -** 2006 Oct 10 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This is an SQLite module implementing full-text search. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). -*/ - -/* TODO(shess) Consider exporting this comment to an HTML file or the -** wiki. -*/ -/* The full-text index is stored in a series of b+tree (-like) -** structures called segments which map terms to doclists. The -** structures are like b+trees in layout, but are constructed from the -** bottom up in optimal fashion and are not updatable. Since trees -** are built from the bottom up, things will be described from the -** bottom up. -** -** -**** Varints **** -** The basic unit of encoding is a variable-length integer called a -** varint. We encode variable-length integers in little-endian order -** using seven bits * per byte as follows: -** -** KEY: -** A = 0xxxxxxx 7 bits of data and one flag bit -** B = 1xxxxxxx 7 bits of data and one flag bit -** -** 7 bits - A -** 14 bits - BA -** 21 bits - BBA -** and so on. -** -** This is identical to how sqlite encodes varints (see util.c). -** -** -**** Document lists **** -** A doclist (document list) holds a docid-sorted list of hits for a -** given term. Doclists hold docids, and can optionally associate -** token positions and offsets with docids. -** -** A DL_POSITIONS_OFFSETS doclist is stored like this: -** -** array { -** varint docid; -** array { (position list for column 0) -** varint position; (delta from previous position plus POS_BASE) -** varint startOffset; (delta from previous startOffset) -** varint endOffset; (delta from startOffset) -** } -** array { -** varint POS_COLUMN; (marks start of position list for new column) -** varint column; (index of new column) -** array { -** varint position; (delta from previous position plus POS_BASE) -** varint startOffset;(delta from previous startOffset) -** varint endOffset; (delta from startOffset) -** } -** } -** varint POS_END; (marks end of positions for this document. -** } -** -** Here, array { X } means zero or more occurrences of X, adjacent in -** memory. A "position" is an index of a token in the token stream -** generated by the tokenizer, while an "offset" is a byte offset, -** both based at 0. Note that POS_END and POS_COLUMN occur in the -** same logical place as the position element, and act as sentinals -** ending a position list array. -** -** A DL_POSITIONS doclist omits the startOffset and endOffset -** information. A DL_DOCIDS doclist omits both the position and -** offset information, becoming an array of varint-encoded docids. -** -** On-disk data is stored as type DL_DEFAULT, so we don't serialize -** the type. Due to how deletion is implemented in the segmentation -** system, on-disk doclists MUST store at least positions. -** -** -**** Segment leaf nodes **** -** Segment leaf nodes store terms and doclists, ordered by term. Leaf -** nodes are written using LeafWriter, and read using LeafReader (to -** iterate through a single leaf node's data) and LeavesReader (to -** iterate through a segment's entire leaf layer). Leaf nodes have -** the format: -** -** varint iHeight; (height from leaf level, always 0) -** varint nTerm; (length of first term) -** char pTerm[nTerm]; (content of first term) -** varint nDoclist; (length of term's associated doclist) -** char pDoclist[nDoclist]; (content of doclist) -** array { -** (further terms are delta-encoded) -** varint nPrefix; (length of prefix shared with previous term) -** varint nSuffix; (length of unshared suffix) -** char pTermSuffix[nSuffix];(unshared suffix of next term) -** varint nDoclist; (length of term's associated doclist) -** char pDoclist[nDoclist]; (content of doclist) -** } -** -** Here, array { X } means zero or more occurrences of X, adjacent in -** memory. -** -** Leaf nodes are broken into blocks which are stored contiguously in -** the %_segments table in sorted order. This means that when the end -** of a node is reached, the next term is in the node with the next -** greater node id. -** -** New data is spilled to a new leaf node when the current node -** exceeds LEAF_MAX bytes (default 2048). New data which itself is -** larger than STANDALONE_MIN (default 1024) is placed in a standalone -** node (a leaf node with a single term and doclist). The goal of -** these settings is to pack together groups of small doclists while -** making it efficient to directly access large doclists. The -** assumption is that large doclists represent terms which are more -** likely to be query targets. -** -** TODO(shess) It may be useful for blocking decisions to be more -** dynamic. For instance, it may make more sense to have a 2.5k leaf -** node rather than splitting into 2k and .5k nodes. My intuition is -** that this might extend through 2x or 4x the pagesize. -** -** -**** Segment interior nodes **** -** Segment interior nodes store blockids for subtree nodes and terms -** to describe what data is stored by the each subtree. Interior -** nodes are written using InteriorWriter, and read using -** InteriorReader. InteriorWriters are created as needed when -** SegmentWriter creates new leaf nodes, or when an interior node -** itself grows too big and must be split. The format of interior -** nodes: -** -** varint iHeight; (height from leaf level, always >0) -** varint iBlockid; (block id of node's leftmost subtree) -** optional { -** varint nTerm; (length of first term) -** char pTerm[nTerm]; (content of first term) -** array { -** (further terms are delta-encoded) -** varint nPrefix; (length of shared prefix with previous term) -** varint nSuffix; (length of unshared suffix) -** char pTermSuffix[nSuffix]; (unshared suffix of next term) -** } -** } -** -** Here, optional { X } means an optional element, while array { X } -** means zero or more occurrences of X, adjacent in memory. -** -** An interior node encodes n terms separating n+1 subtrees. The -** subtree blocks are contiguous, so only the first subtree's blockid -** is encoded. The subtree at iBlockid will contain all terms less -** than the first term encoded (or all terms if no term is encoded). -** Otherwise, for terms greater than or equal to pTerm[i] but less -** than pTerm[i+1], the subtree for that term will be rooted at -** iBlockid+i. Interior nodes only store enough term data to -** distinguish adjacent children (if the rightmost term of the left -** child is "something", and the leftmost term of the right child is -** "wicked", only "w" is stored). -** -** New data is spilled to a new interior node at the same height when -** the current node exceeds INTERIOR_MAX bytes (default 2048). -** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing -** interior nodes and making the tree too skinny. The interior nodes -** at a given height are naturally tracked by interior nodes at -** height+1, and so on. -** -** -**** Segment directory **** -** The segment directory in table %_segdir stores meta-information for -** merging and deleting segments, and also the root node of the -** segment's tree. -** -** The root node is the top node of the segment's tree after encoding -** the entire segment, restricted to ROOT_MAX bytes (default 1024). -** This could be either a leaf node or an interior node. If the top -** node requires more than ROOT_MAX bytes, it is flushed to %_segments -** and a new root interior node is generated (which should always fit -** within ROOT_MAX because it only needs space for 2 varints, the -** height and the blockid of the previous root). -** -** The meta-information in the segment directory is: -** level - segment level (see below) -** idx - index within level -** - (level,idx uniquely identify a segment) -** start_block - first leaf node -** leaves_end_block - last leaf node -** end_block - last block (including interior nodes) -** root - contents of root node -** -** If the root node is a leaf node, then start_block, -** leaves_end_block, and end_block are all 0. -** -** -**** Segment merging **** -** To amortize update costs, segments are groups into levels and -** merged in matches. Each increase in level represents exponentially -** more documents. -** -** New documents (actually, document updates) are tokenized and -** written individually (using LeafWriter) to a level 0 segment, with -** incrementing idx. When idx reaches MERGE_COUNT (default 16), all -** level 0 segments are merged into a single level 1 segment. Level 1 -** is populated like level 0, and eventually MERGE_COUNT level 1 -** segments are merged to a single level 2 segment (representing -** MERGE_COUNT^2 updates), and so on. -** -** A segment merge traverses all segments at a given level in -** parallel, performing a straightforward sorted merge. Since segment -** leaf nodes are written in to the %_segments table in order, this -** merge traverses the underlying sqlite disk structures efficiently. -** After the merge, all segment blocks from the merged level are -** deleted. -** -** MERGE_COUNT controls how often we merge segments. 16 seems to be -** somewhat of a sweet spot for insertion performance. 32 and 64 show -** very similar performance numbers to 16 on insertion, though they're -** a tiny bit slower (perhaps due to more overhead in merge-time -** sorting). 8 is about 20% slower than 16, 4 about 50% slower than -** 16, 2 about 66% slower than 16. -** -** At query time, high MERGE_COUNT increases the number of segments -** which need to be scanned and merged. For instance, with 100k docs -** inserted: -** -** MERGE_COUNT segments -** 16 25 -** 8 12 -** 4 10 -** 2 6 -** -** This appears to have only a moderate impact on queries for very -** frequent terms (which are somewhat dominated by segment merge -** costs), and infrequent and non-existent terms still seem to be fast -** even with many segments. -** -** TODO(shess) That said, it would be nice to have a better query-side -** argument for MERGE_COUNT of 16. Also, it's possible/likely that -** optimizations to things like doclist merging will swing the sweet -** spot around. -** -** -** -**** Handling of deletions and updates **** -** Since we're using a segmented structure, with no docid-oriented -** index into the term index, we clearly cannot simply update the term -** index when a document is deleted or updated. For deletions, we -** write an empty doclist (varint(docid) varint(POS_END)), for updates -** we simply write the new doclist. Segment merges overwrite older -** data for a particular docid with newer data, so deletes or updates -** will eventually overtake the earlier data and knock it out. The -** query logic likewise merges doclists so that newer data knocks out -** older data. -** -** TODO(shess) Provide a VACUUM type operation to clear out all -** deletions and duplications. This would basically be a forced merge -** into a single segment. -*/ - -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - -#if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE) -# define SQLITE_CORE 1 -#endif - -#include -#include -#include -#include -#include - -#include "fts3.h" -#include "fts3_hash.h" -#include "fts3_tokenizer.h" -#include "sqlite3.h" -#include "sqlite3ext.h" -SQLITE_EXTENSION_INIT1 - - -/* TODO(shess) MAN, this thing needs some refactoring. At minimum, it -** would be nice to order the file better, perhaps something along the -** lines of: -** -** - utility functions -** - table setup functions -** - table update functions -** - table query functions -** -** Put the query functions last because they're likely to reference -** typedefs or functions from the table update section. -*/ - -#if 0 -# define TRACE(A) printf A; fflush(stdout) -#else -# define TRACE(A) -#endif - -/* It is not safe to call isspace(), tolower(), or isalnum() on -** hi-bit-set characters. This is the same solution used in the -** tokenizer. -*/ -/* TODO(shess) The snippet-generation code should be using the -** tokenizer-generated tokens rather than doing its own local -** tokenization. -*/ -/* TODO(shess) Is __isascii() a portable version of (c&0x80)==0? */ -static int safe_isspace(char c){ - return (c&0x80)==0 ? isspace(c) : 0; -} -static int safe_tolower(char c){ - return (c&0x80)==0 ? tolower(c) : c; -} -static int safe_isalnum(char c){ - return (c&0x80)==0 ? isalnum(c) : 0; -} - -typedef enum DocListType { - DL_DOCIDS, /* docids only */ - DL_POSITIONS, /* docids + positions */ - DL_POSITIONS_OFFSETS /* docids + positions + offsets */ -} DocListType; - -/* -** By default, only positions and not offsets are stored in the doclists. -** To change this so that offsets are stored too, compile with -** -** -DDL_DEFAULT=DL_POSITIONS_OFFSETS -** -** If DL_DEFAULT is set to DL_DOCIDS, your table can only be inserted -** into (no deletes or updates). -*/ -#ifndef DL_DEFAULT -# define DL_DEFAULT DL_POSITIONS -#endif - -enum { - POS_END = 0, /* end of this position list */ - POS_COLUMN, /* followed by new column number */ - POS_BASE -}; - -/* MERGE_COUNT controls how often we merge segments (see comment at -** top of file). -*/ -#define MERGE_COUNT 16 - -/* utility functions */ - -/* CLEAR() and SCRAMBLE() abstract memset() on a pointer to a single -** record to prevent errors of the form: -** -** my_function(SomeType *b){ -** memset(b, '\0', sizeof(b)); // sizeof(b)!=sizeof(*b) -** } -*/ -/* TODO(shess) Obvious candidates for a header file. */ -#define CLEAR(b) memset(b, '\0', sizeof(*(b))) - -#ifndef NDEBUG -# define SCRAMBLE(b) memset(b, 0x55, sizeof(*(b))) -#else -# define SCRAMBLE(b) -#endif - -/* We may need up to VARINT_MAX bytes to store an encoded 64-bit integer. */ -#define VARINT_MAX 10 - -/* Write a 64-bit variable-length integer to memory starting at p[0]. - * The length of data written will be between 1 and VARINT_MAX bytes. - * The number of bytes written is returned. */ -static int putVarint(char *p, sqlite_int64 v){ - unsigned char *q = (unsigned char *) p; - sqlite_uint64 vu = v; - do{ - *q++ = (unsigned char) ((vu & 0x7f) | 0x80); - vu >>= 7; - }while( vu!=0 ); - q[-1] &= 0x7f; /* turn off high bit in final byte */ - assert( q - (unsigned char *)p <= VARINT_MAX ); - return (int) (q - (unsigned char *)p); -} - -/* Read a 64-bit variable-length integer from memory starting at p[0]. - * Return the number of bytes read, or 0 on error. - * The value is stored in *v. */ -static int getVarint(const char *p, sqlite_int64 *v){ - const unsigned char *q = (const unsigned char *) p; - sqlite_uint64 x = 0, y = 1; - while( (*q & 0x80) == 0x80 ){ - x += y * (*q++ & 0x7f); - y <<= 7; - if( q - (unsigned char *)p >= VARINT_MAX ){ /* bad data */ - assert( 0 ); - return 0; - } - } - x += y * (*q++); - *v = (sqlite_int64) x; - return (int) (q - (unsigned char *)p); -} - -static int getVarint32(const char *p, int *pi){ - sqlite_int64 i; - int ret = getVarint(p, &i); - *pi = (int) i; - assert( *pi==i ); - return ret; -} - -/*******************************************************************/ -/* DataBuffer is used to collect data into a buffer in piecemeal -** fashion. It implements the usual distinction between amount of -** data currently stored (nData) and buffer capacity (nCapacity). -** -** dataBufferInit - create a buffer with given initial capacity. -** dataBufferReset - forget buffer's data, retaining capacity. -** dataBufferDestroy - free buffer's data. -** dataBufferExpand - expand capacity without adding data. -** dataBufferAppend - append data. -** dataBufferAppend2 - append two pieces of data at once. -** dataBufferReplace - replace buffer's data. -*/ -typedef struct DataBuffer { - char *pData; /* Pointer to malloc'ed buffer. */ - int nCapacity; /* Size of pData buffer. */ - int nData; /* End of data loaded into pData. */ -} DataBuffer; - -static void dataBufferInit(DataBuffer *pBuffer, int nCapacity){ - assert( nCapacity>=0 ); - pBuffer->nData = 0; - pBuffer->nCapacity = nCapacity; - pBuffer->pData = nCapacity==0 ? NULL : malloc(nCapacity); -} -static void dataBufferReset(DataBuffer *pBuffer){ - pBuffer->nData = 0; -} -static void dataBufferDestroy(DataBuffer *pBuffer){ - if( pBuffer->pData!=NULL ) free(pBuffer->pData); - SCRAMBLE(pBuffer); -} -static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){ - assert( nAddCapacity>0 ); - /* TODO(shess) Consider expanding more aggressively. Note that the - ** underlying malloc implementation may take care of such things for - ** us already. - */ - if( pBuffer->nData+nAddCapacity>pBuffer->nCapacity ){ - pBuffer->nCapacity = pBuffer->nData+nAddCapacity; - pBuffer->pData = realloc(pBuffer->pData, pBuffer->nCapacity); - } -} -static void dataBufferAppend(DataBuffer *pBuffer, - const char *pSource, int nSource){ - assert( nSource>0 && pSource!=NULL ); - dataBufferExpand(pBuffer, nSource); - memcpy(pBuffer->pData+pBuffer->nData, pSource, nSource); - pBuffer->nData += nSource; -} -static void dataBufferAppend2(DataBuffer *pBuffer, - const char *pSource1, int nSource1, - const char *pSource2, int nSource2){ - assert( nSource1>0 && pSource1!=NULL ); - assert( nSource2>0 && pSource2!=NULL ); - dataBufferExpand(pBuffer, nSource1+nSource2); - memcpy(pBuffer->pData+pBuffer->nData, pSource1, nSource1); - memcpy(pBuffer->pData+pBuffer->nData+nSource1, pSource2, nSource2); - pBuffer->nData += nSource1+nSource2; -} -static void dataBufferReplace(DataBuffer *pBuffer, - const char *pSource, int nSource){ - dataBufferReset(pBuffer); - dataBufferAppend(pBuffer, pSource, nSource); -} - -/* StringBuffer is a null-terminated version of DataBuffer. */ -typedef struct StringBuffer { - DataBuffer b; /* Includes null terminator. */ -} StringBuffer; - -static void initStringBuffer(StringBuffer *sb){ - dataBufferInit(&sb->b, 100); - dataBufferReplace(&sb->b, "", 1); -} -static int stringBufferLength(StringBuffer *sb){ - return sb->b.nData-1; -} -static char *stringBufferData(StringBuffer *sb){ - return sb->b.pData; -} -static void stringBufferDestroy(StringBuffer *sb){ - dataBufferDestroy(&sb->b); -} - -static void nappend(StringBuffer *sb, const char *zFrom, int nFrom){ - assert( sb->b.nData>0 ); - if( nFrom>0 ){ - sb->b.nData--; - dataBufferAppend2(&sb->b, zFrom, nFrom, "", 1); - } -} -static void append(StringBuffer *sb, const char *zFrom){ - nappend(sb, zFrom, strlen(zFrom)); -} - -/* Append a list of strings separated by commas. */ -static void appendList(StringBuffer *sb, int nString, char **azString){ - int i; - for(i=0; i0 ) append(sb, ", "); - append(sb, azString[i]); - } -} - -static int endsInWhiteSpace(StringBuffer *p){ - return stringBufferLength(p)>0 && - safe_isspace(stringBufferData(p)[stringBufferLength(p)-1]); -} - -/* If the StringBuffer ends in something other than white space, add a -** single space character to the end. -*/ -static void appendWhiteSpace(StringBuffer *p){ - if( stringBufferLength(p)==0 ) return; - if( !endsInWhiteSpace(p) ) append(p, " "); -} - -/* Remove white space from the end of the StringBuffer */ -static void trimWhiteSpace(StringBuffer *p){ - while( endsInWhiteSpace(p) ){ - p->b.pData[--p->b.nData-1] = '\0'; - } -} - -/*******************************************************************/ -/* DLReader is used to read document elements from a doclist. The -** current docid is cached, so dlrDocid() is fast. DLReader does not -** own the doclist buffer. -** -** dlrAtEnd - true if there's no more data to read. -** dlrDocid - docid of current document. -** dlrDocData - doclist data for current document (including docid). -** dlrDocDataBytes - length of same. -** dlrAllDataBytes - length of all remaining data. -** dlrPosData - position data for current document. -** dlrPosDataLen - length of pos data for current document (incl POS_END). -** dlrStep - step to current document. -** dlrInit - initial for doclist of given type against given data. -** dlrDestroy - clean up. -** -** Expected usage is something like: -** -** DLReader reader; -** dlrInit(&reader, pData, nData); -** while( !dlrAtEnd(&reader) ){ -** // calls to dlrDocid() and kin. -** dlrStep(&reader); -** } -** dlrDestroy(&reader); -*/ -typedef struct DLReader { - DocListType iType; - const char *pData; - int nData; - - sqlite_int64 iDocid; - int nElement; -} DLReader; - -static int dlrAtEnd(DLReader *pReader){ - assert( pReader->nData>=0 ); - return pReader->nData==0; -} -static sqlite_int64 dlrDocid(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->iDocid; -} -static const char *dlrDocData(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->pData; -} -static int dlrDocDataBytes(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->nElement; -} -static int dlrAllDataBytes(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - return pReader->nData; -} -/* TODO(shess) Consider adding a field to track iDocid varint length -** to make these two functions faster. This might matter (a tiny bit) -** for queries. -*/ -static const char *dlrPosData(DLReader *pReader){ - sqlite_int64 iDummy; - int n = getVarint(pReader->pData, &iDummy); - assert( !dlrAtEnd(pReader) ); - return pReader->pData+n; -} -static int dlrPosDataLen(DLReader *pReader){ - sqlite_int64 iDummy; - int n = getVarint(pReader->pData, &iDummy); - assert( !dlrAtEnd(pReader) ); - return pReader->nElement-n; -} -static void dlrStep(DLReader *pReader){ - assert( !dlrAtEnd(pReader) ); - - /* Skip past current doclist element. */ - assert( pReader->nElement<=pReader->nData ); - pReader->pData += pReader->nElement; - pReader->nData -= pReader->nElement; - - /* If there is more data, read the next doclist element. */ - if( pReader->nData!=0 ){ - sqlite_int64 iDocidDelta; - int iDummy, n = getVarint(pReader->pData, &iDocidDelta); - pReader->iDocid += iDocidDelta; - if( pReader->iType>=DL_POSITIONS ){ - assert( nnData ); - while( 1 ){ - n += getVarint32(pReader->pData+n, &iDummy); - assert( n<=pReader->nData ); - if( iDummy==POS_END ) break; - if( iDummy==POS_COLUMN ){ - n += getVarint32(pReader->pData+n, &iDummy); - assert( nnData ); - }else if( pReader->iType==DL_POSITIONS_OFFSETS ){ - n += getVarint32(pReader->pData+n, &iDummy); - n += getVarint32(pReader->pData+n, &iDummy); - assert( nnData ); - } - } - } - pReader->nElement = n; - assert( pReader->nElement<=pReader->nData ); - } -} -static void dlrInit(DLReader *pReader, DocListType iType, - const char *pData, int nData){ - assert( pData!=NULL && nData!=0 ); - pReader->iType = iType; - pReader->pData = pData; - pReader->nData = nData; - pReader->nElement = 0; - pReader->iDocid = 0; - - /* Load the first element's data. There must be a first element. */ - dlrStep(pReader); -} -static void dlrDestroy(DLReader *pReader){ - SCRAMBLE(pReader); -} - -#ifndef NDEBUG -/* Verify that the doclist can be validly decoded. Also returns the -** last docid found because it's convenient in other assertions for -** DLWriter. -*/ -static void docListValidate(DocListType iType, const char *pData, int nData, - sqlite_int64 *pLastDocid){ - sqlite_int64 iPrevDocid = 0; - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - while( nData!=0 ){ - sqlite_int64 iDocidDelta; - int n = getVarint(pData, &iDocidDelta); - iPrevDocid += iDocidDelta; - if( iType>DL_DOCIDS ){ - int iDummy; - while( 1 ){ - n += getVarint32(pData+n, &iDummy); - if( iDummy==POS_END ) break; - if( iDummy==POS_COLUMN ){ - n += getVarint32(pData+n, &iDummy); - }else if( iType>DL_POSITIONS ){ - n += getVarint32(pData+n, &iDummy); - n += getVarint32(pData+n, &iDummy); - } - assert( n<=nData ); - } - } - assert( n<=nData ); - pData += n; - nData -= n; - } - if( pLastDocid ) *pLastDocid = iPrevDocid; -} -#define ASSERT_VALID_DOCLIST(i, p, n, o) docListValidate(i, p, n, o) -#else -#define ASSERT_VALID_DOCLIST(i, p, n, o) assert( 1 ) -#endif - -/*******************************************************************/ -/* DLWriter is used to write doclist data to a DataBuffer. DLWriter -** always appends to the buffer and does not own it. -** -** dlwInit - initialize to write a given type doclistto a buffer. -** dlwDestroy - clear the writer's memory. Does not free buffer. -** dlwAppend - append raw doclist data to buffer. -** dlwCopy - copy next doclist from reader to writer. -** dlwAdd - construct doclist element and append to buffer. -** Only apply dlwAdd() to DL_DOCIDS doclists (else use PLWriter). -*/ -typedef struct DLWriter { - DocListType iType; - DataBuffer *b; - sqlite_int64 iPrevDocid; -#ifndef NDEBUG - int has_iPrevDocid; -#endif -} DLWriter; - -static void dlwInit(DLWriter *pWriter, DocListType iType, DataBuffer *b){ - pWriter->b = b; - pWriter->iType = iType; - pWriter->iPrevDocid = 0; -#ifndef NDEBUG - pWriter->has_iPrevDocid = 0; -#endif -} -static void dlwDestroy(DLWriter *pWriter){ - SCRAMBLE(pWriter); -} -/* iFirstDocid is the first docid in the doclist in pData. It is -** needed because pData may point within a larger doclist, in which -** case the first item would be delta-encoded. -** -** iLastDocid is the final docid in the doclist in pData. It is -** needed to create the new iPrevDocid for future delta-encoding. The -** code could decode the passed doclist to recreate iLastDocid, but -** the only current user (docListMerge) already has decoded this -** information. -*/ -/* TODO(shess) This has become just a helper for docListMerge. -** Consider a refactor to make this cleaner. -*/ -static void dlwAppend(DLWriter *pWriter, - const char *pData, int nData, - sqlite_int64 iFirstDocid, sqlite_int64 iLastDocid){ - sqlite_int64 iDocid = 0; - char c[VARINT_MAX]; - int nFirstOld, nFirstNew; /* Old and new varint len of first docid. */ -#ifndef NDEBUG - sqlite_int64 iLastDocidDelta; -#endif - - /* Recode the initial docid as delta from iPrevDocid. */ - nFirstOld = getVarint(pData, &iDocid); - assert( nFirstOldiType==DL_DOCIDS) ); - nFirstNew = putVarint(c, iFirstDocid-pWriter->iPrevDocid); - - /* Verify that the incoming doclist is valid AND that it ends with - ** the expected docid. This is essential because we'll trust this - ** docid in future delta-encoding. - */ - ASSERT_VALID_DOCLIST(pWriter->iType, pData, nData, &iLastDocidDelta); - assert( iLastDocid==iFirstDocid-iDocid+iLastDocidDelta ); - - /* Append recoded initial docid and everything else. Rest of docids - ** should have been delta-encoded from previous initial docid. - */ - if( nFirstOldb, c, nFirstNew, - pData+nFirstOld, nData-nFirstOld); - }else{ - dataBufferAppend(pWriter->b, c, nFirstNew); - } - pWriter->iPrevDocid = iLastDocid; -} -static void dlwCopy(DLWriter *pWriter, DLReader *pReader){ - dlwAppend(pWriter, dlrDocData(pReader), dlrDocDataBytes(pReader), - dlrDocid(pReader), dlrDocid(pReader)); -} -static void dlwAdd(DLWriter *pWriter, sqlite_int64 iDocid){ - char c[VARINT_MAX]; - int n = putVarint(c, iDocid-pWriter->iPrevDocid); - - /* Docids must ascend. */ - assert( !pWriter->has_iPrevDocid || iDocid>pWriter->iPrevDocid ); - assert( pWriter->iType==DL_DOCIDS ); - - dataBufferAppend(pWriter->b, c, n); - pWriter->iPrevDocid = iDocid; -#ifndef NDEBUG - pWriter->has_iPrevDocid = 1; -#endif -} - -/*******************************************************************/ -/* PLReader is used to read data from a document's position list. As -** the caller steps through the list, data is cached so that varints -** only need to be decoded once. -** -** plrInit, plrDestroy - create/destroy a reader. -** plrColumn, plrPosition, plrStartOffset, plrEndOffset - accessors -** plrAtEnd - at end of stream, only call plrDestroy once true. -** plrStep - step to the next element. -*/ -typedef struct PLReader { - /* These refer to the next position's data. nData will reach 0 when - ** reading the last position, so plrStep() signals EOF by setting - ** pData to NULL. - */ - const char *pData; - int nData; - - DocListType iType; - int iColumn; /* the last column read */ - int iPosition; /* the last position read */ - int iStartOffset; /* the last start offset read */ - int iEndOffset; /* the last end offset read */ -} PLReader; - -static int plrAtEnd(PLReader *pReader){ - return pReader->pData==NULL; -} -static int plrColumn(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iColumn; -} -static int plrPosition(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iPosition; -} -static int plrStartOffset(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iStartOffset; -} -static int plrEndOffset(PLReader *pReader){ - assert( !plrAtEnd(pReader) ); - return pReader->iEndOffset; -} -static void plrStep(PLReader *pReader){ - int i, n; - - assert( !plrAtEnd(pReader) ); - - if( pReader->nData==0 ){ - pReader->pData = NULL; - return; - } - - n = getVarint32(pReader->pData, &i); - if( i==POS_COLUMN ){ - n += getVarint32(pReader->pData+n, &pReader->iColumn); - pReader->iPosition = 0; - pReader->iStartOffset = 0; - n += getVarint32(pReader->pData+n, &i); - } - /* Should never see adjacent column changes. */ - assert( i!=POS_COLUMN ); - - if( i==POS_END ){ - pReader->nData = 0; - pReader->pData = NULL; - return; - } - - pReader->iPosition += i-POS_BASE; - if( pReader->iType==DL_POSITIONS_OFFSETS ){ - n += getVarint32(pReader->pData+n, &i); - pReader->iStartOffset += i; - n += getVarint32(pReader->pData+n, &i); - pReader->iEndOffset = pReader->iStartOffset+i; - } - assert( n<=pReader->nData ); - pReader->pData += n; - pReader->nData -= n; -} - -static void plrInit(PLReader *pReader, DLReader *pDLReader){ - pReader->pData = dlrPosData(pDLReader); - pReader->nData = dlrPosDataLen(pDLReader); - pReader->iType = pDLReader->iType; - pReader->iColumn = 0; - pReader->iPosition = 0; - pReader->iStartOffset = 0; - pReader->iEndOffset = 0; - plrStep(pReader); -} -static void plrDestroy(PLReader *pReader){ - SCRAMBLE(pReader); -} - -/*******************************************************************/ -/* PLWriter is used in constructing a document's position list. As a -** convenience, if iType is DL_DOCIDS, PLWriter becomes a no-op. -** PLWriter writes to the associated DLWriter's buffer. -** -** plwInit - init for writing a document's poslist. -** plwDestroy - clear a writer. -** plwAdd - append position and offset information. -** plwCopy - copy next position's data from reader to writer. -** plwTerminate - add any necessary doclist terminator. -** -** Calling plwAdd() after plwTerminate() may result in a corrupt -** doclist. -*/ -/* TODO(shess) Until we've written the second item, we can cache the -** first item's information. Then we'd have three states: -** -** - initialized with docid, no positions. -** - docid and one position. -** - docid and multiple positions. -** -** Only the last state needs to actually write to dlw->b, which would -** be an improvement in the DLCollector case. -*/ -typedef struct PLWriter { - DLWriter *dlw; - - int iColumn; /* the last column written */ - int iPos; /* the last position written */ - int iOffset; /* the last start offset written */ -} PLWriter; - -/* TODO(shess) In the case where the parent is reading these values -** from a PLReader, we could optimize to a copy if that PLReader has -** the same type as pWriter. -*/ -static void plwAdd(PLWriter *pWriter, int iColumn, int iPos, - int iStartOffset, int iEndOffset){ - /* Worst-case space for POS_COLUMN, iColumn, iPosDelta, - ** iStartOffsetDelta, and iEndOffsetDelta. - */ - char c[5*VARINT_MAX]; - int n = 0; - - /* Ban plwAdd() after plwTerminate(). */ - assert( pWriter->iPos!=-1 ); - - if( pWriter->dlw->iType==DL_DOCIDS ) return; - - if( iColumn!=pWriter->iColumn ){ - n += putVarint(c+n, POS_COLUMN); - n += putVarint(c+n, iColumn); - pWriter->iColumn = iColumn; - pWriter->iPos = 0; - pWriter->iOffset = 0; - } - assert( iPos>=pWriter->iPos ); - n += putVarint(c+n, POS_BASE+(iPos-pWriter->iPos)); - pWriter->iPos = iPos; - if( pWriter->dlw->iType==DL_POSITIONS_OFFSETS ){ - assert( iStartOffset>=pWriter->iOffset ); - n += putVarint(c+n, iStartOffset-pWriter->iOffset); - pWriter->iOffset = iStartOffset; - assert( iEndOffset>=iStartOffset ); - n += putVarint(c+n, iEndOffset-iStartOffset); - } - dataBufferAppend(pWriter->dlw->b, c, n); -} -static void plwCopy(PLWriter *pWriter, PLReader *pReader){ - plwAdd(pWriter, plrColumn(pReader), plrPosition(pReader), - plrStartOffset(pReader), plrEndOffset(pReader)); -} -static void plwInit(PLWriter *pWriter, DLWriter *dlw, sqlite_int64 iDocid){ - char c[VARINT_MAX]; - int n; - - pWriter->dlw = dlw; - - /* Docids must ascend. */ - assert( !pWriter->dlw->has_iPrevDocid || iDocid>pWriter->dlw->iPrevDocid ); - n = putVarint(c, iDocid-pWriter->dlw->iPrevDocid); - dataBufferAppend(pWriter->dlw->b, c, n); - pWriter->dlw->iPrevDocid = iDocid; -#ifndef NDEBUG - pWriter->dlw->has_iPrevDocid = 1; -#endif - - pWriter->iColumn = 0; - pWriter->iPos = 0; - pWriter->iOffset = 0; -} -/* TODO(shess) Should plwDestroy() also terminate the doclist? But -** then plwDestroy() would no longer be just a destructor, it would -** also be doing work, which isn't consistent with the overall idiom. -** Another option would be for plwAdd() to always append any necessary -** terminator, so that the output is always correct. But that would -** add incremental work to the common case with the only benefit being -** API elegance. Punt for now. -*/ -static void plwTerminate(PLWriter *pWriter){ - if( pWriter->dlw->iType>DL_DOCIDS ){ - char c[VARINT_MAX]; - int n = putVarint(c, POS_END); - dataBufferAppend(pWriter->dlw->b, c, n); - } -#ifndef NDEBUG - /* Mark as terminated for assert in plwAdd(). */ - pWriter->iPos = -1; -#endif -} -static void plwDestroy(PLWriter *pWriter){ - SCRAMBLE(pWriter); -} - -/*******************************************************************/ -/* DLCollector wraps PLWriter and DLWriter to provide a -** dynamically-allocated doclist area to use during tokenization. -** -** dlcNew - malloc up and initialize a collector. -** dlcDelete - destroy a collector and all contained items. -** dlcAddPos - append position and offset information. -** dlcAddDoclist - add the collected doclist to the given buffer. -** dlcNext - terminate the current document and open another. -*/ -typedef struct DLCollector { - DataBuffer b; - DLWriter dlw; - PLWriter plw; -} DLCollector; - -/* TODO(shess) This could also be done by calling plwTerminate() and -** dataBufferAppend(). I tried that, expecting nominal performance -** differences, but it seemed to pretty reliably be worth 1% to code -** it this way. I suspect it's the incremental malloc overhead (some -** percentage of the plwTerminate() calls will cause a realloc), so -** this might be worth revisiting if the DataBuffer implementation -** changes. -*/ -static void dlcAddDoclist(DLCollector *pCollector, DataBuffer *b){ - if( pCollector->dlw.iType>DL_DOCIDS ){ - char c[VARINT_MAX]; - int n = putVarint(c, POS_END); - dataBufferAppend2(b, pCollector->b.pData, pCollector->b.nData, c, n); - }else{ - dataBufferAppend(b, pCollector->b.pData, pCollector->b.nData); - } -} -static void dlcNext(DLCollector *pCollector, sqlite_int64 iDocid){ - plwTerminate(&pCollector->plw); - plwDestroy(&pCollector->plw); - plwInit(&pCollector->plw, &pCollector->dlw, iDocid); -} -static void dlcAddPos(DLCollector *pCollector, int iColumn, int iPos, - int iStartOffset, int iEndOffset){ - plwAdd(&pCollector->plw, iColumn, iPos, iStartOffset, iEndOffset); -} - -static DLCollector *dlcNew(sqlite_int64 iDocid, DocListType iType){ - DLCollector *pCollector = malloc(sizeof(DLCollector)); - dataBufferInit(&pCollector->b, 0); - dlwInit(&pCollector->dlw, iType, &pCollector->b); - plwInit(&pCollector->plw, &pCollector->dlw, iDocid); - return pCollector; -} -static void dlcDelete(DLCollector *pCollector){ - plwDestroy(&pCollector->plw); - dlwDestroy(&pCollector->dlw); - dataBufferDestroy(&pCollector->b); - SCRAMBLE(pCollector); - free(pCollector); -} - - -/* Copy the doclist data of iType in pData/nData into *out, trimming -** unnecessary data as we go. Only columns matching iColumn are -** copied, all columns copied if iColumn is -1. Elements with no -** matching columns are dropped. The output is an iOutType doclist. -*/ -/* NOTE(shess) This code is only valid after all doclists are merged. -** If this is run before merges, then doclist items which represent -** deletion will be trimmed, and will thus not effect a deletion -** during the merge. -*/ -static void docListTrim(DocListType iType, const char *pData, int nData, - int iColumn, DocListType iOutType, DataBuffer *out){ - DLReader dlReader; - DLWriter dlWriter; - - assert( iOutType<=iType ); - - dlrInit(&dlReader, iType, pData, nData); - dlwInit(&dlWriter, iOutType, out); - - while( !dlrAtEnd(&dlReader) ){ - PLReader plReader; - PLWriter plWriter; - int match = 0; - - plrInit(&plReader, &dlReader); - - while( !plrAtEnd(&plReader) ){ - if( iColumn==-1 || plrColumn(&plReader)==iColumn ){ - if( !match ){ - plwInit(&plWriter, &dlWriter, dlrDocid(&dlReader)); - match = 1; - } - plwAdd(&plWriter, plrColumn(&plReader), plrPosition(&plReader), - plrStartOffset(&plReader), plrEndOffset(&plReader)); - } - plrStep(&plReader); - } - if( match ){ - plwTerminate(&plWriter); - plwDestroy(&plWriter); - } - - plrDestroy(&plReader); - dlrStep(&dlReader); - } - dlwDestroy(&dlWriter); - dlrDestroy(&dlReader); -} - -/* Used by docListMerge() to keep doclists in the ascending order by -** docid, then ascending order by age (so the newest comes first). -*/ -typedef struct OrderedDLReader { - DLReader *pReader; - - /* TODO(shess) If we assume that docListMerge pReaders is ordered by - ** age (which we do), then we could use pReader comparisons to break - ** ties. - */ - int idx; -} OrderedDLReader; - -/* Order eof to end, then by docid asc, idx desc. */ -static int orderedDLReaderCmp(OrderedDLReader *r1, OrderedDLReader *r2){ - if( dlrAtEnd(r1->pReader) ){ - if( dlrAtEnd(r2->pReader) ) return 0; /* Both atEnd(). */ - return 1; /* Only r1 atEnd(). */ - } - if( dlrAtEnd(r2->pReader) ) return -1; /* Only r2 atEnd(). */ - - if( dlrDocid(r1->pReader)pReader) ) return -1; - if( dlrDocid(r1->pReader)>dlrDocid(r2->pReader) ) return 1; - - /* Descending on idx. */ - return r2->idx-r1->idx; -} - -/* Bubble p[0] to appropriate place in p[1..n-1]. Assumes that -** p[1..n-1] is already sorted. -*/ -/* TODO(shess) Is this frequent enough to warrant a binary search? -** Before implementing that, instrument the code to check. In most -** current usage, I expect that p[0] will be less than p[1] a very -** high proportion of the time. -*/ -static void orderedDLReaderReorder(OrderedDLReader *p, int n){ - while( n>1 && orderedDLReaderCmp(p, p+1)>0 ){ - OrderedDLReader tmp = p[0]; - p[0] = p[1]; - p[1] = tmp; - n--; - p++; - } -} - -/* Given an array of doclist readers, merge their doclist elements -** into out in sorted order (by docid), dropping elements from older -** readers when there is a duplicate docid. pReaders is assumed to be -** ordered by age, oldest first. -*/ -/* TODO(shess) nReaders must be <= MERGE_COUNT. This should probably -** be fixed. -*/ -static void docListMerge(DataBuffer *out, - DLReader *pReaders, int nReaders){ - OrderedDLReader readers[MERGE_COUNT]; - DLWriter writer; - int i, n; - const char *pStart = 0; - int nStart = 0; - sqlite_int64 iFirstDocid = 0, iLastDocid = 0; - - assert( nReaders>0 ); - if( nReaders==1 ){ - dataBufferAppend(out, dlrDocData(pReaders), dlrAllDataBytes(pReaders)); - return; - } - - assert( nReaders<=MERGE_COUNT ); - n = 0; - for(i=0; i0 ){ - orderedDLReaderReorder(readers+i, nReaders-i); - } - - dlwInit(&writer, pReaders[0].iType, out); - while( !dlrAtEnd(readers[0].pReader) ){ - sqlite_int64 iDocid = dlrDocid(readers[0].pReader); - - /* If this is a continuation of the current buffer to copy, extend - ** that buffer. memcpy() seems to be more efficient if it has a - ** lots of data to copy. - */ - if( dlrDocData(readers[0].pReader)==pStart+nStart ){ - nStart += dlrDocDataBytes(readers[0].pReader); - }else{ - if( pStart!=0 ){ - dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); - } - pStart = dlrDocData(readers[0].pReader); - nStart = dlrDocDataBytes(readers[0].pReader); - iFirstDocid = iDocid; - } - iLastDocid = iDocid; - dlrStep(readers[0].pReader); - - /* Drop all of the older elements with the same docid. */ - for(i=1; i0 ){ - orderedDLReaderReorder(readers+i, nReaders-i); - } - } - - /* Copy over any remaining elements. */ - if( nStart>0 ) dlwAppend(&writer, pStart, nStart, iFirstDocid, iLastDocid); - dlwDestroy(&writer); -} - -/* Helper function for posListUnion(). Compares the current position -** between left and right, returning as standard C idiom of <0 if -** left0 if left>right, and 0 if left==right. "End" always -** compares greater. -*/ -static int posListCmp(PLReader *pLeft, PLReader *pRight){ - assert( pLeft->iType==pRight->iType ); - if( pLeft->iType==DL_DOCIDS ) return 0; - - if( plrAtEnd(pLeft) ) return plrAtEnd(pRight) ? 0 : 1; - if( plrAtEnd(pRight) ) return -1; - - if( plrColumn(pLeft)plrColumn(pRight) ) return 1; - - if( plrPosition(pLeft)plrPosition(pRight) ) return 1; - if( pLeft->iType==DL_POSITIONS ) return 0; - - if( plrStartOffset(pLeft)plrStartOffset(pRight) ) return 1; - - if( plrEndOffset(pLeft)plrEndOffset(pRight) ) return 1; - - return 0; -} - -/* Write the union of position lists in pLeft and pRight to pOut. -** "Union" in this case meaning "All unique position tuples". Should -** work with any doclist type, though both inputs and the output -** should be the same type. -*/ -static void posListUnion(DLReader *pLeft, DLReader *pRight, DLWriter *pOut){ - PLReader left, right; - PLWriter writer; - - assert( dlrDocid(pLeft)==dlrDocid(pRight) ); - assert( pLeft->iType==pRight->iType ); - assert( pLeft->iType==pOut->iType ); - - plrInit(&left, pLeft); - plrInit(&right, pRight); - plwInit(&writer, pOut, dlrDocid(pLeft)); - - while( !plrAtEnd(&left) || !plrAtEnd(&right) ){ - int c = posListCmp(&left, &right); - if( c<0 ){ - plwCopy(&writer, &left); - plrStep(&left); - }else if( c>0 ){ - plwCopy(&writer, &right); - plrStep(&right); - }else{ - plwCopy(&writer, &left); - plrStep(&left); - plrStep(&right); - } - } - - plwTerminate(&writer); - plwDestroy(&writer); - plrDestroy(&left); - plrDestroy(&right); -} - -/* Write the union of doclists in pLeft and pRight to pOut. For -** docids in common between the inputs, the union of the position -** lists is written. Inputs and outputs are always type DL_DEFAULT. -*/ -static void docListUnion( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DataBuffer *pOut /* Write the combined doclist here */ -){ - DLReader left, right; - DLWriter writer; - - if( nLeft==0 ){ - dataBufferAppend(pOut, pRight, nRight); - return; - } - if( nRight==0 ){ - dataBufferAppend(pOut, pLeft, nLeft); - return; - } - - dlrInit(&left, DL_DEFAULT, pLeft, nLeft); - dlrInit(&right, DL_DEFAULT, pRight, nRight); - dlwInit(&writer, DL_DEFAULT, pOut); - - while( !dlrAtEnd(&left) || !dlrAtEnd(&right) ){ - if( dlrAtEnd(&right) ){ - dlwCopy(&writer, &left); - dlrStep(&left); - }else if( dlrAtEnd(&left) ){ - dlwCopy(&writer, &right); - dlrStep(&right); - }else if( dlrDocid(&left)dlrDocid(&right) ){ - dlwCopy(&writer, &right); - dlrStep(&right); - }else{ - posListUnion(&left, &right, &writer); - dlrStep(&left); - dlrStep(&right); - } - } - - dlrDestroy(&left); - dlrDestroy(&right); - dlwDestroy(&writer); -} - -/* pLeft and pRight are DLReaders positioned to the same docid. -** -** If there are no instances in pLeft or pRight where the position -** of pLeft is one less than the position of pRight, then this -** routine adds nothing to pOut. -** -** If there are one or more instances where positions from pLeft -** are exactly one less than positions from pRight, then add a new -** document record to pOut. If pOut wants to hold positions, then -** include the positions from pRight that are one more than a -** position in pLeft. In other words: pRight.iPos==pLeft.iPos+1. -*/ -static void posListPhraseMerge(DLReader *pLeft, DLReader *pRight, - DLWriter *pOut){ - PLReader left, right; - PLWriter writer; - int match = 0; - - assert( dlrDocid(pLeft)==dlrDocid(pRight) ); - assert( pOut->iType!=DL_POSITIONS_OFFSETS ); - - plrInit(&left, pLeft); - plrInit(&right, pRight); - - while( !plrAtEnd(&left) && !plrAtEnd(&right) ){ - if( plrColumn(&left)plrColumn(&right) ){ - plrStep(&right); - }else if( plrPosition(&left)+1plrPosition(&right) ){ - plrStep(&right); - }else{ - if( !match ){ - plwInit(&writer, pOut, dlrDocid(pLeft)); - match = 1; - } - plwAdd(&writer, plrColumn(&right), plrPosition(&right), 0, 0); - plrStep(&left); - plrStep(&right); - } - } - - if( match ){ - plwTerminate(&writer); - plwDestroy(&writer); - } - - plrDestroy(&left); - plrDestroy(&right); -} - -/* We have two doclists with positions: pLeft and pRight. -** Write the phrase intersection of these two doclists into pOut. -** -** A phrase intersection means that two documents only match -** if pLeft.iPos+1==pRight.iPos. -** -** iType controls the type of data written to pOut. If iType is -** DL_POSITIONS, the positions are those from pRight. -*/ -static void docListPhraseMerge( - const char *pLeft, int nLeft, - const char *pRight, int nRight, - DocListType iType, - DataBuffer *pOut /* Write the combined doclist here */ -){ - DLReader left, right; - DLWriter writer; - - if( nLeft==0 || nRight==0 ) return; - - assert( iType!=DL_POSITIONS_OFFSETS ); - - dlrInit(&left, DL_POSITIONS, pLeft, nLeft); - dlrInit(&right, DL_POSITIONS, pRight, nRight); - dlwInit(&writer, iType, pOut); - - while( !dlrAtEnd(&left) && !dlrAtEnd(&right) ){ - if( dlrDocid(&left) one AND (two OR three) - * [one OR two three] ==> (one OR two) AND three - * - * A "-" before a term matches all entries that lack that term. - * The "-" must occur immediately before the term with in intervening - * space. This is how the search engines do it. - * - * A NOT term cannot be the right-hand operand of an OR. If this - * occurs in the query string, the NOT is ignored: - * - * [one OR -two] ==> one OR two - * - */ -typedef struct Query { - fulltext_vtab *pFts; /* The full text index */ - int nTerms; /* Number of terms in the query */ - QueryTerm *pTerms; /* Array of terms. Space obtained from malloc() */ - int nextIsOr; /* Set the isOr flag on the next inserted term */ - int nextColumn; /* Next word parsed must be in this column */ - int dfltColumn; /* The default column */ -} Query; - - -/* -** An instance of the following structure keeps track of generated -** matching-word offset information and snippets. -*/ -typedef struct Snippet { - int nMatch; /* Total number of matches */ - int nAlloc; /* Space allocated for aMatch[] */ - struct snippetMatch { /* One entry for each matching term */ - char snStatus; /* Status flag for use while constructing snippets */ - short int iCol; /* The column that contains the match */ - short int iTerm; /* The index in Query.pTerms[] of the matching term */ - short int nByte; /* Number of bytes in the term */ - int iStart; /* The offset to the first character of the term */ - } *aMatch; /* Points to space obtained from malloc */ - char *zOffset; /* Text rendering of aMatch[] */ - int nOffset; /* strlen(zOffset) */ - char *zSnippet; /* Snippet text */ - int nSnippet; /* strlen(zSnippet) */ -} Snippet; - - -typedef enum QueryType { - QUERY_GENERIC, /* table scan */ - QUERY_DOCID, /* lookup by docid */ - QUERY_FULLTEXT /* QUERY_FULLTEXT + [i] is a full-text search for column i*/ -} QueryType; - -typedef enum fulltext_statement { - CONTENT_INSERT_STMT, - CONTENT_SELECT_STMT, - CONTENT_UPDATE_STMT, - CONTENT_DELETE_STMT, - - BLOCK_INSERT_STMT, - BLOCK_SELECT_STMT, - BLOCK_DELETE_STMT, - - SEGDIR_MAX_INDEX_STMT, - SEGDIR_SET_STMT, - SEGDIR_SELECT_STMT, - SEGDIR_SPAN_STMT, - SEGDIR_DELETE_STMT, - SEGDIR_SELECT_ALL_STMT, - - MAX_STMT /* Always at end! */ -} fulltext_statement; - -/* These must exactly match the enum above. */ -/* TODO(shess): Is there some risk that a statement will be used in two -** cursors at once, e.g. if a query joins a virtual table to itself? -** If so perhaps we should move some of these to the cursor object. -*/ -static const char *const fulltext_zStatement[MAX_STMT] = { - /* CONTENT_INSERT */ NULL, /* generated in contentInsertStatement() */ - /* CONTENT_SELECT */ NULL, /* generated in contentSelectStatement() */ - /* CONTENT_UPDATE */ NULL, /* generated in contentUpdateStatement() */ - /* CONTENT_DELETE */ "delete from %_content where docid = ?", - - /* BLOCK_INSERT */ - "insert into %_segments (blockid, block) values (null, ?)", - /* BLOCK_SELECT */ "select block from %_segments where blockid = ?", - /* BLOCK_DELETE */ "delete from %_segments where blockid between ? and ?", - - /* SEGDIR_MAX_INDEX */ "select max(idx) from %_segdir where level = ?", - /* SEGDIR_SET */ "insert into %_segdir values (?, ?, ?, ?, ?, ?)", - /* SEGDIR_SELECT */ - "select start_block, leaves_end_block, root from %_segdir " - " where level = ? order by idx", - /* SEGDIR_SPAN */ - "select min(start_block), max(end_block) from %_segdir " - " where level = ? and start_block <> 0", - /* SEGDIR_DELETE */ "delete from %_segdir where level = ?", - /* SEGDIR_SELECT_ALL */ - "select root, leaves_end_block from %_segdir order by level desc, idx", -}; - -/* -** A connection to a fulltext index is an instance of the following -** structure. The xCreate and xConnect methods create an instance -** of this structure and xDestroy and xDisconnect free that instance. -** All other methods receive a pointer to the structure as one of their -** arguments. -*/ -struct fulltext_vtab { - sqlite3_vtab base; /* Base class used by SQLite core */ - sqlite3 *db; /* The database connection */ - const char *zDb; /* logical database name */ - const char *zName; /* virtual table name */ - int nColumn; /* number of columns in virtual table */ - char **azColumn; /* column names. malloced */ - char **azContentColumn; /* column names in content table; malloced */ - sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */ - - /* Precompiled statements which we keep as long as the table is - ** open. - */ - sqlite3_stmt *pFulltextStatements[MAX_STMT]; - - /* Precompiled statements used for segment merges. We run a - ** separate select across the leaf level of each tree being merged. - */ - sqlite3_stmt *pLeafSelectStmts[MERGE_COUNT]; - /* The statement used to prepare pLeafSelectStmts. */ -#define LEAF_SELECT \ - "select block from %_segments where blockid between ? and ? order by blockid" - - /* These buffer pending index updates during transactions. - ** nPendingData estimates the memory size of the pending data. It - ** doesn't include the hash-bucket overhead, nor any malloc - ** overhead. When nPendingData exceeds kPendingThreshold, the - ** buffer is flushed even before the transaction closes. - ** pendingTerms stores the data, and is only valid when nPendingData - ** is >=0 (nPendingData<0 means pendingTerms has not been - ** initialized). iPrevDocid is the last docid written, used to make - ** certain we're inserting in sorted order. - */ - int nPendingData; -#define kPendingThreshold (1*1024*1024) - sqlite_int64 iPrevDocid; - fts3Hash pendingTerms; -}; - -/* -** When the core wants to do a query, it create a cursor using a -** call to xOpen. This structure is an instance of a cursor. It -** is destroyed by xClose. -*/ -typedef struct fulltext_cursor { - sqlite3_vtab_cursor base; /* Base class used by SQLite core */ - QueryType iCursorType; /* Copy of sqlite3_index_info.idxNum */ - sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ - int eof; /* True if at End Of Results */ - Query q; /* Parsed query string */ - Snippet snippet; /* Cached snippet for the current row */ - int iColumn; /* Column being searched */ - DataBuffer result; /* Doclist results from fulltextQuery */ - DLReader reader; /* Result reader if result not empty */ -} fulltext_cursor; - -static struct fulltext_vtab *cursor_vtab(fulltext_cursor *c){ - return (fulltext_vtab *) c->base.pVtab; -} - -static const sqlite3_module fts3Module; /* forward declaration */ - -/* Return a dynamically generated statement of the form - * insert into %_content (docid, ...) values (?, ...) - */ -static const char *contentInsertStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "insert into %_content (docid, "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, ") values (?"); - for(i=0; inColumn; ++i) - append(&sb, ", ?"); - append(&sb, ")"); - return stringBufferData(&sb); -} - -/* Return a dynamically generated statement of the form - * select from %_content where docid = ? - */ -static const char *contentSelectStatement(fulltext_vtab *v){ - StringBuffer sb; - initStringBuffer(&sb); - append(&sb, "SELECT "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, " FROM %_content WHERE docid = ?"); - return stringBufferData(&sb); -} - -/* Return a dynamically generated statement of the form - * update %_content set [col_0] = ?, [col_1] = ?, ... - * where docid = ? - */ -static const char *contentUpdateStatement(fulltext_vtab *v){ - StringBuffer sb; - int i; - - initStringBuffer(&sb); - append(&sb, "update %_content set "); - for(i=0; inColumn; ++i) { - if( i>0 ){ - append(&sb, ", "); - } - append(&sb, v->azContentColumn[i]); - append(&sb, " = ?"); - } - append(&sb, " where docid = ?"); - return stringBufferData(&sb); -} - -/* Puts a freshly-prepared statement determined by iStmt in *ppStmt. -** If the indicated statement has never been prepared, it is prepared -** and cached, otherwise the cached version is reset. -*/ -static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt, - sqlite3_stmt **ppStmt){ - assert( iStmtpFulltextStatements[iStmt]==NULL ){ - const char *zStmt; - int rc; - switch( iStmt ){ - case CONTENT_INSERT_STMT: - zStmt = contentInsertStatement(v); break; - case CONTENT_SELECT_STMT: - zStmt = contentSelectStatement(v); break; - case CONTENT_UPDATE_STMT: - zStmt = contentUpdateStatement(v); break; - default: - zStmt = fulltext_zStatement[iStmt]; - } - rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt], - zStmt); - if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt); - if( rc!=SQLITE_OK ) return rc; - } else { - int rc = sqlite3_reset(v->pFulltextStatements[iStmt]); - if( rc!=SQLITE_OK ) return rc; - } - - *ppStmt = v->pFulltextStatements[iStmt]; - return SQLITE_OK; -} - -/* Like sqlite3_step(), but convert SQLITE_DONE to SQLITE_OK and -** SQLITE_ROW to SQLITE_ERROR. Useful for statements like UPDATE, -** where we expect no results. -*/ -static int sql_single_step(sqlite3_stmt *s){ - int rc = sqlite3_step(s); - return (rc==SQLITE_DONE) ? SQLITE_OK : rc; -} - -/* Like sql_get_statement(), but for special replicated LEAF_SELECT -** statements. -*/ -/* TODO(shess) Write version for generic statements and then share -** that between the cached-statement functions. -*/ -static int sql_get_leaf_statement(fulltext_vtab *v, int idx, - sqlite3_stmt **ppStmt){ - assert( idx>=0 && idxpLeafSelectStmts[idx]==NULL ){ - int rc = sql_prepare(v->db, v->zDb, v->zName, &v->pLeafSelectStmts[idx], - LEAF_SELECT); - if( rc!=SQLITE_OK ) return rc; - }else{ - int rc = sqlite3_reset(v->pLeafSelectStmts[idx]); - if( rc!=SQLITE_OK ) return rc; - } - - *ppStmt = v->pLeafSelectStmts[idx]; - return SQLITE_OK; -} - -/* insert into %_content (docid, ...) values ([docid], [pValues]) -** If the docid contains SQL NULL, then a unique docid will be -** generated. -*/ -static int content_insert(fulltext_vtab *v, sqlite3_value *docid, - sqlite3_value **pValues){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_value(s, 1, docid); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 2+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; - } - - return sql_single_step(s); -} - -/* update %_content set col0 = pValues[0], col1 = pValues[1], ... - * where docid = [iDocid] */ -static int content_update(fulltext_vtab *v, sqlite3_value **pValues, - sqlite_int64 iDocid){ - sqlite3_stmt *s; - int i; - int rc = sql_get_statement(v, CONTENT_UPDATE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - for(i=0; inColumn; ++i){ - rc = sqlite3_bind_value(s, 1+i, pValues[i]); - if( rc!=SQLITE_OK ) return rc; - } - - rc = sqlite3_bind_int64(s, 1+v->nColumn, iDocid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -static void freeStringArray(int nString, const char **pString){ - int i; - - for (i=0 ; i < nString ; ++i) { - if( pString[i]!=NULL ) free((void *) pString[i]); - } - free((void *) pString); -} - -/* select * from %_content where docid = [iDocid] - * The caller must delete the returned array and all strings in it. - * null fields will be NULL in the returned array. - * - * TODO: Perhaps we should return pointer/length strings here for consistency - * with other code which uses pointer/length. */ -static int content_select(fulltext_vtab *v, sqlite_int64 iDocid, - const char ***pValues){ - sqlite3_stmt *s; - const char **values; - int i; - int rc; - - *pValues = NULL; - - rc = sql_get_statement(v, CONTENT_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iDocid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc!=SQLITE_ROW ) return rc; - - values = (const char **) malloc(v->nColumn * sizeof(const char *)); - for(i=0; inColumn; ++i){ - if( sqlite3_column_type(s, i)==SQLITE_NULL ){ - values[i] = NULL; - }else{ - values[i] = string_dup((char*)sqlite3_column_text(s, i)); - } - } - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - *pValues = values; - return SQLITE_OK; - } - - freeStringArray(v->nColumn, values); - return rc; -} - -/* delete from %_content where docid = [iDocid ] */ -static int content_delete(fulltext_vtab *v, sqlite_int64 iDocid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, CONTENT_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iDocid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* insert into %_segments values ([pData]) -** returns assigned blockid in *piBlockid -*/ -static int block_insert(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 *piBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, BLOCK_INSERT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_blob(s, 1, pData, nData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - - /* blockid column is an alias for rowid. */ - *piBlockid = sqlite3_last_insert_rowid(v->db); - return SQLITE_OK; -} - -/* delete from %_segments -** where blockid between [iStartBlockid] and [iEndBlockid] -** -** Deletes the range of blocks, inclusive, used to delete the blocks -** which form a segment. -*/ -static int block_delete(fulltext_vtab *v, - sqlite_int64 iStartBlockid, sqlite_int64 iEndBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, BLOCK_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* Returns SQLITE_ROW with *pidx set to the maximum segment idx found -** at iLevel. Returns SQLITE_DONE if there are no segments at -** iLevel. Otherwise returns an error. -*/ -static int segdir_max_index(fulltext_vtab *v, int iLevel, int *pidx){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_MAX_INDEX_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - /* Should always get at least one row due to how max() works. */ - if( rc==SQLITE_DONE ) return SQLITE_DONE; - if( rc!=SQLITE_ROW ) return rc; - - /* NULL means that there were no inputs to max(). */ - if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - return rc; - } - - *pidx = sqlite3_column_int(s, 0); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - return SQLITE_ROW; -} - -/* insert into %_segdir values ( -** [iLevel], [idx], -** [iStartBlockid], [iLeavesEndBlockid], [iEndBlockid], -** [pRootData] -** ) -*/ -static int segdir_set(fulltext_vtab *v, int iLevel, int idx, - sqlite_int64 iStartBlockid, - sqlite_int64 iLeavesEndBlockid, - sqlite_int64 iEndBlockid, - const char *pRootData, int nRootData){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SET_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 2, idx); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 3, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 4, iLeavesEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 5, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_blob(s, 6, pRootData, nRootData, SQLITE_STATIC); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* Queries %_segdir for the block span of the segments in level -** iLevel. Returns SQLITE_DONE if there are no blocks for iLevel, -** SQLITE_ROW if there are blocks, else an error. -*/ -static int segdir_span(fulltext_vtab *v, int iLevel, - sqlite_int64 *piStartBlockid, - sqlite_int64 *piEndBlockid){ - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SPAN_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_DONE; /* Should never happen */ - if( rc!=SQLITE_ROW ) return rc; - - /* This happens if all segments at this level are entirely inline. */ - if( SQLITE_NULL==sqlite3_column_type(s, 0) ){ - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - int rc2 = sqlite3_step(s); - if( rc2==SQLITE_ROW ) return SQLITE_ERROR; - return rc2; - } - - *piStartBlockid = sqlite3_column_int64(s, 0); - *piEndBlockid = sqlite3_column_int64(s, 1); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - return SQLITE_ROW; -} - -/* Delete the segment blocks and segment directory records for all -** segments at iLevel. -*/ -static int segdir_delete(fulltext_vtab *v, int iLevel){ - sqlite3_stmt *s; - sqlite_int64 iStartBlockid, iEndBlockid; - int rc = segdir_span(v, iLevel, &iStartBlockid, &iEndBlockid); - if( rc!=SQLITE_ROW && rc!=SQLITE_DONE ) return rc; - - if( rc==SQLITE_ROW ){ - rc = block_delete(v, iStartBlockid, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - } - - /* Delete the segment directory itself. */ - rc = sql_get_statement(v, SEGDIR_DELETE_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - return sql_single_step(s); -} - -/* TODO(shess) clearPendingTerms() is far down the file because -** writeZeroSegment() is far down the file because LeafWriter is far -** down the file. Consider refactoring the code to move the non-vtab -** code above the vtab code so that we don't need this forward -** reference. -*/ -static int clearPendingTerms(fulltext_vtab *v); - -/* -** Free the memory used to contain a fulltext_vtab structure. -*/ -static void fulltext_vtab_destroy(fulltext_vtab *v){ - int iStmt, i; - - TRACE(("FTS3 Destroy %p\n", v)); - for( iStmt=0; iStmtpFulltextStatements[iStmt]!=NULL ){ - sqlite3_finalize(v->pFulltextStatements[iStmt]); - v->pFulltextStatements[iStmt] = NULL; - } - } - - for( i=0; ipLeafSelectStmts[i]!=NULL ){ - sqlite3_finalize(v->pLeafSelectStmts[i]); - v->pLeafSelectStmts[i] = NULL; - } - } - - if( v->pTokenizer!=NULL ){ - v->pTokenizer->pModule->xDestroy(v->pTokenizer); - v->pTokenizer = NULL; - } - - clearPendingTerms(v); - - free(v->azColumn); - for(i = 0; i < v->nColumn; ++i) { - sqlite3_free(v->azContentColumn[i]); - } - free(v->azContentColumn); - free(v); -} - -/* -** Token types for parsing the arguments to xConnect or xCreate. -*/ -#define TOKEN_EOF 0 /* End of file */ -#define TOKEN_SPACE 1 /* Any kind of whitespace */ -#define TOKEN_ID 2 /* An identifier */ -#define TOKEN_STRING 3 /* A string literal */ -#define TOKEN_PUNCT 4 /* A single punctuation character */ - -/* -** If X is a character that can be used in an identifier then -** IdChar(X) will be true. Otherwise it is false. -** -** For ASCII, any character with the high-order bit set is -** allowed in an identifier. For 7-bit characters, -** sqlite3IsIdChar[X] must be 1. -** -** Ticket #1066. the SQL standard does not allow '$' in the -** middle of identfiers. But many SQL implementations do. -** SQLite will allow '$' in identifiers for compatibility. -** But the feature is undocumented. -*/ -static const char isIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && isIdChar[c-0x20])) - - -/* -** Return the length of the token that begins at z[0]. -** Store the token type in *tokenType before returning. -*/ -static int getToken(const char *z, int *tokenType){ - int i, c; - switch( *z ){ - case 0: { - *tokenType = TOKEN_EOF; - return 0; - } - case ' ': case '\t': case '\n': case '\f': case '\r': { - for(i=1; safe_isspace(z[i]); i++){} - *tokenType = TOKEN_SPACE; - return i; - } - case '`': - case '\'': - case '"': { - int delim = z[0]; - for(i=1; (c=z[i])!=0; i++){ - if( c==delim ){ - if( z[i+1]==delim ){ - i++; - }else{ - break; - } - } - } - *tokenType = TOKEN_STRING; - return i + (c!=0); - } - case '[': { - for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} - *tokenType = TOKEN_ID; - return i; - } - default: { - if( !IdChar(*z) ){ - break; - } - for(i=1; IdChar(z[i]); i++){} - *tokenType = TOKEN_ID; - return i; - } - } - *tokenType = TOKEN_PUNCT; - return 1; -} - -/* -** A token extracted from a string is an instance of the following -** structure. -*/ -typedef struct Token { - const char *z; /* Pointer to token text. Not '\000' terminated */ - short int n; /* Length of the token text in bytes. */ -} Token; - -/* -** Given a input string (which is really one of the argv[] parameters -** passed into xConnect or xCreate) split the string up into tokens. -** Return an array of pointers to '\000' terminated strings, one string -** for each non-whitespace token. -** -** The returned array is terminated by a single NULL pointer. -** -** Space to hold the returned array is obtained from a single -** malloc and should be freed by passing the return value to free(). -** The individual strings within the token list are all a part of -** the single memory allocation and will all be freed at once. -*/ -static char **tokenizeString(const char *z, int *pnToken){ - int nToken = 0; - Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) ); - int n = 1; - int e, i; - int totalSize = 0; - char **azToken; - char *zCopy; - while( n>0 ){ - n = getToken(z, &e); - if( e!=TOKEN_SPACE ){ - aToken[nToken].z = z; - aToken[nToken].n = n; - nToken++; - totalSize += n+1; - } - z += n; - } - azToken = (char**)malloc( nToken*sizeof(char*) + totalSize ); - zCopy = (char*)&azToken[nToken]; - nToken--; - for(i=0; i=0 ){ - azIn[j] = azIn[i]; - } - j++; - } - } - azIn[j] = 0; - } -} - - -/* -** Find the first alphanumeric token in the string zIn. Null-terminate -** this token. Remove any quotation marks. And return a pointer to -** the result. -*/ -static char *firstToken(char *zIn, char **pzTail){ - int n, ttype; - while(1){ - n = getToken(zIn, &ttype); - if( ttype==TOKEN_SPACE ){ - zIn += n; - }else if( ttype==TOKEN_EOF ){ - *pzTail = zIn; - return 0; - }else{ - zIn[n] = 0; - *pzTail = &zIn[1]; - dequoteString(zIn); - return zIn; - } - } - /*NOTREACHED*/ -} - -/* Return true if... -** -** * s begins with the string t, ignoring case -** * s is longer than t -** * The first character of s beyond t is not a alphanumeric -** -** Ignore leading space in *s. -** -** To put it another way, return true if the first token of -** s[] is t[]. -*/ -static int startsWith(const char *s, const char *t){ - while( safe_isspace(*s) ){ s++; } - while( *t ){ - if( safe_tolower(*s++)!=safe_tolower(*t++) ) return 0; - } - return *s!='_' && !safe_isalnum(*s); -} - -/* -** An instance of this structure defines the "spec" of a -** full text index. This structure is populated by parseSpec -** and use by fulltextConnect and fulltextCreate. -*/ -typedef struct TableSpec { - const char *zDb; /* Logical database name */ - const char *zName; /* Name of the full-text index */ - int nColumn; /* Number of columns to be indexed */ - char **azColumn; /* Original names of columns to be indexed */ - char **azContentColumn; /* Column names for %_content */ - char **azTokenizer; /* Name of tokenizer and its arguments */ -} TableSpec; - -/* -** Reclaim all of the memory used by a TableSpec -*/ -static void clearTableSpec(TableSpec *p) { - free(p->azColumn); - free(p->azContentColumn); - free(p->azTokenizer); -} - -/* Parse a CREATE VIRTUAL TABLE statement, which looks like this: - * - * CREATE VIRTUAL TABLE email - * USING fts3(subject, body, tokenize mytokenizer(myarg)) - * - * We return parsed information in a TableSpec structure. - * - */ -static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv, - char**pzErr){ - int i, n; - char *z, *zDummy; - char **azArg; - const char *zTokenizer = 0; /* argv[] entry describing the tokenizer */ - - assert( argc>=3 ); - /* Current interface: - ** argv[0] - module name - ** argv[1] - database name - ** argv[2] - table name - ** argv[3..] - columns, optionally followed by tokenizer specification - ** and snippet delimiters specification. - */ - - /* Make a copy of the complete argv[][] array in a single allocation. - ** The argv[][] array is read-only and transient. We can write to the - ** copy in order to modify things and the copy is persistent. - */ - CLEAR(pSpec); - for(i=n=0; izDb = azArg[1]; - pSpec->zName = azArg[2]; - pSpec->nColumn = 0; - pSpec->azColumn = azArg; - zTokenizer = "tokenize simple"; - for(i=3; inColumn] = firstToken(azArg[i], &zDummy); - pSpec->nColumn++; - } - } - if( pSpec->nColumn==0 ){ - azArg[0] = "content"; - pSpec->nColumn = 1; - } - - /* - ** Construct the list of content column names. - ** - ** Each content column name will be of the form cNNAAAA - ** where NN is the column number and AAAA is the sanitized - ** column name. "sanitized" means that special characters are - ** converted to "_". The cNN prefix guarantees that all column - ** names are unique. - ** - ** The AAAA suffix is not strictly necessary. It is included - ** for the convenience of people who might examine the generated - ** %_content table and wonder what the columns are used for. - */ - pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) ); - if( pSpec->azContentColumn==0 ){ - clearTableSpec(pSpec); - return SQLITE_NOMEM; - } - for(i=0; inColumn; i++){ - char *p; - pSpec->azContentColumn[i] = sqlite3_mprintf("c%d%s", i, azArg[i]); - for (p = pSpec->azContentColumn[i]; *p ; ++p) { - if( !safe_isalnum(*p) ) *p = '_'; - } - } - - /* - ** Parse the tokenizer specification string. - */ - pSpec->azTokenizer = tokenizeString(zTokenizer, &n); - tokenListToIdList(pSpec->azTokenizer); - - return SQLITE_OK; -} - -/* -** Generate a CREATE TABLE statement that describes the schema of -** the virtual table. Return a pointer to this schema string. -** -** Space is obtained from sqlite3_mprintf() and should be freed -** using sqlite3_free(). -*/ -static char *fulltextSchema( - int nColumn, /* Number of columns */ - const char *const* azColumn, /* List of columns */ - const char *zTableName /* Name of the table */ -){ - int i; - char *zSchema, *zNext; - const char *zSep = "("; - zSchema = sqlite3_mprintf("CREATE TABLE x"); - for(i=0; ibase */ - v->db = db; - v->zDb = spec->zDb; /* Freed when azColumn is freed */ - v->zName = spec->zName; /* Freed when azColumn is freed */ - v->nColumn = spec->nColumn; - v->azContentColumn = spec->azContentColumn; - spec->azContentColumn = 0; - v->azColumn = spec->azColumn; - spec->azColumn = 0; - - if( spec->azTokenizer==0 ){ - return SQLITE_NOMEM; - } - - zTok = spec->azTokenizer[0]; - if( !zTok ){ - zTok = "simple"; - } - nTok = strlen(zTok)+1; - - m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zTok, nTok); - if( !m ){ - *pzErr = sqlite3_mprintf("unknown tokenizer: %s", spec->azTokenizer[0]); - rc = SQLITE_ERROR; - goto err; - } - - for(n=0; spec->azTokenizer[n]; n++){} - if( n ){ - rc = m->xCreate(n-1, (const char*const*)&spec->azTokenizer[1], - &v->pTokenizer); - }else{ - rc = m->xCreate(0, 0, &v->pTokenizer); - } - if( rc!=SQLITE_OK ) goto err; - v->pTokenizer->pModule = m; - - /* TODO: verify the existence of backing tables foo_content, foo_term */ - - schema = fulltextSchema(v->nColumn, (const char*const*)v->azColumn, - spec->zName); - rc = sqlite3_declare_vtab(db, schema); - sqlite3_free(schema); - if( rc!=SQLITE_OK ) goto err; - - memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); - - /* Indicate that the buffer is not live. */ - v->nPendingData = -1; - - *ppVTab = &v->base; - TRACE(("FTS3 Connect %p\n", v)); - - return rc; - -err: - fulltext_vtab_destroy(v); - return rc; -} - -static int fulltextConnect( - sqlite3 *db, - void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, - char **pzErr -){ - TableSpec spec; - int rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - rc = constructVtab(db, (fts3Hash *)pAux, &spec, ppVTab, pzErr); - clearTableSpec(&spec); - return rc; -} - -/* The %_content table holds the text of each document, with -** the docid column exposed as the SQLite rowid for the table. -*/ -/* TODO(shess) This comment needs elaboration to match the updated -** code. Work it into the top-of-file comment at that time. -*/ -static int fulltextCreate(sqlite3 *db, void *pAux, - int argc, const char * const *argv, - sqlite3_vtab **ppVTab, char **pzErr){ - int rc; - TableSpec spec; - StringBuffer schema; - TRACE(("FTS3 Create\n")); - - rc = parseSpec(&spec, argc, argv, pzErr); - if( rc!=SQLITE_OK ) return rc; - - initStringBuffer(&schema); - append(&schema, "CREATE TABLE %_content("); - append(&schema, " docid INTEGER PRIMARY KEY,"); - appendList(&schema, spec.nColumn, spec.azContentColumn); - append(&schema, ")"); - rc = sql_exec(db, spec.zDb, spec.zName, stringBufferData(&schema)); - stringBufferDestroy(&schema); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_segments(" - " blockid INTEGER PRIMARY KEY," - " block blob" - ");" - ); - if( rc!=SQLITE_OK ) goto out; - - rc = sql_exec(db, spec.zDb, spec.zName, - "create table %_segdir(" - " level integer," - " idx integer," - " start_block integer," - " leaves_end_block integer," - " end_block integer," - " root blob," - " primary key(level, idx)" - ");"); - if( rc!=SQLITE_OK ) goto out; - - rc = constructVtab(db, (fts3Hash *)pAux, &spec, ppVTab, pzErr); - -out: - clearTableSpec(&spec); - return rc; -} - -/* Decide how to handle an SQL query. */ -static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ - fulltext_vtab *v = (fulltext_vtab *)pVTab; - int i; - TRACE(("FTS3 BestIndex\n")); - - for(i=0; inConstraint; ++i){ - const struct sqlite3_index_constraint *pConstraint; - pConstraint = &pInfo->aConstraint[i]; - if( pConstraint->usable ) { - if( (pConstraint->iColumn==-1 || pConstraint->iColumn==v->nColumn+1) && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ - pInfo->idxNum = QUERY_DOCID; /* lookup by docid */ - TRACE(("FTS3 QUERY_DOCID\n")); - } else if( pConstraint->iColumn>=0 && pConstraint->iColumn<=v->nColumn && - pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){ - /* full-text search */ - pInfo->idxNum = QUERY_FULLTEXT + pConstraint->iColumn; - TRACE(("FTS3 QUERY_FULLTEXT %d\n", pConstraint->iColumn)); - } else continue; - - pInfo->aConstraintUsage[i].argvIndex = 1; - pInfo->aConstraintUsage[i].omit = 1; - - /* An arbitrary value for now. - * TODO: Perhaps docid matches should be considered cheaper than - * full-text searches. */ - pInfo->estimatedCost = 1.0; - - return SQLITE_OK; - } - } - pInfo->idxNum = QUERY_GENERIC; - return SQLITE_OK; -} - -static int fulltextDisconnect(sqlite3_vtab *pVTab){ - TRACE(("FTS3 Disconnect %p\n", pVTab)); - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} - -static int fulltextDestroy(sqlite3_vtab *pVTab){ - fulltext_vtab *v = (fulltext_vtab *)pVTab; - int rc; - - TRACE(("FTS3 Destroy %p\n", pVTab)); - rc = sql_exec(v->db, v->zDb, v->zName, - "drop table if exists %_content;" - "drop table if exists %_segments;" - "drop table if exists %_segdir;" - ); - if( rc!=SQLITE_OK ) return rc; - - fulltext_vtab_destroy((fulltext_vtab *)pVTab); - return SQLITE_OK; -} - -static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ - fulltext_cursor *c; - - c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1); - /* sqlite will initialize c->base */ - *ppCursor = &c->base; - TRACE(("FTS3 Open %p: %p\n", pVTab, c)); - - return SQLITE_OK; -} - - -/* Free all of the dynamically allocated memory held by *q -*/ -static void queryClear(Query *q){ - int i; - for(i = 0; i < q->nTerms; ++i){ - free(q->pTerms[i].pTerm); - } - free(q->pTerms); - CLEAR(q); -} - -/* Free all of the dynamically allocated memory held by the -** Snippet -*/ -static void snippetClear(Snippet *p){ - free(p->aMatch); - free(p->zOffset); - free(p->zSnippet); - CLEAR(p); -} -/* -** Append a single entry to the p->aMatch[] log. -*/ -static void snippetAppendMatch( - Snippet *p, /* Append the entry to this snippet */ - int iCol, int iTerm, /* The column and query term */ - int iStart, int nByte /* Offset and size of the match */ -){ - int i; - struct snippetMatch *pMatch; - if( p->nMatch+1>=p->nAlloc ){ - p->nAlloc = p->nAlloc*2 + 10; - p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) ); - if( p->aMatch==0 ){ - p->nMatch = 0; - p->nAlloc = 0; - return; - } - } - i = p->nMatch++; - pMatch = &p->aMatch[i]; - pMatch->iCol = iCol; - pMatch->iTerm = iTerm; - pMatch->iStart = iStart; - pMatch->nByte = nByte; -} - -/* -** Sizing information for the circular buffer used in snippetOffsetsOfColumn() -*/ -#define FTS3_ROTOR_SZ (32) -#define FTS3_ROTOR_MASK (FTS3_ROTOR_SZ-1) - -/* -** Add entries to pSnippet->aMatch[] for every match that occurs against -** document zDoc[0..nDoc-1] which is stored in column iColumn. -*/ -static void snippetOffsetsOfColumn( - Query *pQuery, - Snippet *pSnippet, - int iColumn, - const char *zDoc, - int nDoc -){ - const sqlite3_tokenizer_module *pTModule; /* The tokenizer module */ - sqlite3_tokenizer *pTokenizer; /* The specific tokenizer */ - sqlite3_tokenizer_cursor *pTCursor; /* Tokenizer cursor */ - fulltext_vtab *pVtab; /* The full text index */ - int nColumn; /* Number of columns in the index */ - const QueryTerm *aTerm; /* Query string terms */ - int nTerm; /* Number of query string terms */ - int i, j; /* Loop counters */ - int rc; /* Return code */ - unsigned int match, prevMatch; /* Phrase search bitmasks */ - const char *zToken; /* Next token from the tokenizer */ - int nToken; /* Size of zToken */ - int iBegin, iEnd, iPos; /* Offsets of beginning and end */ - - /* The following variables keep a circular buffer of the last - ** few tokens */ - unsigned int iRotor = 0; /* Index of current token */ - int iRotorBegin[FTS3_ROTOR_SZ]; /* Beginning offset of token */ - int iRotorLen[FTS3_ROTOR_SZ]; /* Length of token */ - - pVtab = pQuery->pFts; - nColumn = pVtab->nColumn; - pTokenizer = pVtab->pTokenizer; - pTModule = pTokenizer->pModule; - rc = pTModule->xOpen(pTokenizer, zDoc, nDoc, &pTCursor); - if( rc ) return; - pTCursor->pTokenizer = pTokenizer; - aTerm = pQuery->pTerms; - nTerm = pQuery->nTerms; - if( nTerm>=FTS3_ROTOR_SZ ){ - nTerm = FTS3_ROTOR_SZ - 1; - } - prevMatch = 0; - while(1){ - rc = pTModule->xNext(pTCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos); - if( rc ) break; - iRotorBegin[iRotor&FTS3_ROTOR_MASK] = iBegin; - iRotorLen[iRotor&FTS3_ROTOR_MASK] = iEnd-iBegin; - match = 0; - for(i=0; i=0 && iColnToken ) continue; - if( !aTerm[i].isPrefix && aTerm[i].nTerm1 && (prevMatch & (1<=0; j--){ - int k = (iRotor-j) & FTS3_ROTOR_MASK; - snippetAppendMatch(pSnippet, iColumn, i-j, - iRotorBegin[k], iRotorLen[k]); - } - } - } - prevMatch = match<<1; - iRotor++; - } - pTModule->xClose(pTCursor); -} - - -/* -** Compute all offsets for the current row of the query. -** If the offsets have already been computed, this routine is a no-op. -*/ -static void snippetAllOffsets(fulltext_cursor *p){ - int nColumn; - int iColumn, i; - int iFirst, iLast; - fulltext_vtab *pFts; - - if( p->snippet.nMatch ) return; - if( p->q.nTerms==0 ) return; - pFts = p->q.pFts; - nColumn = pFts->nColumn; - iColumn = (p->iCursorType - QUERY_FULLTEXT); - if( iColumn<0 || iColumn>=nColumn ){ - iFirst = 0; - iLast = nColumn-1; - }else{ - iFirst = iColumn; - iLast = iColumn; - } - for(i=iFirst; i<=iLast; i++){ - const char *zDoc; - int nDoc; - zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1); - nDoc = sqlite3_column_bytes(p->pStmt, i+1); - snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc); - } -} - -/* -** Convert the information in the aMatch[] array of the snippet -** into the string zOffset[0..nOffset-1]. -*/ -static void snippetOffsetText(Snippet *p){ - int i; - int cnt = 0; - StringBuffer sb; - char zBuf[200]; - if( p->zOffset ) return; - initStringBuffer(&sb); - for(i=0; inMatch; i++){ - struct snippetMatch *pMatch = &p->aMatch[i]; - zBuf[0] = ' '; - sprintf(&zBuf[cnt>0], "%d %d %d %d", pMatch->iCol, - pMatch->iTerm, pMatch->iStart, pMatch->nByte); - append(&sb, zBuf); - cnt++; - } - p->zOffset = stringBufferData(&sb); - p->nOffset = stringBufferLength(&sb); -} - -/* -** zDoc[0..nDoc-1] is phrase of text. aMatch[0..nMatch-1] are a set -** of matching words some of which might be in zDoc. zDoc is column -** number iCol. -** -** iBreak is suggested spot in zDoc where we could begin or end an -** excerpt. Return a value similar to iBreak but possibly adjusted -** to be a little left or right so that the break point is better. -*/ -static int wordBoundary( - int iBreak, /* The suggested break point */ - const char *zDoc, /* Document text */ - int nDoc, /* Number of bytes in zDoc[] */ - struct snippetMatch *aMatch, /* Matching words */ - int nMatch, /* Number of entries in aMatch[] */ - int iCol /* The column number for zDoc[] */ -){ - int i; - if( iBreak<=10 ){ - return 0; - } - if( iBreak>=nDoc-10 ){ - return nDoc; - } - for(i=0; i0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){ - return aMatch[i-1].iStart; - } - } - for(i=1; i<=10; i++){ - if( safe_isspace(zDoc[iBreak-i]) ){ - return iBreak - i + 1; - } - if( safe_isspace(zDoc[iBreak+i]) ){ - return iBreak + i + 1; - } - } - return iBreak; -} - - - -/* -** Allowed values for Snippet.aMatch[].snStatus -*/ -#define SNIPPET_IGNORE 0 /* It is ok to omit this match from the snippet */ -#define SNIPPET_DESIRED 1 /* We want to include this match in the snippet */ - -/* -** Generate the text of a snippet. -*/ -static void snippetText( - fulltext_cursor *pCursor, /* The cursor we need the snippet for */ - const char *zStartMark, /* Markup to appear before each match */ - const char *zEndMark, /* Markup to appear after each match */ - const char *zEllipsis /* Ellipsis mark */ -){ - int i, j; - struct snippetMatch *aMatch; - int nMatch; - int nDesired; - StringBuffer sb; - int tailCol; - int tailOffset; - int iCol; - int nDoc; - const char *zDoc; - int iStart, iEnd; - int tailEllipsis = 0; - int iMatch; - - - free(pCursor->snippet.zSnippet); - pCursor->snippet.zSnippet = 0; - aMatch = pCursor->snippet.aMatch; - nMatch = pCursor->snippet.nMatch; - initStringBuffer(&sb); - - for(i=0; iq.nTerms; i++){ - for(j=0; j0; i++){ - if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue; - nDesired--; - iCol = aMatch[i].iCol; - zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1); - nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1); - iStart = aMatch[i].iStart - 40; - iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol); - if( iStart<=10 ){ - iStart = 0; - } - if( iCol==tailCol && iStart<=tailOffset+20 ){ - iStart = tailOffset; - } - if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){ - trimWhiteSpace(&sb); - appendWhiteSpace(&sb); - append(&sb, zEllipsis); - appendWhiteSpace(&sb); - } - iEnd = aMatch[i].iStart + aMatch[i].nByte + 40; - iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol); - if( iEnd>=nDoc-10 ){ - iEnd = nDoc; - tailEllipsis = 0; - }else{ - tailEllipsis = 1; - } - while( iMatchsnippet.zSnippet = stringBufferData(&sb); - pCursor->snippet.nSnippet = stringBufferLength(&sb); -} - - -/* -** Close the cursor. For additional information see the documentation -** on the xClose method of the virtual table interface. -*/ -static int fulltextClose(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - TRACE(("FTS3 Close %p\n", c)); - sqlite3_finalize(c->pStmt); - queryClear(&c->q); - snippetClear(&c->snippet); - if( c->result.nData!=0 ) dlrDestroy(&c->reader); - dataBufferDestroy(&c->result); - free(c); - return SQLITE_OK; -} - -static int fulltextNext(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - int rc; - - TRACE(("FTS3 Next %p\n", pCursor)); - snippetClear(&c->snippet); - if( c->iCursorType < QUERY_FULLTEXT ){ - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - switch( rc ){ - case SQLITE_ROW: - c->eof = 0; - return SQLITE_OK; - case SQLITE_DONE: - c->eof = 1; - return SQLITE_OK; - default: - c->eof = 1; - return rc; - } - } else { /* full-text query */ - rc = sqlite3_reset(c->pStmt); - if( rc!=SQLITE_OK ) return rc; - - if( c->result.nData==0 || dlrAtEnd(&c->reader) ){ - c->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_bind_int64(c->pStmt, 1, dlrDocid(&c->reader)); - dlrStep(&c->reader); - if( rc!=SQLITE_OK ) return rc; - /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */ - rc = sqlite3_step(c->pStmt); - if( rc==SQLITE_ROW ){ /* the case we expect */ - c->eof = 0; - return SQLITE_OK; - } - /* an error occurred; abort */ - return rc==SQLITE_DONE ? SQLITE_ERROR : rc; - } -} - - -/* TODO(shess) If we pushed LeafReader to the top of the file, or to -** another file, term_select() could be pushed above -** docListOfTerm(). -*/ -static int termSelect(fulltext_vtab *v, int iColumn, - const char *pTerm, int nTerm, int isPrefix, - DocListType iType, DataBuffer *out); - -/* Return a DocList corresponding to the query term *pTerm. If *pTerm -** is the first term of a phrase query, go ahead and evaluate the phrase -** query and return the doclist for the entire phrase query. -** -** The resulting DL_DOCIDS doclist is stored in pResult, which is -** overwritten. -*/ -static int docListOfTerm( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* column to restrict to. No restriction if >=nColumn */ - QueryTerm *pQTerm, /* Term we are looking for, or 1st term of a phrase */ - DataBuffer *pResult /* Write the result here */ -){ - DataBuffer left, right, new; - int i, rc; - - /* No phrase search if no position info. */ - assert( pQTerm->nPhrase==0 || DL_DEFAULT!=DL_DOCIDS ); - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); - - dataBufferInit(&left, 0); - rc = termSelect(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pQTerm->isPrefix, - 0nPhrase ? DL_POSITIONS : DL_DOCIDS, &left); - if( rc ) return rc; - for(i=1; i<=pQTerm->nPhrase && left.nData>0; i++){ - dataBufferInit(&right, 0); - rc = termSelect(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm, - pQTerm[i].isPrefix, DL_POSITIONS, &right); - if( rc ){ - dataBufferDestroy(&left); - return rc; - } - dataBufferInit(&new, 0); - docListPhraseMerge(left.pData, left.nData, right.pData, right.nData, - inPhrase ? DL_POSITIONS : DL_DOCIDS, &new); - dataBufferDestroy(&left); - dataBufferDestroy(&right); - left = new; - } - *pResult = left; - return SQLITE_OK; -} - -/* Add a new term pTerm[0..nTerm-1] to the query *q. -*/ -static void queryAdd(Query *q, const char *pTerm, int nTerm){ - QueryTerm *t; - ++q->nTerms; - q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0])); - if( q->pTerms==0 ){ - q->nTerms = 0; - return; - } - t = &q->pTerms[q->nTerms - 1]; - CLEAR(t); - t->pTerm = malloc(nTerm+1); - memcpy(t->pTerm, pTerm, nTerm); - t->pTerm[nTerm] = 0; - t->nTerm = nTerm; - t->isOr = q->nextIsOr; - t->isPrefix = 0; - q->nextIsOr = 0; - t->iColumn = q->nextColumn; - q->nextColumn = q->dfltColumn; -} - -/* -** Check to see if the string zToken[0...nToken-1] matches any -** column name in the virtual table. If it does, -** return the zero-indexed column number. If not, return -1. -*/ -static int checkColumnSpecifier( - fulltext_vtab *pVtab, /* The virtual table */ - const char *zToken, /* Text of the token */ - int nToken /* Number of characters in the token */ -){ - int i; - for(i=0; inColumn; i++){ - if( memcmp(pVtab->azColumn[i], zToken, nToken)==0 - && pVtab->azColumn[i][nToken]==0 ){ - return i; - } - } - return -1; -} - -/* -** Parse the text at pSegment[0..nSegment-1]. Add additional terms -** to the query being assemblied in pQuery. -** -** inPhrase is true if pSegment[0..nSegement-1] is contained within -** double-quotes. If inPhrase is true, then the first term -** is marked with the number of terms in the phrase less one and -** OR and "-" syntax is ignored. If inPhrase is false, then every -** term found is marked with nPhrase=0 and OR and "-" syntax is significant. -*/ -static int tokenizeSegment( - sqlite3_tokenizer *pTokenizer, /* The tokenizer to use */ - const char *pSegment, int nSegment, /* Query expression being parsed */ - int inPhrase, /* True if within "..." */ - Query *pQuery /* Append results here */ -){ - const sqlite3_tokenizer_module *pModule = pTokenizer->pModule; - sqlite3_tokenizer_cursor *pCursor; - int firstIndex = pQuery->nTerms; - int iCol; - int nTerm = 1; - - int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor); - if( rc!=SQLITE_OK ) return rc; - pCursor->pTokenizer = pTokenizer; - - while( 1 ){ - const char *pToken; - int nToken, iBegin, iEnd, iPos; - - rc = pModule->xNext(pCursor, - &pToken, &nToken, - &iBegin, &iEnd, &iPos); - if( rc!=SQLITE_OK ) break; - if( !inPhrase && - pSegment[iEnd]==':' && - (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){ - pQuery->nextColumn = iCol; - continue; - } - if( !inPhrase && pQuery->nTerms>0 && nToken==2 - && pSegment[iBegin]=='O' && pSegment[iBegin+1]=='R' ){ - pQuery->nextIsOr = 1; - continue; - } - queryAdd(pQuery, pToken, nToken); - if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){ - pQuery->pTerms[pQuery->nTerms-1].isNot = 1; - } - if( iEndpTerms[pQuery->nTerms-1].isPrefix = 1; - } - pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm; - if( inPhrase ){ - nTerm++; - } - } - - if( inPhrase && pQuery->nTerms>firstIndex ){ - pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1; - } - - return pModule->xClose(pCursor); -} - -/* Parse a query string, yielding a Query object pQuery. -** -** The calling function will need to queryClear() to clean up -** the dynamically allocated memory held by pQuery. -*/ -static int parseQuery( - fulltext_vtab *v, /* The fulltext index */ - const char *zInput, /* Input text of the query string */ - int nInput, /* Size of the input text */ - int dfltColumn, /* Default column of the index to match against */ - Query *pQuery /* Write the parse results here. */ -){ - int iInput, inPhrase = 0; - - if( zInput==0 ) nInput = 0; - if( nInput<0 ) nInput = strlen(zInput); - pQuery->nTerms = 0; - pQuery->pTerms = NULL; - pQuery->nextIsOr = 0; - pQuery->nextColumn = dfltColumn; - pQuery->dfltColumn = dfltColumn; - pQuery->pFts = v; - - for(iInput=0; iInputiInput ){ - tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase, - pQuery); - } - iInput = i; - if( i=nColumn -** they are allowed to match against any column. -*/ -static int fulltextQuery( - fulltext_vtab *v, /* The full text index */ - int iColumn, /* Match against this column by default */ - const char *zInput, /* The query string */ - int nInput, /* Number of bytes in zInput[] */ - DataBuffer *pResult, /* Write the result doclist here */ - Query *pQuery /* Put parsed query string here */ -){ - int i, iNext, rc; - DataBuffer left, right, or, new; - int nNot = 0; - QueryTerm *aTerm; - - /* TODO(shess) Instead of flushing pendingTerms, we could query for - ** the relevant term and merge the doclist into what we receive from - ** the database. Wait and see if this is a common issue, first. - ** - ** A good reason not to flush is to not generate update-related - ** error codes from here. - */ - - /* Flush any buffered updates before executing the query. */ - rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ) return rc; - - /* TODO(shess) I think that the queryClear() calls below are not - ** necessary, because fulltextClose() already clears the query. - */ - rc = parseQuery(v, zInput, nInput, iColumn, pQuery); - if( rc!=SQLITE_OK ) return rc; - - /* Empty or NULL queries return no results. */ - if( pQuery->nTerms==0 ){ - dataBufferInit(pResult, 0); - return SQLITE_OK; - } - - /* Merge AND terms. */ - /* TODO(shess) I think we can early-exit if( i>nNot && left.nData==0 ). */ - aTerm = pQuery->pTerms; - for(i = 0; inTerms; i=iNext){ - if( aTerm[i].isNot ){ - /* Handle all NOT terms in a separate pass */ - nNot++; - iNext = i + aTerm[i].nPhrase+1; - continue; - } - iNext = i + aTerm[i].nPhrase + 1; - rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); - if( rc ){ - if( i!=nNot ) dataBufferDestroy(&left); - queryClear(pQuery); - return rc; - } - while( iNextnTerms && aTerm[iNext].isOr ){ - rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &or); - iNext += aTerm[iNext].nPhrase + 1; - if( rc ){ - if( i!=nNot ) dataBufferDestroy(&left); - dataBufferDestroy(&right); - queryClear(pQuery); - return rc; - } - dataBufferInit(&new, 0); - docListOrMerge(right.pData, right.nData, or.pData, or.nData, &new); - dataBufferDestroy(&right); - dataBufferDestroy(&or); - right = new; - } - if( i==nNot ){ /* first term processed. */ - left = right; - }else{ - dataBufferInit(&new, 0); - docListAndMerge(left.pData, left.nData, right.pData, right.nData, &new); - dataBufferDestroy(&right); - dataBufferDestroy(&left); - left = new; - } - } - - if( nNot==pQuery->nTerms ){ - /* We do not yet know how to handle a query of only NOT terms */ - return SQLITE_ERROR; - } - - /* Do the EXCEPT terms */ - for(i=0; inTerms; i += aTerm[i].nPhrase + 1){ - if( !aTerm[i].isNot ) continue; - rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right); - if( rc ){ - queryClear(pQuery); - dataBufferDestroy(&left); - return rc; - } - dataBufferInit(&new, 0); - docListExceptMerge(left.pData, left.nData, right.pData, right.nData, &new); - dataBufferDestroy(&right); - dataBufferDestroy(&left); - left = new; - } - - *pResult = left; - return rc; -} - -/* -** This is the xFilter interface for the virtual table. See -** the virtual table xFilter method documentation for additional -** information. -** -** If idxNum==QUERY_GENERIC then do a full table scan against -** the %_content table. -** -** If idxNum==QUERY_DOCID then do a docid lookup for a single entry -** in the %_content table. -** -** If idxNum>=QUERY_FULLTEXT then use the full text index. The -** column on the left-hand side of the MATCH operator is column -** number idxNum-QUERY_FULLTEXT, 0 indexed. argv[0] is the right-hand -** side of the MATCH operator. -*/ -/* TODO(shess) Upgrade the cursor initialization and destruction to -** account for fulltextFilter() being called multiple times on the -** same cursor. The current solution is very fragile. Apply fix to -** fts3 as appropriate. -*/ -static int fulltextFilter( - sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ - int idxNum, const char *idxStr, /* Which indexing scheme to use */ - int argc, sqlite3_value **argv /* Arguments for the indexing scheme */ -){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - int rc; - StringBuffer sb; - - TRACE(("FTS3 Filter %p\n",pCursor)); - - initStringBuffer(&sb); - append(&sb, "SELECT docid, "); - appendList(&sb, v->nColumn, v->azContentColumn); - append(&sb, " FROM %_content"); - if( idxNum!=QUERY_GENERIC ) append(&sb, " WHERE docid = ?"); - sqlite3_finalize(c->pStmt); - rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, stringBufferData(&sb)); - stringBufferDestroy(&sb); - if( rc!=SQLITE_OK ) return rc; - - c->iCursorType = idxNum; - switch( idxNum ){ - case QUERY_GENERIC: - break; - - case QUERY_DOCID: - rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0])); - if( rc!=SQLITE_OK ) return rc; - break; - - default: /* full-text search */ - { - const char *zQuery = (const char *)sqlite3_value_text(argv[0]); - assert( idxNum<=QUERY_FULLTEXT+v->nColumn); - assert( argc==1 ); - queryClear(&c->q); - if( c->result.nData!=0 ){ - /* This case happens if the same cursor is used repeatedly. */ - dlrDestroy(&c->reader); - dataBufferReset(&c->result); - }else{ - dataBufferInit(&c->result, 0); - } - rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &c->result, &c->q); - if( rc!=SQLITE_OK ) return rc; - if( c->result.nData!=0 ){ - dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData); - } - break; - } - } - - return fulltextNext(pCursor); -} - -/* This is the xEof method of the virtual table. The SQLite core -** calls this routine to find out if it has reached the end of -** a query's results set. -*/ -static int fulltextEof(sqlite3_vtab_cursor *pCursor){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - return c->eof; -} - -/* This is the xColumn method of the virtual table. The SQLite -** core calls this method during a query when it needs the value -** of a column from the virtual table. This method needs to use -** one of the sqlite3_result_*() routines to store the requested -** value back in the pContext. -*/ -static int fulltextColumn(sqlite3_vtab_cursor *pCursor, - sqlite3_context *pContext, int idxCol){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - fulltext_vtab *v = cursor_vtab(c); - - if( idxColnColumn ){ - sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1); - sqlite3_result_value(pContext, pVal); - }else if( idxCol==v->nColumn ){ - /* The extra column whose name is the same as the table. - ** Return a blob which is a pointer to the cursor - */ - sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT); - }else if( idxCol==v->nColumn+1 ){ - /* The docid column, which is an alias for rowid. */ - sqlite3_value *pVal = sqlite3_column_value(c->pStmt, 0); - sqlite3_result_value(pContext, pVal); - } - return SQLITE_OK; -} - -/* This is the xRowid method. The SQLite core calls this routine to -** retrieve the rowid for the current row of the result set. fts3 -** exposes %_content.docid as the rowid for the virtual table. The -** rowid should be written to *pRowid. -*/ -static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ - fulltext_cursor *c = (fulltext_cursor *) pCursor; - - *pRowid = sqlite3_column_int64(c->pStmt, 0); - return SQLITE_OK; -} - -/* Add all terms in [zText] to pendingTerms table. If [iColumn] > 0, -** we also store positions and offsets in the hash table using that -** column number. -*/ -static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid, - const char *zText, int iColumn){ - sqlite3_tokenizer *pTokenizer = v->pTokenizer; - sqlite3_tokenizer_cursor *pCursor; - const char *pToken; - int nTokenBytes; - int iStartOffset, iEndOffset, iPosition; - int rc; - - rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor); - if( rc!=SQLITE_OK ) return rc; - - pCursor->pTokenizer = pTokenizer; - while( SQLITE_OK==pTokenizer->pModule->xNext(pCursor, - &pToken, &nTokenBytes, - &iStartOffset, &iEndOffset, - &iPosition) ){ - DLCollector *p; - int nData; /* Size of doclist before our update. */ - - /* Positions can't be negative; we use -1 as a terminator internally. */ - if( iPosition<0 ){ - pTokenizer->pModule->xClose(pCursor); - return SQLITE_ERROR; - } - - p = fts3HashFind(&v->pendingTerms, pToken, nTokenBytes); - if( p==NULL ){ - nData = 0; - p = dlcNew(iDocid, DL_DEFAULT); - fts3HashInsert(&v->pendingTerms, pToken, nTokenBytes, p); - - /* Overhead for our hash table entry, the key, and the value. */ - v->nPendingData += sizeof(struct fts3HashElem)+sizeof(*p)+nTokenBytes; - }else{ - nData = p->b.nData; - if( p->dlw.iPrevDocid!=iDocid ) dlcNext(p, iDocid); - } - if( iColumn>=0 ){ - dlcAddPos(p, iColumn, iPosition, iStartOffset, iEndOffset); - } - - /* Accumulate data added by dlcNew or dlcNext, and dlcAddPos. */ - v->nPendingData += p->b.nData-nData; - } - - /* TODO(shess) Check return? Should this be able to cause errors at - ** this point? Actually, same question about sqlite3_finalize(), - ** though one could argue that failure there means that the data is - ** not durable. *ponder* - */ - pTokenizer->pModule->xClose(pCursor); - return rc; -} - -/* Add doclists for all terms in [pValues] to pendingTerms table. */ -static int insertTerms(fulltext_vtab *v, sqlite_int64 iDocid, - sqlite3_value **pValues){ - int i; - for(i = 0; i < v->nColumn ; ++i){ - char *zText = (char*)sqlite3_value_text(pValues[i]); - int rc = buildTerms(v, iDocid, zText, i); - if( rc!=SQLITE_OK ) return rc; - } - return SQLITE_OK; -} - -/* Add empty doclists for all terms in the given row's content to -** pendingTerms. -*/ -static int deleteTerms(fulltext_vtab *v, sqlite_int64 iDocid){ - const char **pValues; - int i, rc; - - /* TODO(shess) Should we allow such tables at all? */ - if( DL_DEFAULT==DL_DOCIDS ) return SQLITE_ERROR; - - rc = content_select(v, iDocid, &pValues); - if( rc!=SQLITE_OK ) return rc; - - for(i = 0 ; i < v->nColumn; ++i) { - rc = buildTerms(v, iDocid, pValues[i], -1); - if( rc!=SQLITE_OK ) break; - } - - freeStringArray(v->nColumn, pValues); - return SQLITE_OK; -} - -/* TODO(shess) Refactor the code to remove this forward decl. */ -static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid); - -/* Insert a row into the %_content table; set *piDocid to be the ID of the -** new row. Add doclists for terms to pendingTerms. -*/ -static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestDocid, - sqlite3_value **pValues, sqlite_int64 *piDocid){ - int rc; - - rc = content_insert(v, pRequestDocid, pValues); /* execute an SQL INSERT */ - if( rc!=SQLITE_OK ) return rc; - - /* docid column is an alias for rowid. */ - *piDocid = sqlite3_last_insert_rowid(v->db); - rc = initPendingTerms(v, *piDocid); - if( rc!=SQLITE_OK ) return rc; - - return insertTerms(v, *piDocid, pValues); -} - -/* Delete a row from the %_content table; add empty doclists for terms -** to pendingTerms. -*/ -static int index_delete(fulltext_vtab *v, sqlite_int64 iRow){ - int rc = initPendingTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = deleteTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - return content_delete(v, iRow); /* execute an SQL DELETE */ -} - -/* Update a row in the %_content table; add delete doclists to -** pendingTerms for old terms not in the new data, add insert doclists -** to pendingTerms for terms in the new data. -*/ -static int index_update(fulltext_vtab *v, sqlite_int64 iRow, - sqlite3_value **pValues){ - int rc = initPendingTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - /* Generate an empty doclist for each term that previously appeared in this - * row. */ - rc = deleteTerms(v, iRow); - if( rc!=SQLITE_OK ) return rc; - - rc = content_update(v, pValues, iRow); /* execute an SQL UPDATE */ - if( rc!=SQLITE_OK ) return rc; - - /* Now add positions for terms which appear in the updated row. */ - return insertTerms(v, iRow, pValues); -} - -/*******************************************************************/ -/* InteriorWriter is used to collect terms and block references into -** interior nodes in %_segments. See commentary at top of file for -** format. -*/ - -/* How large interior nodes can grow. */ -#define INTERIOR_MAX 2048 - -/* Minimum number of terms per interior node (except the root). This -** prevents large terms from making the tree too skinny - must be >0 -** so that the tree always makes progress. Note that the min tree -** fanout will be INTERIOR_MIN_TERMS+1. -*/ -#define INTERIOR_MIN_TERMS 7 -#if INTERIOR_MIN_TERMS<1 -# error INTERIOR_MIN_TERMS must be greater than 0. -#endif - -/* ROOT_MAX controls how much data is stored inline in the segment -** directory. -*/ -/* TODO(shess) Push ROOT_MAX down to whoever is writing things. It's -** only here so that interiorWriterRootInfo() and leafWriterRootInfo() -** can both see it, but if the caller passed it in, we wouldn't even -** need a define. -*/ -#define ROOT_MAX 1024 -#if ROOT_MAXterm, 0); - dataBufferReplace(&block->term, pTerm, nTerm); - - n = putVarint(c, iHeight); - n += putVarint(c+n, iChildBlock); - dataBufferInit(&block->data, INTERIOR_MAX); - dataBufferReplace(&block->data, c, n); - - return block; -} - -#ifndef NDEBUG -/* Verify that the data is readable as an interior node. */ -static void interiorBlockValidate(InteriorBlock *pBlock){ - const char *pData = pBlock->data.pData; - int nData = pBlock->data.nData; - int n, iDummy; - sqlite_int64 iBlockid; - - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - - /* Must lead with height of node as a varint(n), n>0 */ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>0 ); - assert( n0 ); - assert( n<=nData ); - pData += n; - nData -= n; - - /* Zero or more terms of positive length */ - if( nData!=0 ){ - /* First term is not delta-encoded. */ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>0 ); - assert( n+iDummy>0); - assert( n+iDummy<=nData ); - pData += n+iDummy; - nData -= n+iDummy; - - /* Following terms delta-encoded. */ - while( nData!=0 ){ - /* Length of shared prefix. */ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>=0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0); - assert( n+iDummy<=nData ); - pData += n+iDummy; - nData -= n+iDummy; - } - } -} -#define ASSERT_VALID_INTERIOR_BLOCK(x) interiorBlockValidate(x) -#else -#define ASSERT_VALID_INTERIOR_BLOCK(x) assert( 1 ) -#endif - -typedef struct InteriorWriter { - int iHeight; /* from 0 at leaves. */ - InteriorBlock *first, *last; - struct InteriorWriter *parentWriter; - - DataBuffer term; /* Last term written to block "last". */ - sqlite_int64 iOpeningChildBlock; /* First child block in block "last". */ -#ifndef NDEBUG - sqlite_int64 iLastChildBlock; /* for consistency checks. */ -#endif -} InteriorWriter; - -/* Initialize an interior node where pTerm[nTerm] marks the leftmost -** term in the tree. iChildBlock is the leftmost child block at the -** next level down the tree. -*/ -static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm, - sqlite_int64 iChildBlock, - InteriorWriter *pWriter){ - InteriorBlock *block; - assert( iHeight>0 ); - CLEAR(pWriter); - - pWriter->iHeight = iHeight; - pWriter->iOpeningChildBlock = iChildBlock; -#ifndef NDEBUG - pWriter->iLastChildBlock = iChildBlock; -#endif - block = interiorBlockNew(iHeight, iChildBlock, pTerm, nTerm); - pWriter->last = pWriter->first = block; - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); - dataBufferInit(&pWriter->term, 0); -} - -/* Append the child node rooted at iChildBlock to the interior node, -** with pTerm[nTerm] as the leftmost term in iChildBlock's subtree. -*/ -static void interiorWriterAppend(InteriorWriter *pWriter, - const char *pTerm, int nTerm, - sqlite_int64 iChildBlock){ - char c[VARINT_MAX+VARINT_MAX]; - int n, nPrefix = 0; - - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); - - /* The first term written into an interior node is actually - ** associated with the second child added (the first child was added - ** in interiorWriterInit, or in the if clause at the bottom of this - ** function). That term gets encoded straight up, with nPrefix left - ** at 0. - */ - if( pWriter->term.nData==0 ){ - n = putVarint(c, nTerm); - }else{ - while( nPrefixterm.nData && - pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ - nPrefix++; - } - - n = putVarint(c, nPrefix); - n += putVarint(c+n, nTerm-nPrefix); - } - -#ifndef NDEBUG - pWriter->iLastChildBlock++; -#endif - assert( pWriter->iLastChildBlock==iChildBlock ); - - /* Overflow to a new block if the new term makes the current block - ** too big, and the current block already has enough terms. - */ - if( pWriter->last->data.nData+n+nTerm-nPrefix>INTERIOR_MAX && - iChildBlock-pWriter->iOpeningChildBlock>INTERIOR_MIN_TERMS ){ - pWriter->last->next = interiorBlockNew(pWriter->iHeight, iChildBlock, - pTerm, nTerm); - pWriter->last = pWriter->last->next; - pWriter->iOpeningChildBlock = iChildBlock; - dataBufferReset(&pWriter->term); - }else{ - dataBufferAppend2(&pWriter->last->data, c, n, - pTerm+nPrefix, nTerm-nPrefix); - dataBufferReplace(&pWriter->term, pTerm, nTerm); - } - ASSERT_VALID_INTERIOR_BLOCK(pWriter->last); -} - -/* Free the space used by pWriter, including the linked-list of -** InteriorBlocks, and parentWriter, if present. -*/ -static int interiorWriterDestroy(InteriorWriter *pWriter){ - InteriorBlock *block = pWriter->first; - - while( block!=NULL ){ - InteriorBlock *b = block; - block = block->next; - dataBufferDestroy(&b->term); - dataBufferDestroy(&b->data); - free(b); - } - if( pWriter->parentWriter!=NULL ){ - interiorWriterDestroy(pWriter->parentWriter); - free(pWriter->parentWriter); - } - dataBufferDestroy(&pWriter->term); - SCRAMBLE(pWriter); - return SQLITE_OK; -} - -/* If pWriter can fit entirely in ROOT_MAX, return it as the root info -** directly, leaving *piEndBlockid unchanged. Otherwise, flush -** pWriter to %_segments, building a new layer of interior nodes, and -** recursively ask for their root into. -*/ -static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter, - char **ppRootInfo, int *pnRootInfo, - sqlite_int64 *piEndBlockid){ - InteriorBlock *block = pWriter->first; - sqlite_int64 iBlockid = 0; - int rc; - - /* If we can fit the segment inline */ - if( block==pWriter->last && block->data.nDatadata.pData; - *pnRootInfo = block->data.nData; - return SQLITE_OK; - } - - /* Flush the first block to %_segments, and create a new level of - ** interior node. - */ - ASSERT_VALID_INTERIOR_BLOCK(block); - rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - *piEndBlockid = iBlockid; - - pWriter->parentWriter = malloc(sizeof(*pWriter->parentWriter)); - interiorWriterInit(pWriter->iHeight+1, - block->term.pData, block->term.nData, - iBlockid, pWriter->parentWriter); - - /* Flush additional blocks and append to the higher interior - ** node. - */ - for(block=block->next; block!=NULL; block=block->next){ - ASSERT_VALID_INTERIOR_BLOCK(block); - rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - *piEndBlockid = iBlockid; - - interiorWriterAppend(pWriter->parentWriter, - block->term.pData, block->term.nData, iBlockid); - } - - /* Parent node gets the chance to be the root. */ - return interiorWriterRootInfo(v, pWriter->parentWriter, - ppRootInfo, pnRootInfo, piEndBlockid); -} - -/****************************************************************/ -/* InteriorReader is used to read off the data from an interior node -** (see comment at top of file for the format). -*/ -typedef struct InteriorReader { - const char *pData; - int nData; - - DataBuffer term; /* previous term, for decoding term delta. */ - - sqlite_int64 iBlockid; -} InteriorReader; - -static void interiorReaderDestroy(InteriorReader *pReader){ - dataBufferDestroy(&pReader->term); - SCRAMBLE(pReader); -} - -/* TODO(shess) The assertions are great, but what if we're in NDEBUG -** and the blob is empty or otherwise contains suspect data? -*/ -static void interiorReaderInit(const char *pData, int nData, - InteriorReader *pReader){ - int n, nTerm; - - /* Require at least the leading flag byte */ - assert( nData>0 ); - assert( pData[0]!='\0' ); - - CLEAR(pReader); - - /* Decode the base blockid, and set the cursor to the first term. */ - n = getVarint(pData+1, &pReader->iBlockid); - assert( 1+n<=nData ); - pReader->pData = pData+1+n; - pReader->nData = nData-(1+n); - - /* A single-child interior node (such as when a leaf node was too - ** large for the segment directory) won't have any terms. - ** Otherwise, decode the first term. - */ - if( pReader->nData==0 ){ - dataBufferInit(&pReader->term, 0); - }else{ - n = getVarint32(pReader->pData, &nTerm); - dataBufferInit(&pReader->term, nTerm); - dataBufferReplace(&pReader->term, pReader->pData+n, nTerm); - assert( n+nTerm<=pReader->nData ); - pReader->pData += n+nTerm; - pReader->nData -= n+nTerm; - } -} - -static int interiorReaderAtEnd(InteriorReader *pReader){ - return pReader->term.nData==0; -} - -static sqlite_int64 interiorReaderCurrentBlockid(InteriorReader *pReader){ - return pReader->iBlockid; -} - -static int interiorReaderTermBytes(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - return pReader->term.nData; -} -static const char *interiorReaderTerm(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - return pReader->term.pData; -} - -/* Step forward to the next term in the node. */ -static void interiorReaderStep(InteriorReader *pReader){ - assert( !interiorReaderAtEnd(pReader) ); - - /* If the last term has been read, signal eof, else construct the - ** next term. - */ - if( pReader->nData==0 ){ - dataBufferReset(&pReader->term); - }else{ - int n, nPrefix, nSuffix; - - n = getVarint32(pReader->pData, &nPrefix); - n += getVarint32(pReader->pData+n, &nSuffix); - - /* Truncate the current term and append suffix data. */ - pReader->term.nData = nPrefix; - dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); - - assert( n+nSuffix<=pReader->nData ); - pReader->pData += n+nSuffix; - pReader->nData -= n+nSuffix; - } - pReader->iBlockid++; -} - -/* Compare the current term to pTerm[nTerm], returning strcmp-style -** results. If isPrefix, equality means equal through nTerm bytes. -*/ -static int interiorReaderTermCmp(InteriorReader *pReader, - const char *pTerm, int nTerm, int isPrefix){ - const char *pReaderTerm = interiorReaderTerm(pReader); - int nReaderTerm = interiorReaderTermBytes(pReader); - int c, n = nReaderTerm0 ) return -1; - if( nTerm>0 ) return 1; - return 0; - } - - c = memcmp(pReaderTerm, pTerm, n); - if( c!=0 ) return c; - if( isPrefix && n==nTerm ) return 0; - return nReaderTerm - nTerm; -} - -/****************************************************************/ -/* LeafWriter is used to collect terms and associated doclist data -** into leaf blocks in %_segments (see top of file for format info). -** Expected usage is: -** -** LeafWriter writer; -** leafWriterInit(0, 0, &writer); -** while( sorted_terms_left_to_process ){ -** // data is doclist data for that term. -** rc = leafWriterStep(v, &writer, pTerm, nTerm, pData, nData); -** if( rc!=SQLITE_OK ) goto err; -** } -** rc = leafWriterFinalize(v, &writer); -**err: -** leafWriterDestroy(&writer); -** return rc; -** -** leafWriterStep() may write a collected leaf out to %_segments. -** leafWriterFinalize() finishes writing any buffered data and stores -** a root node in %_segdir. leafWriterDestroy() frees all buffers and -** InteriorWriters allocated as part of writing this segment. -** -** TODO(shess) Document leafWriterStepMerge(). -*/ - -/* Put terms with data this big in their own block. */ -#define STANDALONE_MIN 1024 - -/* Keep leaf blocks below this size. */ -#define LEAF_MAX 2048 - -typedef struct LeafWriter { - int iLevel; - int idx; - sqlite_int64 iStartBlockid; /* needed to create the root info */ - sqlite_int64 iEndBlockid; /* when we're done writing. */ - - DataBuffer term; /* previous encoded term */ - DataBuffer data; /* encoding buffer */ - - /* bytes of first term in the current node which distinguishes that - ** term from the last term of the previous node. - */ - int nTermDistinct; - - InteriorWriter parentWriter; /* if we overflow */ - int has_parent; -} LeafWriter; - -static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){ - CLEAR(pWriter); - pWriter->iLevel = iLevel; - pWriter->idx = idx; - - dataBufferInit(&pWriter->term, 32); - - /* Start out with a reasonably sized block, though it can grow. */ - dataBufferInit(&pWriter->data, LEAF_MAX); -} - -#ifndef NDEBUG -/* Verify that the data is readable as a leaf node. */ -static void leafNodeValidate(const char *pData, int nData){ - int n, iDummy; - - if( nData==0 ) return; - assert( nData>0 ); - assert( pData!=0 ); - assert( pData+nData>pData ); - - /* Must lead with a varint(0) */ - n = getVarint32(pData, &iDummy); - assert( iDummy==0 ); - assert( n>0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy<=nData ); - ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); - pData += n+iDummy; - nData -= n+iDummy; - - /* Verify that trailing terms and doclists also are readable. */ - while( nData!=0 ){ - n = getVarint32(pData, &iDummy); - assert( n>0 ); - assert( iDummy>=0 ); - assert( n0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy0 ); - assert( iDummy>0 ); - assert( n+iDummy>0 ); - assert( n+iDummy<=nData ); - ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL); - pData += n+iDummy; - nData -= n+iDummy; - } -} -#define ASSERT_VALID_LEAF_NODE(p, n) leafNodeValidate(p, n) -#else -#define ASSERT_VALID_LEAF_NODE(p, n) assert( 1 ) -#endif - -/* Flush the current leaf node to %_segments, and adding the resulting -** blockid and the starting term to the interior node which will -** contain it. -*/ -static int leafWriterInternalFlush(fulltext_vtab *v, LeafWriter *pWriter, - int iData, int nData){ - sqlite_int64 iBlockid = 0; - const char *pStartingTerm; - int nStartingTerm, rc, n; - - /* Must have the leading varint(0) flag, plus at least some - ** valid-looking data. - */ - assert( nData>2 ); - assert( iData>=0 ); - assert( iData+nData<=pWriter->data.nData ); - ASSERT_VALID_LEAF_NODE(pWriter->data.pData+iData, nData); - - rc = block_insert(v, pWriter->data.pData+iData, nData, &iBlockid); - if( rc!=SQLITE_OK ) return rc; - assert( iBlockid!=0 ); - - /* Reconstruct the first term in the leaf for purposes of building - ** the interior node. - */ - n = getVarint32(pWriter->data.pData+iData+1, &nStartingTerm); - pStartingTerm = pWriter->data.pData+iData+1+n; - assert( pWriter->data.nData>iData+1+n+nStartingTerm ); - assert( pWriter->nTermDistinct>0 ); - assert( pWriter->nTermDistinct<=nStartingTerm ); - nStartingTerm = pWriter->nTermDistinct; - - if( pWriter->has_parent ){ - interiorWriterAppend(&pWriter->parentWriter, - pStartingTerm, nStartingTerm, iBlockid); - }else{ - interiorWriterInit(1, pStartingTerm, nStartingTerm, iBlockid, - &pWriter->parentWriter); - pWriter->has_parent = 1; - } - - /* Track the span of this segment's leaf nodes. */ - if( pWriter->iEndBlockid==0 ){ - pWriter->iEndBlockid = pWriter->iStartBlockid = iBlockid; - }else{ - pWriter->iEndBlockid++; - assert( iBlockid==pWriter->iEndBlockid ); - } - - return SQLITE_OK; -} -static int leafWriterFlush(fulltext_vtab *v, LeafWriter *pWriter){ - int rc = leafWriterInternalFlush(v, pWriter, 0, pWriter->data.nData); - if( rc!=SQLITE_OK ) return rc; - - /* Re-initialize the output buffer. */ - dataBufferReset(&pWriter->data); - - return SQLITE_OK; -} - -/* Fetch the root info for the segment. If the entire leaf fits -** within ROOT_MAX, then it will be returned directly, otherwise it -** will be flushed and the root info will be returned from the -** interior node. *piEndBlockid is set to the blockid of the last -** interior or leaf node written to disk (0 if none are written at -** all). -*/ -static int leafWriterRootInfo(fulltext_vtab *v, LeafWriter *pWriter, - char **ppRootInfo, int *pnRootInfo, - sqlite_int64 *piEndBlockid){ - /* we can fit the segment entirely inline */ - if( !pWriter->has_parent && pWriter->data.nDatadata.pData; - *pnRootInfo = pWriter->data.nData; - *piEndBlockid = 0; - return SQLITE_OK; - } - - /* Flush remaining leaf data. */ - if( pWriter->data.nData>0 ){ - int rc = leafWriterFlush(v, pWriter); - if( rc!=SQLITE_OK ) return rc; - } - - /* We must have flushed a leaf at some point. */ - assert( pWriter->has_parent ); - - /* Tenatively set the end leaf blockid as the end blockid. If the - ** interior node can be returned inline, this will be the final - ** blockid, otherwise it will be overwritten by - ** interiorWriterRootInfo(). - */ - *piEndBlockid = pWriter->iEndBlockid; - - return interiorWriterRootInfo(v, &pWriter->parentWriter, - ppRootInfo, pnRootInfo, piEndBlockid); -} - -/* Collect the rootInfo data and store it into the segment directory. -** This has the effect of flushing the segment's leaf data to -** %_segments, and also flushing any interior nodes to %_segments. -*/ -static int leafWriterFinalize(fulltext_vtab *v, LeafWriter *pWriter){ - sqlite_int64 iEndBlockid; - char *pRootInfo; - int rc, nRootInfo; - - rc = leafWriterRootInfo(v, pWriter, &pRootInfo, &nRootInfo, &iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - /* Don't bother storing an entirely empty segment. */ - if( iEndBlockid==0 && nRootInfo==0 ) return SQLITE_OK; - - return segdir_set(v, pWriter->iLevel, pWriter->idx, - pWriter->iStartBlockid, pWriter->iEndBlockid, - iEndBlockid, pRootInfo, nRootInfo); -} - -static void leafWriterDestroy(LeafWriter *pWriter){ - if( pWriter->has_parent ) interiorWriterDestroy(&pWriter->parentWriter); - dataBufferDestroy(&pWriter->term); - dataBufferDestroy(&pWriter->data); -} - -/* Encode a term into the leafWriter, delta-encoding as appropriate. -** Returns the length of the new term which distinguishes it from the -** previous term, which can be used to set nTermDistinct when a node -** boundary is crossed. -*/ -static int leafWriterEncodeTerm(LeafWriter *pWriter, - const char *pTerm, int nTerm){ - char c[VARINT_MAX+VARINT_MAX]; - int n, nPrefix = 0; - - assert( nTerm>0 ); - while( nPrefixterm.nData && - pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){ - nPrefix++; - /* Failing this implies that the terms weren't in order. */ - assert( nPrefixdata.nData==0 ){ - /* Encode the node header and leading term as: - ** varint(0) - ** varint(nTerm) - ** char pTerm[nTerm] - */ - n = putVarint(c, '\0'); - n += putVarint(c+n, nTerm); - dataBufferAppend2(&pWriter->data, c, n, pTerm, nTerm); - }else{ - /* Delta-encode the term as: - ** varint(nPrefix) - ** varint(nSuffix) - ** char pTermSuffix[nSuffix] - */ - n = putVarint(c, nPrefix); - n += putVarint(c+n, nTerm-nPrefix); - dataBufferAppend2(&pWriter->data, c, n, pTerm+nPrefix, nTerm-nPrefix); - } - dataBufferReplace(&pWriter->term, pTerm, nTerm); - - return nPrefix+1; -} - -/* Used to avoid a memmove when a large amount of doclist data is in -** the buffer. This constructs a node and term header before -** iDoclistData and flushes the resulting complete node using -** leafWriterInternalFlush(). -*/ -static int leafWriterInlineFlush(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - int iDoclistData){ - char c[VARINT_MAX+VARINT_MAX]; - int iData, n = putVarint(c, 0); - n += putVarint(c+n, nTerm); - - /* There should always be room for the header. Even if pTerm shared - ** a substantial prefix with the previous term, the entire prefix - ** could be constructed from earlier data in the doclist, so there - ** should be room. - */ - assert( iDoclistData>=n+nTerm ); - - iData = iDoclistData-(n+nTerm); - memcpy(pWriter->data.pData+iData, c, n); - memcpy(pWriter->data.pData+iData+n, pTerm, nTerm); - - return leafWriterInternalFlush(v, pWriter, iData, pWriter->data.nData-iData); -} - -/* Push pTerm[nTerm] along with the doclist data to the leaf layer of -** %_segments. -*/ -static int leafWriterStepMerge(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - DLReader *pReaders, int nReaders){ - char c[VARINT_MAX+VARINT_MAX]; - int iTermData = pWriter->data.nData, iDoclistData; - int i, nData, n, nActualData, nActual, rc, nTermDistinct; - - ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); - nTermDistinct = leafWriterEncodeTerm(pWriter, pTerm, nTerm); - - /* Remember nTermDistinct if opening a new node. */ - if( iTermData==0 ) pWriter->nTermDistinct = nTermDistinct; - - iDoclistData = pWriter->data.nData; - - /* Estimate the length of the merged doclist so we can leave space - ** to encode it. - */ - for(i=0, nData=0; idata, c, n); - - docListMerge(&pWriter->data, pReaders, nReaders); - ASSERT_VALID_DOCLIST(DL_DEFAULT, - pWriter->data.pData+iDoclistData+n, - pWriter->data.nData-iDoclistData-n, NULL); - - /* The actual amount of doclist data at this point could be smaller - ** than the length we encoded. Additionally, the space required to - ** encode this length could be smaller. For small doclists, this is - ** not a big deal, we can just use memmove() to adjust things. - */ - nActualData = pWriter->data.nData-(iDoclistData+n); - nActual = putVarint(c, nActualData); - assert( nActualData<=nData ); - assert( nActual<=n ); - - /* If the new doclist is big enough for force a standalone leaf - ** node, we can immediately flush it inline without doing the - ** memmove(). - */ - /* TODO(shess) This test matches leafWriterStep(), which does this - ** test before it knows the cost to varint-encode the term and - ** doclist lengths. At some point, change to - ** pWriter->data.nData-iTermData>STANDALONE_MIN. - */ - if( nTerm+nActualData>STANDALONE_MIN ){ - /* Push leaf node from before this term. */ - if( iTermData>0 ){ - rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); - if( rc!=SQLITE_OK ) return rc; - - pWriter->nTermDistinct = nTermDistinct; - } - - /* Fix the encoded doclist length. */ - iDoclistData += n - nActual; - memcpy(pWriter->data.pData+iDoclistData, c, nActual); - - /* Push the standalone leaf node. */ - rc = leafWriterInlineFlush(v, pWriter, pTerm, nTerm, iDoclistData); - if( rc!=SQLITE_OK ) return rc; - - /* Leave the node empty. */ - dataBufferReset(&pWriter->data); - - return rc; - } - - /* At this point, we know that the doclist was small, so do the - ** memmove if indicated. - */ - if( nActualdata.pData+iDoclistData+nActual, - pWriter->data.pData+iDoclistData+n, - pWriter->data.nData-(iDoclistData+n)); - pWriter->data.nData -= n-nActual; - } - - /* Replace written length with actual length. */ - memcpy(pWriter->data.pData+iDoclistData, c, nActual); - - /* If the node is too large, break things up. */ - /* TODO(shess) This test matches leafWriterStep(), which does this - ** test before it knows the cost to varint-encode the term and - ** doclist lengths. At some point, change to - ** pWriter->data.nData>LEAF_MAX. - */ - if( iTermData+nTerm+nActualData>LEAF_MAX ){ - /* Flush out the leading data as a node */ - rc = leafWriterInternalFlush(v, pWriter, 0, iTermData); - if( rc!=SQLITE_OK ) return rc; - - pWriter->nTermDistinct = nTermDistinct; - - /* Rebuild header using the current term */ - n = putVarint(pWriter->data.pData, 0); - n += putVarint(pWriter->data.pData+n, nTerm); - memcpy(pWriter->data.pData+n, pTerm, nTerm); - n += nTerm; - - /* There should always be room, because the previous encoding - ** included all data necessary to construct the term. - */ - assert( ndata.nData-iDoclistDatadata.pData+n, - pWriter->data.pData+iDoclistData, - pWriter->data.nData-iDoclistData); - pWriter->data.nData -= iDoclistData-n; - } - ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData); - - return SQLITE_OK; -} - -/* Push pTerm[nTerm] along with the doclist data to the leaf layer of -** %_segments. -*/ -/* TODO(shess) Revise writeZeroSegment() so that doclists are -** constructed directly in pWriter->data. -*/ -static int leafWriterStep(fulltext_vtab *v, LeafWriter *pWriter, - const char *pTerm, int nTerm, - const char *pData, int nData){ - int rc; - DLReader reader; - - dlrInit(&reader, DL_DEFAULT, pData, nData); - rc = leafWriterStepMerge(v, pWriter, pTerm, nTerm, &reader, 1); - dlrDestroy(&reader); - - return rc; -} - - -/****************************************************************/ -/* LeafReader is used to iterate over an individual leaf node. */ -typedef struct LeafReader { - DataBuffer term; /* copy of current term. */ - - const char *pData; /* data for current term. */ - int nData; -} LeafReader; - -static void leafReaderDestroy(LeafReader *pReader){ - dataBufferDestroy(&pReader->term); - SCRAMBLE(pReader); -} - -static int leafReaderAtEnd(LeafReader *pReader){ - return pReader->nData<=0; -} - -/* Access the current term. */ -static int leafReaderTermBytes(LeafReader *pReader){ - return pReader->term.nData; -} -static const char *leafReaderTerm(LeafReader *pReader){ - assert( pReader->term.nData>0 ); - return pReader->term.pData; -} - -/* Access the doclist data for the current term. */ -static int leafReaderDataBytes(LeafReader *pReader){ - int nData; - assert( pReader->term.nData>0 ); - getVarint32(pReader->pData, &nData); - return nData; -} -static const char *leafReaderData(LeafReader *pReader){ - int n, nData; - assert( pReader->term.nData>0 ); - n = getVarint32(pReader->pData, &nData); - return pReader->pData+n; -} - -static void leafReaderInit(const char *pData, int nData, - LeafReader *pReader){ - int nTerm, n; - - assert( nData>0 ); - assert( pData[0]=='\0' ); - - CLEAR(pReader); - - /* Read the first term, skipping the header byte. */ - n = getVarint32(pData+1, &nTerm); - dataBufferInit(&pReader->term, nTerm); - dataBufferReplace(&pReader->term, pData+1+n, nTerm); - - /* Position after the first term. */ - assert( 1+n+nTermpData = pData+1+n+nTerm; - pReader->nData = nData-1-n-nTerm; -} - -/* Step the reader forward to the next term. */ -static void leafReaderStep(LeafReader *pReader){ - int n, nData, nPrefix, nSuffix; - assert( !leafReaderAtEnd(pReader) ); - - /* Skip previous entry's data block. */ - n = getVarint32(pReader->pData, &nData); - assert( n+nData<=pReader->nData ); - pReader->pData += n+nData; - pReader->nData -= n+nData; - - if( !leafReaderAtEnd(pReader) ){ - /* Construct the new term using a prefix from the old term plus a - ** suffix from the leaf data. - */ - n = getVarint32(pReader->pData, &nPrefix); - n += getVarint32(pReader->pData+n, &nSuffix); - assert( n+nSuffixnData ); - pReader->term.nData = nPrefix; - dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix); - - pReader->pData += n+nSuffix; - pReader->nData -= n+nSuffix; - } -} - -/* strcmp-style comparison of pReader's current term against pTerm. -** If isPrefix, equality means equal through nTerm bytes. -*/ -static int leafReaderTermCmp(LeafReader *pReader, - const char *pTerm, int nTerm, int isPrefix){ - int c, n = pReader->term.nDataterm.nData : nTerm; - if( n==0 ){ - if( pReader->term.nData>0 ) return -1; - if(nTerm>0 ) return 1; - return 0; - } - - c = memcmp(pReader->term.pData, pTerm, n); - if( c!=0 ) return c; - if( isPrefix && n==nTerm ) return 0; - return pReader->term.nData - nTerm; -} - - -/****************************************************************/ -/* LeavesReader wraps LeafReader to allow iterating over the entire -** leaf layer of the tree. -*/ -typedef struct LeavesReader { - int idx; /* Index within the segment. */ - - sqlite3_stmt *pStmt; /* Statement we're streaming leaves from. */ - int eof; /* we've seen SQLITE_DONE from pStmt. */ - - LeafReader leafReader; /* reader for the current leaf. */ - DataBuffer rootData; /* root data for inline. */ -} LeavesReader; - -/* Access the current term. */ -static int leavesReaderTermBytes(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderTermBytes(&pReader->leafReader); -} -static const char *leavesReaderTerm(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderTerm(&pReader->leafReader); -} - -/* Access the doclist data for the current term. */ -static int leavesReaderDataBytes(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderDataBytes(&pReader->leafReader); -} -static const char *leavesReaderData(LeavesReader *pReader){ - assert( !pReader->eof ); - return leafReaderData(&pReader->leafReader); -} - -static int leavesReaderAtEnd(LeavesReader *pReader){ - return pReader->eof; -} - -/* loadSegmentLeaves() may not read all the way to SQLITE_DONE, thus -** leaving the statement handle open, which locks the table. -*/ -/* TODO(shess) This "solution" is not satisfactory. Really, there -** should be check-in function for all statement handles which -** arranges to call sqlite3_reset(). This most likely will require -** modification to control flow all over the place, though, so for now -** just punt. -** -** Note the the current system assumes that segment merges will run to -** completion, which is why this particular probably hasn't arisen in -** this case. Probably a brittle assumption. -*/ -static int leavesReaderReset(LeavesReader *pReader){ - return sqlite3_reset(pReader->pStmt); -} - -static void leavesReaderDestroy(LeavesReader *pReader){ - leafReaderDestroy(&pReader->leafReader); - dataBufferDestroy(&pReader->rootData); - SCRAMBLE(pReader); -} - -/* Initialize pReader with the given root data (if iStartBlockid==0 -** the leaf data was entirely contained in the root), or from the -** stream of blocks between iStartBlockid and iEndBlockid, inclusive. -*/ -static int leavesReaderInit(fulltext_vtab *v, - int idx, - sqlite_int64 iStartBlockid, - sqlite_int64 iEndBlockid, - const char *pRootData, int nRootData, - LeavesReader *pReader){ - CLEAR(pReader); - pReader->idx = idx; - - dataBufferInit(&pReader->rootData, 0); - if( iStartBlockid==0 ){ - /* Entire leaf level fit in root data. */ - dataBufferReplace(&pReader->rootData, pRootData, nRootData); - leafReaderInit(pReader->rootData.pData, pReader->rootData.nData, - &pReader->leafReader); - }else{ - sqlite3_stmt *s; - int rc = sql_get_leaf_statement(v, idx, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iStartBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 2, iEndBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ){ - pReader->eof = 1; - return SQLITE_OK; - } - if( rc!=SQLITE_ROW ) return rc; - - pReader->pStmt = s; - leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), - sqlite3_column_bytes(pReader->pStmt, 0), - &pReader->leafReader); - } - return SQLITE_OK; -} - -/* Step the current leaf forward to the next term. If we reach the -** end of the current leaf, step forward to the next leaf block. -*/ -static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){ - assert( !leavesReaderAtEnd(pReader) ); - leafReaderStep(&pReader->leafReader); - - if( leafReaderAtEnd(&pReader->leafReader) ){ - int rc; - if( pReader->rootData.pData ){ - pReader->eof = 1; - return SQLITE_OK; - } - rc = sqlite3_step(pReader->pStmt); - if( rc!=SQLITE_ROW ){ - pReader->eof = 1; - return rc==SQLITE_DONE ? SQLITE_OK : rc; - } - leafReaderDestroy(&pReader->leafReader); - leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), - sqlite3_column_bytes(pReader->pStmt, 0), - &pReader->leafReader); - } - return SQLITE_OK; -} - -/* Order LeavesReaders by their term, ignoring idx. Readers at eof -** always sort to the end. -*/ -static int leavesReaderTermCmp(LeavesReader *lr1, LeavesReader *lr2){ - if( leavesReaderAtEnd(lr1) ){ - if( leavesReaderAtEnd(lr2) ) return 0; - return 1; - } - if( leavesReaderAtEnd(lr2) ) return -1; - - return leafReaderTermCmp(&lr1->leafReader, - leavesReaderTerm(lr2), leavesReaderTermBytes(lr2), - 0); -} - -/* Similar to leavesReaderTermCmp(), with additional ordering by idx -** so that older segments sort before newer segments. -*/ -static int leavesReaderCmp(LeavesReader *lr1, LeavesReader *lr2){ - int c = leavesReaderTermCmp(lr1, lr2); - if( c!=0 ) return c; - return lr1->idx-lr2->idx; -} - -/* Assume that pLr[1]..pLr[nLr] are sorted. Bubble pLr[0] into its -** sorted position. -*/ -static void leavesReaderReorder(LeavesReader *pLr, int nLr){ - while( nLr>1 && leavesReaderCmp(pLr, pLr+1)>0 ){ - LeavesReader tmp = pLr[0]; - pLr[0] = pLr[1]; - pLr[1] = tmp; - nLr--; - pLr++; - } -} - -/* Initializes pReaders with the segments from level iLevel, returning -** the number of segments in *piReaders. Leaves pReaders in sorted -** order. -*/ -static int leavesReadersInit(fulltext_vtab *v, int iLevel, - LeavesReader *pReaders, int *piReaders){ - sqlite3_stmt *s; - int i, rc = sql_get_statement(v, SEGDIR_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int(s, 1, iLevel); - if( rc!=SQLITE_OK ) return rc; - - i = 0; - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - sqlite_int64 iStart = sqlite3_column_int64(s, 0); - sqlite_int64 iEnd = sqlite3_column_int64(s, 1); - const char *pRootData = sqlite3_column_blob(s, 2); - int nRootData = sqlite3_column_bytes(s, 2); - - assert( i0 ){ - leavesReaderDestroy(&pReaders[i]); - } - return rc; - } - - *piReaders = i; - - /* Leave our results sorted by term, then age. */ - while( i-- ){ - leavesReaderReorder(pReaders+i, *piReaders-i); - } - return SQLITE_OK; -} - -/* Merge doclists from pReaders[nReaders] into a single doclist, which -** is written to pWriter. Assumes pReaders is ordered oldest to -** newest. -*/ -/* TODO(shess) Consider putting this inline in segmentMerge(). */ -static int leavesReadersMerge(fulltext_vtab *v, - LeavesReader *pReaders, int nReaders, - LeafWriter *pWriter){ - DLReader dlReaders[MERGE_COUNT]; - const char *pTerm = leavesReaderTerm(pReaders); - int i, nTerm = leavesReaderTermBytes(pReaders); - - assert( nReaders<=MERGE_COUNT ); - - for(i=0; i0 ){ - rc = leavesReaderStep(v, lrs+i); - if( rc!=SQLITE_OK ) goto err; - - /* Reorder by term, then by age. */ - leavesReaderReorder(lrs+i, MERGE_COUNT-i); - } - } - - for(i=0; i0 ); - - /* Process while the prefix matches. */ - while( !leavesReaderAtEnd(pReader) ){ - /* TODO(shess) Really want leavesReaderTermCmp(), but that name is - ** already taken to compare the terms of two LeavesReaders. Think - ** on a better name. [Meanwhile, break encapsulation rather than - ** use a confusing name.] - */ - int rc; - int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix); - if( c==0 ){ - const char *pData = leavesReaderData(pReader); - int nData = leavesReaderDataBytes(pReader); - if( out->nData==0 ){ - dataBufferReplace(out, pData, nData); - }else{ - DataBuffer result; - dataBufferInit(&result, out->nData+nData); - docListUnion(out->pData, out->nData, pData, nData, &result); - dataBufferDestroy(out); - *out = result; - /* TODO(shess) Rather than destroy out, we could retain it for - ** later reuse. - */ - } - } - if( c>0 ) break; /* Past any possible matches. */ - - rc = leavesReaderStep(v, pReader); - if( rc!=SQLITE_OK ) return rc; - } - return SQLITE_OK; -} - -/* Call loadSegmentLeavesInt() with pData/nData as input. */ -static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - LeavesReader reader; - int rc; - - assert( nData>1 ); - assert( *pData=='\0' ); - rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader); - if( rc!=SQLITE_OK ) return rc; - - rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); - leavesReaderReset(&reader); - leavesReaderDestroy(&reader); - return rc; -} - -/* Call loadSegmentLeavesInt() with the leaf nodes from iStartLeaf to -** iEndLeaf (inclusive) as input, and merge the resulting doclist into -** out. -*/ -static int loadSegmentLeaves(fulltext_vtab *v, - sqlite_int64 iStartLeaf, sqlite_int64 iEndLeaf, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - int rc; - LeavesReader reader; - - assert( iStartLeaf<=iEndLeaf ); - rc = leavesReaderInit(v, 0, iStartLeaf, iEndLeaf, NULL, 0, &reader); - if( rc!=SQLITE_OK ) return rc; - - rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out); - leavesReaderReset(&reader); - leavesReaderDestroy(&reader); - return rc; -} - -/* Taking pData/nData as an interior node, find the sequence of child -** nodes which could include pTerm/nTerm/isPrefix. Note that the -** interior node terms logically come between the blocks, so there is -** one more blockid than there are terms (that block contains terms >= -** the last interior-node term). -*/ -/* TODO(shess) The calling code may already know that the end child is -** not worth calculating, because the end may be in a later sibling -** node. Consider whether breaking symmetry is worthwhile. I suspect -** it's not worthwhile. -*/ -static void getChildrenContaining(const char *pData, int nData, - const char *pTerm, int nTerm, int isPrefix, - sqlite_int64 *piStartChild, - sqlite_int64 *piEndChild){ - InteriorReader reader; - - assert( nData>1 ); - assert( *pData!='\0' ); - interiorReaderInit(pData, nData, &reader); - - /* Scan for the first child which could contain pTerm/nTerm. */ - while( !interiorReaderAtEnd(&reader) ){ - if( interiorReaderTermCmp(&reader, pTerm, nTerm, 0)>0 ) break; - interiorReaderStep(&reader); - } - *piStartChild = interiorReaderCurrentBlockid(&reader); - - /* Keep scanning to find a term greater than our term, using prefix - ** comparison if indicated. If isPrefix is false, this will be the - ** same blockid as the starting block. - */ - while( !interiorReaderAtEnd(&reader) ){ - if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break; - interiorReaderStep(&reader); - } - *piEndChild = interiorReaderCurrentBlockid(&reader); - - interiorReaderDestroy(&reader); - - /* Children must ascend, and if !prefix, both must be the same. */ - assert( *piEndChild>=*piStartChild ); - assert( isPrefix || *piStartChild==*piEndChild ); -} - -/* Read block at iBlockid and pass it with other params to -** getChildrenContaining(). -*/ -static int loadAndGetChildrenContaining( - fulltext_vtab *v, - sqlite_int64 iBlockid, - const char *pTerm, int nTerm, int isPrefix, - sqlite_int64 *piStartChild, sqlite_int64 *piEndChild -){ - sqlite3_stmt *s = NULL; - int rc; - - assert( iBlockid!=0 ); - assert( pTerm!=NULL ); - assert( nTerm!=0 ); /* TODO(shess) Why not allow this? */ - assert( piStartChild!=NULL ); - assert( piEndChild!=NULL ); - - rc = sql_get_statement(v, BLOCK_SELECT_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_bind_int64(s, 1, iBlockid); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3_step(s); - if( rc==SQLITE_DONE ) return SQLITE_ERROR; - if( rc!=SQLITE_ROW ) return rc; - - getChildrenContaining(sqlite3_column_blob(s, 0), sqlite3_column_bytes(s, 0), - pTerm, nTerm, isPrefix, piStartChild, piEndChild); - - /* We expect only one row. We must execute another sqlite3_step() - * to complete the iteration; otherwise the table will remain - * locked. */ - rc = sqlite3_step(s); - if( rc==SQLITE_ROW ) return SQLITE_ERROR; - if( rc!=SQLITE_DONE ) return rc; - - return SQLITE_OK; -} - -/* Traverse the tree represented by pData[nData] looking for -** pTerm[nTerm], placing its doclist into *out. This is internal to -** loadSegment() to make error-handling cleaner. -*/ -static int loadSegmentInt(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 iLeavesEnd, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - /* Special case where root is a leaf. */ - if( *pData=='\0' ){ - return loadSegmentLeaf(v, pData, nData, pTerm, nTerm, isPrefix, out); - }else{ - int rc; - sqlite_int64 iStartChild, iEndChild; - - /* Process pData as an interior node, then loop down the tree - ** until we find the set of leaf nodes to scan for the term. - */ - getChildrenContaining(pData, nData, pTerm, nTerm, isPrefix, - &iStartChild, &iEndChild); - while( iStartChild>iLeavesEnd ){ - sqlite_int64 iNextStart, iNextEnd; - rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix, - &iNextStart, &iNextEnd); - if( rc!=SQLITE_OK ) return rc; - - /* If we've branched, follow the end branch, too. */ - if( iStartChild!=iEndChild ){ - sqlite_int64 iDummy; - rc = loadAndGetChildrenContaining(v, iEndChild, pTerm, nTerm, isPrefix, - &iDummy, &iNextEnd); - if( rc!=SQLITE_OK ) return rc; - } - - assert( iNextStart<=iNextEnd ); - iStartChild = iNextStart; - iEndChild = iNextEnd; - } - assert( iStartChild<=iLeavesEnd ); - assert( iEndChild<=iLeavesEnd ); - - /* Scan through the leaf segments for doclists. */ - return loadSegmentLeaves(v, iStartChild, iEndChild, - pTerm, nTerm, isPrefix, out); - } -} - -/* Call loadSegmentInt() to collect the doclist for pTerm/nTerm, then -** merge its doclist over *out (any duplicate doclists read from the -** segment rooted at pData will overwrite those in *out). -*/ -/* TODO(shess) Consider changing this to determine the depth of the -** leaves using either the first characters of interior nodes (when -** ==1, we're one level above the leaves), or the first character of -** the root (which will describe the height of the tree directly). -** Either feels somewhat tricky to me. -*/ -/* TODO(shess) The current merge is likely to be slow for large -** doclists (though it should process from newest/smallest to -** oldest/largest, so it may not be that bad). It might be useful to -** modify things to allow for N-way merging. This could either be -** within a segment, with pairwise merges across segments, or across -** all segments at once. -*/ -static int loadSegment(fulltext_vtab *v, const char *pData, int nData, - sqlite_int64 iLeavesEnd, - const char *pTerm, int nTerm, int isPrefix, - DataBuffer *out){ - DataBuffer result; - int rc; - - assert( nData>1 ); - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); - - dataBufferInit(&result, 0); - rc = loadSegmentInt(v, pData, nData, iLeavesEnd, - pTerm, nTerm, isPrefix, &result); - if( rc==SQLITE_OK && result.nData>0 ){ - if( out->nData==0 ){ - DataBuffer tmp = *out; - *out = result; - result = tmp; - }else{ - DataBuffer merged; - DLReader readers[2]; - - dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData); - dlrInit(&readers[1], DL_DEFAULT, result.pData, result.nData); - dataBufferInit(&merged, out->nData+result.nData); - docListMerge(&merged, readers, 2); - dataBufferDestroy(out); - *out = merged; - dlrDestroy(&readers[0]); - dlrDestroy(&readers[1]); - } - } - dataBufferDestroy(&result); - return rc; -} - -/* Scan the database and merge together the posting lists for the term -** into *out. -*/ -static int termSelect(fulltext_vtab *v, int iColumn, - const char *pTerm, int nTerm, int isPrefix, - DocListType iType, DataBuffer *out){ - DataBuffer doclist; - sqlite3_stmt *s; - int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s); - if( rc!=SQLITE_OK ) return rc; - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); - - dataBufferInit(&doclist, 0); - - /* Traverse the segments from oldest to newest so that newer doclist - ** elements for given docids overwrite older elements. - */ - while( (rc = sqlite3_step(s))==SQLITE_ROW ){ - const char *pData = sqlite3_column_blob(s, 0); - const int nData = sqlite3_column_bytes(s, 0); - const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); - rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix, - &doclist); - if( rc!=SQLITE_OK ) goto err; - } - if( rc==SQLITE_DONE ){ - if( doclist.nData!=0 ){ - /* TODO(shess) The old term_select_all() code applied the column - ** restrict as we merged segments, leading to smaller buffers. - ** This is probably worthwhile to bring back, once the new storage - ** system is checked in. - */ - if( iColumn==v->nColumn) iColumn = -1; - docListTrim(DL_DEFAULT, doclist.pData, doclist.nData, - iColumn, iType, out); - } - rc = SQLITE_OK; - } - - err: - dataBufferDestroy(&doclist); - return rc; -} - -/****************************************************************/ -/* Used to hold hashtable data for sorting. */ -typedef struct TermData { - const char *pTerm; - int nTerm; - DLCollector *pCollector; -} TermData; - -/* Orders TermData elements in strcmp fashion ( <0 for less-than, 0 -** for equal, >0 for greater-than). -*/ -static int termDataCmp(const void *av, const void *bv){ - const TermData *a = (const TermData *)av; - const TermData *b = (const TermData *)bv; - int n = a->nTermnTerm ? a->nTerm : b->nTerm; - int c = memcmp(a->pTerm, b->pTerm, n); - if( c!=0 ) return c; - return a->nTerm-b->nTerm; -} - -/* Order pTerms data by term, then write a new level 0 segment using -** LeafWriter. -*/ -static int writeZeroSegment(fulltext_vtab *v, fts3Hash *pTerms){ - fts3HashElem *e; - int idx, rc, i, n; - TermData *pData; - LeafWriter writer; - DataBuffer dl; - - /* Determine the next index at level 0, merging as necessary. */ - rc = segdirNextIndex(v, 0, &idx); - if( rc!=SQLITE_OK ) return rc; - - n = fts3HashCount(pTerms); - pData = malloc(n*sizeof(TermData)); - - for(i = 0, e = fts3HashFirst(pTerms); e; i++, e = fts3HashNext(e)){ - assert( i1 ) qsort(pData, n, sizeof(*pData), termDataCmp); - - /* TODO(shess) Refactor so that we can write directly to the segment - ** DataBuffer, as happens for segment merges. - */ - leafWriterInit(0, idx, &writer); - dataBufferInit(&dl, 0); - for(i=0; inPendingData>=0 ){ - fts3HashElem *e; - for(e=fts3HashFirst(&v->pendingTerms); e; e=fts3HashNext(e)){ - dlcDelete(fts3HashData(e)); - } - fts3HashClear(&v->pendingTerms); - v->nPendingData = -1; - } - return SQLITE_OK; -} - -/* If pendingTerms has data, flush it to a level-zero segment, and -** free it. -*/ -static int flushPendingTerms(fulltext_vtab *v){ - if( v->nPendingData>=0 ){ - int rc = writeZeroSegment(v, &v->pendingTerms); - if( rc==SQLITE_OK ) clearPendingTerms(v); - return rc; - } - return SQLITE_OK; -} - -/* If pendingTerms is "too big", or docid is out of order, flush it. -** Regardless, be certain that pendingTerms is initialized for use. -*/ -static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid){ - /* TODO(shess) Explore whether partially flushing the buffer on - ** forced-flush would provide better performance. I suspect that if - ** we ordered the doclists by size and flushed the largest until the - ** buffer was half empty, that would let the less frequent terms - ** generate longer doclists. - */ - if( iDocid<=v->iPrevDocid || v->nPendingData>kPendingThreshold ){ - int rc = flushPendingTerms(v); - if( rc!=SQLITE_OK ) return rc; - } - if( v->nPendingData<0 ){ - fts3HashInit(&v->pendingTerms, FTS3_HASH_STRING, 1); - v->nPendingData = 0; - } - v->iPrevDocid = iDocid; - return SQLITE_OK; -} - -/* This function implements the xUpdate callback; it's the top-level entry - * point for inserting, deleting or updating a row in a full-text table. */ -static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg, - sqlite_int64 *pRowid){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - int rc; - - TRACE(("FTS3 Update %p\n", pVtab)); - - if( nArg<2 ){ - rc = index_delete(v, sqlite3_value_int64(ppArg[0])); - } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){ - /* An update: - * ppArg[0] = old rowid - * ppArg[1] = new rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - * ppArg[2+v->nColumn+1] = value for docid - */ - sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]); - if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER || - sqlite3_value_int64(ppArg[1]) != rowid ){ - rc = SQLITE_ERROR; /* we don't allow changing the rowid */ - }else if( sqlite3_value_type(ppArg[2+v->nColumn+1]) != SQLITE_INTEGER || - sqlite3_value_int64(ppArg[2+v->nColumn+1]) != rowid ){ - rc = SQLITE_ERROR; /* we don't allow changing the docid */ - }else{ - assert( nArg==2+v->nColumn+2); - rc = index_update(v, rowid, &ppArg[2]); - } - } else { - /* An insert: - * ppArg[1] = requested rowid - * ppArg[2..2+v->nColumn-1] = values - * ppArg[2+v->nColumn] = value for magic column (we ignore this) - * ppArg[2+v->nColumn+1] = value for docid - */ - sqlite3_value *pRequestDocid = ppArg[2+v->nColumn+1]; - assert( nArg==2+v->nColumn+2); - if( SQLITE_NULL != sqlite3_value_type(pRequestDocid) && - SQLITE_NULL != sqlite3_value_type(ppArg[1]) ){ - /* TODO(shess) Consider allowing this to work if the values are - ** identical. I'm inclined to discourage that usage, though, - ** given that both rowid and docid are special columns. Better - ** would be to define one or the other as the default winner, - ** but should it be fts3-centric (docid) or SQLite-centric - ** (rowid)? - */ - rc = SQLITE_ERROR; - }else{ - if( SQLITE_NULL == sqlite3_value_type(pRequestDocid) ){ - pRequestDocid = ppArg[1]; - } - rc = index_insert(v, pRequestDocid, &ppArg[2], pRowid); - } - } - - return rc; -} - -static int fulltextSync(sqlite3_vtab *pVtab){ - TRACE(("FTS3 xSync()\n")); - return flushPendingTerms((fulltext_vtab *)pVtab); -} - -static int fulltextBegin(sqlite3_vtab *pVtab){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - TRACE(("FTS3 xBegin()\n")); - - /* Any buffered updates should have been cleared by the previous - ** transaction. - */ - assert( v->nPendingData<0 ); - return clearPendingTerms(v); -} - -static int fulltextCommit(sqlite3_vtab *pVtab){ - fulltext_vtab *v = (fulltext_vtab *) pVtab; - TRACE(("FTS3 xCommit()\n")); - - /* Buffered updates should have been cleared by fulltextSync(). */ - assert( v->nPendingData<0 ); - return clearPendingTerms(v); -} - -static int fulltextRollback(sqlite3_vtab *pVtab){ - TRACE(("FTS3 xRollback()\n")); - return clearPendingTerms((fulltext_vtab *)pVtab); -} - -/* -** Implementation of the snippet() function for FTS3 -*/ -static void snippetFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1); - }else{ - const char *zStart = ""; - const char *zEnd = ""; - const char *zEllipsis = "..."; - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - if( argc>=2 ){ - zStart = (const char*)sqlite3_value_text(argv[1]); - if( argc>=3 ){ - zEnd = (const char*)sqlite3_value_text(argv[2]); - if( argc>=4 ){ - zEllipsis = (const char*)sqlite3_value_text(argv[3]); - } - } - } - snippetAllOffsets(pCursor); - snippetText(pCursor, zStart, zEnd, zEllipsis); - sqlite3_result_text(pContext, pCursor->snippet.zSnippet, - pCursor->snippet.nSnippet, SQLITE_STATIC); - } -} - -/* -** Implementation of the offsets() function for FTS3 -*/ -static void snippetOffsetsFunc( - sqlite3_context *pContext, - int argc, - sqlite3_value **argv -){ - fulltext_cursor *pCursor; - if( argc<1 ) return; - if( sqlite3_value_type(argv[0])!=SQLITE_BLOB || - sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){ - sqlite3_result_error(pContext, "illegal first argument to offsets",-1); - }else{ - memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor)); - snippetAllOffsets(pCursor); - snippetOffsetText(&pCursor->snippet); - sqlite3_result_text(pContext, - pCursor->snippet.zOffset, pCursor->snippet.nOffset, - SQLITE_STATIC); - } -} - -/* -** This routine implements the xFindFunction method for the FTS3 -** virtual table. -*/ -static int fulltextFindFunction( - sqlite3_vtab *pVtab, - int nArg, - const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg -){ - if( strcmp(zName,"snippet")==0 ){ - *pxFunc = snippetFunc; - return 1; - }else if( strcmp(zName,"offsets")==0 ){ - *pxFunc = snippetOffsetsFunc; - return 1; - } - return 0; -} - -/* -** Rename an fts3 table. -*/ -static int fulltextRename( - sqlite3_vtab *pVtab, - const char *zName -){ - fulltext_vtab *p = (fulltext_vtab *)pVtab; - int rc = SQLITE_NOMEM; - char *zSql = sqlite3_mprintf( - "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';" - "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';" - "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';" - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - , p->zDb, p->zName, zName - ); - if( zSql ){ - rc = sqlite3_exec(p->db, zSql, 0, 0, 0); - sqlite3_free(zSql); - } - return rc; -} - -static const sqlite3_module fts3Module = { - /* iVersion */ 0, - /* xCreate */ fulltextCreate, - /* xConnect */ fulltextConnect, - /* xBestIndex */ fulltextBestIndex, - /* xDisconnect */ fulltextDisconnect, - /* xDestroy */ fulltextDestroy, - /* xOpen */ fulltextOpen, - /* xClose */ fulltextClose, - /* xFilter */ fulltextFilter, - /* xNext */ fulltextNext, - /* xEof */ fulltextEof, - /* xColumn */ fulltextColumn, - /* xRowid */ fulltextRowid, - /* xUpdate */ fulltextUpdate, - /* xBegin */ fulltextBegin, - /* xSync */ fulltextSync, - /* xCommit */ fulltextCommit, - /* xRollback */ fulltextRollback, - /* xFindFunction */ fulltextFindFunction, - /* xRename */ fulltextRename, -}; - -static void hashDestroy(void *p){ - fts3Hash *pHash = (fts3Hash *)p; - sqlite3Fts3HashClear(pHash); - sqlite3_free(pHash); -} - -/* -** The fts3 built-in tokenizers - "simple" and "porter" - are implemented -** in files fts3_tokenizer1.c and fts3_porter.c respectively. The following -** two forward declarations are for functions declared in these files -** used to retrieve the respective implementations. -** -** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed -** to by the argument to point a the "simple" tokenizer implementation. -** Function ...PorterTokenizerModule() sets *pModule to point to the -** porter tokenizer/stemmer implementation. -*/ -void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); -void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule); -void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); - -int sqlite3Fts3InitHashTable(sqlite3 *, fts3Hash *, const char *); - -/* -** Initialise the fts3 extension. If this extension is built as part -** of the sqlite library, then this function is called directly by -** SQLite. If fts3 is built as a dynamically loadable extension, this -** function is called by the sqlite3_extension_init() entry point. -*/ -int sqlite3Fts3Init(sqlite3 *db){ - int rc = SQLITE_OK; - fts3Hash *pHash = 0; - const sqlite3_tokenizer_module *pSimple = 0; - const sqlite3_tokenizer_module *pPorter = 0; - const sqlite3_tokenizer_module *pIcu = 0; - - sqlite3Fts3SimpleTokenizerModule(&pSimple); - sqlite3Fts3PorterTokenizerModule(&pPorter); -#ifdef SQLITE_ENABLE_ICU - sqlite3Fts3IcuTokenizerModule(&pIcu); -#endif - - /* Allocate and initialise the hash-table used to store tokenizers. */ - pHash = sqlite3_malloc(sizeof(fts3Hash)); - if( !pHash ){ - rc = SQLITE_NOMEM; - }else{ - sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); - } - - /* Load the built-in tokenizers into the hash table */ - if( rc==SQLITE_OK ){ - if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple) - || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter) - || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu)) - ){ - rc = SQLITE_NOMEM; - } - } - - /* Create the virtual table wrapper around the hash-table and overload - ** the two scalar functions. If this is successful, register the - ** module with sqlite. - */ - if( SQLITE_OK==rc - && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer")) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1)) - && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1)) - ){ - return sqlite3_create_module_v2( - db, "fts3", &fts3Module, (void *)pHash, hashDestroy - ); - } - - /* An error has occured. Delete the hash table and return the error code. */ - assert( rc!=SQLITE_OK ); - if( pHash ){ - sqlite3Fts3HashClear(pHash); - sqlite3_free(pHash); - } - return rc; -} - -#if !SQLITE_CORE -int sqlite3_extension_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - SQLITE_EXTENSION_INIT2(pApi) - return sqlite3Fts3Init(db); -} -#endif - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h deleted file mode 100644 index c1aa8caf09..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -** 2006 Oct 10 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file is used by programs that want to link against the -** FTS3 library. All it does is declare the sqlite3Fts3Init() interface. -*/ -#include "sqlite3.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -int sqlite3Fts3Init(sqlite3 *db); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c deleted file mode 100644 index b14511a3c9..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.c +++ /dev/null @@ -1,373 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the implementation of generic hash-tables used in SQLite. -** We've modified it slightly to serve as a standalone hash table -** implementation for the full-text indexing module. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - -#include -#include -#include - -#include "fts3_hash.h" - -/* -** Malloc and Free functions -*/ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); - if( p ){ - memset(p, 0, n); - } - return p; -} -static void fts3HashFree(void *p){ - sqlite3_free(p); -} - -/* Turn bulk memory into a hash table object by initializing the -** fields of the Hash structure. -** -** "pNew" is a pointer to the hash table that is to be initialized. -** keyClass is one of the constants -** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass -** determines what kind of key the hash table will use. "copyKey" is -** true if the hash table should make its own private copy of keys and -** false if it should just use the supplied pointer. -*/ -void sqlite3Fts3HashInit(fts3Hash *pNew, int keyClass, int copyKey){ - assert( pNew!=0 ); - assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY ); - pNew->keyClass = keyClass; - pNew->copyKey = copyKey; - pNew->first = 0; - pNew->count = 0; - pNew->htsize = 0; - pNew->ht = 0; -} - -/* Remove all entries from a hash table. Reclaim all memory. -** Call this routine to delete a hash table or to reset a hash table -** to the empty state. -*/ -void sqlite3Fts3HashClear(fts3Hash *pH){ - fts3HashElem *elem; /* For looping over all elements of the table */ - - assert( pH!=0 ); - elem = pH->first; - pH->first = 0; - fts3HashFree(pH->ht); - pH->ht = 0; - pH->htsize = 0; - while( elem ){ - fts3HashElem *next_elem = elem->next; - if( pH->copyKey && elem->pKey ){ - fts3HashFree(elem->pKey); - } - fts3HashFree(elem); - elem = next_elem; - } - pH->count = 0; -} - -/* -** Hash and comparison functions when the mode is FTS3_HASH_STRING -*/ -static int fts3StrHash(const void *pKey, int nKey){ - const char *z = (const char *)pKey; - int h = 0; - if( nKey<=0 ) nKey = (int) strlen(z); - while( nKey > 0 ){ - h = (h<<3) ^ h ^ *z++; - nKey--; - } - return h & 0x7fffffff; -} -static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return strncmp((const char*)pKey1,(const char*)pKey2,n1); -} - -/* -** Hash and comparison functions when the mode is FTS3_HASH_BINARY -*/ -static int fts3BinHash(const void *pKey, int nKey){ - int h = 0; - const char *z = (const char *)pKey; - while( nKey-- > 0 ){ - h = (h<<3) ^ h ^ *(z++); - } - return h & 0x7fffffff; -} -static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return memcmp(pKey1,pKey2,n1); -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** The C syntax in this function definition may be unfamilar to some -** programmers, so we provide the following additional explanation: -** -** The name of the function is "hashFunction". The function takes a -** single parameter "keyClass". The return value of hashFunction() -** is a pointer to another function. Specifically, the return value -** of hashFunction() is a pointer to a function that takes two parameters -** with types "const void*" and "int" and returns an "int". -*/ -static int (*hashFunction(int keyClass))(const void*,int){ - if( keyClass==FTS3_HASH_STRING ){ - return &fts3StrHash; - }else{ - assert( keyClass==FTS3_HASH_BINARY ); - return &fts3BinHash; - } -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** For help in interpreted the obscure C code in the function definition, -** see the header comment on the previous function. -*/ -static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ - if( keyClass==FTS3_HASH_STRING ){ - return &fts3StrCompare; - }else{ - assert( keyClass==FTS3_HASH_BINARY ); - return &fts3BinCompare; - } -} - -/* Link an element into the hash table -*/ -static void fts3HashInsertElement( - fts3Hash *pH, /* The complete hash table */ - struct _fts3ht *pEntry, /* The entry into which pNew is inserted */ - fts3HashElem *pNew /* The element to be inserted */ -){ - fts3HashElem *pHead; /* First element already in pEntry */ - pHead = pEntry->chain; - if( pHead ){ - pNew->next = pHead; - pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } - pHead->prev = pNew; - }else{ - pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } - pNew->prev = 0; - pH->first = pNew; - } - pEntry->count++; - pEntry->chain = pNew; -} - - -/* Resize the hash table so that it cantains "new_size" buckets. -** "new_size" must be a power of 2. The hash table might fail -** to resize if sqliteMalloc() fails. -*/ -static void fts3Rehash(fts3Hash *pH, int new_size){ - struct _fts3ht *new_ht; /* The new hash table */ - fts3HashElem *elem, *next_elem; /* For looping over existing elements */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( (new_size & (new_size-1))==0 ); - new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) ); - if( new_ht==0 ) return; - fts3HashFree(pH->ht); - pH->ht = new_ht; - pH->htsize = new_size; - xHash = hashFunction(pH->keyClass); - for(elem=pH->first, pH->first=0; elem; elem = next_elem){ - int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); - next_elem = elem->next; - fts3HashInsertElement(pH, &new_ht[h], elem); - } -} - -/* This function (for internal use only) locates an element in an -** hash table that matches the given key. The hash for this key has -** already been computed and is passed as the 4th parameter. -*/ -static fts3HashElem *fts3FindElementByHash( - const fts3Hash *pH, /* The pH to be searched */ - const void *pKey, /* The key we are searching for */ - int nKey, - int h /* The hash for this key. */ -){ - fts3HashElem *elem; /* Used to loop thru the element list */ - int count; /* Number of elements left to test */ - int (*xCompare)(const void*,int,const void*,int); /* comparison function */ - - if( pH->ht ){ - struct _fts3ht *pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - xCompare = compareFunction(pH->keyClass); - while( count-- && elem ){ - if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ - return elem; - } - elem = elem->next; - } - } - return 0; -} - -/* Remove a single entry from the hash table given a pointer to that -** element and a hash on the element's key. -*/ -static void fts3RemoveElementByHash( - fts3Hash *pH, /* The pH containing "elem" */ - fts3HashElem* elem, /* The element to be removed from the pH */ - int h /* Hash value for the element */ -){ - struct _fts3ht *pEntry; - if( elem->prev ){ - elem->prev->next = elem->next; - }else{ - pH->first = elem->next; - } - if( elem->next ){ - elem->next->prev = elem->prev; - } - pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ - pEntry->chain = elem->next; - } - pEntry->count--; - if( pEntry->count<=0 ){ - pEntry->chain = 0; - } - if( pH->copyKey && elem->pKey ){ - fts3HashFree(elem->pKey); - } - fts3HashFree( elem ); - pH->count--; - if( pH->count<=0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); - fts3HashClear(pH); - } -} - -/* Attempt to locate an element of the hash table pH with a key -** that matches pKey,nKey. Return the data for this element if it is -** found, or NULL if there is no match. -*/ -void *sqlite3Fts3HashFind(const fts3Hash *pH, const void *pKey, int nKey){ - int h; /* A hash on key */ - fts3HashElem *elem; /* The element that matches key */ - int (*xHash)(const void*,int); /* The hash function */ - - if( pH==0 || pH->ht==0 ) return 0; - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - h = (*xHash)(pKey,nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - elem = fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1)); - return elem ? elem->data : 0; -} - -/* Insert an element into the hash table pH. The key is pKey,nKey -** and the data is "data". -** -** If no element exists with a matching key, then a new -** element is created. A copy of the key is made if the copyKey -** flag is set. NULL is returned. -** -** If another element already exists with the same key, then the -** new data replaces the old data and the old data is returned. -** The key is not copied in this instance. If a malloc fails, then -** the new data is returned and the hash table is unchanged. -** -** If the "data" parameter to this function is NULL, then the -** element corresponding to "key" is removed from the hash table. -*/ -void *sqlite3Fts3HashInsert( - fts3Hash *pH, /* The hash table to insert into */ - const void *pKey, /* The key */ - int nKey, /* Number of bytes in the key */ - void *data /* The data */ -){ - int hraw; /* Raw hash value of the key */ - int h; /* the hash of the key modulo hash table size */ - fts3HashElem *elem; /* Used to loop thru the element list */ - fts3HashElem *new_elem; /* New element added to the pH */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( pH!=0 ); - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - hraw = (*xHash)(pKey, nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - elem = fts3FindElementByHash(pH,pKey,nKey,h); - if( elem ){ - void *old_data = elem->data; - if( data==0 ){ - fts3RemoveElementByHash(pH,elem,h); - }else{ - elem->data = data; - } - return old_data; - } - if( data==0 ) return 0; - new_elem = (fts3HashElem*)fts3HashMalloc( sizeof(fts3HashElem) ); - if( new_elem==0 ) return data; - if( pH->copyKey && pKey!=0 ){ - new_elem->pKey = fts3HashMalloc( nKey ); - if( new_elem->pKey==0 ){ - fts3HashFree(new_elem); - return data; - } - memcpy((void*)new_elem->pKey, pKey, nKey); - }else{ - new_elem->pKey = (void*)pKey; - } - new_elem->nKey = nKey; - pH->count++; - if( pH->htsize==0 ){ - fts3Rehash(pH,8); - if( pH->htsize==0 ){ - pH->count = 0; - fts3HashFree(new_elem); - return data; - } - } - if( pH->count > pH->htsize ){ - fts3Rehash(pH,pH->htsize*2); - } - assert( pH->htsize>0 ); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - fts3HashInsertElement(pH, &pH->ht[h], new_elem); - new_elem->data = data; - return 0; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h deleted file mode 100644 index e01954edc8..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_hash.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implemenation -** used in SQLite. We've modified it slightly to serve as a standalone -** hash table implementation for the full-text indexing module. -** -*/ -#ifndef _FTS3_HASH_H_ -#define _FTS3_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct fts3Hash fts3Hash; -typedef struct fts3HashElem fts3HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, many of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -*/ -struct fts3Hash { - char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */ - char copyKey; /* True if copy of key made on insert */ - int count; /* Number of entries in this table */ - fts3HashElem *first; /* The first element of the array */ - int htsize; /* Number of buckets in the hash table */ - struct _fts3ht { /* the hash table */ - int count; /* Number of entries with this hash */ - fts3HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct fts3HashElem { - fts3HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - void *pKey; int nKey; /* Key associated with this element */ -}; - -/* -** There are 2 different modes of operation for a hash table: -** -** FTS3_HASH_STRING pKey points to a string that is nKey bytes long -** (including the null-terminator, if any). Case -** is respected in comparisons. -** -** FTS3_HASH_BINARY pKey points to binary data nKey bytes long. -** memcmp() is used to compare keys. -** -** A copy of the key is made if the copyKey parameter to fts3HashInit is 1. -*/ -#define FTS3_HASH_STRING 1 -#define FTS3_HASH_BINARY 2 - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -void sqlite3Fts3HashInit(fts3Hash*, int keytype, int copyKey); -void *sqlite3Fts3HashInsert(fts3Hash*, const void *pKey, int nKey, void *pData); -void *sqlite3Fts3HashFind(const fts3Hash*, const void *pKey, int nKey); -void sqlite3Fts3HashClear(fts3Hash*); - -/* -** Shorthand for the functions above -*/ -#define fts3HashInit sqlite3Fts3HashInit -#define fts3HashInsert sqlite3Fts3HashInsert -#define fts3HashFind sqlite3Fts3HashFind -#define fts3HashClear sqlite3Fts3HashClear - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** fts3Hash h; -** fts3HashElem *p; -** ... -** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){ -** SomeStructure *pData = fts3HashData(p); -** // do something with pData -** } -*/ -#define fts3HashFirst(H) ((H)->first) -#define fts3HashNext(E) ((E)->next) -#define fts3HashData(E) ((E)->data) -#define fts3HashKey(E) ((E)->pKey) -#define fts3HashKeysize(E) ((E)->nKey) - -/* -** Number of entries in a hash table -*/ -#define fts3HashCount(H) ((H)->count) - -#endif /* _FTS3_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c deleted file mode 100644 index 86a9a50cfd..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_icu.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -** 2007 June 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file implements a tokenizer for fts3 based on the ICU library. -** -** $Id: fts3_icu.c,v 1.1 2007/08/20 17:37:04 shess Exp $ -*/ - -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) -#ifdef SQLITE_ENABLE_ICU - -#include -#include -#include "fts3_tokenizer.h" - -#include -#include -#include -#include - -typedef struct IcuTokenizer IcuTokenizer; -typedef struct IcuCursor IcuCursor; - -struct IcuTokenizer { - sqlite3_tokenizer base; - char *zLocale; -}; - -struct IcuCursor { - sqlite3_tokenizer_cursor base; - - UBreakIterator *pIter; /* ICU break-iterator object */ - int nChar; /* Number of UChar elements in pInput */ - UChar *aChar; /* Copy of input using utf-16 encoding */ - int *aOffset; /* Offsets of each character in utf-8 input */ - - int nBuffer; - char *zBuffer; - - int iToken; -}; - -/* -** Create a new tokenizer instance. -*/ -static int icuCreate( - int argc, /* Number of entries in argv[] */ - const char * const *argv, /* Tokenizer creation arguments */ - sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ -){ - IcuTokenizer *p; - int n = 0; - - if( argc>0 ){ - n = strlen(argv[0])+1; - } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); - if( !p ){ - return SQLITE_NOMEM; - } - memset(p, 0, sizeof(IcuTokenizer)); - - if( n ){ - p->zLocale = (char *)&p[1]; - memcpy(p->zLocale, argv[0], n); - } - - *ppTokenizer = (sqlite3_tokenizer *)p; - - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int icuDestroy(sqlite3_tokenizer *pTokenizer){ - IcuTokenizer *p = (IcuTokenizer *)pTokenizer; - sqlite3_free(p); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int icuOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *zInput, /* Input string */ - int nInput, /* Length of zInput in bytes */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - IcuTokenizer *p = (IcuTokenizer *)pTokenizer; - IcuCursor *pCsr; - - const int32_t opt = U_FOLD_CASE_DEFAULT; - UErrorCode status = U_ZERO_ERROR; - int nChar; - - UChar32 c; - int iInput = 0; - int iOut = 0; - - *ppCursor = 0; - - nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( - sizeof(IcuCursor) + /* IcuCursor */ - nChar * sizeof(UChar) + /* IcuCursor.aChar[] */ - (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ - ); - if( !pCsr ){ - return SQLITE_NOMEM; - } - memset(pCsr, 0, sizeof(IcuCursor)); - pCsr->aChar = (UChar *)&pCsr[1]; - pCsr->aOffset = (int *)&pCsr->aChar[nChar]; - - pCsr->aOffset[iOut] = iInput; - U8_NEXT(zInput, iInput, nInput, c); - while( c>0 ){ - int isError = 0; - c = u_foldCase(c, opt); - U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); - if( isError ){ - sqlite3_free(pCsr); - return SQLITE_ERROR; - } - pCsr->aOffset[iOut] = iInput; - - if( iInputpIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status); - if( !U_SUCCESS(status) ){ - sqlite3_free(pCsr); - return SQLITE_ERROR; - } - pCsr->nChar = iOut; - - ubrk_first(pCsr->pIter); - *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to icuOpen(). -*/ -static int icuClose(sqlite3_tokenizer_cursor *pCursor){ - IcuCursor *pCsr = (IcuCursor *)pCursor; - ubrk_close(pCsr->pIter); - sqlite3_free(pCsr->zBuffer); - sqlite3_free(pCsr); - return SQLITE_OK; -} - -/* -** Extract the next token from a tokenization cursor. -*/ -static int icuNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ - const char **ppToken, /* OUT: *ppToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - IcuCursor *pCsr = (IcuCursor *)pCursor; - - int iStart = 0; - int iEnd = 0; - int nByte = 0; - - while( iStart==iEnd ){ - UChar32 c; - - iStart = ubrk_current(pCsr->pIter); - iEnd = ubrk_next(pCsr->pIter); - if( iEnd==UBRK_DONE ){ - return SQLITE_DONE; - } - - while( iStartaChar, iWhite, pCsr->nChar, c); - if( u_isspace(c) ){ - iStart = iWhite; - }else{ - break; - } - } - assert(iStart<=iEnd); - } - - do { - UErrorCode status = U_ZERO_ERROR; - if( nByte ){ - char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); - if( !zNew ){ - return SQLITE_NOMEM; - } - pCsr->zBuffer = zNew; - pCsr->nBuffer = nByte; - } - - u_strToUTF8( - pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ - &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */ - &status /* Output success/failure */ - ); - } while( nByte>pCsr->nBuffer ); - - *ppToken = pCsr->zBuffer; - *pnBytes = nByte; - *piStartOffset = pCsr->aOffset[iStart]; - *piEndOffset = pCsr->aOffset[iEnd]; - *piPosition = pCsr->iToken++; - - return SQLITE_OK; -} - -/* -** The set of routines that implement the simple tokenizer -*/ -static const sqlite3_tokenizer_module icuTokenizerModule = { - 0, /* iVersion */ - icuCreate, /* xCreate */ - icuDestroy, /* xCreate */ - icuOpen, /* xOpen */ - icuClose, /* xClose */ - icuNext, /* xNext */ -}; - -/* -** Set *ppModule to point at the implementation of the ICU tokenizer. -*/ -void sqlite3Fts3IcuTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &icuTokenizerModule; -} - -#endif /* defined(SQLITE_ENABLE_ICU) */ -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c deleted file mode 100644 index 14e129f4b7..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_porter.c +++ /dev/null @@ -1,642 +0,0 @@ -/* -** 2006 September 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Implementation of the full-text-search tokenizer that implements -** a Porter stemmer. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - - -#include -#include -#include -#include -#include - -#include "fts3_tokenizer.h" - -/* -** Class derived from sqlite3_tokenizer -*/ -typedef struct porter_tokenizer { - sqlite3_tokenizer base; /* Base class */ -} porter_tokenizer; - -/* -** Class derived from sqlit3_tokenizer_cursor -*/ -typedef struct porter_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *zInput; /* input we are tokenizing */ - int nInput; /* size of the input */ - int iOffset; /* current position in zInput */ - int iToken; /* index of next token to be returned */ - char *zToken; /* storage for current token */ - int nAllocated; /* space allocated to zToken buffer */ -} porter_tokenizer_cursor; - - -/* Forward declaration */ -static const sqlite3_tokenizer_module porterTokenizerModule; - - -/* -** Create a new tokenizer instance. -*/ -static int porterCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - porter_tokenizer *t; - t = (porter_tokenizer *) calloc(sizeof(*t), 1); - if( t==NULL ) return SQLITE_NOMEM; - - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int porterDestroy(sqlite3_tokenizer *pTokenizer){ - free(pTokenizer); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is zInput[0..nInput-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int porterOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *zInput, int nInput, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - porter_tokenizer_cursor *c; - - c = (porter_tokenizer_cursor *) malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; - - c->zInput = zInput; - if( zInput==0 ){ - c->nInput = 0; - }else if( nInput<0 ){ - c->nInput = (int)strlen(zInput); - }else{ - c->nInput = nInput; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->zToken = NULL; /* no space allocated, yet. */ - c->nAllocated = 0; - - *ppCursor = &c->base; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to -** porterOpen() above. -*/ -static int porterClose(sqlite3_tokenizer_cursor *pCursor){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - free(c->zToken); - free(c); - return SQLITE_OK; -} -/* -** Vowel or consonant -*/ -static const char cType[] = { - 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 2, 1 -}; - -/* -** isConsonant() and isVowel() determine if their first character in -** the string they point to is a consonant or a vowel, according -** to Porter ruls. -** -** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'. -** 'Y' is a consonant unless it follows another consonant, -** in which case it is a vowel. -** -** In these routine, the letters are in reverse order. So the 'y' rule -** is that 'y' is a consonant unless it is followed by another -** consonent. -*/ -static int isVowel(const char*); -static int isConsonant(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return j; - return z[1]==0 || isVowel(z + 1); -} -static int isVowel(const char *z){ - int j; - char x = *z; - if( x==0 ) return 0; - assert( x>='a' && x<='z' ); - j = cType[x-'a']; - if( j<2 ) return 1-j; - return isConsonant(z + 1); -} - -/* -** Let any sequence of one or more vowels be represented by V and let -** C be sequence of one or more consonants. Then every word can be -** represented as: -** -** [C] (VC){m} [V] -** -** In prose: A word is an optional consonant followed by zero or -** vowel-consonant pairs followed by an optional vowel. "m" is the -** number of vowel consonant pairs. This routine computes the value -** of m for the first i bytes of a word. -** -** Return true if the m-value for z is 1 or more. In other words, -** return true if z contains at least one vowel that is followed -** by a consonant. -** -** In this routine z[] is in reverse order. So we are really looking -** for an instance of of a consonant followed by a vowel. -*/ -static int m_gt_0(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* Like mgt0 above except we are looking for a value of m which is -** exactly 1 -*/ -static int m_eq_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 1; - while( isConsonant(z) ){ z++; } - return *z==0; -} - -/* Like mgt0 above except we are looking for a value of m>1 instead -** or m>0 -*/ -static int m_gt_1(const char *z){ - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - if( *z==0 ) return 0; - while( isVowel(z) ){ z++; } - if( *z==0 ) return 0; - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* -** Return TRUE if there is a vowel anywhere within z[0..n-1] -*/ -static int hasVowel(const char *z){ - while( isConsonant(z) ){ z++; } - return *z!=0; -} - -/* -** Return TRUE if the word ends in a double consonant. -** -** The text is reversed here. So we are really looking at -** the first two characters of z[]. -*/ -static int doubleConsonant(const char *z){ - return isConsonant(z) && z[0]==z[1] && isConsonant(z+1); -} - -/* -** Return TRUE if the word ends with three letters which -** are consonant-vowel-consonent and where the final consonant -** is not 'w', 'x', or 'y'. -** -** The word is reversed here. So we are really checking the -** first three letters and the first one cannot be in [wxy]. -*/ -static int star_oh(const char *z){ - return - z[0]!=0 && isConsonant(z) && - z[0]!='w' && z[0]!='x' && z[0]!='y' && - z[1]!=0 && isVowel(z+1) && - z[2]!=0 && isConsonant(z+2); -} - -/* -** If the word ends with zFrom and xCond() is true for the stem -** of the word that preceeds the zFrom ending, then change the -** ending to zTo. -** -** The input word *pz and zFrom are both in reverse order. zTo -** is in normal order. -** -** Return TRUE if zFrom matches. Return FALSE if zFrom does not -** match. Not that TRUE is returned even if xCond() fails and -** no substitution occurs. -*/ -static int stem( - char **pz, /* The word being stemmed (Reversed) */ - const char *zFrom, /* If the ending matches this... (Reversed) */ - const char *zTo, /* ... change the ending to this (not reversed) */ - int (*xCond)(const char*) /* Condition that must be true */ -){ - char *z = *pz; - while( *zFrom && *zFrom==*z ){ z++; zFrom++; } - if( *zFrom!=0 ) return 0; - if( xCond && !xCond(z) ) return 1; - while( *zTo ){ - *(--z) = *(zTo++); - } - *pz = z; - return 1; -} - -/* -** This is the fallback stemmer used when the porter stemmer is -** inappropriate. The input word is copied into the output with -** US-ASCII case folding. If the input word is too long (more -** than 20 bytes if it contains no digits or more than 6 bytes if -** it contains digits) then word is truncated to 20 or 6 bytes -** by taking 10 or 3 bytes from the beginning and end. -*/ -static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ - int i, mx, j; - int hasDigit = 0; - for(i=0; i='A' && c<='Z' ){ - zOut[i] = c - 'A' + 'a'; - }else{ - if( c>='0' && c<='9' ) hasDigit = 1; - zOut[i] = c; - } - } - mx = hasDigit ? 3 : 10; - if( nIn>mx*2 ){ - for(j=mx, i=nIn-mx; i=sizeof(zReverse)-7 ){ - /* The word is too big or too small for the porter stemmer. - ** Fallback to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - for(i=0, j=sizeof(zReverse)-6; i='A' && c<='Z' ){ - zReverse[j] = c + 'a' - 'A'; - }else if( c>='a' && c<='z' ){ - zReverse[j] = c; - }else{ - /* The use of a character not in [a-zA-Z] means that we fallback - ** to the copy stemmer */ - copy_stemmer(zIn, nIn, zOut, pnOut); - return; - } - } - memset(&zReverse[sizeof(zReverse)-5], 0, 5); - z = &zReverse[j+1]; - - - /* Step 1a */ - if( z[0]=='s' ){ - if( - !stem(&z, "sess", "ss", 0) && - !stem(&z, "sei", "i", 0) && - !stem(&z, "ss", "ss", 0) - ){ - z++; - } - } - - /* Step 1b */ - z2 = z; - if( stem(&z, "dee", "ee", m_gt_0) ){ - /* Do nothing. The work was all in the test */ - }else if( - (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel)) - && z!=z2 - ){ - if( stem(&z, "ta", "ate", 0) || - stem(&z, "lb", "ble", 0) || - stem(&z, "zi", "ize", 0) ){ - /* Do nothing. The work was all in the test */ - }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){ - z++; - }else if( m_eq_1(z) && star_oh(z) ){ - *(--z) = 'e'; - } - } - - /* Step 1c */ - if( z[0]=='y' && hasVowel(z+1) ){ - z[0] = 'i'; - } - - /* Step 2 */ - switch( z[1] ){ - case 'a': - stem(&z, "lanoita", "ate", m_gt_0) || - stem(&z, "lanoit", "tion", m_gt_0); - break; - case 'c': - stem(&z, "icne", "ence", m_gt_0) || - stem(&z, "icna", "ance", m_gt_0); - break; - case 'e': - stem(&z, "rezi", "ize", m_gt_0); - break; - case 'g': - stem(&z, "igol", "log", m_gt_0); - break; - case 'l': - stem(&z, "ilb", "ble", m_gt_0) || - stem(&z, "illa", "al", m_gt_0) || - stem(&z, "iltne", "ent", m_gt_0) || - stem(&z, "ile", "e", m_gt_0) || - stem(&z, "ilsuo", "ous", m_gt_0); - break; - case 'o': - stem(&z, "noitazi", "ize", m_gt_0) || - stem(&z, "noita", "ate", m_gt_0) || - stem(&z, "rota", "ate", m_gt_0); - break; - case 's': - stem(&z, "msila", "al", m_gt_0) || - stem(&z, "ssenevi", "ive", m_gt_0) || - stem(&z, "ssenluf", "ful", m_gt_0) || - stem(&z, "ssensuo", "ous", m_gt_0); - break; - case 't': - stem(&z, "itila", "al", m_gt_0) || - stem(&z, "itivi", "ive", m_gt_0) || - stem(&z, "itilib", "ble", m_gt_0); - break; - } - - /* Step 3 */ - switch( z[0] ){ - case 'e': - stem(&z, "etaci", "ic", m_gt_0) || - stem(&z, "evita", "", m_gt_0) || - stem(&z, "ezila", "al", m_gt_0); - break; - case 'i': - stem(&z, "itici", "ic", m_gt_0); - break; - case 'l': - stem(&z, "laci", "ic", m_gt_0) || - stem(&z, "luf", "", m_gt_0); - break; - case 's': - stem(&z, "ssen", "", m_gt_0); - break; - } - - /* Step 4 */ - switch( z[1] ){ - case 'a': - if( z[0]=='l' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'c': - if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'e': - if( z[0]=='r' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'i': - if( z[0]=='c' && m_gt_1(z+2) ){ - z += 2; - } - break; - case 'l': - if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){ - z += 4; - } - break; - case 'n': - if( z[0]=='t' ){ - if( z[2]=='a' ){ - if( m_gt_1(z+3) ){ - z += 3; - } - }else if( z[2]=='e' ){ - stem(&z, "tneme", "", m_gt_1) || - stem(&z, "tnem", "", m_gt_1) || - stem(&z, "tne", "", m_gt_1); - } - } - break; - case 'o': - if( z[0]=='u' ){ - if( m_gt_1(z+2) ){ - z += 2; - } - }else if( z[3]=='s' || z[3]=='t' ){ - stem(&z, "noi", "", m_gt_1); - } - break; - case 's': - if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 't': - stem(&z, "eta", "", m_gt_1) || - stem(&z, "iti", "", m_gt_1); - break; - case 'u': - if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ - z += 3; - } - break; - case 'v': - case 'z': - if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){ - z += 3; - } - break; - } - - /* Step 5a */ - if( z[0]=='e' ){ - if( m_gt_1(z+1) ){ - z++; - }else if( m_eq_1(z+1) && !star_oh(z+1) ){ - z++; - } - } - - /* Step 5b */ - if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){ - z++; - } - - /* z[] is now the stemmed word in reverse order. Flip it back - ** around into forward order and return. - */ - *pnOut = i = strlen(z); - zOut[i] = 0; - while( *z ){ - zOut[--i] = *(z++); - } -} - -/* -** Characters that can be part of a token. We assume any character -** whose value is greater than 0x80 (any UTF character) can be -** part of a token. In other words, delimiters all must have -** values of 0x7f or lower. -*/ -static const char porterIdChar[] = { -/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */ -}; -#define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30])) - -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to porterOpen(). -*/ -static int porterNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */ - const char **pzToken, /* OUT: *pzToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor; - const char *z = c->zInput; - - while( c->iOffsetnInput ){ - int iStartOffset, ch; - - /* Scan past delimiter characters */ - while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ - c->iOffset++; - } - - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ - c->iOffset++; - } - - if( c->iOffset>iStartOffset ){ - int n = c->iOffset-iStartOffset; - if( n>c->nAllocated ){ - c->nAllocated = n+20; - c->zToken = realloc(c->zToken, c->nAllocated); - if( c->zToken==NULL ) return SQLITE_NOMEM; - } - porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); - *pzToken = c->zToken; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - return SQLITE_OK; - } - } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the porter-stemmer tokenizer -*/ -static const sqlite3_tokenizer_module porterTokenizerModule = { - 0, - porterCreate, - porterDestroy, - porterOpen, - porterClose, - porterNext, -}; - -/* -** Allocate a new porter tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -void sqlite3Fts3PorterTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &porterTokenizerModule; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c deleted file mode 100644 index 7398227257..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.c +++ /dev/null @@ -1,371 +0,0 @@ -/* -** 2007 June 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This is part of an SQLite module implementing full-text search. -** This particular file implements the generic tokenizer interface. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - - -#include "sqlite3.h" -#include "sqlite3ext.h" -SQLITE_EXTENSION_INIT1 - -#include "fts3_hash.h" -#include "fts3_tokenizer.h" -#include - -/* -** Implementation of the SQL scalar function for accessing the underlying -** hash table. This function may be called as follows: -** -** SELECT (); -** SELECT (, ); -** -** where is the name passed as the second argument -** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer'). -** -** If the argument is specified, it must be a blob value -** containing a pointer to be stored as the hash data corresponding -** to the string . If is not specified, then -** the string must already exist in the has table. Otherwise, -** an error is returned. -** -** Whether or not the argument is specified, the value returned -** is a blob containing the pointer stored as the hash data corresponding -** to string (after the hash-table is updated, if applicable). -*/ -static void scalarFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - fts3Hash *pHash; - void *pPtr = 0; - const unsigned char *zName; - int nName; - - assert( argc==1 || argc==2 ); - - pHash = (fts3Hash *)sqlite3_user_data(context); - - zName = sqlite3_value_text(argv[0]); - nName = sqlite3_value_bytes(argv[0])+1; - - if( argc==2 ){ - void *pOld; - int n = sqlite3_value_bytes(argv[1]); - if( n!=sizeof(pPtr) ){ - sqlite3_result_error(context, "argument type mismatch", -1); - return; - } - pPtr = *(void **)sqlite3_value_blob(argv[1]); - pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); - if( pOld==pPtr ){ - sqlite3_result_error(context, "out of memory", -1); - return; - } - }else{ - pPtr = sqlite3Fts3HashFind(pHash, zName, nName); - if( !pPtr ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; - } - } - - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); -} - -#ifdef SQLITE_TEST - -#include -#include - -/* -** Implementation of a special SQL scalar function for testing tokenizers -** designed to be used in concert with the Tcl testing framework. This -** function must be called with two arguments: -** -** SELECT (, ); -** SELECT (, ); -** -** where is the name passed as the second argument -** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer') -** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test'). -** -** The return value is a string that may be interpreted as a Tcl -** list. For each token in the , three elements are -** added to the returned list. The first is the token position, the -** second is the token text (folded, stemmed, etc.) and the third is the -** substring of associated with the token. For example, -** using the built-in "simple" tokenizer: -** -** SELECT fts_tokenizer_test('simple', 'I don't see how'); -** -** will return the string: -** -** "{0 i I 1 dont don't 2 see see 3 how how}" -** -*/ -static void testFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - fts3Hash *pHash; - sqlite3_tokenizer_module *p; - sqlite3_tokenizer *pTokenizer = 0; - sqlite3_tokenizer_cursor *pCsr = 0; - - const char *zErr = 0; - - const char *zName; - int nName; - const char *zInput; - int nInput; - - const char *zArg = 0; - - const char *zToken; - int nToken; - int iStart; - int iEnd; - int iPos; - - Tcl_Obj *pRet; - - assert( argc==2 || argc==3 ); - - nName = sqlite3_value_bytes(argv[0]); - zName = (const char *)sqlite3_value_text(argv[0]); - nInput = sqlite3_value_bytes(argv[argc-1]); - zInput = (const char *)sqlite3_value_text(argv[argc-1]); - - if( argc==3 ){ - zArg = (const char *)sqlite3_value_text(argv[1]); - } - - pHash = (fts3Hash *)sqlite3_user_data(context); - p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); - - if( !p ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; - } - - pRet = Tcl_NewObj(); - Tcl_IncrRefCount(pRet); - - if( SQLITE_OK!=p->xCreate(zArg ? 1 : 0, &zArg, &pTokenizer) ){ - zErr = "error in xCreate()"; - goto finish; - } - pTokenizer->pModule = p; - if( SQLITE_OK!=p->xOpen(pTokenizer, zInput, nInput, &pCsr) ){ - zErr = "error in xOpen()"; - goto finish; - } - pCsr->pTokenizer = pTokenizer; - - while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ - Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos)); - Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); - zToken = &zInput[iStart]; - nToken = iEnd-iStart; - Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); - } - - if( SQLITE_OK!=p->xClose(pCsr) ){ - zErr = "error in xClose()"; - goto finish; - } - if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ - zErr = "error in xDestroy()"; - goto finish; - } - -finish: - if( zErr ){ - sqlite3_result_error(context, zErr, -1); - }else{ - sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT); - } - Tcl_DecrRefCount(pRet); -} - -static -int registerTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module *p -){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; - - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC); - sqlite3_step(pStmt); - - return sqlite3_finalize(pStmt); -} - -static -int queryTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module **pp -){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?)"; - - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); - } - } - - return sqlite3_finalize(pStmt); -} - -void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule); - -/* -** Implementation of the scalar function fts3_tokenizer_internal_test(). -** This function is used for testing only, it is not included in the -** build unless SQLITE_TEST is defined. -** -** The purpose of this is to test that the fts3_tokenizer() function -** can be used as designed by the C-code in the queryTokenizer and -** registerTokenizer() functions above. These two functions are repeated -** in the README.tokenizer file as an example, so it is important to -** test them. -** -** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar -** function with no arguments. An assert() will fail if a problem is -** detected. i.e.: -** -** SELECT fts3_tokenizer_internal_test(); -** -*/ -static void intTestFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int rc; - const sqlite3_tokenizer_module *p1; - const sqlite3_tokenizer_module *p2; - sqlite3 *db = (sqlite3 *)sqlite3_user_data(context); - - /* Test the query function */ - sqlite3Fts3SimpleTokenizerModule(&p1); - rc = queryTokenizer(db, "simple", &p2); - assert( rc==SQLITE_OK ); - assert( p1==p2 ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_ERROR ); - assert( p2==0 ); - assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); - - /* Test the storage function */ - rc = registerTokenizer(db, "nosuchtokenizer", p1); - assert( rc==SQLITE_OK ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_OK ); - assert( p2==p1 ); - - sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); -} - -#endif - -/* -** Set up SQL objects in database db used to access the contents of -** the hash table pointed to by argument pHash. The hash table must -** been initialised to use string keys, and to take a private copy -** of the key when a value is inserted. i.e. by a call similar to: -** -** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); -** -** This function adds a scalar function (see header comment above -** scalarFunc() in this file for details) and, if ENABLE_TABLE is -** defined at compilation time, a temporary virtual table (see header -** comment above struct HashTableVtab) to the database schema. Both -** provide read/write access to the contents of *pHash. -** -** The third argument to this function, zName, is used as the name -** of both the scalar and, if created, the virtual table. -*/ -int sqlite3Fts3InitHashTable( - sqlite3 *db, - fts3Hash *pHash, - const char *zName -){ - int rc = SQLITE_OK; - void *p = (void *)pHash; - const int any = SQLITE_ANY; - char *zTest = 0; - char *zTest2 = 0; - -#ifdef SQLITE_TEST - void *pdb = (void *)db; - zTest = sqlite3_mprintf("%s_test", zName); - zTest2 = sqlite3_mprintf("%s_internal_test", zName); - if( !zTest || !zTest2 ){ - rc = SQLITE_NOMEM; - } -#endif - - if( rc!=SQLITE_OK - || (rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0)) -#ifdef SQLITE_TEST - || (rc = sqlite3_create_function(db, zTest, 2, any, p, testFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zTest, 3, any, p, testFunc, 0, 0)) - || (rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0)) -#endif - ); - - sqlite3_free(zTest); - sqlite3_free(zTest2); - return rc; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h deleted file mode 100644 index 4faef56f24..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer.h +++ /dev/null @@ -1,145 +0,0 @@ -/* -** 2006 July 10 -** -** The author disclaims copyright to this source code. -** -************************************************************************* -** Defines the interface to tokenizers used by fulltext-search. There -** are three basic components: -** -** sqlite3_tokenizer_module is a singleton defining the tokenizer -** interface functions. This is essentially the class structure for -** tokenizers. -** -** sqlite3_tokenizer is used to define a particular tokenizer, perhaps -** including customization information defined at creation time. -** -** sqlite3_tokenizer_cursor is generated by a tokenizer to generate -** tokens from a particular input. -*/ -#ifndef _FTS3_TOKENIZER_H_ -#define _FTS3_TOKENIZER_H_ - -/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. -** If tokenizers are to be allowed to call sqlite3_*() functions, then -** we will need a way to register the API consistently. -*/ -#include "sqlite3.h" - -/* -** Structures used by the tokenizer interface. When a new tokenizer -** implementation is registered, the caller provides a pointer to -** an sqlite3_tokenizer_module containing pointers to the callback -** functions that make up an implementation. -** -** When an fts3 table is created, it passes any arguments passed to -** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the -** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer -** implementation. The xCreate() function in turn returns an -** sqlite3_tokenizer structure representing the specific tokenizer to -** be used for the fts3 table (customized by the tokenizer clause arguments). -** -** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() -** method is called. It returns an sqlite3_tokenizer_cursor object -** that may be used to tokenize a specific input buffer based on -** the tokenization rules supplied by a specific sqlite3_tokenizer -** object. -*/ -typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; -typedef struct sqlite3_tokenizer sqlite3_tokenizer; -typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; - -struct sqlite3_tokenizer_module { - - /* - ** Structure version. Should always be set to 0. - */ - int iVersion; - - /* - ** Create a new tokenizer. The values in the argv[] array are the - ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL - ** TABLE statement that created the fts3 table. For example, if - ** the following SQL is executed: - ** - ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) - ** - ** then argc is set to 2, and the argv[] array contains pointers - ** to the strings "arg1" and "arg2". - ** - ** This method should return either SQLITE_OK (0), or an SQLite error - ** code. If SQLITE_OK is returned, then *ppTokenizer should be set - ** to point at the newly created tokenizer structure. The generic - ** sqlite3_tokenizer.pModule variable should not be initialised by - ** this callback. The caller will do so. - */ - int (*xCreate)( - int argc, /* Size of argv array */ - const char *const*argv, /* Tokenizer argument strings */ - sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ - ); - - /* - ** Destroy an existing tokenizer. The fts3 module calls this method - ** exactly once for each successful call to xCreate(). - */ - int (*xDestroy)(sqlite3_tokenizer *pTokenizer); - - /* - ** Create a tokenizer cursor to tokenize an input buffer. The caller - ** is responsible for ensuring that the input buffer remains valid - ** until the cursor is closed (using the xClose() method). - */ - int (*xOpen)( - sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ - const char *pInput, int nBytes, /* Input buffer */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ - ); - - /* - ** Destroy an existing tokenizer cursor. The fts3 module calls this - ** method exactly once for each successful call to xOpen(). - */ - int (*xClose)(sqlite3_tokenizer_cursor *pCursor); - - /* - ** Retrieve the next token from the tokenizer cursor pCursor. This - ** method should either return SQLITE_OK and set the values of the - ** "OUT" variables identified below, or SQLITE_DONE to indicate that - ** the end of the buffer has been reached, or an SQLite error code. - ** - ** *ppToken should be set to point at a buffer containing the - ** normalized version of the token (i.e. after any case-folding and/or - ** stemming has been performed). *pnBytes should be set to the length - ** of this buffer in bytes. The input text that generated the token is - ** identified by the byte offsets returned in *piStartOffset and - ** *piEndOffset. - ** - ** The buffer *ppToken is set to point at is managed by the tokenizer - ** implementation. It is only required to be valid until the next call - ** to xNext() or xClose(). - */ - /* TODO(shess) current implementation requires pInput to be - ** nul-terminated. This should either be fixed, or pInput/nBytes - ** should be converted to zInput. - */ - int (*xNext)( - sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ - const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ - int *piStartOffset, /* OUT: Byte offset of token in input buffer */ - int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ - int *piPosition /* OUT: Number of tokens returned before this one */ - ); -}; - -struct sqlite3_tokenizer { - const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ - /* Tokenizer implementations will typically add additional fields */ -}; - -struct sqlite3_tokenizer_cursor { - sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ - /* Tokenizer implementations will typically add additional fields */ -}; - -#endif /* _FTS3_TOKENIZER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c deleted file mode 100644 index f53cc1dd46..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/fts3_tokenizer1.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** 2006 Oct 10 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** Implementation of the "simple" full-text-search tokenizer. -*/ - -/* -** The code in this file is only compiled if: -** -** * The FTS3 module is being built as an extension -** (in which case SQLITE_CORE is not defined), or -** -** * The FTS3 module is being built into the core of -** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). -*/ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) - - -#include -#include -#include -#include -#include - -#include "fts3_tokenizer.h" - -typedef struct simple_tokenizer { - sqlite3_tokenizer base; - char delim[128]; /* flag ASCII delimiters */ -} simple_tokenizer; - -typedef struct simple_tokenizer_cursor { - sqlite3_tokenizer_cursor base; - const char *pInput; /* input we are tokenizing */ - int nBytes; /* size of the input */ - int iOffset; /* current position in pInput */ - int iToken; /* index of next token to be returned */ - char *pToken; /* storage for current token */ - int nTokenAllocated; /* space allocated to zToken buffer */ -} simple_tokenizer_cursor; - - -/* Forward declaration */ -static const sqlite3_tokenizer_module simpleTokenizerModule; - -static int simpleDelim(simple_tokenizer *t, unsigned char c){ - return c<0x80 && t->delim[c]; -} - -/* -** Create a new tokenizer instance. -*/ -static int simpleCreate( - int argc, const char * const *argv, - sqlite3_tokenizer **ppTokenizer -){ - simple_tokenizer *t; - - t = (simple_tokenizer *) calloc(sizeof(*t), 1); - if( t==NULL ) return SQLITE_NOMEM; - - /* TODO(shess) Delimiters need to remain the same from run to run, - ** else we need to reindex. One solution would be a meta-table to - ** track such information in the database, then we'd only want this - ** information on the initial create. - */ - if( argc>1 ){ - int i, n = strlen(argv[1]); - for(i=0; i=0x80 ){ - free(t); - return SQLITE_ERROR; - } - t->delim[ch] = 1; - } - } else { - /* Mark non-alphanumeric ASCII characters as delimiters */ - int i; - for(i=1; i<0x80; i++){ - t->delim[i] = !isalnum(i); - } - } - - *ppTokenizer = &t->base; - return SQLITE_OK; -} - -/* -** Destroy a tokenizer -*/ -static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ - free(pTokenizer); - return SQLITE_OK; -} - -/* -** Prepare to begin tokenizing a particular string. The input -** string to be tokenized is pInput[0..nBytes-1]. A cursor -** used to incrementally tokenize this string is returned in -** *ppCursor. -*/ -static int simpleOpen( - sqlite3_tokenizer *pTokenizer, /* The tokenizer */ - const char *pInput, int nBytes, /* String to be tokenized */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */ -){ - simple_tokenizer_cursor *c; - - c = (simple_tokenizer_cursor *) malloc(sizeof(*c)); - if( c==NULL ) return SQLITE_NOMEM; - - c->pInput = pInput; - if( pInput==0 ){ - c->nBytes = 0; - }else if( nBytes<0 ){ - c->nBytes = (int)strlen(pInput); - }else{ - c->nBytes = nBytes; - } - c->iOffset = 0; /* start tokenizing at the beginning */ - c->iToken = 0; - c->pToken = NULL; /* no space allocated, yet. */ - c->nTokenAllocated = 0; - - *ppCursor = &c->base; - return SQLITE_OK; -} - -/* -** Close a tokenization cursor previously opened by a call to -** simpleOpen() above. -*/ -static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - free(c->pToken); - free(c); - return SQLITE_OK; -} - -/* -** Extract the next token from a tokenization cursor. The cursor must -** have been opened by a prior call to simpleOpen(). -*/ -static int simpleNext( - sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */ - const char **ppToken, /* OUT: *ppToken is the token text */ - int *pnBytes, /* OUT: Number of bytes in token */ - int *piStartOffset, /* OUT: Starting offset of token */ - int *piEndOffset, /* OUT: Ending offset of token */ - int *piPosition /* OUT: Position integer of token */ -){ - simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor; - simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer; - unsigned char *p = (unsigned char *)c->pInput; - - while( c->iOffsetnBytes ){ - int iStartOffset; - - /* Scan past delimiter characters */ - while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } - - /* Count non-delimiter characters. */ - iStartOffset = c->iOffset; - while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ - c->iOffset++; - } - - if( c->iOffset>iStartOffset ){ - int i, n = c->iOffset-iStartOffset; - if( n>c->nTokenAllocated ){ - c->nTokenAllocated = n+20; - c->pToken = realloc(c->pToken, c->nTokenAllocated); - if( c->pToken==NULL ) return SQLITE_NOMEM; - } - for(i=0; ipToken[i] = ch<0x80 ? tolower(ch) : ch; - } - *ppToken = c->pToken; - *pnBytes = n; - *piStartOffset = iStartOffset; - *piEndOffset = c->iOffset; - *piPosition = c->iToken++; - - return SQLITE_OK; - } - } - return SQLITE_DONE; -} - -/* -** The set of routines that implement the simple tokenizer -*/ -static const sqlite3_tokenizer_module simpleTokenizerModule = { - 0, - simpleCreate, - simpleDestroy, - simpleOpen, - simpleClose, - simpleNext, -}; - -/* -** Allocate a new simple tokenizer. Return a pointer to the new -** tokenizer in *ppModule -*/ -void sqlite3Fts3SimpleTokenizerModule( - sqlite3_tokenizer_module const**ppModule -){ - *ppModule = &simpleTokenizerModule; -} - -#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl b/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl deleted file mode 100644 index cfea5d2ab0..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/fts3/mkfts3amal.tcl +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/tclsh -# -# This script builds a single C code file holding all of FTS3 code. -# The name of the output file is fts3amal.c. To build this file, -# first do: -# -# make target_source -# -# The make target above moves all of the source code files into -# a subdirectory named "tsrc". (This script expects to find the files -# there and will not work if they are not found.) -# -# After the "tsrc" directory has been created and populated, run -# this script: -# -# tclsh mkfts3amal.tcl -# -# The amalgamated FTS3 code will be written into fts3amal.c -# - -# Open the output file and write a header comment at the beginning -# of the file. -# -set out [open fts3amal.c w] -set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] -puts $out [subst \ -{/****************************************************************************** -** This file is an amalgamation of separate C source files from the SQLite -** Full Text Search extension 2 (fts3). By combining all the individual C -** code files into this single large file, the entire code can be compiled -** as a one translation unit. This allows many compilers to do optimizations -** that would not be possible if the files were compiled separately. It also -** makes the code easier to import into other projects. -** -** This amalgamation was generated on $today. -*/}] - -# These are the header files used by FTS3. The first time any of these -# files are seen in a #include statement in the C code, include the complete -# text of the file in-line. The file only needs to be included once. -# -foreach hdr { - fts3.h - fts3_hash.h - fts3_tokenizer.h - sqlite3.h - sqlite3ext.h -} { - set available_hdr($hdr) 1 -} - -# 78 stars used for comment formatting. -set s78 \ -{*****************************************************************************} - -# Insert a comment into the code -# -proc section_comment {text} { - global out s78 - set n [string length $text] - set nstar [expr {60 - $n}] - set stars [string range $s78 0 $nstar] - puts $out "/************** $text $stars/" -} - -# Read the source file named $filename and write it into the -# sqlite3.c output file. If any #include statements are seen, -# process them approprately. -# -proc copy_file {filename} { - global seen_hdr available_hdr out - set tail [file tail $filename] - section_comment "Begin file $tail" - set in [open $filename r] - while {![eof $in]} { - set line [gets $in] - if {[regexp {^#\s*include\s+["<]([^">]+)[">]} $line all hdr]} { - if {[info exists available_hdr($hdr)]} { - if {$available_hdr($hdr)} { - section_comment "Include $hdr in the middle of $tail" - copy_file tsrc/$hdr - section_comment "Continuing where we left off in $tail" - } - } elseif {![info exists seen_hdr($hdr)]} { - set seen_hdr($hdr) 1 - puts $out $line - } - } elseif {[regexp {^#ifdef __cplusplus} $line]} { - puts $out "#if 0" - } elseif {[regexp {^#line} $line]} { - # Skip #line directives. - } else { - puts $out $line - } - } - close $in - section_comment "End of $tail" -} - - -# Process the source files. Process files containing commonly -# used subroutines first in order to help the compiler find -# inlining opportunities. -# -foreach file { - fts3.c - fts3_hash.c - fts3_porter.c - fts3_tokenizer.c - fts3_tokenizer1.c - fts3_icu.c -} { - copy_file tsrc/$file -} - -close $out diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt b/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt deleted file mode 100644 index 5c995ccb4a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/README.txt +++ /dev/null @@ -1,170 +0,0 @@ - -This directory contains source code for the SQLite "ICU" extension, an -integration of the "International Components for Unicode" library with -SQLite. Documentation follows. - - 1. Features - - 1.1 SQL Scalars upper() and lower() - 1.2 Unicode Aware LIKE Operator - 1.3 ICU Collation Sequences - 1.4 SQL REGEXP Operator - - 2. Compilation and Usage - - 3. Bugs, Problems and Security Issues - - 3.1 The "case_sensitive_like" Pragma - 3.2 The SQLITE_MAX_LIKE_PATTERN_LENGTH Macro - 3.3 Collation Sequence Security Issue - - -1. FEATURES - - 1.1 SQL Scalars upper() and lower() - - SQLite's built-in implementations of these two functions only - provide case mapping for the 26 letters used in the English - language. The ICU based functions provided by this extension - provide case mapping, where defined, for the full range of - unicode characters. - - ICU provides two types of case mapping, "general" case mapping and - "language specific". Refer to ICU documentation for the differences - between the two. Specifically: - - http://www.icu-project.org/userguide/caseMappings.html - http://www.icu-project.org/userguide/posix.html#case_mappings - - To utilise "general" case mapping, the upper() or lower() scalar - functions are invoked with one argument: - - upper('ABC') -> 'abc' - lower('abc') -> 'ABC' - - To access ICU "language specific" case mapping, upper() or lower() - should be invoked with two arguments. The second argument is the name - of the locale to use. Passing an empty string ("") or SQL NULL value - as the second argument is the same as invoking the 1 argument version - of upper() or lower(): - - lower('I', 'en_us') -> 'i' - lower('I', 'tr_tr') -> 'ı' (small dotless i) - - 1.2 Unicode Aware LIKE Operator - - Similarly to the upper() and lower() functions, the built-in SQLite LIKE - operator understands case equivalence for the 26 letters of the English - language alphabet. The implementation of LIKE included in this - extension uses the ICU function u_foldCase() to provide case - independent comparisons for the full range of unicode characters. - - The U_FOLD_CASE_DEFAULT flag is passed to u_foldCase(), meaning the - dotless 'I' character used in the Turkish language is considered - to be in the same equivalence class as the dotted 'I' character - used by many languages (including English). - - 1.3 ICU Collation Sequences - - A special SQL scalar function, icu_load_collation() is provided that - may be used to register ICU collation sequences with SQLite. It - is always called with exactly two arguments, the ICU locale - identifying the collation sequence to ICU, and the name of the - SQLite collation sequence to create. For example, to create an - SQLite collation sequence named "turkish" using Turkish language - sorting rules, the SQL statement: - - SELECT icu_load_collation('tr_TR', 'turkish'); - - Or, for Australian English: - - SELECT icu_load_collation('en_AU', 'australian'); - - The identifiers "turkish" and "australian" may then be used - as collation sequence identifiers in SQL statements: - - CREATE TABLE aust_turkish_penpals( - australian_penpal_name TEXT COLLATE australian, - turkish_penpal_name TEXT COLLATE turkish - ); - - 1.4 SQL REGEXP Operator - - This extension provides an implementation of the SQL binary - comparision operator "REGEXP", based on the regular expression functions - provided by the ICU library. The syntax of the operator is as described - in SQLite documentation: - - REGEXP - - This extension uses the ICU defaults for regular expression matching - behaviour. Specifically, this means that: - - * Matching is case-sensitive, - * Regular expression comments are not allowed within patterns, and - * The '^' and '$' characters match the beginning and end of the - argument, not the beginning and end of lines within - the argument. - - Even more specifically, the value passed to the "flags" parameter - of ICU C function uregex_open() is 0. - - -2 COMPILATION AND USAGE - - The easiest way to compile and use the ICU extension is to build - and use it as a dynamically loadable SQLite extension. To do this - using gcc on *nix: - - gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so - - You may need to add "-I" flags so that gcc can find sqlite3ext.h - and sqlite3.h. The resulting shared lib, libSqliteIcu.so, may be - loaded into sqlite in the same way as any other dynamically loadable - extension. - - -3 BUGS, PROBLEMS AND SECURITY ISSUES - - 3.1 The "case_sensitive_like" Pragma - - This extension does not work well with the "case_sensitive_like" - pragma. If this pragma is used before the ICU extension is loaded, - then the pragma has no effect. If the pragma is used after the ICU - extension is loaded, then SQLite ignores the ICU implementation and - always uses the built-in LIKE operator. - - The ICU extension LIKE operator is always case insensitive. - - 3.2 The SQLITE_MAX_LIKE_PATTERN_LENGTH Macro - - Passing very long patterns to the built-in SQLite LIKE operator can - cause a stack overflow. To curb this problem, SQLite defines the - SQLITE_MAX_LIKE_PATTERN_LENGTH macro as the maximum length of a - pattern in bytes (irrespective of encoding). The default value is - defined in internal header file "limits.h". - - The ICU extension LIKE implementation suffers from the same - problem and uses the same solution. However, since the ICU extension - code does not include the SQLite file "limits.h", modifying - the default value therein does not affect the ICU extension. - The default value of SQLITE_MAX_LIKE_PATTERN_LENGTH used by - the ICU extension LIKE operator is 50000, defined in source - file "icu.c". - - 3.3 Collation Sequence Security Issue - - Internally, SQLite assumes that indices stored in database files - are sorted according to the collation sequence indicated by the - SQL schema. Changing the definition of a collation sequence after - an index has been built is therefore equivalent to database - corruption. The SQLite library is not very well tested under - these conditions, and may contain potential buffer overruns - or other programming errors that could be exploited by a malicious - programmer. - - If the ICU extension is used in an environment where potentially - malicious users may execute arbitrary SQL (i.e. gears), they - should be prevented from invoking the icu_load_collation() function, - possibly using the authorisation callback. - diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c b/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c deleted file mode 100644 index 11bb116d8d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ext/icu/icu.c +++ /dev/null @@ -1,499 +0,0 @@ -/* -** 2007 May 6 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** $Id: icu.c,v 1.6 2007/06/22 15:21:16 danielk1977 Exp $ -** -** This file implements an integration between the ICU library -** ("International Components for Unicode", an open-source library -** for handling unicode data) and SQLite. The integration uses -** ICU to provide the following to SQLite: -** -** * An implementation of the SQL regexp() function (and hence REGEXP -** operator) using the ICU uregex_XX() APIs. -** -** * Implementations of the SQL scalar upper() and lower() functions -** for case mapping. -** -** * Integration of ICU and SQLite collation seqences. -** -** * An implementation of the LIKE operator that uses ICU to -** provide case-independent matching. -*/ - -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) - -/* Include ICU headers */ -#include -#include -#include -#include - -#include - -#ifndef SQLITE_CORE - #include "sqlite3ext.h" - SQLITE_EXTENSION_INIT1 -#else - #include "sqlite3.h" -#endif - -/* -** Maximum length (in bytes) of the pattern in a LIKE or GLOB -** operator. -*/ -#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 -#endif - -/* -** Version of sqlite3_free() that is always a function, never a macro. -*/ -static void xFree(void *p){ - sqlite3_free(p); -} - -/* -** Compare two UTF-8 strings for equality where the first string is -** a "LIKE" expression. Return true (1) if they are the same and -** false (0) if they are different. -*/ -static int icuLikeCompare( - const uint8_t *zPattern, /* LIKE pattern */ - const uint8_t *zString, /* The UTF-8 string to compare against */ - const UChar32 uEsc /* The escape character */ -){ - static const int MATCH_ONE = (UChar32)'_'; - static const int MATCH_ALL = (UChar32)'%'; - - int iPattern = 0; /* Current byte index in zPattern */ - int iString = 0; /* Current byte index in zString */ - - int prevEscape = 0; /* True if the previous character was uEsc */ - - while( zPattern[iPattern]!=0 ){ - - /* Read (and consume) the next character from the input pattern. */ - UChar32 uPattern; - U8_NEXT_UNSAFE(zPattern, iPattern, uPattern); - assert(uPattern!=0); - - /* There are now 4 possibilities: - ** - ** 1. uPattern is an unescaped match-all character "%", - ** 2. uPattern is an unescaped match-one character "_", - ** 3. uPattern is an unescaped escape character, or - ** 4. uPattern is to be handled as an ordinary character - */ - if( !prevEscape && uPattern==MATCH_ALL ){ - /* Case 1. */ - uint8_t c; - - /* Skip any MATCH_ALL or MATCH_ONE characters that follow a - ** MATCH_ALL. For each MATCH_ONE, skip one character in the - ** test string. - */ - while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){ - if( c==MATCH_ONE ){ - if( zString[iString]==0 ) return 0; - U8_FWD_1_UNSAFE(zString, iString); - } - iPattern++; - } - - if( zPattern[iPattern]==0 ) return 1; - - while( zString[iString] ){ - if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){ - return 1; - } - U8_FWD_1_UNSAFE(zString, iString); - } - return 0; - - }else if( !prevEscape && uPattern==MATCH_ONE ){ - /* Case 2. */ - if( zString[iString]==0 ) return 0; - U8_FWD_1_UNSAFE(zString, iString); - - }else if( !prevEscape && uPattern==uEsc){ - /* Case 3. */ - prevEscape = 1; - - }else{ - /* Case 4. */ - UChar32 uString; - U8_NEXT_UNSAFE(zString, iString, uString); - uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT); - uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT); - if( uString!=uPattern ){ - return 0; - } - prevEscape = 0; - } - } - - return zString[iString]==0; -} - -/* -** Implementation of the like() SQL function. This function implements -** the build-in LIKE operator. The first argument to the function is the -** pattern and the second argument is the string. So, the SQL statements: -** -** A LIKE B -** -** is implemented as like(B, A). If there is an escape character E, -** -** A LIKE B ESCAPE E -** -** is mapped to like(B, A, E). -*/ -static void icuLikeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const unsigned char *zA = sqlite3_value_text(argv[0]); - const unsigned char *zB = sqlite3_value_text(argv[1]); - UChar32 uEsc = 0; - - /* Limit the length of the LIKE or GLOB pattern to avoid problems - ** of deep recursion and N*N behavior in patternCompare(). - */ - if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ - sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); - return; - } - - - if( argc==3 ){ - /* The escape character string must consist of a single UTF-8 character. - ** Otherwise, return an error. - */ - int nE= sqlite3_value_bytes(argv[2]); - const unsigned char *zE = sqlite3_value_text(argv[2]); - int i = 0; - if( zE==0 ) return; - U8_NEXT(zE, i, nE, uEsc); - if( i!=nE){ - sqlite3_result_error(context, - "ESCAPE expression must be a single character", -1); - return; - } - } - - if( zA && zB ){ - sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); - } -} - -/* -** This function is called when an ICU function called from within -** the implementation of an SQL scalar function returns an error. -** -** The scalar function context passed as the first argument is -** loaded with an error message based on the following two args. -*/ -static void icuFunctionError( - sqlite3_context *pCtx, /* SQLite scalar function context */ - const char *zName, /* Name of ICU function that failed */ - UErrorCode e /* Error code returned by ICU function */ -){ - char zBuf[128]; - sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); - zBuf[127] = '\0'; - sqlite3_result_error(pCtx, zBuf, -1); -} - -/* -** Function to delete compiled regexp objects. Registered as -** a destructor function with sqlite3_set_auxdata(). -*/ -static void icuRegexpDelete(void *p){ - URegularExpression *pExpr = (URegularExpression *)p; - uregex_close(pExpr); -} - -/* -** Implementation of SQLite REGEXP operator. This scalar function takes -** two arguments. The first is a regular expression pattern to compile -** the second is a string to match against that pattern. If either -** argument is an SQL NULL, then NULL Is returned. Otherwise, the result -** is 1 if the string matches the pattern, or 0 otherwise. -** -** SQLite maps the regexp() function to the regexp() operator such -** that the following two are equivalent: -** -** zString REGEXP zPattern -** regexp(zPattern, zString) -** -** Uses the following ICU regexp APIs: -** -** uregex_open() -** uregex_matches() -** uregex_close() -*/ -static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ - UErrorCode status = U_ZERO_ERROR; - URegularExpression *pExpr; - UBool res; - const UChar *zString = sqlite3_value_text16(apArg[1]); - - /* If the left hand side of the regexp operator is NULL, - ** then the result is also NULL. - */ - if( !zString ){ - return; - } - - pExpr = sqlite3_get_auxdata(p, 0); - if( !pExpr ){ - const UChar *zPattern = sqlite3_value_text16(apArg[0]); - if( !zPattern ){ - return; - } - pExpr = uregex_open(zPattern, -1, 0, 0, &status); - - if( U_SUCCESS(status) ){ - sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); - }else{ - assert(!pExpr); - icuFunctionError(p, "uregex_open", status); - return; - } - } - - /* Configure the text that the regular expression operates on. */ - uregex_setText(pExpr, zString, -1, &status); - if( !U_SUCCESS(status) ){ - icuFunctionError(p, "uregex_setText", status); - return; - } - - /* Attempt the match */ - res = uregex_matches(pExpr, 0, &status); - if( !U_SUCCESS(status) ){ - icuFunctionError(p, "uregex_matches", status); - return; - } - - /* Set the text that the regular expression operates on to a NULL - ** pointer. This is not really necessary, but it is tidier than - ** leaving the regular expression object configured with an invalid - ** pointer after this function returns. - */ - uregex_setText(pExpr, 0, 0, &status); - - /* Return 1 or 0. */ - sqlite3_result_int(p, res ? 1 : 0); -} - -/* -** Implementations of scalar functions for case mapping - upper() and -** lower(). Function upper() converts it's input to upper-case (ABC). -** Function lower() converts to lower-case (abc). -** -** ICU provides two types of case mapping, "general" case mapping and -** "language specific". Refer to ICU documentation for the differences -** between the two. -** -** To utilise "general" case mapping, the upper() or lower() scalar -** functions are invoked with one argument: -** -** upper('ABC') -> 'abc' -** lower('abc') -> 'ABC' -** -** To access ICU "language specific" case mapping, upper() or lower() -** should be invoked with two arguments. The second argument is the name -** of the locale to use. Passing an empty string ("") or SQL NULL value -** as the second argument is the same as invoking the 1 argument version -** of upper() or lower(). -** -** lower('I', 'en_us') -> 'i' -** lower('I', 'tr_tr') -> 'ı' (small dotless i) -** -** http://www.icu-project.org/userguide/posix.html#case_mappings -*/ -static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ - const UChar *zInput; - UChar *zOutput; - int nInput; - int nOutput; - - UErrorCode status = U_ZERO_ERROR; - const char *zLocale = 0; - - assert(nArg==1 || nArg==2); - if( nArg==2 ){ - zLocale = (const char *)sqlite3_value_text(apArg[1]); - } - - zInput = sqlite3_value_text16(apArg[0]); - if( !zInput ){ - return; - } - nInput = sqlite3_value_bytes16(apArg[0]); - - nOutput = nInput * 2 + 2; - zOutput = sqlite3_malloc(nOutput); - if( !zOutput ){ - return; - } - - if( sqlite3_user_data(p) ){ - u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); - }else{ - u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); - } - - if( !U_SUCCESS(status) ){ - icuFunctionError(p, "u_strToLower()/u_strToUpper", status); - return; - } - - sqlite3_result_text16(p, zOutput, -1, xFree); -} - -/* -** Collation sequence destructor function. The pCtx argument points to -** a UCollator structure previously allocated using ucol_open(). -*/ -static void icuCollationDel(void *pCtx){ - UCollator *p = (UCollator *)pCtx; - ucol_close(p); -} - -/* -** Collation sequence comparison function. The pCtx argument points to -** a UCollator structure previously allocated using ucol_open(). -*/ -static int icuCollationColl( - void *pCtx, - int nLeft, - const void *zLeft, - int nRight, - const void *zRight -){ - UCollationResult res; - UCollator *p = (UCollator *)pCtx; - res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2); - switch( res ){ - case UCOL_LESS: return -1; - case UCOL_GREATER: return +1; - case UCOL_EQUAL: return 0; - } - assert(!"Unexpected return value from ucol_strcoll()"); - return 0; -} - -/* -** Implementation of the scalar function icu_load_collation(). -** -** This scalar function is used to add ICU collation based collation -** types to an SQLite database connection. It is intended to be called -** as follows: -** -** SELECT icu_load_collation(, ); -** -** Where is a string containing an ICU locale identifier (i.e. -** "en_AU", "tr_TR" etc.) and is the name of the -** collation sequence to create. -*/ -static void icuLoadCollation( - sqlite3_context *p, - int nArg, - sqlite3_value **apArg -){ - sqlite3 *db = (sqlite3 *)sqlite3_user_data(p); - UErrorCode status = U_ZERO_ERROR; - const char *zLocale; /* Locale identifier - (eg. "jp_JP") */ - const char *zName; /* SQL Collation sequence name (eg. "japanese") */ - UCollator *pUCollator; /* ICU library collation object */ - int rc; /* Return code from sqlite3_create_collation_x() */ - - assert(nArg==2); - zLocale = (const char *)sqlite3_value_text(apArg[0]); - zName = (const char *)sqlite3_value_text(apArg[1]); - - if( !zLocale || !zName ){ - return; - } - - pUCollator = ucol_open(zLocale, &status); - if( !U_SUCCESS(status) ){ - icuFunctionError(p, "ucol_open", status); - return; - } - assert(p); - - rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator, - icuCollationColl, icuCollationDel - ); - if( rc!=SQLITE_OK ){ - ucol_close(pUCollator); - sqlite3_result_error(p, "Error registering collation function", -1); - } -} - -/* -** Register the ICU extension functions with database db. -*/ -int sqlite3IcuInit(sqlite3 *db){ - struct IcuScalar { - const char *zName; /* Function name */ - int nArg; /* Number of arguments */ - int enc; /* Optimal text encoding */ - void *pContext; /* sqlite3_user_data() context */ - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - } scalars[] = { - {"regexp",-1, SQLITE_ANY, 0, icuRegexpFunc}, - - {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16}, - {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16}, - {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16}, - {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16}, - - {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16}, - {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16}, - {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16}, - {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16}, - - {"like", 2, SQLITE_UTF8, 0, icuLikeFunc}, - {"like", 3, SQLITE_UTF8, 0, icuLikeFunc}, - - {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation}, - }; - - int rc = SQLITE_OK; - int i; - - for(i=0; rc==SQLITE_OK && i<(sizeof(scalars)/sizeof(struct IcuScalar)); i++){ - struct IcuScalar *p = &scalars[i]; - rc = sqlite3_create_function( - db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 - ); - } - - return rc; -} - -#if !SQLITE_CORE -int sqlite3_extension_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - SQLITE_EXTENSION_INIT2(pApi) - return sqlite3IcuInit(db); -} -#endif - -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/install-sh b/libraries/sqlite/unix/sqlite-3.5.1/install-sh deleted file mode 100755 index e9de23842d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh b/libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh deleted file mode 100644 index 8f7a6ac10d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/ltmain.sh +++ /dev/null @@ -1,6971 +0,0 @@ -# ltmain.sh - Provide generalized library-building support services. -# NOTE: Changing this file will not affect anything until you rerun configure. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -basename="s,^.*/,,g" - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - -# define SED for historic ltconfig's generated by Libtool 1.3 -test -z "$SED" && SED=sed - -# The name of this program: -progname=`echo "$progpath" | $SED $basename` -modename="$progname" - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 - -PROGRAM=ltmain.sh -PACKAGE=libtool -VERSION=1.5.22 -TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes. -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -# Same for EGREP, and just to be sure, do LTCC as well -if test "X$EGREP" = X ; then - EGREP=egrep -fi -if test "X$LTCC" = X ; then - LTCC=${CC-gcc} -fi - -# Check that we have a working $echo. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$progpath" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <&2 - $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit $EXIT_FAILURE -fi - -# Global variables. -mode=$default_mode -nonopt= -prev= -prevopt= -run= -show="$echo" -show_help= -execute_dlfiles= -duplicate_deps=no -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" - -if test -z "$max_cmd_len"; then - i=0 - testring="ABCD" - new_result= - - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while (test "X"`$SHELL $0 --fallback-echo "X$testring" 2>/dev/null` \ - = "XX$testring") >/dev/null 2>&1 && - new_result=`expr "X$testring" : ".*" 2>&1` && - max_cmd_len="$new_result" && - test "$i" != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - testring="$testring$testring" - done - testring= - # Add a significant safety factor because C++ compilers can tack on massive - # amounts of additional arguments before passing them to the linker. - # It appears as though 1/2 is a usable value. - max_cmd_len=`expr $max_cmd_len \/ 2` -fi - -##################################### -# Shell function definitions: -# This seems to be the best place for them - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $mkdir "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || { - $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 - exit $EXIT_FAILURE - } - fi - - $echo "X$my_tmpdir" | $Xsed -} - - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -func_win32_libid () -{ - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ - $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then - win32_nmres=`eval $NM -f posix -A $1 | \ - $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $echo $win32_libid_type -} - - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - CC_quoted="$CC_quoted $arg" - done - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - CC_quoted="$CC_quoted $arg" - done - # user sometimes does CC=-gcc so we need to match that to 'gcc' - trimedcc=`echo ${CC} | $SED -e "s/${host}-//g"` - # and sometimes libtool has CC=-gcc but user does CC=gcc - extendcc=${host}-${CC} - # and sometimes libtool has CC=-gcc but user has CC=-gcc - # (Gentoo-specific hack because we always export $CHOST) - mungedcc=${CHOST-${host}}-${trimedcc} - case "$@ " in - "cc "* | " cc "* | "${host}-cc "* | " ${host}-cc "*|\ - "gcc "* | " gcc "* | "${host}-gcc "* | " ${host}-gcc "*) - tagname=CC - break ;; - "$trimedcc "* | " $trimedcc "* | "`$echo $trimedcc` "* | " `$echo $trimedcc` "*|\ - "$extendcc "* | " $extendcc "* | "`$echo $extendcc` "* | " `$echo $extendcc` "*|\ - "$mungedcc "* | " $mungedcc "* | "`$echo $mungedcc` "* | " `$echo $mungedcc` "*|\ - " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - $echo "$modename: unable to infer tagged configuration" - $echo "$modename: specify a tag with \`--tag'" 1>&2 - exit $EXIT_FAILURE -# else -# $echo "$modename: using $tagname tagged configuration" - fi - ;; - esac - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - - $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" - $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 - exit $EXIT_FAILURE - fi -} - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - my_status="" - - $show "${rm}r $my_gentop" - $run ${rm}r "$my_gentop" - $show "$mkdir $my_gentop" - $run $mkdir "$my_gentop" - my_status=$? - if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then - exit $my_status - fi - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` - my_xdir="$my_gentop/$my_xlib" - - $show "${rm}r $my_xdir" - $run ${rm}r "$my_xdir" - $show "$mkdir $my_xdir" - $run $mkdir "$my_xdir" - exit_status=$? - if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then - exit $exit_status - fi - case $host in - *-darwin*) - $show "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - if test -z "$run"; then - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` - darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` - if test -n "$darwin_arches"; then - darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - $show "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we have a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` - lipo -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - ${rm}r unfat-$$ - cd "$darwin_orig_dir" - else - cd "$darwin_orig_dir" - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - fi # $run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` - done - func_extract_archives_result="$my_oldobjs" -} -# End of Shell function definitions -##################################### - -# Darwin sucks -eval std_shrext=\"$shrext_cmds\" - -disable_libs=no - -# Parse our command line options once, thoroughly. -while test "$#" -gt 0 -do - arg="$1" - shift - - case $arg in - -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - execute_dlfiles) - execute_dlfiles="$execute_dlfiles $arg" - ;; - tag) - tagname="$arg" - preserve_args="${preserve_args}=$arg" - - # Check whether tagname contains only valid characters - case $tagname in - *[!-_A-Za-z0-9,/]*) - $echo "$progname: invalid tag name: $tagname" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - case $tagname in - CC) - # Don't test for the "default" C tag, as we know, it's there, but - # not specially marked. - ;; - *) - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then - taglist="$taglist $tagname" - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" - else - $echo "$progname: ignoring unknown tag $tagname" 1>&2 - fi - ;; - esac - ;; - *) - eval "$prev=\$arg" - ;; - esac - - prev= - prevopt= - continue - fi - - # Have we seen a non-optional argument yet? - case $arg in - --help) - show_help=yes - ;; - - --version) - $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - $echo - $echo "Copyright (C) 2005 Free Software Foundation, Inc." - $echo "This is free software; see the source for copying conditions. There is NO" - $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - exit $? - ;; - - --config) - ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath - # Now print the configurations for the tags. - for tagname in $taglist; do - ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" - done - exit $? - ;; - - --debug) - $echo "$progname: enabling shell trace mode" - set -x - preserve_args="$preserve_args $arg" - ;; - - --dry-run | -n) - run=: - ;; - - --features) - $echo "host: $host" - if test "$build_libtool_libs" = yes; then - $echo "enable shared libraries" - else - $echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - $echo "enable static libraries" - else - $echo "disable static libraries" - fi - exit $? - ;; - - --finish) mode="finish" ;; - - --mode) prevopt="--mode" prev=mode ;; - --mode=*) mode="$optarg" ;; - - --preserve-dup-deps) duplicate_deps="yes" ;; - - --quiet | --silent) - show=: - preserve_args="$preserve_args $arg" - ;; - - --tag) - prevopt="--tag" - prev=tag - preserve_args="$preserve_args --tag" - ;; - --tag=*) - set tag "$optarg" ${1+"$@"} - shift - prev=tag - preserve_args="$preserve_args --tag" - ;; - - -dlopen) - prevopt="-dlopen" - prev=execute_dlfiles - ;; - - -*) - $echo "$modename: unrecognized option \`$arg'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - - *) - nonopt="$arg" - break - ;; - esac -done - -if test -n "$prevopt"; then - $echo "$modename: option \`$prevopt' requires an argument" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE -fi - -case $disable_libs in -no) - ;; -shared) - build_libtool_libs=no - build_old_libs=yes - ;; -static) - build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` - ;; -esac - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -if test -z "$show_help"; then - - # Infer the operation mode. - if test -z "$mode"; then - $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 - $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 - case $nonopt in - *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) - mode=link - for arg - do - case $arg in - -c) - mode=compile - break - ;; - esac - done - ;; - *db | *dbx | *strace | *truss) - mode=execute - ;; - *install*|cp|mv) - mode=install - ;; - *rm) - mode=uninstall - ;; - *) - # If we have no mode, but dlfiles were specified, then do execute mode. - test -n "$execute_dlfiles" && mode=execute - - # Just use the default operation mode. - if test -z "$mode"; then - if test -n "$nonopt"; then - $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 - else - $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 - fi - fi - ;; - esac - fi - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - $echo "$modename: unrecognized option \`-dlopen'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$modename --help --mode=$mode' for more information." - - # These modes are in order of execution frequency so that they run quickly. - case $mode in - # libtool compile mode - compile) - modename="$modename: compile" - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - if test -n "$libobj" ; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit $EXIT_FAILURE - fi - arg_mode=target - continue - ;; - - -static | -prefer-pic | -prefer-non-pic) - later="$later $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - base_compile="$base_compile $lastarg" - continue - ;; - - * ) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - case $lastarg in - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, and some SunOS ksh mistreat backslash-escaping - # in scan sets (worked around with variable expansion), - # and furthermore cannot handle '|' '&' '(' ')' in scan sets - # at all, so we specify them separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - lastarg="\"$lastarg\"" - ;; - esac - - base_compile="$base_compile $lastarg" - done # for arg - - case $arg_mode in - arg) - $echo "$modename: you must specify an argument for -Xcompile" - exit $EXIT_FAILURE - ;; - target) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit $EXIT_FAILURE - ;; - *) - # Get the name of the library object. - [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSifmso]' - case $libobj in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.ii) xform=ii ;; - *.class) xform=class ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; - *.for) xform=for ;; - *.java) xform=java ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - - case $libobj in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -static) - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` - case $qlibobj in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qlibobj="\"$qlibobj\"" ;; - esac - test "X$libobj" != "X$qlibobj" \ - && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." - objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir= - else - xdir=$xdir/ - fi - lobj=${xdir}$objdir/$objname - - if test -z "$base_compile"; then - $echo "$modename: you must specify a compilation command" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - $run $rm $removelist - trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $run ln "$srcfile" "$lockfile" 2>/dev/null; do - $show "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $echo "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit $EXIT_FAILURE - fi - $echo "$srcfile" > "$lockfile" - fi - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` - case $qsrcfile in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qsrcfile="\"$qsrcfile\"" ;; - esac - - $run $rm "$libobj" "${libobj}T" - - # Create a libtool object file (analogous to a ".la" file), - # but don't create it if we're doing a dry run. - test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then - $echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - $show "$mv $output_obj $lobj" - if $run $mv $output_obj $lobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Append the name of the PIC object to the libtool object file. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then - $echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - $show "$mv $output_obj $obj" - if $run $mv $output_obj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Append the name of the non-PIC object the libtool object file. - # Only append if the libtool object file exists. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - else - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - fi - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test - ;; - *) qarg=$arg ;; - esac - libtool_args="$libtool_args $qarg" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" - ;; - esac - - case $prev in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - if test ! -f "$arg"; then - $echo "$modename: symbol file \`$arg' does not exist" - exit $EXIT_FAILURE - fi - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat $save_arg` - do -# moreargs="$moreargs $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit $EXIT_FAILURE - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit $EXIT_FAILURE - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - done - else - $echo "$modename: link input file \`$save_arg' does not exist" - exit $EXIT_FAILURE - fi - arg=$save_arg - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit $EXIT_FAILURE - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - compile_command="$compile_command $wl$qarg" - finalize_command="$finalize_command $wl$qarg" - continue - ;; - xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - darwin_framework|darwin_framework_skip) - test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - prev= - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 - continue - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: more than one -exported-symbols argument is not allowed" - exit $EXIT_FAILURE - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework|-arch|-isysroot) - case " $CC " in - *" ${arg} ${1} "* | *" ${arg} ${1} "*) - prev=darwin_framework_skip ;; - *) compiler_flags="$compiler_flags $arg" - prev=darwin_framework ;; - esac - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - ;; - esac - continue - ;; - - -L*) - dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - notinst_path="$notinst_path $dir" - fi - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "*) ;; - *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - *) dllsearchpath="$dllsearchpath:$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - deplibs="$deplibs -framework System" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - deplibs="$deplibs $arg" - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - -model) - compile_command="$compile_command $arg" - compiler_flags="$compiler_flags $arg" - finalize_command="$finalize_command $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) - compiler_flags="$compiler_flags $arg" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # -64, -mips[0-9] enable 64-bit mode on the SGI compiler - # -r[0-9][0-9]* specifies the processor on the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler - # +DA*, +DD* enable 64-bit mode on the HP compiler - # -q* pass through compiler args for the IBM compiler - # -m* pass through architecture-specific compiler args for GCC - # -m*, -t[45]*, -txscale* pass through architecture-specific - # compiler args for GCC - # -pg pass through profiling flag for GCC - # @file GCC response files - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ - -t[45]*|-txscale*|@*) - - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - compiler_flags="$compiler_flags $arg" - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - # The PATH hackery in wrapper scripts is required on Windows - # in order for the loader to find any dlls it needs. - $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 - $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit $EXIT_FAILURE - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -static) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Wl,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $wl$flag" - linker_flags="$linker_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # Some other compiler flag. - -* | +*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit $EXIT_FAILURE - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit $EXIT_FAILURE - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - ;; - - *.$libext) - # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" - prev= - else - deplibs="$deplibs $arg" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - done # argument parsing loop - - if test -n "$prev"; then - $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - # Create the object directory. - if test ! -d "$output_objdir"; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - exit_status=$? - if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then - exit $exit_status - fi - fi - - # Determine the type of output - case $output in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - case $host in - *cygwin* | *mingw* | *pw32*) - # don't eliminate duplications in $postdeps and $predeps - duplicate_compiler_generated_deps=yes - ;; - *) - duplicate_compiler_generated_deps=$duplicate_deps - ;; - esac - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if test "X$duplicate_deps" = "Xyes" ; then - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - libs="$libs $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; - esac - pre_post_deps="$pre_post_deps $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - case $linkmode in - lib) - passes="conv link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 - exit $EXIT_FAILURE - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - for pass in $passes; do - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - compiler_flags="$compiler_flags $deplib" - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 - continue - fi - name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` - for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if (${SED} -e '2q' $lib | - grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - library_names= - old_library= - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - *) - $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) lib="$deplib" ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method - match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` - if eval $echo \"$deplib\" 2>/dev/null \ - | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - $echo - $echo "*** Warning: Trying to link with static lib archive $deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because the file extensions .$libext of this argument makes me believe" - $echo "*** that it is just a static archive that I should not used here." - else - $echo - $echo "*** Warning: Linking the shared library $output against the" - $echo "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - if test "$found" = yes || test -f "$lib"; then : - else - $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 - exit $EXIT_FAILURE - fi - - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - $echo "$modename: \`$lib' is not a convenience library" 1>&2 - exit $EXIT_FAILURE - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - dlprefiles="$dlprefiles $lib $dependency_libs" - else - newdlfiles="$newdlfiles $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - abs_ladir="$ladir" - fi - ;; - esac - laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - $echo "$modename: warning: library \`$lib' was moved." 1>&2 - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$libdir" - absdir="$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - fi - fi # $installed = yes - name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - newdlprefiles="$newdlprefiles $dir/$dlname" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - newlib_search_path="$newlib_search_path $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $absdir" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes ; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" - need_relink=yes - fi - # This is a shared library - - # Warn about portability, can't link against -module's on - # some systems (darwin) - if test "$shouldnotlink" = yes && test "$pass" = link ; then - $echo - if test "$linkmode" = prog; then - $echo "*** Warning: Linking the executable $output against the loadable module" - else - $echo "*** Warning: Linking the shared library $output against the loadable module" - fi - $echo "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - realname="$2" - shift; shift - libname=`eval \\$echo \"$libname_spec\"` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw*) - major=`expr $current - $age` - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - soname=`$echo $soroot | ${SED} -e 's/^.*\///'` - newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - $show "extracting exported symbol list from \`$soname'" - save_ifs="$IFS"; IFS='~' - cmds=$extract_expsyms_cmds - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - $show "generating import library for \`$soname'" - save_ifs="$IFS"; IFS='~' - cmds=$old_archive_from_expsyms_cmds - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a module then we can not link against - # it, someone is ignoring the new warnings I added - if /usr/bin/file -L $add 2> /dev/null | - $EGREP ": [^:]* bundle" >/dev/null ; then - $echo "** Warning, lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - $echo - $echo "** And there doesn't seem to be a static archive available" - $echo "** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit $EXIT_FAILURE - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && \ - test "$hardcode_minus_L" != yes && \ - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - $echo - $echo "*** Warning: This system can not link to static lib archive $lib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - $echo "*** But as you try to build a module library, libtool will still create " - $echo "*** a static module, that should work as long as the dlopening application" - $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - $echo - $echo "*** However, this would only work if libtool was able to extract symbol" - $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - $echo "*** not find such a program. So, this module is probably useless." - $echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - *) temp_deplibs="$temp_deplibs $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - newlib_search_path="$newlib_search_path $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - case $deplib in - -L*) path="$deplib" ;; - *.la) - dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$deplib" && dir="." - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - fi - ;; - esac - if grep "^installed=no" $deplib > /dev/null; then - path="$absdir/$objdir" - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - if test "$absdir" != "$libdir"; then - $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 - fi - path="$absdir" - fi - depdepl= - case $host in - *-*-darwin*) - # we do not want to link against static libs, - # but need to link against shared - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$path/$depdepl" ; then - depdepl="$path/$depdepl" - fi - # do not add paths which are already there - case " $newlib_search_path " in - *" $path "*) ;; - *) newlib_search_path="$newlib_search_path $path";; - esac - fi - path="" - ;; - *) - path="-L$path" - ;; - esac - ;; - -l*) - case $host in - *-*-darwin*) - # Again, we only want to link against shared libraries - eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` - for tmp in $newlib_search_path ; do - if test -f "$tmp/lib$tmp_libs.dylib" ; then - eval depdepl="$tmp/lib$tmp_libs.dylib" - break - fi - done - path="" - ;; - *) continue ;; - esac - ;; - *) continue ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - case " $deplibs " in - *" $depdepl "*) ;; - *) deplibs="$depdepl $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - tmp_libs="$tmp_libs $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 - fi - - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 - fi - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - objs="$objs$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - if test "$module" = no; then - $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 - exit $EXIT_FAILURE - else - $echo - $echo "*** Warning: Linking the shared library $output against the non-libtool" - $echo "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - if test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 - fi - - set dummy $rpath - if test "$#" -gt 2; then - $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 - fi - install_libdir="$2" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 - fi - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - IFS="$save_ifs" - - if test -n "$8"; then - $echo "$modename: too many parameters to \`-version-info'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$2" - number_minor="$3" - number_revision="$4" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - darwin|linux|osf|windows) - current=`expr $number_major + $number_minor` - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - current=`expr $number_major + $number_minor - 1` - age="$number_minor" - revision="$number_minor" - ;; - esac - ;; - no) - current="$2" - revision="$3" - age="$4" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - if test "$age" -gt "$current"; then - $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - minor_current=`expr $current + 1` - verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - - irix | nonstopux) - major=`expr $current - $age + 1` - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - iface=`expr $revision - $loop` - loop=`expr $loop - 1` - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - ;; - - osf) - major=.`expr $current - $age` - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - iface=`expr $current - $loop` - loop=`expr $loop - 1` - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - major=`expr $current - $age` - versuffix="-$major" - ;; - - *) - $echo "$modename: unknown library version type \`$version_type'" 1>&2 - $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit $EXIT_FAILURE - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - fi - - if test "$mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$echo "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - removelist="$removelist $p" - ;; - *) ;; - esac - done - if test -n "$removelist"; then - $show "${rm}r $removelist" - $run ${rm}r $removelist - fi - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - for path in $notinst_path; do - lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` - deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` - dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` - done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - deplibs="$deplibs -framework System" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - deplibs="$deplibs -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $rm conftest.c - cat > conftest.c </dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null \ - | grep " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - # It is ok to link against an archive when - # building a shared library. - if $AR -t $potlib > /dev/null 2>&1; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - $echo - $echo "*** Warning: linker path does not have real file for library $a_deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $echo "*** with $libname but no candidates were found. (...for file magic test)" - else - $echo "*** with $libname and none of the candidates passed a file format test" - $echo "*** using a file magic. Last file checked: $potlib" - fi - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method - match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` - for a_deplib in $deplibs; do - name=`expr $a_deplib : '-l\(.*\)'` - # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval $echo \"$potent_lib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - $echo - $echo "*** Warning: linker path does not have real file for library $a_deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $echo "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $echo "*** with $libname and none of the candidates passed a file format test" - $echo "*** using a regex pattern. Last file checked: $potlib" - fi - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` - done - fi - if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ - | grep . >/dev/null; then - $echo - if test "X$deplibs_check_method" = "Xnone"; then - $echo "*** Warning: inter-library dependencies are not supported in this platform." - else - $echo "*** Warning: inter-library dependencies are not known to be supported." - fi - $echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - $echo - $echo "*** Warning: libtool could not satisfy all declared inter-library" - $echo "*** dependencies of module $libname. Therefore, libtool will create" - $echo "*** a static module, that should work as long as the dlopening" - $echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - $echo - $echo "*** However, this would only work if libtool was able to extract symbol" - $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - $echo "*** not find such a program. So, this module is probably useless." - $echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - $echo "*** The inter-library dependencies that have been dropped here will be" - $echo "*** automatically added whenever a program is linked with this library" - $echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - $echo - $echo "*** Since this library must not contain undefined symbols," - $echo "*** because either the platform does not support them or" - $echo "*** it was explicitly requested with -no-undefined," - $echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; - esac - ;; - *) new_libs="$new_libs $deplib" ;; - esac - done - deplibs="$new_libs" - - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - realname="$2" - shift; shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - linknames="$linknames $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - if len=`expr "X$cmd" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - $show "$cmd" - $run eval "$cmd" || exit $? - skipped_export=false - else - # The command line is too long to execute in one step. - $show "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex"; then - $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - $show "$mv \"${export_symbols}T\" \"$export_symbols\"" - $run eval '$mv "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - tmp_deplibs="$tmp_deplibs $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - libobjs="$libobjs $func_extract_archives_result" - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - len=`expr "X$test_cmds" : ".*" 2>/dev/null` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise. - $echo "creating reloadable object files..." - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - output_la=`$echo "X$output" | $Xsed -e "$basename"` - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - delfiles= - last_robj= - k=1 - output=$output_objdir/$output_la-${k}.$objext - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - eval test_cmds=\"$reload_cmds $objlist $last_robj\" - if test "X$objlist" = X || - { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && - test "$len" -le "$max_cmd_len"; }; then - objlist="$objlist $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" - else - # All subsequent reloadable object files will link in - # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - k=`expr $k + 1` - output=$output_objdir/$output_la-${k}.$objext - objlist=$obj - len=1 - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" - - if ${skipped_export-false}; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - libobjs=$output - # Append the command to create the export file. - eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" - fi - - # Set up a command to remove the reloadable object files - # after they are used. - i=0 - while test "$i" -lt "$k" - do - i=`expr $i + 1` - delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" - done - - $echo "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - - # Append the command to remove the reloadable object files - # to the just-reset $cmds. - eval cmds=\"\$cmds~\$rm $delfiles\" - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 - fi - - case $output in - *.lo) - if test -n "$objs$old_deplibs"; then - $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit $EXIT_FAILURE - fi - libobj="$output" - obj=`$echo "X$output" | $Xsed -e "$lo2o"` - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $run $rm $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${obj}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - cmds=$reload_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $run eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - cmds=$reload_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; - esac - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 - fi - - if test "$preload" = yes; then - if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && - test "$dlopen_self_static" = unknown; then - $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi - fi - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - case $host in - *darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - if test "$tagname" = CXX ; then - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" - fi - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; - esac - ;; - *) new_libs="$new_libs $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - *) dllsearchpath="$dllsearchpath:$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - dlsyms="${outputname}S.c" - else - $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 - fi - fi - - if test -n "$dlsyms"; then - case $dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${outputname}.nm" - - $show "$rm $nlist ${nlist}S ${nlist}T" - $run $rm "$nlist" "${nlist}S" "${nlist}T" - - # Parse the name list into a source file. - $show "creating $output_objdir/$dlsyms" - - test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ -/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* Prevent the only kind of declaration conflicts we can make. */ -#define lt_preloaded_symbols some_other_symbol - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - $show "generating symbol list for \`$output'" - - test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for arg in $progfiles; do - $show "extracting global C symbols from \`$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - if test -n "$export_symbols_regex"; then - $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $run $rm $export_symbols - $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* ) - $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - else - $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - $run eval 'mv "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* ) - $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - fi - fi - - for arg in $dlprefiles; do - $show "extracting global C symbols from \`$arg'" - name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` - $run eval '$echo ": $name " >> "$nlist"' - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -z "$run"; then - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $mv "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - grep -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' - else - $echo '/* NONE */' >> "$output_objdir/$dlsyms" - fi - - $echo >> "$output_objdir/$dlsyms" "\ - -#undef lt_preloaded_symbols - -#if defined (__STDC__) && __STDC__ -# define lt_ptr void * -#else -# define lt_ptr char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -" - - case $host in - *cygwin* | *mingw* ) - $echo >> "$output_objdir/$dlsyms" "\ -/* DATA imports from DLLs on WIN32 can't be const, because - runtime relocations are performed -- see ld's documentation - on pseudo-relocs */ -struct { -" - ;; - * ) - $echo >> "$output_objdir/$dlsyms" "\ -const struct { -" - ;; - esac - - - $echo >> "$output_objdir/$dlsyms" "\ - const char *name; - lt_ptr address; -} -lt_preloaded_symbols[] = -{\ -" - - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" - - $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - fi - - pic_flag_for_symtable= - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; - esac;; - *-*-hpux*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag";; - esac - esac - - # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? - - # Clean up the generated files. - $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" - $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" - - # Transform the symbol file into the correct name. - case $host in - *cygwin* | *mingw* ) - if test -f "$output_objdir/${outputname}.def" ; then - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` - else - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - fi - ;; - * ) - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - ;; - esac - ;; - *) - $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit $EXIT_FAILURE - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` - fi - - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - # Replace the output file specification. - compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - $show "$link_command" - $run eval "$link_command" - exit_status=$? - - # Delete the generated files. - if test -n "$dlsyms"; then - $show "$rm $output_objdir/${outputname}S.${objext}" - $run $rm "$output_objdir/${outputname}S.${objext}" - fi - - exit $exit_status - fi - - if test -n "$shlibpath_var"; then - # We should set the shlibpath_var - rpath= - for dir in $temp_rpath; do - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) - # Absolute path. - rpath="$rpath$dir:" - ;; - *) - # Relative path: add a thisdir entry. - rpath="$rpath\$thisdir/$dir:" - ;; - esac - done - temp_rpath="$rpath" - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $run $rm $output - # Link the executable and exit - $show "$link_command" - $run eval "$link_command" || exit $? - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 - $echo "$modename: \`$output' will be relinked during installation" 1>&2 - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - - $show "$link_command" - $run eval "$link_command" || exit $? - - # Now create the wrapper script. - $show "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then - case $progpath in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; - *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; - esac - qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if our run command is non-null. - if test -z "$run"; then - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - output_name=`basename $output` - output_path=`dirname $output` - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $rm $cwrappersource $cwrapper - trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - cat > $cwrappersource <> $cwrappersource<<"EOF" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -/* -DDEBUG is fairly common in CFLAGS. */ -#undef DEBUG -#if defined DEBUGWRAPPER -# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) -#else -# define DEBUG(format, ...) -#endif - -const char *program_name = NULL; - -void * xmalloc (size_t num); -char * xstrdup (const char *string); -const char * base_name (const char *name); -char * find_executable(const char *wrapper); -int check_executable(const char *path); -char * strendzap(char *str, const char *pat); -void lt_fatal (const char *message, ...); - -int -main (int argc, char *argv[]) -{ - char **newargz; - int i; - - program_name = (char *) xstrdup (base_name (argv[0])); - DEBUG("(main) argv[0] : %s\n",argv[0]); - DEBUG("(main) program_name : %s\n",program_name); - newargz = XMALLOC(char *, argc+2); -EOF - - cat >> $cwrappersource <> $cwrappersource <<"EOF" - newargz[1] = find_executable(argv[0]); - if (newargz[1] == NULL) - lt_fatal("Couldn't find %s", argv[0]); - DEBUG("(main) found exe at : %s\n",newargz[1]); - /* we know the script has the same name, without the .exe */ - /* so make sure newargz[1] doesn't end in .exe */ - strendzap(newargz[1],".exe"); - for (i = 1; i < argc; i++) - newargz[i+1] = xstrdup(argv[i]); - newargz[argc+1] = NULL; - - for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" - return 127; -} - -void * -xmalloc (size_t num) -{ - void * p = (void *) malloc (num); - if (!p) - lt_fatal ("Memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL -; -} - -const char * -base_name (const char *name) -{ - const char *base; - -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha ((unsigned char)name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return base; -} - -int -check_executable(const char * path) -{ - struct stat st; - - DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) && - ( - /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ -#if defined (S_IXOTH) - ((st.st_mode & S_IXOTH) == S_IXOTH) || -#endif -#if defined (S_IXGRP) - ((st.st_mode & S_IXGRP) == S_IXGRP) || -#endif - ((st.st_mode & S_IXUSR) == S_IXUSR)) - ) - return 1; - else - return 0; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise */ -char * -find_executable (const char* wrapper) -{ - int has_slash = 0; - const char* p; - const char* p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char* concat_name; - - DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char* path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char* q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR(*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - tmp_len = strlen(tmp); - concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - tmp_len = strlen(tmp); - concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - return NULL; -} - -char * -strendzap(char *str, const char *pat) -{ - size_t len, patlen; - - assert(str != NULL); - assert(pat != NULL); - - len = strlen(str); - patlen = strlen(pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp(str, pat) == 0) - *str = '\0'; - } - return str; -} - -static void -lt_error_core (int exit_status, const char * mode, - const char * message, va_list ap) -{ - fprintf (stderr, "%s: %s: ", program_name, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); - va_end (ap); -} -EOF - # we should really use a build-platform specific compiler - # here, but OTOH, the wrappers (shell script and this C one) - # are only useful if you want to execute the "real" binary. - # Since the "real" binary is built for $host, then this - # wrapper might as well be built for $host, too. - $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource - ;; - esac - $rm $output - trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 - - $echo > $output "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variable: - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$echo are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - echo=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$echo works! - : - else - # Restart under the correct shell, and then maybe \$echo will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ -" - $echo >> $output "\ - - # Find the directory that this script lives in. - thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` - done - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $echo >> $output "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || \\ - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $mkdir \"\$progdir\" - else - $rm \"\$progdir/\$file\" - fi" - - $echo >> $output "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $echo \"\$relink_command_output\" >&2 - $rm \"\$progdir/\$file\" - exit $EXIT_FAILURE - fi - fi - - $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $rm \"\$progdir/\$program\"; - $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $rm \"\$progdir/\$file\" - fi" - else - $echo >> $output "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $echo >> $output "\ - - if test -f \"\$progdir/\$program\"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $echo >> $output "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $echo >> $output "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $echo >> $output "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - - # Make sure env LD_LIBRARY_PATH does not mess us up - if test -n \"\${LD_LIBRARY_PATH+set}\"; then - export LD_LIBRARY_PATH=\$progdir:\$LD_LIBRARY_PATH - fi -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2*) - $echo >> $output "\ - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $echo >> $output "\ - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $echo >> $output "\ - \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" - exit $EXIT_FAILURE - fi - else - # The program doesn't exist. - \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$echo \"This script is just a wrapper for \$program.\" 1>&2 - $echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit $EXIT_FAILURE - fi -fi\ -" - chmod +x $output - fi - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $addlibs - oldobjs="$oldobjs $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - $echo "X$obj" | $Xsed -e 's%^.*/%%' - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "copying selected object files to avoid basename conflicts..." - - if test -z "$gentop"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" - exit_status=$? - if test "$exit_status" -ne 0 && test ! -d "$gentop"; then - exit $exit_status - fi - fi - - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - counter=`expr $counter + 1` - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - $run ln "$obj" "$gentop/$newobj" || - $run cp "$obj" "$gentop/$newobj" - oldobjs="$oldobjs $gentop/$newobj" - ;; - *) oldobjs="$oldobjs $obj" ;; - esac - done - fi - - eval cmds=\"$old_archive_cmds\" - - if len=`expr "X$cmds" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - $echo "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - for obj in $save_oldobjs - do - oldobjs="$objlist $obj" - objlist="$objlist $obj" - eval test_cmds=\"$old_archive_cmds\" - if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && - test "$len" -le "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - eval cmd=\"$cmd\" - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$generated"; then - $show "${rm}r$generated" - $run ${rm}r$generated - fi - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - $show "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - - # Only create the output if not a dry run. - if test -z "$run"; then - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - if test "X$EGREP" = X ; then - EGREP=egrep - fi - # We do not want portage's install root ($D) present. Check only for - # this if the .la is being installed. - if test "$installed" = yes && test "$D"; then - eval mynewdependency_lib=`echo "$libdir/$name" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` - else - mynewdependency_lib="$libdir/$name" - fi - # Do not add duplicates - if test "$mynewdependency_lib"; then - my_little_ninja_foo_1=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` - if test -z "$my_little_ninja_foo_1"; then - newdependency_libs="$newdependency_libs $mynewdependency_lib" - fi - fi - ;; - *) - if test "$installed" = yes; then - # Rather use S=WORKDIR if our version of portage supports it. - # This is because some ebuild (gcc) do not use $S as buildroot. - if test "$PWORKDIR"; then - S="$PWORKDIR" - fi - # We do not want portage's build root ($S) present. - my_little_ninja_foo_2=`echo $deplib |$EGREP -e "$S"` - # We do not want portage's install root ($D) present. - my_little_ninja_foo_3=`echo $deplib |$EGREP -e "$D"` - if test -n "$my_little_ninja_foo_2" && test "$S"; then - mynewdependency_lib="" - elif test -n "$my_little_ninja_foo_3" && test "$D"; then - eval mynewdependency_lib=`echo "$deplib" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` - else - mynewdependency_lib="$deplib" - fi - else - mynewdependency_lib="$deplib" - fi - # Do not add duplicates - if test "$mynewdependency_lib"; then - my_little_ninja_foo_4=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` - if test -z "$my_little_ninja_foo_4"; then - newdependency_libs="$newdependency_libs $mynewdependency_lib" - fi - fi - ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - for lib in $dlfiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - newdlfiles="$newdlfiles $libdir/$name" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - newdlprefiles="$newdlprefiles $libdir/$name" - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - newdlfiles="$newdlfiles $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - newdlprefiles="$newdlprefiles $abs" - done - dlprefiles="$newdlprefiles" - fi - $rm $output - # place dlname in correct position for cygwin - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; - esac - # Do not add duplicates - if test "$installed" = yes && test "$D"; then - install_libdir=`echo "$install_libdir" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` - fi - $echo > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $echo >> $output "\ -relink_command=\"$relink_command\"" - fi - done - fi - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? - ;; - esac - exit $EXIT_SUCCESS - ;; - - # libtool install mode - install) - modename="$modename: install" - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - $echo "X$nonopt" | grep shtool > /dev/null; then - # Aesthetically quote it. - arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - install_prog="$arg " - arg="$1" - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog$arg" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - case " $install_prog " in - *[\\\ /]cp\ *) ;; - *) prev=$arg ;; - esac - ;; - -g | -m | -o) prev=$arg ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog $arg" - done - - if test -z "$install_prog"; then - $echo "$modename: you must specify an install program" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - if test -n "$prev"; then - $echo "$modename: the \`$prev' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - if test -z "$files"; then - if test -z "$dest"; then - $echo "$modename: no file or destination specified" 1>&2 - else - $echo "$modename: you must specify a destination" 1>&2 - fi - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Strip any trailing slash from the destination. - dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` - test "X$destdir" = "X$dest" && destdir=. - destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` - - # Not a directory, so check to see that there is only one file specified. - set dummy $files - if test "$#" -gt 2; then - $echo "$modename: \`$dest' is not a directory" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - library_names= - old_library= - relink_command= - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ - test "X$dir" = "X$file/" && dir= - dir="$dir$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - if test "$inst_prefix_dir" = "$destdir"; then - $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 - exit $EXIT_FAILURE - fi - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - $echo "$modename: warning: relinking \`$file'" 1>&2 - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - exit $EXIT_FAILURE - fi - fi - - # See the names of the shared library. - set dummy $library_names - if test -n "$2"; then - realname="$2" - shift - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - $show "$install_prog $dir/$srcname $destdir/$realname" - $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? - if test -n "$stripme" && test -n "$striplib"; then - $show "$striplib $destdir/$realname" - $run eval "$striplib $destdir/$realname" || exit $? - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - if test "$linkname" != "$realname"; then - $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" - $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" - fi - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - cmds=$postinstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - fi - - # Install the pseudo-library for information purposes. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - # Install the libtool object if requested. - if test -n "$destfile"; then - $show "$install_prog $file $destfile" - $run eval "$install_prog $file $destfile" || exit $? - fi - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` - - $show "$install_prog $staticobj $staticdest" - $run eval "$install_prog \$staticobj \$staticdest" || exit $? - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - file=`$echo $file|${SED} 's,.exe$,,'` - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin*|*mingw*) - wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` - ;; - *) - wrapper=$file - ;; - esac - if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then - notinst_deplibs= - relink_command= - - # Note that it is not necessary on cygwin/mingw to append a dot to - # foo even if both foo and FILE.exe exist: automatic-append-.exe - # behavior happens only for exec(3), not for open(2)! Also, sourcing - # `FILE.' does not work on cygwin managed mounts. - # - # If there is no directory component, then add one. - case $wrapper in - */* | *\\*) . ${wrapper} ;; - *) . ./${wrapper} ;; - esac - - # Check the variables that should have been set. - if test -z "$notinst_deplibs"; then - $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 - exit $EXIT_FAILURE - fi - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - # If there is no directory component, then add one. - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - fi - libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 - finalize=no - fi - done - - relink_command= - # Note that it is not necessary on cygwin/mingw to append a dot to - # foo even if both foo and FILE.exe exist: automatic-append-.exe - # behavior happens only for exec(3), not for open(2)! Also, sourcing - # `FILE.' does not work on cygwin managed mounts. - # - # If there is no directory component, then add one. - case $wrapper in - */* | *\\*) . ${wrapper} ;; - *) . ./${wrapper} ;; - esac - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - if test "$finalize" = yes && test -z "$run"; then - tmpdir=`func_mktempdir` - file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - ${rm}r "$tmpdir" - continue - fi - file="$outputname" - else - $echo "$modename: warning: cannot relink \`$file'" 1>&2 - fi - else - # Install the binary that we compiled earlier. - file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` - ;; - esac - ;; - esac - $show "$install_prog$stripme $file $destfile" - $run eval "$install_prog\$stripme \$file \$destfile" || exit $? - test -n "$outputname" && ${rm}r "$tmpdir" - ;; - esac - done - - for file in $staticlibs; do - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - $show "$install_prog $file $oldlib" - $run eval "$install_prog \$file \$oldlib" || exit $? - - if test -n "$stripme" && test -n "$old_striplib"; then - $show "$old_striplib $oldlib" - $run eval "$old_striplib $oldlib" || exit $? - fi - - # Do each command in the postinstall commands. - cmds=$old_postinstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$future_libdirs"; then - $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 - fi - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - test -n "$run" && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi - ;; - - # libtool finish mode - finish) - modename="$modename: finish" - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - cmds=$finish_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || admincmds="$admincmds - $cmd" - done - IFS="$save_ifs" - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $run eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - test "$show" = : && exit $EXIT_SUCCESS - - $echo "X----------------------------------------------------------------------" | $Xsed - $echo "Libraries have been installed in:" - for libdir in $libdirs; do - $echo " $libdir" - done - $echo - $echo "If you ever happen to want to link against installed libraries" - $echo "in a given directory, LIBDIR, you must either use libtool, and" - $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - $echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - $echo " during execution" - fi - if test -n "$runpath_var"; then - $echo " - add LIBDIR to the \`$runpath_var' environment variable" - $echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $echo " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $echo " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - $echo - $echo "See any operating system documentation about shared libraries for" - $echo "more information, such as the ld(1) and ld.so(8) manual pages." - $echo "X----------------------------------------------------------------------" | $Xsed - exit $EXIT_SUCCESS - ;; - - # libtool execute mode - execute) - modename="$modename: execute" - - # The first argument is the command name. - cmd="$nonopt" - if test -z "$cmd"; then - $echo "$modename: you must specify a COMMAND" 1>&2 - $echo "$help" - exit $EXIT_FAILURE - fi - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - if test ! -f "$file"; then - $echo "$modename: \`$file' is not a file" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - dir= - case $file in - *.la) - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Read the libtool library. - dlname= - library_names= - - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" - continue - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit $EXIT_FAILURE - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - ;; - - *) - $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` - args="$args \"$file\"" - done - - if test -z "$run"; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - if test "${save_LC_ALL+set}" = set; then - LC_ALL="$save_LC_ALL"; export LC_ALL - fi - if test "${save_LANG+set}" = set; then - LANG="$save_LANG"; export LANG - fi - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" - $echo "export $shlibpath_var" - fi - $echo "$cmd$args" - exit $EXIT_SUCCESS - fi - ;; - - # libtool clean and uninstall mode - clean | uninstall) - modename="$modename: $mode" - rm="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) rm="$rm $arg"; rmforce=yes ;; - -*) rm="$rm $arg" ;; - *) files="$files $arg" ;; - esac - done - - if test -z "$rm"; then - $echo "$modename: you must specify an RM program" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - rmdirs= - - origobjdir="$objdir" - for file in $files; do - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$file"; then - dir=. - objdir="$origobjdir" - else - objdir="$dir/$origobjdir" - fi - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test "$mode" = uninstall && objdir="$dir" - - # Remember objdir for removal later, being careful to avoid duplicates - if test "$mode" = clean; then - case " $rmdirs " in - *" $objdir "*) ;; - *) rmdirs="$rmdirs $objdir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if (test -L "$file") >/dev/null 2>&1 \ - || (test -h "$file") >/dev/null 2>&1 \ - || test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - . $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - - case "$mode" in - clean) - case " $library_names " in - # " " in the beginning catches empty $dlname - *" $dlname "*) ;; - *) rmfiles="$rmfiles $objdir/$dlname" ;; - esac - test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - cmds=$postuninstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - cmds=$old_postuninstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - - # Read the .lo file - . $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" \ - && test "$pic_object" != none; then - rmfiles="$rmfiles $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" \ - && test "$non_pic_object" != none; then - rmfiles="$rmfiles $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$mode" = clean ; then - noexename=$name - case $file in - *.exe) - file=`$echo $file|${SED} 's,.exe$,,'` - noexename=`$echo $name|${SED} 's,.exe$,,'` - # $file with .exe has already been added to rmfiles, - # add $file without .exe - rmfiles="$rmfiles $file" - ;; - esac - # Do a test to see if this is a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$noexename - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - rmfiles="$rmfiles $objdir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - $show "$rm $rmfiles" - $run $rm $rmfiles || exit_status=1 - done - objdir="$origobjdir" - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - $show "rmdir $dir" - $run rmdir $dir >/dev/null 2>&1 - fi - done - - exit $exit_status - ;; - - "") - $echo "$modename: you must specify a MODE" 1>&2 - $echo "$generic_help" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - if test -z "$exec_cmd"; then - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit $EXIT_FAILURE - fi -fi # test -z "$show_help" - -if test -n "$exec_cmd"; then - eval exec $exec_cmd - exit $EXIT_FAILURE -fi - -# We need to display help for each of the modes. -case $mode in -"") $echo \ -"Usage: $modename [OPTION]... [MODE-ARG]... - -Provide generalized library-building support services. - - --config show all configuration variables - --debug enable verbose shell tracing --n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --finish same as \`--mode=finish' - --help display this help message and exit - --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] - --quiet same as \`--silent' - --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - --version print version information - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE. - -Report bugs to ." - exit $EXIT_SUCCESS - ;; - -clean) - $echo \ -"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - -compile) - $echo \ -"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only - -static always build a \`.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - -execute) - $echo \ -"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - -finish) - $echo \ -"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - -install) - $echo \ -"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - -link) - $echo \ -"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -static do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - -uninstall) - $echo \ -"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - -*) - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; -esac - -$echo -$echo "Try \`$modename --help' for more information about other modes." - -exit $? - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -disable_libs=shared -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -disable_libs=static -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/libraries/sqlite/unix/sqlite-3.5.1/main.mk b/libraries/sqlite/unix/sqlite-3.5.1/main.mk deleted file mode 100644 index c700c5bc73..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/main.mk +++ /dev/null @@ -1,552 +0,0 @@ -############################################################################### -# The following macros should be defined before this script is -# invoked: -# -# TOP The toplevel directory of the source tree. This is the -# directory that contains this "Makefile.in" and the -# "configure.in" script. -# -# BCC C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -# THREADLIB Specify any extra linker options needed to make the library -# thread safe -# -# OPTS Extra compiler command-line options. -# -# EXE The suffix to add to executable files. ".exe" for windows -# and "" for Unix. -# -# TCC C Compiler and options for use in building executables that -# will run on the target platform. This is usually the same -# as BCC, unless you are cross-compiling. -# -# AR Tools used to build a static library. -# RANLIB -# -# TCL_FLAGS Extra compiler options needed for programs that use the -# TCL library. -# -# LIBTCL Linker options needed to link against the TCL library. -# -# READLINE_FLAGS Compiler options needed for programs that use the -# readline() library. -# -# LIBREADLINE Linker options needed by programs using readline() must -# link against. -# -# NAWK Nawk compatible awk program. Older (obsolete?) solaris -# systems need this to avoid using the original AT&T AWK. -# -# Once the macros above are defined, the rest of this make script will -# build the SQLite library and testing tools. -################################################################################ - -# This is how we compile -# -TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src - -# Object files for the SQLite library. -# -LIBOBJ+= alter.o analyze.o attach.o auth.o btmutex.o btree.o build.o \ - callback.o complete.o date.o delete.o \ - expr.o func.o hash.o insert.o journal.o loadext.o \ - main.o malloc.o mem1.o mem2.o mutex.o mutex_os2.o \ - mutex_unix.o mutex_w32.o \ - opcodes.o os.o os_os2.o os_unix.o os_win.o \ - pager.o parse.o pragma.o prepare.o printf.o random.o \ - select.o table.o tclsqlite.o tokenize.o trigger.o \ - update.o util.o vacuum.o \ - vdbe.o vdbeapi.o vdbeaux.o vdbeblob.o vdbefifo.o vdbemem.o \ - where.o utf.o legacy.o vtab.o - -EXTOBJ = icu.o -EXTOBJ += fts1.o \ - fts1_hash.o \ - fts1_tokenizer1.o \ - fts1_porter.o -EXTOBJ += fts2.o \ - fts2_hash.o \ - fts2_icu.o \ - fts2_porter.o \ - fts2_tokenizer.o \ - fts2_tokenizer1.o -EXTOBJ += fts3.o \ - fts3_hash.o \ - fts3_icu.o \ - fts3_porter.o \ - fts3_tokenizer.o \ - fts3_tokenizer1.o - -# All of the source code files. -# -SRC = \ - $(TOP)/src/alter.c \ - $(TOP)/src/analyze.c \ - $(TOP)/src/attach.c \ - $(TOP)/src/auth.c \ - $(TOP)/src/btmutex.c \ - $(TOP)/src/btree.c \ - $(TOP)/src/btree.h \ - $(TOP)/src/btreeInt.h \ - $(TOP)/src/build.c \ - $(TOP)/src/callback.c \ - $(TOP)/src/complete.c \ - $(TOP)/src/date.c \ - $(TOP)/src/delete.c \ - $(TOP)/src/expr.c \ - $(TOP)/src/func.c \ - $(TOP)/src/hash.c \ - $(TOP)/src/hash.h \ - $(TOP)/src/insert.c \ - $(TOP)/src/journal.c \ - $(TOP)/src/legacy.c \ - $(TOP)/src/loadext.c \ - $(TOP)/src/main.c \ - $(TOP)/src/malloc.c \ - $(TOP)/src/mem1.c \ - $(TOP)/src/mem2.c \ - $(TOP)/src/mutex.c \ - $(TOP)/src/mutex.h \ - $(TOP)/src/mutex_os2.c \ - $(TOP)/src/mutex_unix.c \ - $(TOP)/src/mutex_w32.c \ - $(TOP)/src/os.c \ - $(TOP)/src/os.h \ - $(TOP)/src/os_common.h \ - $(TOP)/src/os_os2.c \ - $(TOP)/src/os_unix.c \ - $(TOP)/src/os_win.c \ - $(TOP)/src/pager.c \ - $(TOP)/src/pager.h \ - $(TOP)/src/parse.y \ - $(TOP)/src/pragma.c \ - $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c \ - $(TOP)/src/random.c \ - $(TOP)/src/select.c \ - $(TOP)/src/shell.c \ - $(TOP)/src/sqlite.h.in \ - $(TOP)/src/sqlite3ext.h \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/sqliteLimit.h \ - $(TOP)/src/table.c \ - $(TOP)/src/tclsqlite.c \ - $(TOP)/src/tokenize.c \ - $(TOP)/src/trigger.c \ - $(TOP)/src/utf.c \ - $(TOP)/src/update.c \ - $(TOP)/src/util.c \ - $(TOP)/src/vacuum.c \ - $(TOP)/src/vdbe.c \ - $(TOP)/src/vdbe.h \ - $(TOP)/src/vdbeapi.c \ - $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbeblob.c \ - $(TOP)/src/vdbefifo.c \ - $(TOP)/src/vdbemem.c \ - $(TOP)/src/vdbeInt.h \ - $(TOP)/src/vtab.c \ - $(TOP)/src/where.c - -# Source code for extensions -# -SRC += \ - $(TOP)/ext/fts1/fts1.c \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.c \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_porter.c \ - $(TOP)/ext/fts1/fts1_tokenizer.h \ - $(TOP)/ext/fts1/fts1_tokenizer1.c -SRC += \ - $(TOP)/ext/fts2/fts2.c \ - $(TOP)/ext/fts2/fts2.h \ - $(TOP)/ext/fts2/fts2_hash.c \ - $(TOP)/ext/fts2/fts2_hash.h \ - $(TOP)/ext/fts2/fts2_icu.c \ - $(TOP)/ext/fts2/fts2_porter.c \ - $(TOP)/ext/fts2/fts2_tokenizer.h \ - $(TOP)/ext/fts2/fts2_tokenizer.c \ - $(TOP)/ext/fts2/fts2_tokenizer1.c -SRC += \ - $(TOP)/ext/fts3/fts3.c \ - $(TOP)/ext/fts3/fts3.h \ - $(TOP)/ext/fts3/fts3_hash.c \ - $(TOP)/ext/fts3/fts3_hash.h \ - $(TOP)/ext/fts3/fts3_icu.c \ - $(TOP)/ext/fts3/fts3_porter.c \ - $(TOP)/ext/fts3/fts3_tokenizer.h \ - $(TOP)/ext/fts3/fts3_tokenizer.c \ - $(TOP)/ext/fts3/fts3_tokenizer1.c -SRC += \ - $(TOP)/ext/icu/icu.c - - -# Generated source code files -# -SRC += \ - keywordhash.h \ - opcodes.c \ - opcodes.h \ - parse.c \ - parse.h \ - sqlite3.h - - -# Source code to the test files. -# -TESTSRC = \ - $(TOP)/src/test1.c \ - $(TOP)/src/test2.c \ - $(TOP)/src/test3.c \ - $(TOP)/src/test4.c \ - $(TOP)/src/test5.c \ - $(TOP)/src/test6.c \ - $(TOP)/src/test7.c \ - $(TOP)/src/test8.c \ - $(TOP)/src/test9.c \ - $(TOP)/src/test_autoext.c \ - $(TOP)/src/test_async.c \ - $(TOP)/src/test_btree.c \ - $(TOP)/src/test_config.c \ - $(TOP)/src/test_hexio.c \ - $(TOP)/src/test_malloc.c \ - $(TOP)/src/test_md5.c \ - $(TOP)/src/test_onefile.c \ - $(TOP)/src/test_schema.c \ - $(TOP)/src/test_server.c \ - $(TOP)/src/test_tclvar.c \ - $(TOP)/src/test_thread.c \ - -TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c -TESTSRC += $(TOP)/ext/fts3/fts3_tokenizer.c - -TESTSRC2 = \ - $(TOP)/src/attach.c $(TOP)/src/btree.c $(TOP)/src/build.c $(TOP)/src/date.c \ - $(TOP)/src/expr.c $(TOP)/src/func.c $(TOP)/src/insert.c $(TOP)/src/os.c \ - $(TOP)/src/os_os2.c $(TOP)/src/os_unix.c $(TOP)/src/os_win.c \ - $(TOP)/src/pager.c $(TOP)/src/pragma.c $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c $(TOP)/src/select.c $(TOP)/src/tokenize.c \ - $(TOP)/src/utf.c $(TOP)/src/util.c $(TOP)/src/vdbeapi.c $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbe.c $(TOP)/src/vdbemem.c $(TOP)/src/where.c parse.c - -# Header files used by all library source files. -# -HDR = \ - $(TOP)/src/btree.h \ - $(TOP)/src/btreeInt.h \ - $(TOP)/src/hash.h \ - keywordhash.h \ - $(TOP)/src/mutex.h \ - opcodes.h \ - $(TOP)/src/os.h \ - $(TOP)/src/os_common.h \ - $(TOP)/src/pager.h \ - parse.h \ - sqlite3.h \ - $(TOP)/src/sqlite3ext.h \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/sqliteLimit.h \ - $(TOP)/src/vdbe.h \ - $(TOP)/src/vdbeInt.h - -# Header files used by extensions -# -EXTHDR += \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_tokenizer.h -EXTHDR += \ - $(TOP)/ext/fts2/fts2.h \ - $(TOP)/ext/fts2/fts2_hash.h \ - $(TOP)/ext/fts2/fts2_tokenizer.h -EXTHDR += \ - $(TOP)/ext/fts3/fts3.h \ - $(TOP)/ext/fts3/fts3_hash.h \ - $(TOP)/ext/fts3/fts3_tokenizer.h - -# This is the default Makefile target. The objects listed here -# are what get build when you type just "make" with no arguments. -# -all: sqlite3.h libsqlite3.a sqlite3$(EXE) - -# Generate the file "last_change" which contains the date of change -# of the most recently modified source code file -# -last_change: $(SRC) - cat $(SRC) | grep '$$Id: ' | sort -k 5 | tail -1 \ - | $(NAWK) '{print $$5,$$6}' >last_change - -libsqlite3.a: $(LIBOBJ) - $(AR) libsqlite3.a $(LIBOBJ) - $(RANLIB) libsqlite3.a - -sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h - $(TCCX) $(READLINE_FLAGS) -o sqlite3$(EXE) \ - $(TOP)/src/shell.c \ - libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB) - -objects: $(LIBOBJ_ORIG) - -# This target creates a directory named "tsrc" and fills it with -# copies of all of the C source code and header files needed to -# build on the target system. Some of the C source code and header -# files are automatically generated. This target takes care of -# all that automatic generation. -# -target_source: $(SRC) - rm -rf tsrc - mkdir tsrc - cp -f $(SRC) tsrc - rm tsrc/sqlite.h.in tsrc/parse.y - -sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl - tclsh $(TOP)/tool/mksqlite3c.tcl - cp sqlite3.c tclsqlite3.c - cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c - tclsh $(TOP)/tool/mksqlite3internalh.tcl - -fts2amal.c: target_source $(TOP)/ext/fts2/mkfts2amal.tcl - tclsh $(TOP)/ext/fts2/mkfts2amal.tcl - -fts3amal.c: target_source $(TOP)/ext/fts3/mkfts3amal.tcl - tclsh $(TOP)/ext/fts3/mkfts3amal.tcl - -# Rules to build the LEMON compiler generator -# -lemon: $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c - $(BCC) -o lemon $(TOP)/tool/lemon.c - cp $(TOP)/tool/lempar.c . - -# Rules to build individual *.o files from files in the src directory. -# -%.o: %.c $(HDR) - $(TCCX) -c $< - -# Rules to build individual *.o files from generated *.c files. This -# applies to: -# -# parse.o -# opcodes.o -# -%.o: $(TOP)/src/%.c $(HDR) - $(TCCX) -c $< - -tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR) - $(TCCX) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c - - - -# Rules to build opcodes.c and opcodes.h -# -opcodes.c: opcodes.h $(TOP)/mkopcodec.awk - sort -n -b -k 3 opcodes.h | $(NAWK) -f $(TOP)/mkopcodec.awk >opcodes.c - -opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk - cat parse.h $(TOP)/src/vdbe.c |$(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h - - -# Rules to build parse.c and parse.h - the outputs of lemon. -# -parse.h: parse.c - -parse.c: $(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk - cp $(TOP)/src/parse.y . - ./lemon $(OPTS) parse.y - mv parse.h parse.h.temp - awk -f $(TOP)/addopcodes.awk parse.h.temp >parse.h - -sqlite3.h: $(TOP)/src/sqlite.h.in - sed -e s/--VERS--/`cat ${TOP}/VERSION`/ \ - -e s/--VERSION-NUMBER--/`cat ${TOP}/VERSION | sed 's/[^0-9]/ /g' | $(NAWK) '{printf "%d%03d%03d",$$1,$$2,$$3}'`/ \ - $(TOP)/src/sqlite.h.in >sqlite3.h - -keywordhash.h: $(TOP)/tool/mkkeywordhash.c - $(BCC) -o mkkeywordhash $(OPTS) $(TOP)/tool/mkkeywordhash.c - ./mkkeywordhash >keywordhash.h - - - -# Rules to build the extension objects. -# -icu.o: $(TOP)/ext/icu/icu.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/icu/icu.c - -fts2.o: $(TOP)/ext/fts2/fts2.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2.c - -fts2_hash.o: $(TOP)/ext/fts2/fts2_hash.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_hash.c - -fts2_icu.o: $(TOP)/ext/fts2/fts2_icu.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_icu.c - -fts2_porter.o: $(TOP)/ext/fts2/fts2_porter.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_porter.c - -fts2_tokenizer.o: $(TOP)/ext/fts2/fts2_tokenizer.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_tokenizer.c - -fts2_tokenizer1.o: $(TOP)/ext/fts2/fts2_tokenizer1.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_tokenizer1.c - -fts3.o: $(TOP)/ext/fts3/fts3.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3.c - -fts3_hash.o: $(TOP)/ext/fts3/fts3_hash.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_hash.c - -fts3_icu.o: $(TOP)/ext/fts3/fts3_icu.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_icu.c - -fts3_porter.o: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c - -fts3_tokenizer.o: $(TOP)/ext/fts3/fts3_tokenizer.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer.c - -fts3_tokenizer1.o: $(TOP)/ext/fts3/fts3_tokenizer1.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer1.c - - -# Rules for building test programs and for running tests -# -tclsqlite3: $(TOP)/src/tclsqlite.c libsqlite3.a - $(TCCX) $(TCL_FLAGS) -DTCLSH=1 -o tclsqlite3 \ - $(TOP)/src/tclsqlite.c libsqlite3.a $(LIBTCL) $(THREADLIB) - - -# Rules to build the 'testfixture' application. -# -TESTFIXTURE_FLAGS = -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 -TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE - -testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c - $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c \ - -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) libsqlite3.a - -amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c - $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ - -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) - -fulltest: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/all.test - -soaktest: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/all.test -soak 1 - -test: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/quick.test - -sqlite3_analyzer$(EXE): $(TOP)/src/tclsqlite.c sqlite3.c $(TESTSRC) \ - $(TOP)/tool/spaceanal.tcl - sed \ - -e '/^#/d' \ - -e 's,\\,\\\\,g' \ - -e 's,",\\",g' \ - -e 's,^,",' \ - -e 's,$$,\\n",' \ - $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h - $(TCCX) $(TCL_FLAGS) \ - -DTCLSH=2 -DSQLITE_TEST=1 -DSQLITE_DEBUG=1 -DSQLITE_PRIVATE="" \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ - -o sqlite3_analyzer$(EXE) \ - $(LIBTCL) $(THREADLIB) - -TEST_EXTENSION = $(SHPREFIX)testloadext.$(SO) -$(TEST_EXTENSION): $(TOP)/src/test_loadext.c - $(MKSHLIB) $(TOP)/src/test_loadext.c -o $(TEST_EXTENSION) - -extensiontest: testfixture$(EXE) $(TEST_EXTENSION) - ./testfixture$(EXE) $(TOP)/test/loadext.test - - -# Rules used to build documentation -# -%.html: $(TOP)/www/%.tcl docdir last_change common.tcl - tclsh $< > $@ - -lang.html: $(TOP)/www/lang.tcl docdir - tclsh $(TOP)/www/lang.tcl doc >lang.html - -opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c - tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html - -capi3ref.html: $(TOP)/www/mkapidoc.tcl sqlite3.h - tclsh $(TOP)/www/mkapidoc.tcl capi3ref.html - -copyright-release.html: $(TOP)/www/copyright-release.html - cp $(TOP)/www/copyright-release.html . - -%: $(TOP)/www/% - cp $< $@ - -# Files to be published on the website. -# -DOC = \ - arch.html \ - autoinc.html \ - c_interface.html \ - capi3.html \ - capi3ref.html \ - changes.html \ - compile.html \ - copyright.html \ - copyright-release.html \ - copyright-release.pdf \ - conflict.html \ - datatypes.html \ - datatype3.html \ - different.html \ - docs.html \ - download.html \ - faq.html \ - fileformat.html \ - formatchng.html \ - index.html \ - limits.html \ - lang.html \ - lockingv3.html \ - mingw.html \ - nulls.html \ - oldnews.html \ - omitted.html \ - opcode.html \ - optimizer.html \ - optoverview.html \ - pragma.html \ - quickstart.html \ - sharedcache.html \ - speed.html \ - sqlite.html \ - support.html \ - tclsqlite.html \ - vdbe.html \ - version3.html \ - whentouse.html \ - 34to35.html - -docdir: - mkdir -p doc - -doc: common.tcl $(DOC) docdir - mv $(DOC) doc - cp $(TOP)/www/*.gif $(TOP)/art/*.gif doc - -# Standard install and cleanup targets -# -install: sqlite3 libsqlite3.a sqlite3.h - mv sqlite3 /usr/bin - mv libsqlite3.a /usr/lib - mv sqlite3.h /usr/include - -clean: - rm -f *.o sqlite3 libsqlite3.a sqlite3.h opcodes.* - rm -f lemon lempar.c parse.* sqlite*.tar.gz mkkeywordhash keywordhash.h - rm -f $(PUBLISH) - rm -f *.da *.bb *.bbg gmon.out - rm -rf tsrc - rm -f testloadext.dll libtestloadext.so diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh b/libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh deleted file mode 100644 index e1e6d98818..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/mkdll.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh -# -# This script is used to compile SQLite into a DLL. -# -# Two separate DLLs are generated. "sqlite3.dll" is the core -# library. "tclsqlite3.dll" contains the TCL bindings and is the -# library that is loaded into TCL in order to run SQLite. -# -make sqlite3.c -PATH=$PATH:/opt/mingw/bin -TCLDIR=/home/drh/tcltk/846/win/846win -TCLSTUBLIB=$TCLDIR/libtcl84stub.a -OPTS='-DUSE_TCL_STUBS=1 -DTHREADSAFE=1 -DBUILD_sqlite=1 -DOS_WIN=1' -CC="i386-mingw32msvc-gcc -O2 $OPTS -Itsrc -I$TCLDIR" -NM="i386-mingw32msvc-nm" -CMD="$CC -c sqlite3.c" -echo $CMD -$CMD -CMD="$CC -c tclsqlite3.c" -echo $CMD -$CMD -echo 'EXPORTS' >tclsqlite3.def -$NM tclsqlite3.o | grep ' T ' >temp1 -grep '_Init$' temp1 >temp2 -grep '_SafeInit$' temp1 >>temp2 -grep ' T _sqlite3_' temp1 >>temp2 -echo 'EXPORTS' >tclsqlite3.def -sed 's/^.* T _//' temp2 | sort | uniq >>tclsqlite3.def -i386-mingw32msvc-dllwrap \ - --def tclsqlite3.def -v --export-all \ - --driver-name i386-mingw32msvc-gcc \ - --dlltool-name i386-mingw32msvc-dlltool \ - --as i386-mingw32msvc-as \ - --target i386-mingw32 \ - -dllname tclsqlite3.dll -lmsvcrt tclsqlite3.o $TCLSTUBLIB -$NM sqlite3.o | grep ' T ' >temp1 -echo 'EXPORTS' >sqlite3.def -grep ' _sqlite3_' temp1 | sed 's/^.* _//' >>sqlite3.def -i386-mingw32msvc-dllwrap \ - --def sqlite3.def -v --export-all \ - --driver-name i386-mingw32msvc-gcc \ - --dlltool-name i386-mingw32msvc-dlltool \ - --as i386-mingw32msvc-as \ - --target i386-mingw32 \ - -dllname sqlite3.dll -lmsvcrt sqlite3.o diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh b/libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh deleted file mode 100644 index 1d96897769..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/mkextu.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# This script is used to compile SQLite into a shared library on Linux. -# -# Two separate shared libraries are generated. "sqlite3.so" is the core -# library. "tclsqlite3.so" contains the TCL bindings and is the -# library that is loaded into TCL in order to run SQLite. -# -CFLAGS=-O2 -Wall -make fts2amal.c -echo gcc $CFLAGS -shared fts2amal.c -o fts2.so -gcc $CFLAGS -shared fts2amal.c -o fts2.so -strip fts2.so diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh b/libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh deleted file mode 100644 index 3332f912f3..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/mkextw.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# -# This script is used to compile SQLite extensions into DLLs. -# -make fts2amal.c -PATH=$PATH:/opt/mingw/bin -OPTS='-DTHREADSAFE=1 -DBUILD_sqlite=1 -DOS_WIN=1' -CC="i386-mingw32msvc-gcc -O2 $OPTS -Itsrc" -NM="i386-mingw32msvc-nm" -CMD="$CC -c fts2amal.c" -echo $CMD -$CMD -echo 'EXPORTS' >fts2.def -echo 'sqlite3_extension_init' >>fts2.def -i386-mingw32msvc-dllwrap \ - --def fts2.def -v --export-all \ - --driver-name i386-mingw32msvc-gcc \ - --dlltool-name i386-mingw32msvc-dlltool \ - --as i386-mingw32msvc-as \ - --target i386-mingw32 \ - -dllname fts2.dll -lmsvcrt fts2amal.o -zip fts2dll.zip fts2.dll fts2.def diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk b/libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk deleted file mode 100644 index ec80953009..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/mkopcodec.awk +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/awk -f -# -# This AWK script scans the opcodes.h file (which is itself generated by -# another awk script) and uses the information gleaned to create the -# opcodes.c source file. -# -# Opcodes.c contains strings which are the symbolic names for the various -# opcodes used by the VDBE. These strings are used when disassembling a -# VDBE program during tracing or as a result of the EXPLAIN keyword. -# -BEGIN { - print "/* Automatically generated. Do not edit */" - print "/* See the mkopcodec.awk script for details. */" - printf "#if !defined(SQLITE_OMIT_EXPLAIN)" - printf " || !defined(NDEBUG)" - printf " || defined(VDBE_PROFILE)" - print " || defined(SQLITE_DEBUG)" - print "const char *sqlite3OpcodeName(int i){" - print " static const char *const azName[] = { \"?\"," -} -/define OP_/ { - sub("OP_","",$2) - i++ - printf " /* %3d */ \"%s\",\n", $3, $2 -} -END { - print " };" - print " return azName[i];" - print "}" - print "#endif" -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk b/libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk deleted file mode 100644 index c0874b1439..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/mkopcodeh.awk +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/awk -f -# -# Generate the file opcodes.h. -# -# This AWK script scans a concatenation of the parse.h output file from the -# parser and the vdbe.c source file in order to generate the opcodes numbers -# for all opcodes. -# -# The lines of the vdbe.c that we are interested in are of the form: -# -# case OP_aaaa: /* same as TK_bbbbb */ -# -# The TK_ comment is optional. If it is present, then the value assigned to -# the OP_ is the same as the TK_ value. If missing, the OP_ value is assigned -# a small integer that is different from every other OP_ value. -# -# We go to the trouble of making some OP_ values the same as TK_ values -# as an optimization. During parsing, things like expression operators -# are coded with TK_ values such as TK_ADD, TK_DIVIDE, and so forth. Later -# during code generation, we need to generate corresponding opcodes like -# OP_Add and OP_Divide. By making TK_ADD==OP_Add and TK_DIVIDE==OP_Divide, -# code to translate from one to the other is avoided. This makes the -# code generator run (infinitesimally) faster and more importantly it makes -# the library footprint smaller. -# -# This script also scans for lines of the form: -# -# case OP_aaaa: /* no-push */ -# -# When the no-push comment is found on an opcode, it means that that -# opcode does not leave a result on the stack. By identifying which -# opcodes leave results on the stack it is possible to determine a -# much smaller upper bound on the size of the stack. This allows -# a smaller stack to be allocated, which is important to embedded -# systems with limited memory space. This script generates a series -# of "NOPUSH_MASK" defines that contain bitmaps of opcodes that leave -# results on the stack. The NOPUSH_MASK defines are used in vdbeaux.c -# to help determine the maximum stack size. -# - - -# Remember the TK_ values from the parse.h file -/^#define TK_/ { - tk[$2] = $3 -} - -# Scan for "case OP_aaaa:" lines in the vdbe.c file -/^case OP_/ { - name = $2 - sub(/:/,"",name) - sub("\r","",name) - op[name] = -1 - for(i=3; imax ) max = op[name] - printf "#define %-25s %15d", name, op[name] - if( sameas[op[name]] ) { - printf " /* same as %-12s*/", sameas[op[name]] - } - printf "\n" - - } - seenUnused = 0; - for(i=1; i $HOME/.rpmmacros -echo "%_topdir %{HOME}/rpm" >> $HOME/.rpmmacros -mkdir $HOME/rpm -mkdir $HOME/rpm/BUILD -mkdir $HOME/rpm/SOURCES -mkdir $HOME/rpm/RPMS -mkdir $HOME/rpm/SRPMS -mkdir $HOME/rpm/SPECS - -# create the spec file from the template -sed s/SQLITE_VERSION/$VERS/g $srcdir/spec.template > $HOME/rpm/SPECS/sqlite.spec - -# copy the source tarball to the rpm directory -cp doc/sqlite-$VERS.tar.gz $HOME/rpm/SOURCES/. - -# build all the rpms -rpm -ba $HOME/rpm/SPECS/sqlite.spec >& rpm-$vers.log - -# copy the RPMs into the build directory. -mv $HOME/rpm/RPMS/i386/sqlite*-$vers*.rpm doc -mv $HOME/rpm/SRPMS/sqlite-$vers*.rpm doc - -# Build the website -# -#cp $srcdir/../historical/* doc -make doc -cd doc -chmod 644 *.gz diff --git a/libraries/sqlite/unix/sqlite-3.5.1/spec.template b/libraries/sqlite/unix/sqlite-3.5.1/spec.template deleted file mode 100644 index 24c5eaebb8..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/spec.template +++ /dev/null @@ -1,62 +0,0 @@ -%define name sqlite -%define version SQLITE_VERSION -%define release 1 - -Name: %{name} -Summary: SQLite is a C library that implements an embeddable SQL database engine -Version: %{version} -Release: %{release} -Source: %{name}-%{version}.tar.gz -Group: System/Libraries -URL: http://www.hwaci.com/sw/sqlite/ -License: Public Domain -BuildRoot: %{_tmppath}/%{name}-%{version}-root - -%description -SQLite is a C library that implements an embeddable SQL database engine. -Programs that link with the SQLite library can have SQL database access -without running a separate RDBMS process. The distribution comes with a -standalone command-line access program (sqlite) that can be used to -administer an SQLite database and which serves as an example of how to -use the SQLite library. - -%package -n %{name}-devel -Summary: Header files and libraries for developing apps which will use sqlite -Group: Development/C -Requires: %{name} = %{version}-%{release} - -%description -n %{name}-devel -The sqlite-devel package contains the header files and libraries needed -to develop programs that use the sqlite database library. - -%prep -%setup -q -n %{name} - -%build -CFLAGS="%optflags -DNDEBUG=1" CXXFLAGS="%optflags -DNDEBUG=1" ./configure --prefix=%{_prefix} - -make -make doc - -%install -install -d $RPM_BUILD_ROOT/%{_prefix} -install -d $RPM_BUILD_ROOT/%{_prefix}/bin -install -d $RPM_BUILD_ROOT/%{_prefix}/include -install -d $RPM_BUILD_ROOT/%{_prefix}/lib -make install prefix=$RPM_BUILD_ROOT/%{_prefix} - -%clean -rm -fr $RPM_BUILD_ROOT - -%files -%defattr(-, root, root) -%{_libdir}/*.so* -%{_bindir}/* - -%files -n %{name}-devel -%defattr(-, root, root) -%{_libdir}/pkgconfig/sqlite3.pc -%{_libdir}/*.a -%{_libdir}/*.la -%{_includedir}/* -%doc doc/* diff --git a/libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in b/libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in deleted file mode 100644 index 16ed41c3d9..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/sqlite.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -# Package Information for pkg-config - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: SQLite -Description: SQL database engine -Version: @VERSION@ -Libs: -L${libdir} -lsqlite -Cflags: -I${includedir} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 b/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 deleted file mode 100644 index 785995bf60..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.1 +++ /dev/null @@ -1,229 +0,0 @@ -.\" Hey, EMACS: -*- nroff -*- -.\" First parameter, NAME, should be all caps -.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection -.\" other parameters are allowed: see man(7), man(1) -.TH SQLITE3 1 "Mon Apr 15 23:49:17 2002" -.\" Please adjust this date whenever revising the manpage. -.\" -.\" Some roff macros, for reference: -.\" .nh disable hyphenation -.\" .hy enable hyphenation -.\" .ad l left justify -.\" .ad b justify to both left and right margins -.\" .nf disable filling -.\" .fi enable filling -.\" .br insert line break -.\" .sp insert n+1 empty lines -.\" for manpage-specific macros, see man(7) -.SH NAME -.B sqlite3 -\- A command line interface for SQLite version 3 - -.SH SYNOPSIS -.B sqlite3 -.RI [ options ] -.RI [ databasefile ] -.RI [ SQL ] - -.SH SUMMARY -.PP -.B sqlite3 -is a terminal-based front-end to the SQLite library that can evaluate -queries interactively and display the results in multiple formats. -.B sqlite3 -can also be used within shell scripts and other applications to provide -batch processing features. - -.SH DESCRIPTION -To start a -.B sqlite3 -interactive session, invoke the -.B sqlite3 -command and optionally provide the name of a database file. If the -database file does not exist, it will be created. If the database file -does exist, it will be opened. - -For example, to create a new database file named "mydata.db", create -a table named "memos" and insert a couple of records into that table: -.sp -$ -.B sqlite3 mydata.db -.br -SQLite version 3.1.3 -.br -Enter ".help" for instructions -.br -sqlite> -.B create table memos(text, priority INTEGER); -.br -sqlite> -.B insert into memos values('deliver project description', 10); -.br -sqlite> -.B insert into memos values('lunch with Christine', 100); -.br -sqlite> -.B select * from memos; -.br -deliver project description|10 -.br -lunch with Christine|100 -.br -sqlite> -.sp - -If no database name is supplied, the ATTACH sql command can be used -to attach to existing or create new database files. ATTACH can also -be used to attach to multiple databases within the same interactive -session. This is useful for migrating data between databases, -possibly changing the schema along the way. - -Optionally, a SQL statement or set of SQL statements can be supplied as -a single argument. Multiple statements should be separated by -semi-colons. - -For example: -.sp -$ -.B sqlite3 -line mydata.db 'select * from memos where priority > 20;' -.br - text = lunch with Christine -.br -priority = 100 -.br -.sp - -.SS SQLITE META-COMMANDS -.PP -The interactive interpreter offers a set of meta-commands that can be -used to control the output format, examine the currently attached -database files, or perform administrative operations upon the -attached databases (such as rebuilding indices). Meta-commands are -always prefixed with a dot (.). - -A list of available meta-commands can be viewed at any time by issuing -the '.help' command. For example: -.sp -sqlite> -.B .help -.nf -.cc | -.databases List names and files of attached databases -.dump ?TABLE? ... Dump the database in an SQL text format -.echo ON|OFF Turn command echo on or off -.exit Exit this program -.explain ON|OFF Turn output mode suitable for EXPLAIN on or off. -.header(s) ON|OFF Turn display of headers on or off -.help Show this message -.import FILE TABLE Import data from FILE into TABLE -.indices TABLE Show names of all indices on TABLE -.mode MODE ?TABLE? Set output mode where MODE is one of: - csv Comma-separated values - column Left-aligned columns. (See .width) - html HTML code - insert SQL insert statements for TABLE - line One value per line - list Values delimited by .separator string - tabs Tab-separated values - tcl TCL list elements -.nullvalue STRING Print STRING in place of NULL values -.output FILENAME Send output to FILENAME -.output stdout Send output to the screen -.prompt MAIN CONTINUE Replace the standard prompts -.quit Exit this program -.read FILENAME Execute SQL in FILENAME -.schema ?TABLE? Show the CREATE statements -.separator STRING Change separator used by output mode and .import -.show Show the current values for various settings -.tables ?PATTERN? List names of tables matching a LIKE pattern -.timeout MS Try opening locked tables for MS milliseconds -.width NUM NUM ... Set column widths for "column" mode -sqlite> -|cc . -.sp -.fi - -.SH OPTIONS -.B sqlite3 -has the following options: -.TP -.BI \-init\ file -Read and execute commands from -.I file -, which can contain a mix of SQL statements and meta-commands. -.TP -.B \-echo -Print commands before execution. -.TP -.B \-[no]header -Turn headers on or off. -.TP -.B \-column -Query results will be displayed in a table like form, using -whitespace characters to separate the columns and align the -output. -.TP -.B \-html -Query results will be output as simple HTML tables. -.TP -.B \-line -Query results will be displayed with one value per line, rows -separated by a blank line. Designed to be easily parsed by -scripts or other programs -.TP -.B \-list -Query results will be displayed with the separator (|, by default) -character between each field value. The default. -.TP -.BI \-separator\ separator -Set output field separator. Default is '|'. -.TP -.BI \-nullvalue\ string -Set string used to represent NULL values. Default is '' -(empty string). -.TP -.B \-version -Show SQLite version. -.TP -.B \-help -Show help on options and exit. - - -.SH INIT FILE -.B sqlite3 -reads an initialization file to set the configuration of the -interactive environment. Throughout initialization, any previously -specified setting can be overridden. The sequence of initialization is -as follows: - -o The default configuration is established as follows: - -.sp -.nf -.cc | -mode = LIST -separator = "|" -main prompt = "sqlite> " -continue prompt = " ...> " -|cc . -.sp -.fi - -o If the file -.B ~/.sqliterc -exists, it is processed first. -can be found in the user's home directory, it is -read and processed. It should generally only contain meta-commands. - -o If the -init option is present, the specified file is processed. - -o All other command line options are processed. - -.SH SEE ALSO -http://www.sqlite.org/ -.br -The sqlite-doc package -.SH AUTHOR -This manual page was originally written by Andreas Rottmann -, for the Debian GNU/Linux system (but may be used -by others). It was subsequently revised by Bill Bumgarner . diff --git a/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in b/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in deleted file mode 100644 index c14b5ba33a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/sqlite3.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -# Package Information for pkg-config - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: SQLite -Description: SQL database engine -Version: @VERSION@ -Libs: -L${libdir} -lsqlite3 -Cflags: -I${includedir} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/alter.c b/libraries/sqlite/unix/sqlite-3.5.1/src/alter.c deleted file mode 100644 index 9d1ebd22cb..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/alter.c +++ /dev/null @@ -1,622 +0,0 @@ -/* -** 2005 February 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains C code routines that used to generate VDBE code -** that implements the ALTER TABLE command. -** -** $Id: alter.c,v 1.32 2007/08/29 14:06:23 danielk1977 Exp $ -*/ -#include "sqliteInt.h" -#include - -/* -** The code in this file only exists if we are not omitting the -** ALTER TABLE logic from the build. -*/ -#ifndef SQLITE_OMIT_ALTERTABLE - - -/* -** This function is used by SQL generated to implement the -** ALTER TABLE command. The first argument is the text of a CREATE TABLE or -** CREATE INDEX command. The second is a table name. The table name in -** the CREATE TABLE or CREATE INDEX statement is replaced with the third -** argument and the result returned. Examples: -** -** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def') -** -> 'CREATE TABLE def(a, b, c)' -** -** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def') -** -> 'CREATE INDEX i ON def(a, b, c)' -*/ -static void renameTableFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - unsigned char const *zSql = sqlite3_value_text(argv[0]); - unsigned char const *zTableName = sqlite3_value_text(argv[1]); - - int token; - Token tname; - unsigned char const *zCsr = zSql; - int len = 0; - char *zRet; - - sqlite3 *db = sqlite3_user_data(context); - - /* The principle used to locate the table name in the CREATE TABLE - ** statement is that the table name is the first token that is immediatedly - ** followed by a left parenthesis - TK_LP - or "USING" TK_USING. - */ - if( zSql ){ - do { - if( !*zCsr ){ - /* Ran out of input before finding an opening bracket. Return NULL. */ - return; - } - - /* Store the token that zCsr points to in tname. */ - tname.z = zCsr; - tname.n = len; - - /* Advance zCsr to the next token. Store that token type in 'token', - ** and it's length in 'len' (to be used next iteration of this loop). - */ - do { - zCsr += len; - len = sqlite3GetToken(zCsr, &token); - } while( token==TK_SPACE ); - assert( len>0 ); - } while( token!=TK_LP && token!=TK_USING ); - - zRet = sqlite3MPrintf(db, "%.*s%Q%s", tname.z - zSql, zSql, - zTableName, tname.z+tname.n); - sqlite3_result_text(context, zRet, -1, sqlite3_free); - } -} - -#ifndef SQLITE_OMIT_TRIGGER -/* This function is used by SQL generated to implement the -** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER -** statement. The second is a table name. The table name in the CREATE -** TRIGGER statement is replaced with the third argument and the result -** returned. This is analagous to renameTableFunc() above, except for CREATE -** TRIGGER, not CREATE INDEX and CREATE TABLE. -*/ -static void renameTriggerFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - unsigned char const *zSql = sqlite3_value_text(argv[0]); - unsigned char const *zTableName = sqlite3_value_text(argv[1]); - - int token; - Token tname; - int dist = 3; - unsigned char const *zCsr = zSql; - int len = 0; - char *zRet; - - sqlite3 *db = sqlite3_user_data(context); - - /* The principle used to locate the table name in the CREATE TRIGGER - ** statement is that the table name is the first token that is immediatedly - ** preceded by either TK_ON or TK_DOT and immediatedly followed by one - ** of TK_WHEN, TK_BEGIN or TK_FOR. - */ - if( zSql ){ - do { - - if( !*zCsr ){ - /* Ran out of input before finding the table name. Return NULL. */ - return; - } - - /* Store the token that zCsr points to in tname. */ - tname.z = zCsr; - tname.n = len; - - /* Advance zCsr to the next token. Store that token type in 'token', - ** and it's length in 'len' (to be used next iteration of this loop). - */ - do { - zCsr += len; - len = sqlite3GetToken(zCsr, &token); - }while( token==TK_SPACE ); - assert( len>0 ); - - /* Variable 'dist' stores the number of tokens read since the most - ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN - ** token is read and 'dist' equals 2, the condition stated above - ** to be met. - ** - ** Note that ON cannot be a database, table or column name, so - ** there is no need to worry about syntax like - ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc. - */ - dist++; - if( token==TK_DOT || token==TK_ON ){ - dist = 0; - } - } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) ); - - /* Variable tname now contains the token that is the old table-name - ** in the CREATE TRIGGER statement. - */ - zRet = sqlite3MPrintf(db, "%.*s%Q%s", tname.z - zSql, zSql, - zTableName, tname.z+tname.n); - sqlite3_result_text(context, zRet, -1, sqlite3_free); - } -} -#endif /* !SQLITE_OMIT_TRIGGER */ - -/* -** Register built-in functions used to help implement ALTER TABLE -*/ -void sqlite3AlterFunctions(sqlite3 *db){ - static const struct { - char *zName; - signed char nArg; - void (*xFunc)(sqlite3_context*,int,sqlite3_value **); - } aFuncs[] = { - { "sqlite_rename_table", 2, renameTableFunc}, -#ifndef SQLITE_OMIT_TRIGGER - { "sqlite_rename_trigger", 2, renameTriggerFunc}, -#endif - }; - int i; - - for(i=0; idb->aDb[1].pSchema; /* Temp db schema */ - - /* If the table is not located in the temp-db (in which case NULL is - ** returned, loop through the tables list of triggers. For each trigger - ** that is not part of the temp-db schema, add a clause to the WHERE - ** expression being built up in zWhere. - */ - if( pTab->pSchema!=pTempSchema ){ - sqlite3 *db = pParse->db; - for( pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext ){ - if( pTrig->pSchema==pTempSchema ){ - if( !zWhere ){ - zWhere = sqlite3MPrintf(db, "name=%Q", pTrig->name); - }else{ - tmp = zWhere; - zWhere = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, pTrig->name); - sqlite3_free(tmp); - } - } - } - } - return zWhere; -} - -/* -** Generate code to drop and reload the internal representation of table -** pTab from the database, including triggers and temporary triggers. -** Argument zName is the name of the table in the database schema at -** the time the generated code is executed. This can be different from -** pTab->zName if this function is being called to code part of an -** "ALTER TABLE RENAME TO" statement. -*/ -static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){ - Vdbe *v; - char *zWhere; - int iDb; /* Index of database containing pTab */ -#ifndef SQLITE_OMIT_TRIGGER - Trigger *pTrig; -#endif - - v = sqlite3GetVdbe(pParse); - if( !v ) return; - assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); - iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - assert( iDb>=0 ); - -#ifndef SQLITE_OMIT_TRIGGER - /* Drop any table triggers from the internal schema. */ - for(pTrig=pTab->pTrigger; pTrig; pTrig=pTrig->pNext){ - int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); - assert( iTrigDb==iDb || iTrigDb==1 ); - sqlite3VdbeOp3(v, OP_DropTrigger, iTrigDb, 0, pTrig->name, 0); - } -#endif - - /* Drop the table and index from the internal schema */ - sqlite3VdbeOp3(v, OP_DropTable, iDb, 0, pTab->zName, 0); - - /* Reload the table, index and permanent trigger schemas. */ - zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName); - if( !zWhere ) return; - sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, zWhere, P3_DYNAMIC); - -#ifndef SQLITE_OMIT_TRIGGER - /* Now, if the table is not stored in the temp database, reload any temp - ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined. - */ - if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){ - sqlite3VdbeOp3(v, OP_ParseSchema, 1, 0, zWhere, P3_DYNAMIC); - } -#endif -} - -/* -** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy" -** command. -*/ -void sqlite3AlterRenameTable( - Parse *pParse, /* Parser context. */ - SrcList *pSrc, /* The table to rename. */ - Token *pName /* The new table name. */ -){ - int iDb; /* Database that contains the table */ - char *zDb; /* Name of database iDb */ - Table *pTab; /* Table being renamed */ - char *zName = 0; /* NULL-terminated version of pName */ - sqlite3 *db = pParse->db; /* Database connection */ - int nTabName; /* Number of UTF-8 characters in zTabName */ - const char *zTabName; /* Original name of the table */ - Vdbe *v; -#ifndef SQLITE_OMIT_TRIGGER - char *zWhere = 0; /* Where clause to locate temp triggers */ -#endif - int isVirtualRename = 0; /* True if this is a v-table with an xRename() */ - - if( db->mallocFailed ) goto exit_rename_table; - assert( pSrc->nSrc==1 ); - assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); - - pTab = sqlite3LocateTable(pParse, pSrc->a[0].zName, pSrc->a[0].zDatabase); - if( !pTab ) goto exit_rename_table; - iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - zDb = db->aDb[iDb].zName; - - /* Get a NULL terminated version of the new table name. */ - zName = sqlite3NameFromToken(db, pName); - if( !zName ) goto exit_rename_table; - - /* Check that a table or index named 'zName' does not already exist - ** in database iDb. If so, this is an error. - */ - if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){ - sqlite3ErrorMsg(pParse, - "there is already another table or index with this name: %s", zName); - goto exit_rename_table; - } - - /* Make sure it is not a system table being altered, or a reserved name - ** that the table is being renamed to. - */ - if( strlen(pTab->zName)>6 && 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); - goto exit_rename_table; - } - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ - goto exit_rename_table; - } - -#ifndef SQLITE_OMIT_AUTHORIZATION - /* Invoke the authorization callback. */ - if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ - goto exit_rename_table; - } -#endif - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ - goto exit_rename_table; - } - if( IsVirtual(pTab) && pTab->pMod->pModule->xRename ){ - isVirtualRename = 1; - } -#endif - - /* Begin a transaction and code the VerifyCookie for database iDb. - ** Then modify the schema cookie (since the ALTER TABLE modifies the - ** schema). Open a statement transaction if the table is a virtual - ** table. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ){ - goto exit_rename_table; - } - sqlite3BeginWriteOperation(pParse, isVirtualRename, iDb); - sqlite3ChangeCookie(db, v, iDb); - - /* If this is a virtual table, invoke the xRename() function if - ** one is defined. The xRename() callback will modify the names - ** of any resources used by the v-table implementation (including other - ** SQLite tables) that are identified by the name of the virtual table. - */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( isVirtualRename ){ - sqlite3VdbeOp3(v, OP_String8, 0, 0, zName, 0); - sqlite3VdbeOp3(v, OP_VRename, 0, 0, (const char*)pTab->pVtab, P3_VTAB); - } -#endif - - /* figure out how many UTF-8 characters are in zName */ - zTabName = pTab->zName; - nTabName = sqlite3Utf8CharLen(zTabName, -1); - - /* Modify the sqlite_master table to use the new table name. */ - sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET " -#ifdef SQLITE_OMIT_TRIGGER - "sql = sqlite_rename_table(sql, %Q), " -#else - "sql = CASE " - "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)" - "ELSE sqlite_rename_table(sql, %Q) END, " -#endif - "tbl_name = %Q, " - "name = CASE " - "WHEN type='table' THEN %Q " - "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN " - "'sqlite_autoindex_' || %Q || substr(name,%d+18,10) " - "ELSE name END " - "WHERE tbl_name=%Q AND " - "(type='table' OR type='index' OR type='trigger');", - zDb, SCHEMA_TABLE(iDb), zName, zName, zName, -#ifndef SQLITE_OMIT_TRIGGER - zName, -#endif - zName, nTabName, zTabName - ); - -#ifndef SQLITE_OMIT_AUTOINCREMENT - /* If the sqlite_sequence table exists in this database, then update - ** it with the new table name. - */ - if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){ - sqlite3NestedParse(pParse, - "UPDATE %Q.sqlite_sequence set name = %Q WHERE name = %Q", - zDb, zName, pTab->zName); - } -#endif - -#ifndef SQLITE_OMIT_TRIGGER - /* If there are TEMP triggers on this table, modify the sqlite_temp_master - ** table. Don't do this if the table being ALTERed is itself located in - ** the temp database. - */ - if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){ - sqlite3NestedParse(pParse, - "UPDATE sqlite_temp_master SET " - "sql = sqlite_rename_trigger(sql, %Q), " - "tbl_name = %Q " - "WHERE %s;", zName, zName, zWhere); - sqlite3_free(zWhere); - } -#endif - - /* Drop and reload the internal table schema. */ - reloadTableSchema(pParse, pTab, zName); - -exit_rename_table: - sqlite3SrcListDelete(pSrc); - sqlite3_free(zName); -} - - -/* -** This function is called after an "ALTER TABLE ... ADD" statement -** has been parsed. Argument pColDef contains the text of the new -** column definition. -** -** The Table structure pParse->pNewTable was extended to include -** the new column during parsing. -*/ -void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ - Table *pNew; /* Copy of pParse->pNewTable */ - Table *pTab; /* Table being altered */ - int iDb; /* Database number */ - const char *zDb; /* Database name */ - const char *zTab; /* Table name */ - char *zCol; /* Null-terminated column definition */ - Column *pCol; /* The new column */ - Expr *pDflt; /* Default value for the new column */ - sqlite3 *db; /* The database connection; */ - - if( pParse->nErr ) return; - pNew = pParse->pNewTable; - assert( pNew ); - - db = pParse->db; - assert( sqlite3BtreeHoldsAllMutexes(db) ); - iDb = sqlite3SchemaToIndex(db, pNew->pSchema); - zDb = db->aDb[iDb].zName; - zTab = pNew->zName; - pCol = &pNew->aCol[pNew->nCol-1]; - pDflt = pCol->pDflt; - pTab = sqlite3FindTable(db, zTab, zDb); - assert( pTab ); - -#ifndef SQLITE_OMIT_AUTHORIZATION - /* Invoke the authorization callback. */ - if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ - return; - } -#endif - - /* If the default value for the new column was specified with a - ** literal NULL, then set pDflt to 0. This simplifies checking - ** for an SQL NULL default below. - */ - if( pDflt && pDflt->op==TK_NULL ){ - pDflt = 0; - } - - /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. - ** If there is a NOT NULL constraint, then the default value for the - ** column must not be NULL. - */ - if( pCol->isPrimKey ){ - sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); - return; - } - if( pNew->pIndex ){ - sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); - return; - } - if( pCol->notNull && !pDflt ){ - sqlite3ErrorMsg(pParse, - "Cannot add a NOT NULL column with default value NULL"); - return; - } - - /* Ensure the default expression is something that sqlite3ValueFromExpr() - ** can handle (i.e. not CURRENT_TIME etc.) - */ - if( pDflt ){ - sqlite3_value *pVal; - if( sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_NONE, &pVal) ){ - db->mallocFailed = 1; - return; - } - if( !pVal ){ - sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default"); - return; - } - sqlite3ValueFree(pVal); - } - - /* Modify the CREATE TABLE statement. */ - zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); - if( zCol ){ - char *zEnd = &zCol[pColDef->n-1]; - while( (zEnd>zCol && *zEnd==';') || isspace(*(unsigned char *)zEnd) ){ - *zEnd-- = '\0'; - } - sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET " - "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d,length(sql)) " - "WHERE type = 'table' AND name = %Q", - zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1, - zTab - ); - sqlite3_free(zCol); - } - - /* If the default value of the new column is NULL, then set the file - ** format to 2. If the default value of the new column is not NULL, - ** the file format becomes 3. - */ - sqlite3MinimumFileFormat(pParse, iDb, pDflt ? 3 : 2); - - /* Reload the schema of the modified table. */ - reloadTableSchema(pParse, pTab, pTab->zName); -} - -/* -** This function is called by the parser after the table-name in -** an "ALTER TABLE ADD" statement is parsed. Argument -** pSrc is the full-name of the table being altered. -** -** This routine makes a (partial) copy of the Table structure -** for the table being altered and sets Parse.pNewTable to point -** to it. Routines called by the parser as the column definition -** is parsed (i.e. sqlite3AddColumn()) add the new Column data to -** the copy. The copy of the Table structure is deleted by tokenize.c -** after parsing is finished. -** -** Routine sqlite3AlterFinishAddColumn() will be called to complete -** coding the "ALTER TABLE ... ADD" statement. -*/ -void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ - Table *pNew; - Table *pTab; - Vdbe *v; - int iDb; - int i; - int nAlloc; - sqlite3 *db = pParse->db; - - /* Look up the table being altered. */ - assert( pParse->pNewTable==0 ); - assert( sqlite3BtreeHoldsAllMutexes(db) ); - if( db->mallocFailed ) goto exit_begin_add_column; - pTab = sqlite3LocateTable(pParse, pSrc->a[0].zName, pSrc->a[0].zDatabase); - if( !pTab ) goto exit_begin_add_column; - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - sqlite3ErrorMsg(pParse, "virtual tables may not be altered"); - goto exit_begin_add_column; - } -#endif - - /* Make sure this is not an attempt to ALTER a view. */ - if( pTab->pSelect ){ - sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); - goto exit_begin_add_column; - } - - assert( pTab->addColOffset>0 ); - iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - - /* Put a copy of the Table struct in Parse.pNewTable for the - ** sqlite3AddColumn() function and friends to modify. - */ - pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); - if( !pNew ) goto exit_begin_add_column; - pParse->pNewTable = pNew; - pNew->nRef = 1; - pNew->nCol = pTab->nCol; - assert( pNew->nCol>0 ); - nAlloc = (((pNew->nCol-1)/8)*8)+8; - assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 ); - pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); - pNew->zName = sqlite3DbStrDup(db, pTab->zName); - if( !pNew->aCol || !pNew->zName ){ - db->mallocFailed = 1; - goto exit_begin_add_column; - } - memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); - for(i=0; inCol; i++){ - Column *pCol = &pNew->aCol[i]; - pCol->zName = sqlite3DbStrDup(db, pCol->zName); - pCol->zColl = 0; - pCol->zType = 0; - pCol->pDflt = 0; - } - pNew->pSchema = db->aDb[iDb].pSchema; - pNew->addColOffset = pTab->addColOffset; - pNew->nRef = 1; - - /* Begin a transaction and increment the schema cookie. */ - sqlite3BeginWriteOperation(pParse, 0, iDb); - v = sqlite3GetVdbe(pParse); - if( !v ) goto exit_begin_add_column; - sqlite3ChangeCookie(db, v, iDb); - -exit_begin_add_column: - sqlite3SrcListDelete(pSrc); - return; -} -#endif /* SQLITE_ALTER_TABLE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c b/libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c deleted file mode 100644 index 119e7f6484..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/analyze.c +++ /dev/null @@ -1,418 +0,0 @@ -/* -** 2005 July 8 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code associated with the ANALYZE command. -** -** @(#) $Id: analyze.c,v 1.23 2007/08/29 17:43:20 drh Exp $ -*/ -#ifndef SQLITE_OMIT_ANALYZE -#include "sqliteInt.h" - -/* -** This routine generates code that opens the sqlite_stat1 table on cursor -** iStatCur. -** -** If the sqlite_stat1 tables does not previously exist, it is created. -** If it does previously exist, all entires associated with table zWhere -** are removed. If zWhere==0 then all entries are removed. -*/ -static void openStatTable( - Parse *pParse, /* Parsing context */ - int iDb, /* The database we are looking in */ - int iStatCur, /* Open the sqlite_stat1 table on this cursor */ - const char *zWhere /* Delete entries associated with this table */ -){ - sqlite3 *db = pParse->db; - Db *pDb; - int iRootPage; - Table *pStat; - Vdbe *v = sqlite3GetVdbe(pParse); - - if( v==0 ) return; - assert( sqlite3BtreeHoldsAllMutexes(db) ); - assert( sqlite3VdbeDb(v)==db ); - pDb = &db->aDb[iDb]; - if( (pStat = sqlite3FindTable(db, "sqlite_stat1", pDb->zName))==0 ){ - /* The sqlite_stat1 tables does not exist. Create it. - ** Note that a side-effect of the CREATE TABLE statement is to leave - ** the rootpage of the new table on the top of the stack. This is - ** important because the OpenWrite opcode below will be needing it. */ - sqlite3NestedParse(pParse, - "CREATE TABLE %Q.sqlite_stat1(tbl,idx,stat)", - pDb->zName - ); - iRootPage = 0; /* Cause rootpage to be taken from top of stack */ - }else if( zWhere ){ - /* The sqlite_stat1 table exists. Delete all entries associated with - ** the table zWhere. */ - sqlite3NestedParse(pParse, - "DELETE FROM %Q.sqlite_stat1 WHERE tbl=%Q", - pDb->zName, zWhere - ); - iRootPage = pStat->tnum; - }else{ - /* The sqlite_stat1 table already exists. Delete all rows. */ - iRootPage = pStat->tnum; - sqlite3VdbeAddOp(v, OP_Clear, pStat->tnum, iDb); - } - - /* Open the sqlite_stat1 table for writing. Unless it was created - ** by this vdbe program, lock it for writing at the shared-cache level. - ** If this vdbe did create the sqlite_stat1 table, then it must have - ** already obtained a schema-lock, making the write-lock redundant. - */ - if( iRootPage>0 ){ - sqlite3TableLock(pParse, iDb, iRootPage, 1, "sqlite_stat1"); - } - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - sqlite3VdbeAddOp(v, OP_OpenWrite, iStatCur, iRootPage); - sqlite3VdbeAddOp(v, OP_SetNumColumns, iStatCur, 3); -} - -/* -** Generate code to do an analysis of all indices associated with -** a single table. -*/ -static void analyzeOneTable( - Parse *pParse, /* Parser context */ - Table *pTab, /* Table whose indices are to be analyzed */ - int iStatCur, /* Cursor that writes to the sqlite_stat1 table */ - int iMem /* Available memory locations begin here */ -){ - Index *pIdx; /* An index to being analyzed */ - int iIdxCur; /* Cursor number for index being analyzed */ - int nCol; /* Number of columns in the index */ - Vdbe *v; /* The virtual machine being built up */ - int i; /* Loop counter */ - int topOfLoop; /* The top of the loop */ - int endOfLoop; /* The end of the loop */ - int addr; /* The address of an instruction */ - int iDb; /* Index of database containing pTab */ - - v = sqlite3GetVdbe(pParse); - if( v==0 || pTab==0 || pTab->pIndex==0 ){ - /* Do no analysis for tables that have no indices */ - return; - } - assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); - iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - assert( iDb>=0 ); -#ifndef SQLITE_OMIT_AUTHORIZATION - if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, - pParse->db->aDb[iDb].zName ) ){ - return; - } -#endif - - /* Establish a read-lock on the table at the shared-cache level. */ - sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); - - iIdxCur = pParse->nTab; - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); - - /* Open a cursor to the index to be analyzed - */ - assert( iDb==sqlite3SchemaToIndex(pParse->db, pIdx->pSchema) ); - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - VdbeComment((v, "# %s", pIdx->zName)); - sqlite3VdbeOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, - (char *)pKey, P3_KEYINFO_HANDOFF); - nCol = pIdx->nColumn; - if( iMem+nCol*2>=pParse->nMem ){ - pParse->nMem = iMem+nCol*2+1; - } - sqlite3VdbeAddOp(v, OP_SetNumColumns, iIdxCur, nCol+1); - - /* Memory cells are used as follows: - ** - ** mem[iMem]: The total number of rows in the table. - ** mem[iMem+1]: Number of distinct values in column 1 - ** ... - ** mem[iMem+nCol]: Number of distinct values in column N - ** mem[iMem+nCol+1] Last observed value of column 1 - ** ... - ** mem[iMem+nCol+nCol]: Last observed value of column N - ** - ** Cells iMem through iMem+nCol are initialized to 0. The others - ** are initialized to NULL. - */ - for(i=0; i<=nCol; i++){ - sqlite3VdbeAddOp(v, OP_MemInt, 0, iMem+i); - } - for(i=0; i0 then it is always the case the D>0 so division by zero - ** is never possible. - */ - sqlite3VdbeAddOp(v, OP_MemLoad, iMem, 0); - addr = sqlite3VdbeAddOp(v, OP_IfNot, 0, 0); - sqlite3VdbeAddOp(v, OP_NewRowid, iStatCur, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->zName, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pIdx->zName, 0); - sqlite3VdbeAddOp(v, OP_MemLoad, iMem, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, " ", 0); - for(i=0; idb; - Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */ - HashElem *k; - int iStatCur; - int iMem; - - sqlite3BeginWriteOperation(pParse, 0, iDb); - iStatCur = pParse->nTab++; - openStatTable(pParse, iDb, iStatCur, 0); - iMem = pParse->nMem; - for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ - Table *pTab = (Table*)sqliteHashData(k); - analyzeOneTable(pParse, pTab, iStatCur, iMem); - } - loadAnalysis(pParse, iDb); -} - -/* -** Generate code that will do an analysis of a single table in -** a database. -*/ -static void analyzeTable(Parse *pParse, Table *pTab){ - int iDb; - int iStatCur; - - assert( pTab!=0 ); - assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); - iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - iStatCur = pParse->nTab++; - openStatTable(pParse, iDb, iStatCur, pTab->zName); - analyzeOneTable(pParse, pTab, iStatCur, pParse->nMem); - loadAnalysis(pParse, iDb); -} - -/* -** Generate code for the ANALYZE command. The parser calls this routine -** when it recognizes an ANALYZE command. -** -** ANALYZE -- 1 -** ANALYZE -- 2 -** ANALYZE ?.? -- 3 -** -** Form 1 causes all indices in all attached databases to be analyzed. -** Form 2 analyzes all indices the single database named. -** Form 3 analyzes all indices associated with the named table. -*/ -void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ - sqlite3 *db = pParse->db; - int iDb; - int i; - char *z, *zDb; - Table *pTab; - Token *pTableName; - - /* Read the database schema. If an error occurs, leave an error message - ** and code in pParse and return NULL. */ - assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ - return; - } - - if( pName1==0 ){ - /* Form 1: Analyze everything */ - for(i=0; inDb; i++){ - if( i==1 ) continue; /* Do not analyze the TEMP database */ - analyzeDatabase(pParse, i); - } - }else if( pName2==0 || pName2->n==0 ){ - /* Form 2: Analyze the database or table named */ - iDb = sqlite3FindDb(db, pName1); - if( iDb>=0 ){ - analyzeDatabase(pParse, iDb); - }else{ - z = sqlite3NameFromToken(db, pName1); - pTab = sqlite3LocateTable(pParse, z, 0); - sqlite3_free(z); - if( pTab ){ - analyzeTable(pParse, pTab); - } - } - }else{ - /* Form 3: Analyze the fully qualified table name */ - iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); - if( iDb>=0 ){ - zDb = db->aDb[iDb].zName; - z = sqlite3NameFromToken(db, pTableName); - if( z ){ - pTab = sqlite3LocateTable(pParse, z, zDb); - sqlite3_free(z); - if( pTab ){ - analyzeTable(pParse, pTab); - } - } - } - } -} - -/* -** Used to pass information from the analyzer reader through to the -** callback routine. -*/ -typedef struct analysisInfo analysisInfo; -struct analysisInfo { - sqlite3 *db; - const char *zDatabase; -}; - -/* -** This callback is invoked once for each index when reading the -** sqlite_stat1 table. -** -** argv[0] = name of the index -** argv[1] = results of analysis - on integer for each column -*/ -static int analysisLoader(void *pData, int argc, char **argv, char **azNotUsed){ - analysisInfo *pInfo = (analysisInfo*)pData; - Index *pIndex; - int i, c; - unsigned int v; - const char *z; - - assert( argc==2 ); - if( argv==0 || argv[0]==0 || argv[1]==0 ){ - return 0; - } - pIndex = sqlite3FindIndex(pInfo->db, argv[0], pInfo->zDatabase); - if( pIndex==0 ){ - return 0; - } - z = argv[1]; - for(i=0; *z && i<=pIndex->nColumn; i++){ - v = 0; - while( (c=z[0])>='0' && c<='9' ){ - v = v*10 + c - '0'; - z++; - } - pIndex->aiRowEst[i] = v; - if( *z==' ' ) z++; - } - return 0; -} - -/* -** Load the content of the sqlite_stat1 table into the index hash tables. -*/ -int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ - analysisInfo sInfo; - HashElem *i; - char *zSql; - int rc; - - assert( iDb>=0 && iDbnDb ); - assert( db->aDb[iDb].pBt!=0 ); - assert( sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); - - /* Clear any prior statistics */ - for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ - Index *pIdx = sqliteHashData(i); - sqlite3DefaultRowEst(pIdx); - } - - /* Check to make sure the sqlite_stat1 table existss */ - sInfo.db = db; - sInfo.zDatabase = db->aDb[iDb].zName; - if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){ - return SQLITE_ERROR; - } - - - /* Load new statistics out of the sqlite_stat1 table */ - zSql = sqlite3MPrintf(db, "SELECT idx, stat FROM %Q.sqlite_stat1", - sInfo.zDatabase); - sqlite3SafetyOff(db); - rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); - sqlite3SafetyOn(db); - sqlite3_free(zSql); - return rc; -} - - -#endif /* SQLITE_OMIT_ANALYZE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/attach.c b/libraries/sqlite/unix/sqlite-3.5.1/src/attach.c deleted file mode 100644 index 2fb950fd4a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/attach.c +++ /dev/null @@ -1,521 +0,0 @@ -/* -** 2003 April 6 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code used to implement the ATTACH and DETACH commands. -** -** $Id: attach.c,v 1.63 2007/10/03 08:46:44 danielk1977 Exp $ -*/ -#include "sqliteInt.h" - -#ifndef SQLITE_OMIT_ATTACH -/* -** Resolve an expression that was part of an ATTACH or DETACH statement. This -** is slightly different from resolving a normal SQL expression, because simple -** identifiers are treated as strings, not possible column names or aliases. -** -** i.e. if the parser sees: -** -** ATTACH DATABASE abc AS def -** -** it treats the two expressions as literal strings 'abc' and 'def' instead of -** looking for columns of the same name. -** -** This only applies to the root node of pExpr, so the statement: -** -** ATTACH DATABASE abc||def AS 'db2' -** -** will fail because neither abc or def can be resolved. -*/ -static int resolveAttachExpr(NameContext *pName, Expr *pExpr) -{ - int rc = SQLITE_OK; - if( pExpr ){ - if( pExpr->op!=TK_ID ){ - rc = sqlite3ExprResolveNames(pName, pExpr); - if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){ - sqlite3ErrorMsg(pName->pParse, "invalid name: \"%T\"", &pExpr->span); - return SQLITE_ERROR; - } - }else{ - pExpr->op = TK_STRING; - } - } - return rc; -} - -/* -** An SQL user-function registered to do the work of an ATTACH statement. The -** three arguments to the function come directly from an attach statement: -** -** ATTACH DATABASE x AS y KEY z -** -** SELECT sqlite_attach(x, y, z) -** -** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the -** third argument. -*/ -static void attachFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int i; - int rc = 0; - sqlite3 *db = sqlite3_user_data(context); - const char *zName; - const char *zFile; - Db *aNew; - char *zErrDyn = 0; - char zErr[128]; - - zFile = (const char *)sqlite3_value_text(argv[0]); - zName = (const char *)sqlite3_value_text(argv[1]); - if( zFile==0 ) zFile = ""; - if( zName==0 ) zName = ""; - - /* Check for the following errors: - ** - ** * Too many attached databases, - ** * Transaction currently open - ** * Specified database name already being used. - */ - if( db->nDb>=SQLITE_MAX_ATTACHED+2 ){ - sqlite3_snprintf( - sizeof(zErr), zErr, "too many attached databases - max %d", - SQLITE_MAX_ATTACHED - ); - goto attach_error; - } - if( !db->autoCommit ){ - sqlite3_snprintf(sizeof(zErr), zErr, - "cannot ATTACH database within transaction"); - goto attach_error; - } - for(i=0; inDb; i++){ - char *z = db->aDb[i].zName; - if( z && zName && sqlite3StrICmp(z, zName)==0 ){ - sqlite3_snprintf(sizeof(zErr), zErr, - "database %s is already in use", zName); - goto attach_error; - } - } - - /* Allocate the new entry in the db->aDb[] array and initialise the schema - ** hash tables. - */ - if( db->aDb==db->aDbStatic ){ - aNew = sqlite3_malloc( sizeof(db->aDb[0])*3 ); - if( aNew==0 ){ - db->mallocFailed = 1; - return; - } - memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); - }else{ - aNew = sqlite3_realloc(db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); - if( aNew==0 ){ - db->mallocFailed = 1; - return; - } - } - db->aDb = aNew; - aNew = &db->aDb[db->nDb++]; - memset(aNew, 0, sizeof(*aNew)); - - /* Open the database file. If the btree is successfully opened, use - ** it to obtain the database schema. At this point the schema may - ** or may not be initialised. - */ - rc = sqlite3BtreeFactory(db, zFile, 0, SQLITE_DEFAULT_CACHE_SIZE, - db->openFlags | SQLITE_OPEN_MAIN_DB, - &aNew->pBt); - if( rc==SQLITE_OK ){ - aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt); - if( !aNew->pSchema ){ - rc = SQLITE_NOMEM; - }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){ - sqlite3_snprintf(sizeof(zErr), zErr, - "attached databases must use the same text encoding as main database"); - goto attach_error; - } - sqlite3PagerLockingMode(sqlite3BtreePager(aNew->pBt), db->dfltLockMode); - } - aNew->zName = sqlite3DbStrDup(db, zName); - aNew->safety_level = 3; - -#if SQLITE_HAS_CODEC - { - extern int sqlite3CodecAttach(sqlite3*, int, const void*, int); - extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); - int nKey; - char *zKey; - int t = sqlite3_value_type(argv[2]); - switch( t ){ - case SQLITE_INTEGER: - case SQLITE_FLOAT: - zErrDyn = sqlite3DbStrDup(db, "Invalid key value"); - rc = SQLITE_ERROR; - break; - - case SQLITE_TEXT: - case SQLITE_BLOB: - nKey = sqlite3_value_bytes(argv[2]); - zKey = (char *)sqlite3_value_blob(argv[2]); - sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); - break; - - case SQLITE_NULL: - /* No key specified. Use the key from the main database */ - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); - break; - } - } -#endif - - /* If the file was opened successfully, read the schema for the new database. - ** If this fails, or if opening the file failed, then close the file and - ** remove the entry from the db->aDb[] array. i.e. put everything back the way - ** we found it. - */ - if( rc==SQLITE_OK ){ - sqlite3SafetyOn(db); - rc = sqlite3Init(db, &zErrDyn); - sqlite3SafetyOff(db); - } - if( rc ){ - int iDb = db->nDb - 1; - assert( iDb>=2 ); - if( db->aDb[iDb].pBt ){ - sqlite3BtreeClose(db->aDb[iDb].pBt); - db->aDb[iDb].pBt = 0; - db->aDb[iDb].pSchema = 0; - } - sqlite3ResetInternalSchema(db, 0); - db->nDb = iDb; - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ - db->mallocFailed = 1; - sqlite3_snprintf(sizeof(zErr),zErr, "out of memory"); - }else{ - sqlite3_snprintf(sizeof(zErr),zErr, "unable to open database: %s", zFile); - } - goto attach_error; - } - - return; - -attach_error: - /* Return an error if we get here */ - if( zErrDyn ){ - sqlite3_result_error(context, zErrDyn, -1); - sqlite3_free(zErrDyn); - }else{ - zErr[sizeof(zErr)-1] = 0; - sqlite3_result_error(context, zErr, -1); - } -} - -/* -** An SQL user-function registered to do the work of an DETACH statement. The -** three arguments to the function come directly from a detach statement: -** -** DETACH DATABASE x -** -** SELECT sqlite_detach(x) -*/ -static void detachFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const char *zName = (const char *)sqlite3_value_text(argv[0]); - sqlite3 *db = sqlite3_user_data(context); - int i; - Db *pDb = 0; - char zErr[128]; - - if( zName==0 ) zName = ""; - for(i=0; inDb; i++){ - pDb = &db->aDb[i]; - if( pDb->pBt==0 ) continue; - if( sqlite3StrICmp(pDb->zName, zName)==0 ) break; - } - - if( i>=db->nDb ){ - sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName); - goto detach_error; - } - if( i<2 ){ - sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); - goto detach_error; - } - if( !db->autoCommit ){ - sqlite3_snprintf(sizeof(zErr), zErr, - "cannot DETACH database within transaction"); - goto detach_error; - } - if( sqlite3BtreeIsInReadTrans(pDb->pBt) ){ - sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); - goto detach_error; - } - - sqlite3BtreeClose(pDb->pBt); - pDb->pBt = 0; - pDb->pSchema = 0; - sqlite3ResetInternalSchema(db, 0); - return; - -detach_error: - sqlite3_result_error(context, zErr, -1); -} - -/* -** This procedure generates VDBE code for a single invocation of either the -** sqlite_detach() or sqlite_attach() SQL user functions. -*/ -static void codeAttach( - Parse *pParse, /* The parser context */ - int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */ - const char *zFunc, /* Either "sqlite_attach" or "sqlite_detach */ - int nFunc, /* Number of args to pass to zFunc */ - Expr *pAuthArg, /* Expression to pass to authorization callback */ - Expr *pFilename, /* Name of database file */ - Expr *pDbname, /* Name of the database to use internally */ - Expr *pKey /* Database key for encryption extension */ -){ - int rc; - NameContext sName; - Vdbe *v; - FuncDef *pFunc; - sqlite3* db = pParse->db; - -#ifndef SQLITE_OMIT_AUTHORIZATION - assert( db->mallocFailed || pAuthArg ); - if( pAuthArg ){ - char *zAuthArg = sqlite3NameFromToken(db, &pAuthArg->span); - if( !zAuthArg ){ - goto attach_end; - } - rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0); - sqlite3_free(zAuthArg); - if(rc!=SQLITE_OK ){ - goto attach_end; - } - } -#endif /* SQLITE_OMIT_AUTHORIZATION */ - - memset(&sName, 0, sizeof(NameContext)); - sName.pParse = pParse; - - if( - SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) || - SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || - SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) - ){ - pParse->nErr++; - goto attach_end; - } - - v = sqlite3GetVdbe(pParse); - sqlite3ExprCode(pParse, pFilename); - sqlite3ExprCode(pParse, pDbname); - sqlite3ExprCode(pParse, pKey); - - assert( v || db->mallocFailed ); - if( v ){ - sqlite3VdbeAddOp(v, OP_Function, 0, nFunc); - pFunc = sqlite3FindFunction(db, zFunc, strlen(zFunc), nFunc, SQLITE_UTF8,0); - sqlite3VdbeChangeP3(v, -1, (char *)pFunc, P3_FUNCDEF); - - /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this - ** statement only). For DETACH, set it to false (expire all existing - ** statements). - */ - sqlite3VdbeAddOp(v, OP_Expire, (type==SQLITE_ATTACH), 0); - } - -attach_end: - sqlite3ExprDelete(pFilename); - sqlite3ExprDelete(pDbname); - sqlite3ExprDelete(pKey); -} - -/* -** Called by the parser to compile a DETACH statement. -** -** DETACH pDbname -*/ -void sqlite3Detach(Parse *pParse, Expr *pDbname){ - codeAttach(pParse, SQLITE_DETACH, "sqlite_detach", 1, pDbname, 0, 0, pDbname); -} - -/* -** Called by the parser to compile an ATTACH statement. -** -** ATTACH p AS pDbname KEY pKey -*/ -void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){ - codeAttach(pParse, SQLITE_ATTACH, "sqlite_attach", 3, p, p, pDbname, pKey); -} -#endif /* SQLITE_OMIT_ATTACH */ - -/* -** Register the functions sqlite_attach and sqlite_detach. -*/ -void sqlite3AttachFunctions(sqlite3 *db){ -#ifndef SQLITE_OMIT_ATTACH - static const int enc = SQLITE_UTF8; - sqlite3CreateFunc(db, "sqlite_attach", 3, enc, db, attachFunc, 0, 0); - sqlite3CreateFunc(db, "sqlite_detach", 1, enc, db, detachFunc, 0, 0); -#endif -} - -/* -** Initialize a DbFixer structure. This routine must be called prior -** to passing the structure to one of the sqliteFixAAAA() routines below. -** -** The return value indicates whether or not fixation is required. TRUE -** means we do need to fix the database references, FALSE means we do not. -*/ -int sqlite3FixInit( - DbFixer *pFix, /* The fixer to be initialized */ - Parse *pParse, /* Error messages will be written here */ - int iDb, /* This is the database that must be used */ - const char *zType, /* "view", "trigger", or "index" */ - const Token *pName /* Name of the view, trigger, or index */ -){ - sqlite3 *db; - - if( iDb<0 || iDb==1 ) return 0; - db = pParse->db; - assert( db->nDb>iDb ); - pFix->pParse = pParse; - pFix->zDb = db->aDb[iDb].zName; - pFix->zType = zType; - pFix->pName = pName; - return 1; -} - -/* -** The following set of routines walk through the parse tree and assign -** a specific database to all table references where the database name -** was left unspecified in the original SQL statement. The pFix structure -** must have been initialized by a prior call to sqlite3FixInit(). -** -** These routines are used to make sure that an index, trigger, or -** view in one database does not refer to objects in a different database. -** (Exception: indices, triggers, and views in the TEMP database are -** allowed to refer to anything.) If a reference is explicitly made -** to an object in a different database, an error message is added to -** pParse->zErrMsg and these routines return non-zero. If everything -** checks out, these routines return 0. -*/ -int sqlite3FixSrcList( - DbFixer *pFix, /* Context of the fixation */ - SrcList *pList /* The Source list to check and modify */ -){ - int i; - const char *zDb; - struct SrcList_item *pItem; - - if( pList==0 ) return 0; - zDb = pFix->zDb; - for(i=0, pItem=pList->a; inSrc; i++, pItem++){ - if( pItem->zDatabase==0 ){ - pItem->zDatabase = sqlite3DbStrDup(pFix->pParse->db, zDb); - }else if( sqlite3StrICmp(pItem->zDatabase,zDb)!=0 ){ - sqlite3ErrorMsg(pFix->pParse, - "%s %T cannot reference objects in database %s", - pFix->zType, pFix->pName, pItem->zDatabase); - return 1; - } -#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) - if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; - if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1; -#endif - } - return 0; -} -#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) -int sqlite3FixSelect( - DbFixer *pFix, /* Context of the fixation */ - Select *pSelect /* The SELECT statement to be fixed to one database */ -){ - while( pSelect ){ - if( sqlite3FixExprList(pFix, pSelect->pEList) ){ - return 1; - } - if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){ - return 1; - } - if( sqlite3FixExpr(pFix, pSelect->pWhere) ){ - return 1; - } - if( sqlite3FixExpr(pFix, pSelect->pHaving) ){ - return 1; - } - pSelect = pSelect->pPrior; - } - return 0; -} -int sqlite3FixExpr( - DbFixer *pFix, /* Context of the fixation */ - Expr *pExpr /* The expression to be fixed to one database */ -){ - while( pExpr ){ - if( sqlite3FixSelect(pFix, pExpr->pSelect) ){ - return 1; - } - if( sqlite3FixExprList(pFix, pExpr->pList) ){ - return 1; - } - if( sqlite3FixExpr(pFix, pExpr->pRight) ){ - return 1; - } - pExpr = pExpr->pLeft; - } - return 0; -} -int sqlite3FixExprList( - DbFixer *pFix, /* Context of the fixation */ - ExprList *pList /* The expression to be fixed to one database */ -){ - int i; - struct ExprList_item *pItem; - if( pList==0 ) return 0; - for(i=0, pItem=pList->a; inExpr; i++, pItem++){ - if( sqlite3FixExpr(pFix, pItem->pExpr) ){ - return 1; - } - } - return 0; -} -#endif - -#ifndef SQLITE_OMIT_TRIGGER -int sqlite3FixTriggerStep( - DbFixer *pFix, /* Context of the fixation */ - TriggerStep *pStep /* The trigger step be fixed to one database */ -){ - while( pStep ){ - if( sqlite3FixSelect(pFix, pStep->pSelect) ){ - return 1; - } - if( sqlite3FixExpr(pFix, pStep->pWhere) ){ - return 1; - } - if( sqlite3FixExprList(pFix, pStep->pExprList) ){ - return 1; - } - pStep = pStep->pNext; - } - return 0; -} -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/auth.c b/libraries/sqlite/unix/sqlite-3.5.1/src/auth.c deleted file mode 100644 index 5630c239f5..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/auth.c +++ /dev/null @@ -1,234 +0,0 @@ -/* -** 2003 January 11 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code used to implement the sqlite3_set_authorizer() -** API. This facility is an optional feature of the library. Embedded -** systems that do not need this facility may omit it by recompiling -** the library with -DSQLITE_OMIT_AUTHORIZATION=1 -** -** $Id: auth.c,v 1.29 2007/09/18 15:55:07 drh Exp $ -*/ -#include "sqliteInt.h" - -/* -** All of the code in this file may be omitted by defining a single -** macro. -*/ -#ifndef SQLITE_OMIT_AUTHORIZATION - -/* -** Set or clear the access authorization function. -** -** The access authorization function is be called during the compilation -** phase to verify that the user has read and/or write access permission on -** various fields of the database. The first argument to the auth function -** is a copy of the 3rd argument to this routine. The second argument -** to the auth function is one of these constants: -** -** SQLITE_CREATE_INDEX -** SQLITE_CREATE_TABLE -** SQLITE_CREATE_TEMP_INDEX -** SQLITE_CREATE_TEMP_TABLE -** SQLITE_CREATE_TEMP_TRIGGER -** SQLITE_CREATE_TEMP_VIEW -** SQLITE_CREATE_TRIGGER -** SQLITE_CREATE_VIEW -** SQLITE_DELETE -** SQLITE_DROP_INDEX -** SQLITE_DROP_TABLE -** SQLITE_DROP_TEMP_INDEX -** SQLITE_DROP_TEMP_TABLE -** SQLITE_DROP_TEMP_TRIGGER -** SQLITE_DROP_TEMP_VIEW -** SQLITE_DROP_TRIGGER -** SQLITE_DROP_VIEW -** SQLITE_INSERT -** SQLITE_PRAGMA -** SQLITE_READ -** SQLITE_SELECT -** SQLITE_TRANSACTION -** SQLITE_UPDATE -** -** The third and fourth arguments to the auth function are the name of -** the table and the column that are being accessed. The auth function -** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If -** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY -** means that the SQL statement will never-run - the sqlite3_exec() call -** will return with an error. SQLITE_IGNORE means that the SQL statement -** should run but attempts to read the specified column will return NULL -** and attempts to write the column will be ignored. -** -** Setting the auth function to NULL disables this hook. The default -** setting of the auth function is NULL. -*/ -int sqlite3_set_authorizer( - sqlite3 *db, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pArg -){ - sqlite3_mutex_enter(db->mutex); - db->xAuth = xAuth; - db->pAuthArg = pArg; - sqlite3ExpirePreparedStatements(db); - sqlite3_mutex_leave(db->mutex); - return SQLITE_OK; -} - -/* -** Write an error message into pParse->zErrMsg that explains that the -** user-supplied authorization function returned an illegal value. -*/ -static void sqliteAuthBadReturnCode(Parse *pParse, int rc){ - sqlite3ErrorMsg(pParse, "illegal return value (%d) from the " - "authorization function - should be SQLITE_OK, SQLITE_IGNORE, " - "or SQLITE_DENY", rc); - pParse->rc = SQLITE_ERROR; -} - -/* -** The pExpr should be a TK_COLUMN expression. The table referred to -** is in pTabList or else it is the NEW or OLD table of a trigger. -** Check to see if it is OK to read this particular column. -** -** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN -** instruction into a TK_NULL. If the auth function returns SQLITE_DENY, -** then generate an error. -*/ -void sqlite3AuthRead( - Parse *pParse, /* The parser context */ - Expr *pExpr, /* The expression to check authorization on */ - Schema *pSchema, /* The schema of the expression */ - SrcList *pTabList /* All table that pExpr might refer to */ -){ - sqlite3 *db = pParse->db; - int rc; - Table *pTab = 0; /* The table being read */ - const char *zCol; /* Name of the column of the table */ - int iSrc; /* Index in pTabList->a[] of table being read */ - const char *zDBase; /* Name of database being accessed */ - TriggerStack *pStack; /* The stack of current triggers */ - int iDb; /* The index of the database the expression refers to */ - - if( db->xAuth==0 ) return; - if( pExpr->op!=TK_COLUMN ) return; - iDb = sqlite3SchemaToIndex(pParse->db, pSchema); - if( iDb<0 ){ - /* An attempt to read a column out of a subquery or other - ** temporary table. */ - return; - } - for(iSrc=0; pTabList && iSrcnSrc; iSrc++){ - if( pExpr->iTable==pTabList->a[iSrc].iCursor ) break; - } - if( iSrc>=0 && pTabList && iSrcnSrc ){ - pTab = pTabList->a[iSrc].pTab; - }else if( (pStack = pParse->trigStack)!=0 ){ - /* This must be an attempt to read the NEW or OLD pseudo-tables - ** of a trigger. - */ - assert( pExpr->iTable==pStack->newIdx || pExpr->iTable==pStack->oldIdx ); - pTab = pStack->pTab; - } - if( pTab==0 ) return; - if( pExpr->iColumn>=0 ){ - assert( pExpr->iColumnnCol ); - zCol = pTab->aCol[pExpr->iColumn].zName; - }else if( pTab->iPKey>=0 ){ - assert( pTab->iPKeynCol ); - zCol = pTab->aCol[pTab->iPKey].zName; - }else{ - zCol = "ROWID"; - } - assert( iDb>=0 && iDbnDb ); - zDBase = db->aDb[iDb].zName; - rc = db->xAuth(db->pAuthArg, SQLITE_READ, pTab->zName, zCol, zDBase, - pParse->zAuthContext); - if( rc==SQLITE_IGNORE ){ - pExpr->op = TK_NULL; - }else if( rc==SQLITE_DENY ){ - if( db->nDb>2 || iDb!=0 ){ - sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited", - zDBase, pTab->zName, zCol); - }else{ - sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited",pTab->zName,zCol); - } - pParse->rc = SQLITE_AUTH; - }else if( rc!=SQLITE_OK ){ - sqliteAuthBadReturnCode(pParse, rc); - } -} - -/* -** Do an authorization check using the code and arguments given. Return -** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY -** is returned, then the error count and error message in pParse are -** modified appropriately. -*/ -int sqlite3AuthCheck( - Parse *pParse, - int code, - const char *zArg1, - const char *zArg2, - const char *zArg3 -){ - sqlite3 *db = pParse->db; - int rc; - - /* Don't do any authorization checks if the database is initialising - ** or if the parser is being invoked from within sqlite3_declare_vtab. - */ - if( db->init.busy || IN_DECLARE_VTAB ){ - return SQLITE_OK; - } - - if( db->xAuth==0 ){ - return SQLITE_OK; - } - rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext); - if( rc==SQLITE_DENY ){ - sqlite3ErrorMsg(pParse, "not authorized"); - pParse->rc = SQLITE_AUTH; - }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ - rc = SQLITE_DENY; - sqliteAuthBadReturnCode(pParse, rc); - } - return rc; -} - -/* -** Push an authorization context. After this routine is called, the -** zArg3 argument to authorization callbacks will be zContext until -** popped. Or if pParse==0, this routine is a no-op. -*/ -void sqlite3AuthContextPush( - Parse *pParse, - AuthContext *pContext, - const char *zContext -){ - pContext->pParse = pParse; - if( pParse ){ - pContext->zAuthContext = pParse->zAuthContext; - pParse->zAuthContext = zContext; - } -} - -/* -** Pop an authorization context that was previously pushed -** by sqlite3AuthContextPush -*/ -void sqlite3AuthContextPop(AuthContext *pContext){ - if( pContext->pParse ){ - pContext->pParse->zAuthContext = pContext->zAuthContext; - pContext->pParse = 0; - } -} - -#endif /* SQLITE_OMIT_AUTHORIZATION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c b/libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c deleted file mode 100644 index 1f63434231..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/btmutex.c +++ /dev/null @@ -1,315 +0,0 @@ -/* -** 2007 August 27 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** $Id: btmutex.c,v 1.7 2007/08/30 01:19:59 drh Exp $ -** -** This file contains code used to implement mutexes on Btree objects. -** This code really belongs in btree.c. But btree.c is getting too -** big and we want to break it down some. This packaged seemed like -** a good breakout. -*/ -#include "btreeInt.h" -#if SQLITE_THREADSAFE && !defined(SQLITE_OMIT_SHARED_CACHE) - - -/* -** Enter a mutex on the given BTree object. -** -** If the object is not sharable, then no mutex is ever required -** and this routine is a no-op. The underlying mutex is non-recursive. -** But we keep a reference count in Btree.wantToLock so the behavior -** of this interface is recursive. -** -** To avoid deadlocks, multiple Btrees are locked in the same order -** by all database connections. The p->pNext is a list of other -** Btrees belonging to the same database connection as the p Btree -** which need to be locked after p. If we cannot get a lock on -** p, then first unlock all of the others on p->pNext, then wait -** for the lock to become available on p, then relock all of the -** subsequent Btrees that desire a lock. -*/ -void sqlite3BtreeEnter(Btree *p){ - Btree *pLater; - - /* Some basic sanity checking on the Btree. The list of Btrees - ** connected by pNext and pPrev should be in sorted order by - ** Btree.pBt value. All elements of the list should belong to - ** the same connection. Only shared Btrees are on the list. */ - assert( p->pNext==0 || p->pNext->pBt>p->pBt ); - assert( p->pPrev==0 || p->pPrev->pBtpBt ); - assert( p->pNext==0 || p->pNext->pSqlite==p->pSqlite ); - assert( p->pPrev==0 || p->pPrev->pSqlite==p->pSqlite ); - assert( p->sharable || (p->pNext==0 && p->pPrev==0) ); - - /* Check for locking consistency */ - assert( !p->locked || p->wantToLock>0 ); - assert( p->sharable || p->wantToLock==0 ); - - /* We should already hold a lock on the database connection */ - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - - if( !p->sharable ) return; - p->wantToLock++; - if( p->locked ) return; - - /* In most cases, we should be able to acquire the lock we - ** want without having to go throught the ascending lock - ** procedure that follows. Just be sure not to block. - */ - if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){ - p->locked = 1; - return; - } - - /* To avoid deadlock, first release all locks with a larger - ** BtShared address. Then acquire our lock. Then reacquire - ** the other BtShared locks that we used to hold in ascending - ** order. - */ - for(pLater=p->pNext; pLater; pLater=pLater->pNext){ - assert( pLater->sharable ); - assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt ); - assert( !pLater->locked || pLater->wantToLock>0 ); - if( pLater->locked ){ - sqlite3_mutex_leave(pLater->pBt->mutex); - pLater->locked = 0; - } - } - sqlite3_mutex_enter(p->pBt->mutex); - p->locked = 1; - for(pLater=p->pNext; pLater; pLater=pLater->pNext){ - if( pLater->wantToLock ){ - sqlite3_mutex_enter(pLater->pBt->mutex); - pLater->locked = 1; - } - } -} - -/* -** Exit the recursive mutex on a Btree. -*/ -void sqlite3BtreeLeave(Btree *p){ - if( p->sharable ){ - assert( p->wantToLock>0 ); - p->wantToLock--; - if( p->wantToLock==0 ){ - assert( p->locked ); - sqlite3_mutex_leave(p->pBt->mutex); - p->locked = 0; - } - } -} - -#ifndef NDEBUG -/* -** Return true if the BtShared mutex is held on the btree. -** -** This routine makes no determination one why or another if the -** database connection mutex is held. -** -** This routine is used only from within assert() statements. -*/ -int sqlite3BtreeHoldsMutex(Btree *p){ - return (p->sharable==0 || - (p->locked && p->wantToLock && sqlite3_mutex_held(p->pBt->mutex))); -} -#endif - - -#ifndef SQLITE_OMIT_INCRBLOB -/* -** Enter and leave a mutex on a Btree given a cursor owned by that -** Btree. These entry points are used by incremental I/O and can be -** omitted if that module is not used. -*/ -void sqlite3BtreeEnterCursor(BtCursor *pCur){ - sqlite3BtreeEnter(pCur->pBtree); -} -void sqlite3BtreeLeaveCursor(BtCursor *pCur){ - sqlite3BtreeLeave(pCur->pBtree); -} -#endif /* SQLITE_OMIT_INCRBLOB */ - - -/* -** Enter the mutex on every Btree associated with a database -** connection. This is needed (for example) prior to parsing -** a statement since we will be comparing table and column names -** against all schemas and we do not want those schemas being -** reset out from under us. -** -** There is a corresponding leave-all procedures. -** -** Enter the mutexes in accending order by BtShared pointer address -** to avoid the possibility of deadlock when two threads with -** two or more btrees in common both try to lock all their btrees -** at the same instant. -*/ -void sqlite3BtreeEnterAll(sqlite3 *db){ - int i; - Btree *p, *pLater; - assert( sqlite3_mutex_held(db->mutex) ); - for(i=0; inDb; i++){ - p = db->aDb[i].pBt; - if( p && p->sharable ){ - p->wantToLock++; - if( !p->locked ){ - assert( p->wantToLock==1 ); - while( p->pPrev ) p = p->pPrev; - while( p->locked && p->pNext ) p = p->pNext; - for(pLater = p->pNext; pLater; pLater=pLater->pNext){ - if( pLater->locked ){ - sqlite3_mutex_leave(pLater->pBt->mutex); - pLater->locked = 0; - } - } - while( p ){ - sqlite3_mutex_enter(p->pBt->mutex); - p->locked++; - p = p->pNext; - } - } - } - } -} -void sqlite3BtreeLeaveAll(sqlite3 *db){ - int i; - Btree *p; - assert( sqlite3_mutex_held(db->mutex) ); - for(i=0; inDb; i++){ - p = db->aDb[i].pBt; - if( p && p->sharable ){ - assert( p->wantToLock>0 ); - p->wantToLock--; - if( p->wantToLock==0 ){ - assert( p->locked ); - sqlite3_mutex_leave(p->pBt->mutex); - p->locked = 0; - } - } - } -} - -#ifndef NDEBUG -/* -** Return true if the current thread holds the database connection -** mutex and all required BtShared mutexes. -** -** This routine is used inside assert() statements only. -*/ -int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ - int i; - if( !sqlite3_mutex_held(db->mutex) ){ - return 0; - } - for(i=0; inDb; i++){ - Btree *p; - p = db->aDb[i].pBt; - if( p && p->sharable && - (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){ - return 0; - } - } - return 1; -} -#endif /* NDEBUG */ - -/* -** Potentially dd a new Btree pointer to a BtreeMutexArray. -** Really only add the Btree if it can possibly be shared with -** another database connection. -** -** The Btrees are kept in sorted order by pBtree->pBt. That -** way when we go to enter all the mutexes, we can enter them -** in order without every having to backup and retry and without -** worrying about deadlock. -** -** The number of shared btrees will always be small (usually 0 or 1) -** so an insertion sort is an adequate algorithm here. -*/ -void sqlite3BtreeMutexArrayInsert(BtreeMutexArray *pArray, Btree *pBtree){ - int i, j; - BtShared *pBt; - if( pBtree==0 || pBtree->sharable==0 ) return; -#ifndef NDEBUG - { - for(i=0; inMutex; i++){ - assert( pArray->aBtree[i]!=pBtree ); - } - } -#endif - assert( pArray->nMutex>=0 ); - assert( pArray->nMutexaBtree)/sizeof(pArray->aBtree[0])-1 ); - pBt = pBtree->pBt; - for(i=0; inMutex; i++){ - assert( pArray->aBtree[i]!=pBtree ); - if( pArray->aBtree[i]->pBt>pBt ){ - for(j=pArray->nMutex; j>i; j--){ - pArray->aBtree[j] = pArray->aBtree[j-1]; - } - pArray->aBtree[i] = pBtree; - pArray->nMutex++; - return; - } - } - pArray->aBtree[pArray->nMutex++] = pBtree; -} - -/* -** Enter the mutex of every btree in the array. This routine is -** called at the beginning of sqlite3VdbeExec(). The mutexes are -** exited at the end of the same function. -*/ -void sqlite3BtreeMutexArrayEnter(BtreeMutexArray *pArray){ - int i; - for(i=0; inMutex; i++){ - Btree *p = pArray->aBtree[i]; - /* Some basic sanity checking */ - assert( i==0 || pArray->aBtree[i-1]->pBtpBt ); - assert( !p->locked || p->wantToLock>0 ); - - /* We should already hold a lock on the database connection */ - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - - p->wantToLock++; - if( !p->locked && p->sharable ){ - sqlite3_mutex_enter(p->pBt->mutex); - p->locked = 1; - } - } -} - -/* -** Leave the mutex of every btree in the group. -*/ -void sqlite3BtreeMutexArrayLeave(BtreeMutexArray *pArray){ - int i; - for(i=0; inMutex; i++){ - Btree *p = pArray->aBtree[i]; - /* Some basic sanity checking */ - assert( i==0 || pArray->aBtree[i-1]->pBtpBt ); - assert( p->locked || !p->sharable ); - assert( p->wantToLock>0 ); - - /* We should already hold a lock on the database connection */ - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - - p->wantToLock--; - if( p->wantToLock==0 && p->locked ){ - sqlite3_mutex_leave(p->pBt->mutex); - p->locked = 0; - } - } -} - - -#endif /* SQLITE_THREADSAFE && !SQLITE_OMIT_SHARED_CACHE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btree.c b/libraries/sqlite/unix/sqlite-3.5.1/src/btree.c deleted file mode 100644 index de8821a900..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/btree.c +++ /dev/null @@ -1,6890 +0,0 @@ -/* -** 2004 April 6 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** $Id: btree.c,v 1.428 2007/10/03 08:46:44 danielk1977 Exp $ -** -** This file implements a external (disk-based) database using BTrees. -** See the header comment on "btreeInt.h" for additional information. -** Including a description of file format and an overview of operation. -*/ -#include "btreeInt.h" - -/* -** The header string that appears at the beginning of every -** SQLite database. -*/ -static const char zMagicHeader[] = SQLITE_FILE_HEADER; - -/* -** Set this global variable to 1 to enable tracing using the TRACE -** macro. -*/ -#if SQLITE_TEST -int sqlite3_btree_trace=0; /* True to enable tracing */ -#endif - - - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** A flag to indicate whether or not shared cache is enabled. Also, -** a list of BtShared objects that are eligible for participation -** in shared cache. The variables have file scope during normal builds, -** but the test harness needs to access these variables so we make them -** global for test builds. -*/ -#ifdef SQLITE_TEST -BtShared *sqlite3SharedCacheList = 0; -int sqlite3SharedCacheEnabled = 0; -#else -static BtShared *sqlite3SharedCacheList = 0; -static int sqlite3SharedCacheEnabled = 0; -#endif -#endif /* SQLITE_OMIT_SHARED_CACHE */ - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** Enable or disable the shared pager and schema features. -** -** This routine has no effect on existing database connections. -** The shared cache setting effects only future calls to -** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). -*/ -int sqlite3_enable_shared_cache(int enable){ - sqlite3SharedCacheEnabled = enable; - return SQLITE_OK; -} -#endif - - -/* -** Forward declaration -*/ -static int checkReadLocks(Btree*,Pgno,BtCursor*); - - -#ifdef SQLITE_OMIT_SHARED_CACHE - /* - ** The functions queryTableLock(), lockTable() and unlockAllTables() - ** manipulate entries in the BtShared.pLock linked list used to store - ** shared-cache table level locks. If the library is compiled with the - ** shared-cache feature disabled, then there is only ever one user - ** of each BtShared structure and so this locking is not necessary. - ** So define the lock related functions as no-ops. - */ - #define queryTableLock(a,b,c) SQLITE_OK - #define lockTable(a,b,c) SQLITE_OK - #define unlockAllTables(a) -#endif - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** Query to see if btree handle p may obtain a lock of type eLock -** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return -** SQLITE_OK if the lock may be obtained (by calling lockTable()), or -** SQLITE_LOCKED if not. -*/ -static int queryTableLock(Btree *p, Pgno iTab, u8 eLock){ - BtShared *pBt = p->pBt; - BtLock *pIter; - - assert( sqlite3BtreeHoldsMutex(p) ); - - /* This is a no-op if the shared-cache is not enabled */ - if( !p->sharable ){ - return SQLITE_OK; - } - - /* This (along with lockTable()) is where the ReadUncommitted flag is - ** dealt with. If the caller is querying for a read-lock and the flag is - ** set, it is unconditionally granted - even if there are write-locks - ** on the table. If a write-lock is requested, the ReadUncommitted flag - ** is not considered. - ** - ** In function lockTable(), if a read-lock is demanded and the - ** ReadUncommitted flag is set, no entry is added to the locks list - ** (BtShared.pLock). - ** - ** To summarize: If the ReadUncommitted flag is set, then read cursors do - ** not create or respect table locks. The locking procedure for a - ** write-cursor does not change. - */ - if( - !p->pSqlite || - 0==(p->pSqlite->flags&SQLITE_ReadUncommitted) || - eLock==WRITE_LOCK || - iTab==MASTER_ROOT - ){ - for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ - if( pIter->pBtree!=p && pIter->iTable==iTab && - (pIter->eLock!=eLock || eLock!=READ_LOCK) ){ - return SQLITE_LOCKED; - } - } - } - return SQLITE_OK; -} -#endif /* !SQLITE_OMIT_SHARED_CACHE */ - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** Add a lock on the table with root-page iTable to the shared-btree used -** by Btree handle p. Parameter eLock must be either READ_LOCK or -** WRITE_LOCK. -** -** SQLITE_OK is returned if the lock is added successfully. SQLITE_BUSY and -** SQLITE_NOMEM may also be returned. -*/ -static int lockTable(Btree *p, Pgno iTable, u8 eLock){ - BtShared *pBt = p->pBt; - BtLock *pLock = 0; - BtLock *pIter; - - assert( sqlite3BtreeHoldsMutex(p) ); - - /* This is a no-op if the shared-cache is not enabled */ - if( !p->sharable ){ - return SQLITE_OK; - } - - assert( SQLITE_OK==queryTableLock(p, iTable, eLock) ); - - /* If the read-uncommitted flag is set and a read-lock is requested, - ** return early without adding an entry to the BtShared.pLock list. See - ** comment in function queryTableLock() for more info on handling - ** the ReadUncommitted flag. - */ - if( - (p->pSqlite) && - (p->pSqlite->flags&SQLITE_ReadUncommitted) && - (eLock==READ_LOCK) && - iTable!=MASTER_ROOT - ){ - return SQLITE_OK; - } - - /* First search the list for an existing lock on this table. */ - for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ - if( pIter->iTable==iTable && pIter->pBtree==p ){ - pLock = pIter; - break; - } - } - - /* If the above search did not find a BtLock struct associating Btree p - ** with table iTable, allocate one and link it into the list. - */ - if( !pLock ){ - pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock)); - if( !pLock ){ - return SQLITE_NOMEM; - } - pLock->iTable = iTable; - pLock->pBtree = p; - pLock->pNext = pBt->pLock; - pBt->pLock = pLock; - } - - /* Set the BtLock.eLock variable to the maximum of the current lock - ** and the requested lock. This means if a write-lock was already held - ** and a read-lock requested, we don't incorrectly downgrade the lock. - */ - assert( WRITE_LOCK>READ_LOCK ); - if( eLock>pLock->eLock ){ - pLock->eLock = eLock; - } - - return SQLITE_OK; -} -#endif /* !SQLITE_OMIT_SHARED_CACHE */ - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** Release all the table locks (locks obtained via calls to the lockTable() -** procedure) held by Btree handle p. -*/ -static void unlockAllTables(Btree *p){ - BtLock **ppIter = &p->pBt->pLock; - - assert( sqlite3BtreeHoldsMutex(p) ); - assert( p->sharable || 0==*ppIter ); - - while( *ppIter ){ - BtLock *pLock = *ppIter; - if( pLock->pBtree==p ){ - *ppIter = pLock->pNext; - sqlite3_free(pLock); - }else{ - ppIter = &pLock->pNext; - } - } -} -#endif /* SQLITE_OMIT_SHARED_CACHE */ - -static void releasePage(MemPage *pPage); /* Forward reference */ - -/* -** Verify that the cursor holds a mutex on the BtShared -*/ -#ifndef NDEBUG -static int cursorHoldsMutex(BtCursor *p){ - return sqlite3_mutex_held(p->pBt->mutex); -} -#endif - - -#ifndef SQLITE_OMIT_INCRBLOB -/* -** Invalidate the overflow page-list cache for cursor pCur, if any. -*/ -static void invalidateOverflowCache(BtCursor *pCur){ - assert( cursorHoldsMutex(pCur) ); - sqlite3_free(pCur->aOverflow); - pCur->aOverflow = 0; -} - -/* -** Invalidate the overflow page-list cache for all cursors opened -** on the shared btree structure pBt. -*/ -static void invalidateAllOverflowCache(BtShared *pBt){ - BtCursor *p; - assert( sqlite3_mutex_held(pBt->mutex) ); - for(p=pBt->pCursor; p; p=p->pNext){ - invalidateOverflowCache(p); - } -} -#else - #define invalidateOverflowCache(x) - #define invalidateAllOverflowCache(x) -#endif - -/* -** Save the current cursor position in the variables BtCursor.nKey -** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK. -*/ -static int saveCursorPosition(BtCursor *pCur){ - int rc; - - assert( CURSOR_VALID==pCur->eState ); - assert( 0==pCur->pKey ); - assert( cursorHoldsMutex(pCur) ); - - rc = sqlite3BtreeKeySize(pCur, &pCur->nKey); - - /* If this is an intKey table, then the above call to BtreeKeySize() - ** stores the integer key in pCur->nKey. In this case this value is - ** all that is required. Otherwise, if pCur is not open on an intKey - ** table, then malloc space for and store the pCur->nKey bytes of key - ** data. - */ - if( rc==SQLITE_OK && 0==pCur->pPage->intKey){ - void *pKey = sqlite3_malloc(pCur->nKey); - if( pKey ){ - rc = sqlite3BtreeKey(pCur, 0, pCur->nKey, pKey); - if( rc==SQLITE_OK ){ - pCur->pKey = pKey; - }else{ - sqlite3_free(pKey); - } - }else{ - rc = SQLITE_NOMEM; - } - } - assert( !pCur->pPage->intKey || !pCur->pKey ); - - if( rc==SQLITE_OK ){ - releasePage(pCur->pPage); - pCur->pPage = 0; - pCur->eState = CURSOR_REQUIRESEEK; - } - - invalidateOverflowCache(pCur); - return rc; -} - -/* -** Save the positions of all cursors except pExcept open on the table -** with root-page iRoot. Usually, this is called just before cursor -** pExcept is used to modify the table (BtreeDelete() or BtreeInsert()). -*/ -static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ - BtCursor *p; - assert( sqlite3_mutex_held(pBt->mutex) ); - assert( pExcept==0 || pExcept->pBt==pBt ); - for(p=pBt->pCursor; p; p=p->pNext){ - if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) && - p->eState==CURSOR_VALID ){ - int rc = saveCursorPosition(p); - if( SQLITE_OK!=rc ){ - return rc; - } - } - } - return SQLITE_OK; -} - -/* -** Clear the current cursor position. -*/ -static void clearCursorPosition(BtCursor *pCur){ - assert( cursorHoldsMutex(pCur) ); - sqlite3_free(pCur->pKey); - pCur->pKey = 0; - pCur->eState = CURSOR_INVALID; -} - -/* -** Restore the cursor to the position it was in (or as close to as possible) -** when saveCursorPosition() was called. Note that this call deletes the -** saved position info stored by saveCursorPosition(), so there can be -** at most one effective restoreOrClearCursorPosition() call after each -** saveCursorPosition(). -** -** If the second argument argument - doSeek - is false, then instead of -** returning the cursor to it's saved position, any saved position is deleted -** and the cursor state set to CURSOR_INVALID. -*/ -int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur){ - int rc; - assert( cursorHoldsMutex(pCur) ); - assert( pCur->eState>=CURSOR_REQUIRESEEK ); - if( pCur->eState==CURSOR_FAULT ){ - return pCur->skip; - } -#ifndef SQLITE_OMIT_INCRBLOB - if( pCur->isIncrblobHandle ){ - return SQLITE_ABORT; - } -#endif - pCur->eState = CURSOR_INVALID; - rc = sqlite3BtreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &pCur->skip); - if( rc==SQLITE_OK ){ - sqlite3_free(pCur->pKey); - pCur->pKey = 0; - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); - } - return rc; -} - -#define restoreOrClearCursorPosition(p) \ - (p->eState>=CURSOR_REQUIRESEEK ? \ - sqlite3BtreeRestoreOrClearCursorPosition(p) : \ - SQLITE_OK) - -#ifndef SQLITE_OMIT_AUTOVACUUM -/* -** Given a page number of a regular database page, return the page -** number for the pointer-map page that contains the entry for the -** input page number. -*/ -static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ - int nPagesPerMapPage, iPtrMap, ret; - assert( sqlite3_mutex_held(pBt->mutex) ); - nPagesPerMapPage = (pBt->usableSize/5)+1; - iPtrMap = (pgno-2)/nPagesPerMapPage; - ret = (iPtrMap*nPagesPerMapPage) + 2; - if( ret==PENDING_BYTE_PAGE(pBt) ){ - ret++; - } - return ret; -} - -/* -** Write an entry into the pointer map. -** -** This routine updates the pointer map entry for page number 'key' -** so that it maps to type 'eType' and parent page number 'pgno'. -** An error code is returned if something goes wrong, otherwise SQLITE_OK. -*/ -static int ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent){ - DbPage *pDbPage; /* The pointer map page */ - u8 *pPtrmap; /* The pointer map data */ - Pgno iPtrmap; /* The pointer map page number */ - int offset; /* Offset in pointer map page */ - int rc; - - assert( sqlite3_mutex_held(pBt->mutex) ); - /* The master-journal page number must never be used as a pointer map page */ - assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) ); - - assert( pBt->autoVacuum ); - if( key==0 ){ - return SQLITE_CORRUPT_BKPT; - } - iPtrmap = PTRMAP_PAGENO(pBt, key); - rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); - if( rc!=SQLITE_OK ){ - return rc; - } - offset = PTRMAP_PTROFFSET(pBt, key); - pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); - - if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ - TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); - rc = sqlite3PagerWrite(pDbPage); - if( rc==SQLITE_OK ){ - pPtrmap[offset] = eType; - put4byte(&pPtrmap[offset+1], parent); - } - } - - sqlite3PagerUnref(pDbPage); - return rc; -} - -/* -** Read an entry from the pointer map. -** -** This routine retrieves the pointer map entry for page 'key', writing -** the type and parent page number to *pEType and *pPgno respectively. -** An error code is returned if something goes wrong, otherwise SQLITE_OK. -*/ -static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ - DbPage *pDbPage; /* The pointer map page */ - int iPtrmap; /* Pointer map page index */ - u8 *pPtrmap; /* Pointer map page data */ - int offset; /* Offset of entry in pointer map */ - int rc; - - assert( sqlite3_mutex_held(pBt->mutex) ); - - iPtrmap = PTRMAP_PAGENO(pBt, key); - rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); - if( rc!=0 ){ - return rc; - } - pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); - - offset = PTRMAP_PTROFFSET(pBt, key); - assert( pEType!=0 ); - *pEType = pPtrmap[offset]; - if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); - - sqlite3PagerUnref(pDbPage); - if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT; - return SQLITE_OK; -} - -#endif /* SQLITE_OMIT_AUTOVACUUM */ - -/* -** Given a btree page and a cell index (0 means the first cell on -** the page, 1 means the second cell, and so forth) return a pointer -** to the cell content. -** -** This routine works only for pages that do not contain overflow cells. -*/ -#define findCell(pPage, iCell) \ - ((pPage)->aData + get2byte(&(pPage)->aData[(pPage)->cellOffset+2*(iCell)])) -#ifdef SQLITE_TEST -u8 *sqlite3BtreeFindCell(MemPage *pPage, int iCell){ - assert( iCell>=0 ); - assert( iCellaData[pPage->hdrOffset+3]) ); - return findCell(pPage, iCell); -} -#endif - -/* -** This a more complex version of sqlite3BtreeFindCell() that works for -** pages that do contain overflow cells. See insert -*/ -static u8 *findOverflowCell(MemPage *pPage, int iCell){ - int i; - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - for(i=pPage->nOverflow-1; i>=0; i--){ - int k; - struct _OvflCell *pOvfl; - pOvfl = &pPage->aOvfl[i]; - k = pOvfl->idx; - if( k<=iCell ){ - if( k==iCell ){ - return pOvfl->pCell; - } - iCell--; - } - } - return findCell(pPage, iCell); -} - -/* -** Parse a cell content block and fill in the CellInfo structure. There -** are two versions of this function. sqlite3BtreeParseCell() takes a -** cell index as the second argument and sqlite3BtreeParseCellPtr() -** takes a pointer to the body of the cell as its second argument. -** -** Within this file, the parseCell() macro can be called instead of -** sqlite3BtreeParseCellPtr(). Using some compilers, this will be faster. -*/ -void sqlite3BtreeParseCellPtr( - MemPage *pPage, /* Page containing the cell */ - u8 *pCell, /* Pointer to the cell text. */ - CellInfo *pInfo /* Fill in this structure */ -){ - int n; /* Number bytes in cell content header */ - u32 nPayload; /* Number of bytes of cell payload */ - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - - pInfo->pCell = pCell; - assert( pPage->leaf==0 || pPage->leaf==1 ); - n = pPage->childPtrSize; - assert( n==4-4*pPage->leaf ); - if( pPage->hasData ){ - n += getVarint32(&pCell[n], &nPayload); - }else{ - nPayload = 0; - } - pInfo->nData = nPayload; - if( pPage->intKey ){ - n += getVarint(&pCell[n], (u64 *)&pInfo->nKey); - }else{ - u32 x; - n += getVarint32(&pCell[n], &x); - pInfo->nKey = x; - nPayload += x; - } - pInfo->nPayload = nPayload; - pInfo->nHeader = n; - if( nPayload<=pPage->maxLocal ){ - /* This is the (easy) common case where the entire payload fits - ** on the local page. No overflow is required. - */ - int nSize; /* Total size of cell content in bytes */ - pInfo->nLocal = nPayload; - pInfo->iOverflow = 0; - nSize = nPayload + n; - if( nSize<4 ){ - nSize = 4; /* Minimum cell size is 4 */ - } - pInfo->nSize = nSize; - }else{ - /* If the payload will not fit completely on the local page, we have - ** to decide how much to store locally and how much to spill onto - ** overflow pages. The strategy is to minimize the amount of unused - ** space on overflow pages while keeping the amount of local storage - ** in between minLocal and maxLocal. - ** - ** Warning: changing the way overflow payload is distributed in any - ** way will result in an incompatible file format. - */ - int minLocal; /* Minimum amount of payload held locally */ - int maxLocal; /* Maximum amount of payload held locally */ - int surplus; /* Overflow payload available for local storage */ - - minLocal = pPage->minLocal; - maxLocal = pPage->maxLocal; - surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4); - if( surplus <= maxLocal ){ - pInfo->nLocal = surplus; - }else{ - pInfo->nLocal = minLocal; - } - pInfo->iOverflow = pInfo->nLocal + n; - pInfo->nSize = pInfo->iOverflow + 4; - } -} -#define parseCell(pPage, iCell, pInfo) \ - sqlite3BtreeParseCellPtr((pPage), findCell((pPage), (iCell)), (pInfo)) -void sqlite3BtreeParseCell( - MemPage *pPage, /* Page containing the cell */ - int iCell, /* The cell index. First cell is 0 */ - CellInfo *pInfo /* Fill in this structure */ -){ - parseCell(pPage, iCell, pInfo); -} - -/* -** Compute the total number of bytes that a Cell needs in the cell -** data area of the btree-page. The return number includes the cell -** data header and the local payload, but not any overflow page or -** the space used by the cell pointer. -*/ -#ifndef NDEBUG -static int cellSize(MemPage *pPage, int iCell){ - CellInfo info; - sqlite3BtreeParseCell(pPage, iCell, &info); - return info.nSize; -} -#endif -static int cellSizePtr(MemPage *pPage, u8 *pCell){ - CellInfo info; - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - return info.nSize; -} - -#ifndef SQLITE_OMIT_AUTOVACUUM -/* -** If the cell pCell, part of page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. -*/ -static int ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell){ - if( pCell ){ - CellInfo info; - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload ); - if( (info.nData+(pPage->intKey?0:info.nKey))>info.nLocal ){ - Pgno ovfl = get4byte(&pCell[info.iOverflow]); - return ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno); - } - } - return SQLITE_OK; -} -/* -** If the cell with index iCell on page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. -*/ -static int ptrmapPutOvfl(MemPage *pPage, int iCell){ - u8 *pCell; - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - pCell = findOverflowCell(pPage, iCell); - return ptrmapPutOvflPtr(pPage, pCell); -} -#endif - - -/* -** Defragment the page given. All Cells are moved to the -** end of the page and all free space is collected into one -** big FreeBlk that occurs in between the header and cell -** pointer array and the cell content area. -*/ -static int defragmentPage(MemPage *pPage){ - int i; /* Loop counter */ - int pc; /* Address of a i-th cell */ - int addr; /* Offset of first byte after cell pointer array */ - int hdr; /* Offset to the page header */ - int size; /* Size of a cell */ - int usableSize; /* Number of usable bytes on a page */ - int cellOffset; /* Offset to the cell pointer array */ - int brk; /* Offset to the cell content area */ - int nCell; /* Number of cells on the page */ - unsigned char *data; /* The page data */ - unsigned char *temp; /* Temp area for cell content */ - - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - assert( pPage->pBt!=0 ); - assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); - assert( pPage->nOverflow==0 ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - temp = sqlite3_malloc( pPage->pBt->pageSize ); - if( temp==0 ) return SQLITE_NOMEM; - data = pPage->aData; - hdr = pPage->hdrOffset; - cellOffset = pPage->cellOffset; - nCell = pPage->nCell; - assert( nCell==get2byte(&data[hdr+3]) ); - usableSize = pPage->pBt->usableSize; - brk = get2byte(&data[hdr+5]); - memcpy(&temp[brk], &data[brk], usableSize - brk); - brk = usableSize; - for(i=0; ipBt->usableSize ); - size = cellSizePtr(pPage, &temp[pc]); - brk -= size; - memcpy(&data[brk], &temp[pc], size); - put2byte(pAddr, brk); - } - assert( brk>=cellOffset+2*nCell ); - put2byte(&data[hdr+5], brk); - data[hdr+1] = 0; - data[hdr+2] = 0; - data[hdr+7] = 0; - addr = cellOffset+2*nCell; - memset(&data[addr], 0, brk-addr); - sqlite3_free(temp); - return SQLITE_OK; -} - -/* -** Allocate nByte bytes of space on a page. -** -** Return the index into pPage->aData[] of the first byte of -** the new allocation. Or return 0 if there is not enough free -** space on the page to satisfy the allocation request. -** -** If the page contains nBytes of free space but does not contain -** nBytes of contiguous free space, then this routine automatically -** calls defragementPage() to consolidate all free space before -** allocating the new chunk. -*/ -static int allocateSpace(MemPage *pPage, int nByte){ - int addr, pc, hdr; - int size; - int nFrag; - int top; - int nCell; - int cellOffset; - unsigned char *data; - - data = pPage->aData; - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - assert( pPage->pBt ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( nByte<4 ) nByte = 4; - if( pPage->nFreenOverflow>0 ) return 0; - pPage->nFree -= nByte; - hdr = pPage->hdrOffset; - - nFrag = data[hdr+7]; - if( nFrag<60 ){ - /* Search the freelist looking for a slot big enough to satisfy the - ** space request. */ - addr = hdr+1; - while( (pc = get2byte(&data[addr]))>0 ){ - size = get2byte(&data[pc+2]); - if( size>=nByte ){ - if( sizecellOffset; - if( nFrag>=60 || cellOffset + 2*nCell > top - nByte ){ - if( defragmentPage(pPage) ) return 0; - top = get2byte(&data[hdr+5]); - } - top -= nByte; - assert( cellOffset + 2*nCell <= top ); - put2byte(&data[hdr+5], top); - return top; -} - -/* -** Return a section of the pPage->aData to the freelist. -** The first byte of the new free block is pPage->aDisk[start] -** and the size of the block is "size" bytes. -** -** Most of the effort here is involved in coalesing adjacent -** free blocks into a single big free block. -*/ -static void freeSpace(MemPage *pPage, int start, int size){ - int addr, pbegin, hdr; - unsigned char *data = pPage->aData; - - assert( pPage->pBt!=0 ); - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - assert( start>=pPage->hdrOffset+6+(pPage->leaf?0:4) ); - assert( (start + size)<=pPage->pBt->usableSize ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( size<4 ) size = 4; - -#ifdef SQLITE_SECURE_DELETE - /* Overwrite deleted information with zeros when the SECURE_DELETE - ** option is enabled at compile-time */ - memset(&data[start], 0, size); -#endif - - /* Add the space back into the linked list of freeblocks */ - hdr = pPage->hdrOffset; - addr = hdr + 1; - while( (pbegin = get2byte(&data[addr]))0 ){ - assert( pbegin<=pPage->pBt->usableSize-4 ); - assert( pbegin>addr ); - addr = pbegin; - } - assert( pbegin<=pPage->pBt->usableSize-4 ); - assert( pbegin>addr || pbegin==0 ); - put2byte(&data[addr], start); - put2byte(&data[start], pbegin); - put2byte(&data[start+2], size); - pPage->nFree += size; - - /* Coalesce adjacent free blocks */ - addr = pPage->hdrOffset + 1; - while( (pbegin = get2byte(&data[addr]))>0 ){ - int pnext, psize; - assert( pbegin>addr ); - assert( pbegin<=pPage->pBt->usableSize-4 ); - pnext = get2byte(&data[pbegin]); - psize = get2byte(&data[pbegin+2]); - if( pbegin + psize + 3 >= pnext && pnext>0 ){ - int frag = pnext - (pbegin+psize); - assert( frag<=data[pPage->hdrOffset+7] ); - data[pPage->hdrOffset+7] -= frag; - put2byte(&data[pbegin], get2byte(&data[pnext])); - put2byte(&data[pbegin+2], pnext+get2byte(&data[pnext+2])-pbegin); - }else{ - addr = pbegin; - } - } - - /* If the cell content area begins with a freeblock, remove it. */ - if( data[hdr+1]==data[hdr+5] && data[hdr+2]==data[hdr+6] ){ - int top; - pbegin = get2byte(&data[hdr+1]); - memcpy(&data[hdr+1], &data[pbegin], 2); - top = get2byte(&data[hdr+5]); - put2byte(&data[hdr+5], top + get2byte(&data[pbegin+2])); - } -} - -/* -** Decode the flags byte (the first byte of the header) for a page -** and initialize fields of the MemPage structure accordingly. -*/ -static void decodeFlags(MemPage *pPage, int flagByte){ - BtShared *pBt; /* A copy of pPage->pBt */ - - assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - pPage->intKey = (flagByte & (PTF_INTKEY|PTF_LEAFDATA))!=0; - pPage->zeroData = (flagByte & PTF_ZERODATA)!=0; - pPage->leaf = (flagByte & PTF_LEAF)!=0; - pPage->childPtrSize = 4*(pPage->leaf==0); - pBt = pPage->pBt; - if( flagByte & PTF_LEAFDATA ){ - pPage->leafData = 1; - pPage->maxLocal = pBt->maxLeaf; - pPage->minLocal = pBt->minLeaf; - }else{ - pPage->leafData = 0; - pPage->maxLocal = pBt->maxLocal; - pPage->minLocal = pBt->minLocal; - } - pPage->hasData = !(pPage->zeroData || (!pPage->leaf && pPage->leafData)); -} - -/* -** Initialize the auxiliary information for a disk block. -** -** The pParent parameter must be a pointer to the MemPage which -** is the parent of the page being initialized. The root of a -** BTree has no parent and so for that page, pParent==NULL. -** -** Return SQLITE_OK on success. If we see that the page does -** not contain a well-formed database page, then return -** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not -** guarantee that the page is well-formed. It only shows that -** we failed to detect any corruption. -*/ -int sqlite3BtreeInitPage( - MemPage *pPage, /* The page to be initialized */ - MemPage *pParent /* The parent. Might be NULL */ -){ - int pc; /* Address of a freeblock within pPage->aData[] */ - int hdr; /* Offset to beginning of page header */ - u8 *data; /* Equal to pPage->aData */ - BtShared *pBt; /* The main btree structure */ - int usableSize; /* Amount of usable space on each page */ - int cellOffset; /* Offset from start of page to first cell pointer */ - int nFree; /* Number of unused bytes on the page */ - int top; /* First byte of the cell content area */ - - pBt = pPage->pBt; - assert( pBt!=0 ); - assert( pParent==0 || pParent->pBt==pBt ); - assert( sqlite3_mutex_held(pBt->mutex) ); - assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); - assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); - assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); - if( pPage->pParent!=pParent && (pPage->pParent!=0 || pPage->isInit) ){ - /* The parent page should never change unless the file is corrupt */ - return SQLITE_CORRUPT_BKPT; - } - if( pPage->isInit ) return SQLITE_OK; - if( pPage->pParent==0 && pParent!=0 ){ - pPage->pParent = pParent; - sqlite3PagerRef(pParent->pDbPage); - } - hdr = pPage->hdrOffset; - data = pPage->aData; - decodeFlags(pPage, data[hdr]); - pPage->nOverflow = 0; - pPage->idxShift = 0; - usableSize = pBt->usableSize; - pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf; - top = get2byte(&data[hdr+5]); - pPage->nCell = get2byte(&data[hdr+3]); - if( pPage->nCell>MX_CELL(pBt) ){ - /* To many cells for a single page. The page must be corrupt */ - return SQLITE_CORRUPT_BKPT; - } - if( pPage->nCell==0 && pParent!=0 && pParent->pgno!=1 ){ - /* All pages must have at least one cell, except for root pages */ - return SQLITE_CORRUPT_BKPT; - } - - /* Compute the total free space on the page */ - pc = get2byte(&data[hdr+1]); - nFree = data[hdr+7] + top - (cellOffset + 2*pPage->nCell); - while( pc>0 ){ - int next, size; - if( pc>usableSize-4 ){ - /* Free block is off the page */ - return SQLITE_CORRUPT_BKPT; - } - next = get2byte(&data[pc]); - size = get2byte(&data[pc+2]); - if( next>0 && next<=pc+size+3 ){ - /* Free blocks must be in accending order */ - return SQLITE_CORRUPT_BKPT; - } - nFree += size; - pc = next; - } - pPage->nFree = nFree; - if( nFree>=usableSize ){ - /* Free space cannot exceed total page size */ - return SQLITE_CORRUPT_BKPT; - } - - pPage->isInit = 1; - return SQLITE_OK; -} - -/* -** Set up a raw page so that it looks like a database page holding -** no entries. -*/ -static void zeroPage(MemPage *pPage, int flags){ - unsigned char *data = pPage->aData; - BtShared *pBt = pPage->pBt; - int hdr = pPage->hdrOffset; - int first; - - assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno ); - assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); - assert( sqlite3PagerGetData(pPage->pDbPage) == data ); - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - assert( sqlite3_mutex_held(pBt->mutex) ); - memset(&data[hdr], 0, pBt->usableSize - hdr); - data[hdr] = flags; - first = hdr + 8 + 4*((flags&PTF_LEAF)==0); - memset(&data[hdr+1], 0, 4); - data[hdr+7] = 0; - put2byte(&data[hdr+5], pBt->usableSize); - pPage->nFree = pBt->usableSize - first; - decodeFlags(pPage, flags); - pPage->hdrOffset = hdr; - pPage->cellOffset = first; - pPage->nOverflow = 0; - pPage->idxShift = 0; - pPage->nCell = 0; - pPage->isInit = 1; -} - -/* -** Get a page from the pager. Initialize the MemPage.pBt and -** MemPage.aData elements if needed. -** -** If the noContent flag is set, it means that we do not care about -** the content of the page at this time. So do not go to the disk -** to fetch the content. Just fill in the content with zeros for now. -** If in the future we call sqlite3PagerWrite() on this page, that -** means we have started to be concerned about content and the disk -** read should occur at that point. -*/ -int sqlite3BtreeGetPage( - BtShared *pBt, /* The btree */ - Pgno pgno, /* Number of the page to fetch */ - MemPage **ppPage, /* Return the page in this parameter */ - int noContent /* Do not load page content if true */ -){ - int rc; - MemPage *pPage; - DbPage *pDbPage; - - assert( sqlite3_mutex_held(pBt->mutex) ); - rc = sqlite3PagerAcquire(pBt->pPager, pgno, (DbPage**)&pDbPage, noContent); - if( rc ) return rc; - pPage = (MemPage *)sqlite3PagerGetExtra(pDbPage); - pPage->aData = sqlite3PagerGetData(pDbPage); - pPage->pDbPage = pDbPage; - pPage->pBt = pBt; - pPage->pgno = pgno; - pPage->hdrOffset = pPage->pgno==1 ? 100 : 0; - *ppPage = pPage; - return SQLITE_OK; -} - -/* -** Get a page from the pager and initialize it. This routine -** is just a convenience wrapper around separate calls to -** sqlite3BtreeGetPage() and sqlite3BtreeInitPage(). -*/ -static int getAndInitPage( - BtShared *pBt, /* The database file */ - Pgno pgno, /* Number of the page to get */ - MemPage **ppPage, /* Write the page pointer here */ - MemPage *pParent /* Parent of the page */ -){ - int rc; - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pgno==0 ){ - return SQLITE_CORRUPT_BKPT; - } - rc = sqlite3BtreeGetPage(pBt, pgno, ppPage, 0); - if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){ - rc = sqlite3BtreeInitPage(*ppPage, pParent); - } - return rc; -} - -/* -** Release a MemPage. This should be called once for each prior -** call to sqlite3BtreeGetPage. -*/ -static void releasePage(MemPage *pPage){ - if( pPage ){ - assert( pPage->aData ); - assert( pPage->pBt ); - assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); - assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - sqlite3PagerUnref(pPage->pDbPage); - } -} - -/* -** This routine is called when the reference count for a page -** reaches zero. We need to unref the pParent pointer when that -** happens. -*/ -static void pageDestructor(DbPage *pData, int pageSize){ - MemPage *pPage; - assert( (pageSize & 7)==0 ); - pPage = (MemPage *)sqlite3PagerGetExtra(pData); - assert( pPage->isInit==0 || sqlite3_mutex_held(pPage->pBt->mutex) ); - if( pPage->pParent ){ - MemPage *pParent = pPage->pParent; - assert( pParent->pBt==pPage->pBt ); - pPage->pParent = 0; - releasePage(pParent); - } - pPage->isInit = 0; -} - -/* -** During a rollback, when the pager reloads information into the cache -** so that the cache is restored to its original state at the start of -** the transaction, for each page restored this routine is called. -** -** This routine needs to reset the extra data section at the end of the -** page to agree with the restored data. -*/ -static void pageReinit(DbPage *pData, int pageSize){ - MemPage *pPage; - assert( (pageSize & 7)==0 ); - pPage = (MemPage *)sqlite3PagerGetExtra(pData); - if( pPage->isInit ){ - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - pPage->isInit = 0; - sqlite3BtreeInitPage(pPage, pPage->pParent); - } -} - -/* -** Open a database file. -** -** zFilename is the name of the database file. If zFilename is NULL -** a new database with a random name is created. This randomly named -** database file will be deleted when sqlite3BtreeClose() is called. -** If zFilename is ":memory:" then an in-memory database is created -** that is automatically destroyed when it is closed. -*/ -int sqlite3BtreeOpen( - const char *zFilename, /* Name of the file containing the BTree database */ - sqlite3 *pSqlite, /* Associated database handle */ - Btree **ppBtree, /* Pointer to new Btree object written here */ - int flags, /* Options */ - int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */ -){ - sqlite3_vfs *pVfs; /* The VFS to use for this btree */ - BtShared *pBt = 0; /* Shared part of btree structure */ - Btree *p; /* Handle to return */ - int rc = SQLITE_OK; - int nReserve; - unsigned char zDbHeader[100]; - - /* Set the variable isMemdb to true for an in-memory database, or - ** false for a file-based database. This symbol is only required if - ** either of the shared-data or autovacuum features are compiled - ** into the library. - */ -#if !defined(SQLITE_OMIT_SHARED_CACHE) || !defined(SQLITE_OMIT_AUTOVACUUM) - #ifdef SQLITE_OMIT_MEMORYDB - const int isMemdb = 0; - #else - const int isMemdb = zFilename && !strcmp(zFilename, ":memory:"); - #endif -#endif - - assert( pSqlite!=0 ); - assert( sqlite3_mutex_held(pSqlite->mutex) ); - - pVfs = pSqlite->pVfs; - p = sqlite3MallocZero(sizeof(Btree)); - if( !p ){ - return SQLITE_NOMEM; - } - p->inTrans = TRANS_NONE; - p->pSqlite = pSqlite; - -#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) - /* - ** If this Btree is a candidate for shared cache, try to find an - ** existing BtShared object that we can share with - */ - if( (flags & BTREE_PRIVATE)==0 - && isMemdb==0 - && (pSqlite->flags & SQLITE_Vtab)==0 - && zFilename && zFilename[0] - ){ - if( sqlite3SharedCacheEnabled ){ - int nFullPathname = pVfs->mxPathname+1; - char *zFullPathname = (char *)sqlite3_malloc(nFullPathname); - sqlite3_mutex *mutexShared; - p->sharable = 1; - if( pSqlite ){ - pSqlite->flags |= SQLITE_SharedCache; - } - if( !zFullPathname ){ - sqlite3_free(p); - return SQLITE_NOMEM; - } - sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); - mutexShared = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - sqlite3_mutex_enter(mutexShared); - for(pBt=sqlite3SharedCacheList; pBt; pBt=pBt->pNext){ - assert( pBt->nRef>0 ); - if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager)) - && sqlite3PagerVfs(pBt->pPager)==pVfs ){ - p->pBt = pBt; - pBt->nRef++; - break; - } - } - sqlite3_mutex_leave(mutexShared); - sqlite3_free(zFullPathname); - } -#ifdef SQLITE_DEBUG - else{ - /* In debug mode, we mark all persistent databases as sharable - ** even when they are not. This exercises the locking code and - ** gives more opportunity for asserts(sqlite3_mutex_held()) - ** statements to find locking problems. - */ - p->sharable = 1; - } -#endif - } -#endif - if( pBt==0 ){ - /* - ** The following asserts make sure that structures used by the btree are - ** the right size. This is to guard against size changes that result - ** when compiling on a different architecture. - */ - assert( sizeof(i64)==8 || sizeof(i64)==4 ); - assert( sizeof(u64)==8 || sizeof(u64)==4 ); - assert( sizeof(u32)==4 ); - assert( sizeof(u16)==2 ); - assert( sizeof(Pgno)==4 ); - - pBt = sqlite3MallocZero( sizeof(*pBt) ); - if( pBt==0 ){ - rc = SQLITE_NOMEM; - goto btree_open_out; - } - rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, - EXTRA_SIZE, flags, vfsFlags); - if( rc==SQLITE_OK ){ - rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); - } - if( rc!=SQLITE_OK ){ - goto btree_open_out; - } - p->pBt = pBt; - - sqlite3PagerSetDestructor(pBt->pPager, pageDestructor); - sqlite3PagerSetReiniter(pBt->pPager, pageReinit); - pBt->pCursor = 0; - pBt->pPage1 = 0; - pBt->readOnly = sqlite3PagerIsreadonly(pBt->pPager); - pBt->pageSize = get2byte(&zDbHeader[16]); - if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE - || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ - pBt->pageSize = 0; - sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); - pBt->maxEmbedFrac = 64; /* 25% */ - pBt->minEmbedFrac = 32; /* 12.5% */ - pBt->minLeafFrac = 32; /* 12.5% */ -#ifndef SQLITE_OMIT_AUTOVACUUM - /* If the magic name ":memory:" will create an in-memory database, then - ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if - ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if - ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a - ** regular file-name. In this case the auto-vacuum applies as per normal. - */ - if( zFilename && !isMemdb ){ - pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0); - pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0); - } -#endif - nReserve = 0; - }else{ - nReserve = zDbHeader[20]; - pBt->maxEmbedFrac = zDbHeader[21]; - pBt->minEmbedFrac = zDbHeader[22]; - pBt->minLeafFrac = zDbHeader[23]; - pBt->pageSizeFixed = 1; -#ifndef SQLITE_OMIT_AUTOVACUUM - pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0); - pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0); -#endif - } - pBt->usableSize = pBt->pageSize - nReserve; - assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ - sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); - -#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) - /* Add the new BtShared object to the linked list sharable BtShareds. - */ - if( p->sharable ){ - sqlite3_mutex *mutexShared; - pBt->nRef = 1; - mutexShared = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - if( SQLITE_THREADSAFE ){ - pBt->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pBt->mutex==0 ){ - rc = SQLITE_NOMEM; - pSqlite->mallocFailed = 0; - goto btree_open_out; - } - } - sqlite3_mutex_enter(mutexShared); - pBt->pNext = sqlite3SharedCacheList; - sqlite3SharedCacheList = pBt; - sqlite3_mutex_leave(mutexShared); - } -#endif - } - -#if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) - /* If the new Btree uses a sharable pBtShared, then link the new - ** Btree into the list of all sharable Btrees for the same connection. - ** The list is kept in ascending order by pBt address. - */ - if( p->sharable ){ - int i; - Btree *pSib; - for(i=0; inDb; i++){ - if( (pSib = pSqlite->aDb[i].pBt)!=0 && pSib->sharable ){ - while( pSib->pPrev ){ pSib = pSib->pPrev; } - if( p->pBtpBt ){ - p->pNext = pSib; - p->pPrev = 0; - pSib->pPrev = p; - }else{ - while( pSib->pNext && pSib->pNext->pBtpBt ){ - pSib = pSib->pNext; - } - p->pNext = pSib->pNext; - p->pPrev = pSib; - if( p->pNext ){ - p->pNext->pPrev = p; - } - pSib->pNext = p; - } - break; - } - } - } -#endif - *ppBtree = p; - -btree_open_out: - if( rc!=SQLITE_OK ){ - if( pBt && pBt->pPager ){ - sqlite3PagerClose(pBt->pPager); - } - sqlite3_free(pBt); - sqlite3_free(p); - *ppBtree = 0; - } - return rc; -} - -/* -** Decrement the BtShared.nRef counter. When it reaches zero, -** remove the BtShared structure from the sharing list. Return -** true if the BtShared.nRef counter reaches zero and return -** false if it is still positive. -*/ -static int removeFromSharingList(BtShared *pBt){ -#ifndef SQLITE_OMIT_SHARED_CACHE - sqlite3_mutex *pMaster; - BtShared *pList; - int removed = 0; - - assert( sqlite3_mutex_notheld(pBt->mutex) ); - pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - sqlite3_mutex_enter(pMaster); - pBt->nRef--; - if( pBt->nRef<=0 ){ - if( sqlite3SharedCacheList==pBt ){ - sqlite3SharedCacheList = pBt->pNext; - }else{ - pList = sqlite3SharedCacheList; - while( pList && pList->pNext!=pBt ){ - pList=pList->pNext; - } - if( pList ){ - pList->pNext = pBt->pNext; - } - } - if( SQLITE_THREADSAFE ){ - sqlite3_mutex_free(pBt->mutex); - } - removed = 1; - } - sqlite3_mutex_leave(pMaster); - return removed; -#else - return 1; -#endif -} - -/* -** Close an open database and invalidate all cursors. -*/ -int sqlite3BtreeClose(Btree *p){ - BtShared *pBt = p->pBt; - BtCursor *pCur; - - /* Close all cursors opened via this handle. */ - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - sqlite3BtreeEnter(p); - pCur = pBt->pCursor; - while( pCur ){ - BtCursor *pTmp = pCur; - pCur = pCur->pNext; - if( pTmp->pBtree==p ){ - sqlite3BtreeCloseCursor(pTmp); - } - } - - /* Rollback any active transaction and free the handle structure. - ** The call to sqlite3BtreeRollback() drops any table-locks held by - ** this handle. - */ - sqlite3BtreeRollback(p); - sqlite3BtreeLeave(p); - - /* If there are still other outstanding references to the shared-btree - ** structure, return now. The remainder of this procedure cleans - ** up the shared-btree. - */ - assert( p->wantToLock==0 && p->locked==0 ); - if( !p->sharable || removeFromSharingList(pBt) ){ - /* The pBt is no longer on the sharing list, so we can access - ** it without having to hold the mutex. - ** - ** Clean out and delete the BtShared object. - */ - assert( !pBt->pCursor ); - sqlite3PagerClose(pBt->pPager); - if( pBt->xFreeSchema && pBt->pSchema ){ - pBt->xFreeSchema(pBt->pSchema); - } - sqlite3_free(pBt->pSchema); - sqlite3_free(pBt); - } - -#ifndef SQLITE_OMIT_SHARED_CACHE - assert( p->wantToLock==0 ); - assert( p->locked==0 ); - if( p->pPrev ) p->pPrev->pNext = p->pNext; - if( p->pNext ) p->pNext->pPrev = p->pPrev; -#endif - - sqlite3_free(p); - return SQLITE_OK; -} - -/* -** Change the busy handler callback function. -*/ -int sqlite3BtreeSetBusyHandler(Btree *p, BusyHandler *pHandler){ - BtShared *pBt = p->pBt; - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - sqlite3BtreeEnter(p); - pBt->pBusyHandler = pHandler; - sqlite3PagerSetBusyhandler(pBt->pPager, pHandler); - sqlite3BtreeLeave(p); - return SQLITE_OK; -} - -/* -** Change the limit on the number of pages allowed in the cache. -** -** The maximum number of cache pages is set to the absolute -** value of mxPage. If mxPage is negative, the pager will -** operate asynchronously - it will not stop to do fsync()s -** to insure data is written to the disk surface before -** continuing. Transactions still work if synchronous is off, -** and the database cannot be corrupted if this program -** crashes. But if the operating system crashes or there is -** an abrupt power failure when synchronous is off, the database -** could be left in an inconsistent and unrecoverable state. -** Synchronous is on by default so database corruption is not -** normally a worry. -*/ -int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ - BtShared *pBt = p->pBt; - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - sqlite3BtreeEnter(p); - sqlite3PagerSetCachesize(pBt->pPager, mxPage); - sqlite3BtreeLeave(p); - return SQLITE_OK; -} - -/* -** Change the way data is synced to disk in order to increase or decrease -** how well the database resists damage due to OS crashes and power -** failures. Level 1 is the same as asynchronous (no syncs() occur and -** there is a high probability of damage) Level 2 is the default. There -** is a very low but non-zero probability of damage. Level 3 reduces the -** probability of damage to near zero but with a write performance reduction. -*/ -#ifndef SQLITE_OMIT_PAGER_PRAGMAS -int sqlite3BtreeSetSafetyLevel(Btree *p, int level, int fullSync){ - BtShared *pBt = p->pBt; - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - sqlite3BtreeEnter(p); - sqlite3PagerSetSafetyLevel(pBt->pPager, level, fullSync); - sqlite3BtreeLeave(p); - return SQLITE_OK; -} -#endif - -/* -** Return TRUE if the given btree is set to safety level 1. In other -** words, return TRUE if no sync() occurs on the disk files. -*/ -int sqlite3BtreeSyncDisabled(Btree *p){ - BtShared *pBt = p->pBt; - int rc; - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - sqlite3BtreeEnter(p); - assert( pBt && pBt->pPager ); - rc = sqlite3PagerNosync(pBt->pPager); - sqlite3BtreeLeave(p); - return rc; -} - -#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) -/* -** Change the default pages size and the number of reserved bytes per page. -** -** The page size must be a power of 2 between 512 and 65536. If the page -** size supplied does not meet this constraint then the page size is not -** changed. -** -** Page sizes are constrained to be a power of two so that the region -** of the database file used for locking (beginning at PENDING_BYTE, -** the first byte past the 1GB boundary, 0x40000000) needs to occur -** at the beginning of a page. -** -** If parameter nReserve is less than zero, then the number of reserved -** bytes per page is left unchanged. -*/ -int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve){ - int rc = SQLITE_OK; - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - if( pBt->pageSizeFixed ){ - sqlite3BtreeLeave(p); - return SQLITE_READONLY; - } - if( nReserve<0 ){ - nReserve = pBt->pageSize - pBt->usableSize; - } - if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && - ((pageSize-1)&pageSize)==0 ){ - assert( (pageSize & 7)==0 ); - assert( !pBt->pPage1 && !pBt->pCursor ); - pBt->pageSize = pageSize; - rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize); - } - pBt->usableSize = pBt->pageSize - nReserve; - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Return the currently defined page size -*/ -int sqlite3BtreeGetPageSize(Btree *p){ - return p->pBt->pageSize; -} -int sqlite3BtreeGetReserve(Btree *p){ - int n; - sqlite3BtreeEnter(p); - n = p->pBt->pageSize - p->pBt->usableSize; - sqlite3BtreeLeave(p); - return n; -} - -/* -** Set the maximum page count for a database if mxPage is positive. -** No changes are made if mxPage is 0 or negative. -** Regardless of the value of mxPage, return the maximum page count. -*/ -int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){ - int n; - sqlite3BtreeEnter(p); - n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage); - sqlite3BtreeLeave(p); - return n; -} -#endif /* !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) */ - -/* -** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' -** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it -** is disabled. The default value for the auto-vacuum property is -** determined by the SQLITE_DEFAULT_AUTOVACUUM macro. -*/ -int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ -#ifdef SQLITE_OMIT_AUTOVACUUM - return SQLITE_READONLY; -#else - BtShared *pBt = p->pBt; - int rc = SQLITE_OK; - int av = (autoVacuum?1:0); - - sqlite3BtreeEnter(p); - if( pBt->pageSizeFixed && av!=pBt->autoVacuum ){ - rc = SQLITE_READONLY; - }else{ - pBt->autoVacuum = av; - } - sqlite3BtreeLeave(p); - return rc; -#endif -} - -/* -** Return the value of the 'auto-vacuum' property. If auto-vacuum is -** enabled 1 is returned. Otherwise 0. -*/ -int sqlite3BtreeGetAutoVacuum(Btree *p){ -#ifdef SQLITE_OMIT_AUTOVACUUM - return BTREE_AUTOVACUUM_NONE; -#else - int rc; - sqlite3BtreeEnter(p); - rc = ( - (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE: - (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL: - BTREE_AUTOVACUUM_INCR - ); - sqlite3BtreeLeave(p); - return rc; -#endif -} - - -/* -** Get a reference to pPage1 of the database file. This will -** also acquire a readlock on that file. -** -** SQLITE_OK is returned on success. If the file is not a -** well-formed database file, then SQLITE_CORRUPT is returned. -** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM -** is returned if we run out of memory. -*/ -static int lockBtree(BtShared *pBt){ - int rc, pageSize; - MemPage *pPage1; - - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pBt->pPage1 ) return SQLITE_OK; - rc = sqlite3BtreeGetPage(pBt, 1, &pPage1, 0); - if( rc!=SQLITE_OK ) return rc; - - - /* Do some checking to help insure the file we opened really is - ** a valid database file. - */ - rc = SQLITE_NOTADB; - if( sqlite3PagerPagecount(pBt->pPager)>0 ){ - u8 *page1 = pPage1->aData; - if( memcmp(page1, zMagicHeader, 16)!=0 ){ - goto page1_init_failed; - } - if( page1[18]>1 ){ - pBt->readOnly = 1; - } - if( page1[19]>1 ){ - goto page1_init_failed; - } - pageSize = get2byte(&page1[16]); - if( ((pageSize-1)&pageSize)!=0 || pageSize<512 || - (SQLITE_MAX_PAGE_SIZE<32768 && pageSize>SQLITE_MAX_PAGE_SIZE) - ){ - goto page1_init_failed; - } - assert( (pageSize & 7)==0 ); - pBt->pageSize = pageSize; - pBt->usableSize = pageSize - page1[20]; - if( pBt->usableSize<500 ){ - goto page1_init_failed; - } - pBt->maxEmbedFrac = page1[21]; - pBt->minEmbedFrac = page1[22]; - pBt->minLeafFrac = page1[23]; -#ifndef SQLITE_OMIT_AUTOVACUUM - pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0); - pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0); -#endif - } - - /* maxLocal is the maximum amount of payload to store locally for - ** a cell. Make sure it is small enough so that at least minFanout - ** cells can will fit on one page. We assume a 10-byte page header. - ** Besides the payload, the cell must store: - ** 2-byte pointer to the cell - ** 4-byte child pointer - ** 9-byte nKey value - ** 4-byte nData value - ** 4-byte overflow page pointer - ** So a cell consists of a 2-byte poiner, a header which is as much as - ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow - ** page pointer. - */ - pBt->maxLocal = (pBt->usableSize-12)*pBt->maxEmbedFrac/255 - 23; - pBt->minLocal = (pBt->usableSize-12)*pBt->minEmbedFrac/255 - 23; - pBt->maxLeaf = pBt->usableSize - 35; - pBt->minLeaf = (pBt->usableSize-12)*pBt->minLeafFrac/255 - 23; - if( pBt->minLocal>pBt->maxLocal || pBt->maxLocal<0 ){ - goto page1_init_failed; - } - assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); - pBt->pPage1 = pPage1; - return SQLITE_OK; - -page1_init_failed: - releasePage(pPage1); - pBt->pPage1 = 0; - return rc; -} - -/* -** This routine works like lockBtree() except that it also invokes the -** busy callback if there is lock contention. -*/ -static int lockBtreeWithRetry(Btree *pRef){ - int rc = SQLITE_OK; - - assert( sqlite3BtreeHoldsMutex(pRef) ); - if( pRef->inTrans==TRANS_NONE ){ - u8 inTransaction = pRef->pBt->inTransaction; - btreeIntegrity(pRef); - rc = sqlite3BtreeBeginTrans(pRef, 0); - pRef->pBt->inTransaction = inTransaction; - pRef->inTrans = TRANS_NONE; - if( rc==SQLITE_OK ){ - pRef->pBt->nTransaction--; - } - btreeIntegrity(pRef); - } - return rc; -} - - -/* -** If there are no outstanding cursors and we are not in the middle -** of a transaction but there is a read lock on the database, then -** this routine unrefs the first page of the database file which -** has the effect of releasing the read lock. -** -** If there are any outstanding cursors, this routine is a no-op. -** -** If there is a transaction in progress, this routine is a no-op. -*/ -static void unlockBtreeIfUnused(BtShared *pBt){ - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pBt->inTransaction==TRANS_NONE && pBt->pCursor==0 && pBt->pPage1!=0 ){ - if( sqlite3PagerRefcount(pBt->pPager)>=1 ){ - if( pBt->pPage1->aData==0 ){ - MemPage *pPage = pBt->pPage1; - pPage->aData = sqlite3PagerGetData(pPage->pDbPage); - pPage->pBt = pBt; - pPage->pgno = 1; - } - releasePage(pBt->pPage1); - } - pBt->pPage1 = 0; - pBt->inStmt = 0; - } -} - -/* -** Create a new database by initializing the first page of the -** file. -*/ -static int newDatabase(BtShared *pBt){ - MemPage *pP1; - unsigned char *data; - int rc; - - assert( sqlite3_mutex_held(pBt->mutex) ); - if( sqlite3PagerPagecount(pBt->pPager)>0 ) return SQLITE_OK; - pP1 = pBt->pPage1; - assert( pP1!=0 ); - data = pP1->aData; - rc = sqlite3PagerWrite(pP1->pDbPage); - if( rc ) return rc; - memcpy(data, zMagicHeader, sizeof(zMagicHeader)); - assert( sizeof(zMagicHeader)==16 ); - put2byte(&data[16], pBt->pageSize); - data[18] = 1; - data[19] = 1; - data[20] = pBt->pageSize - pBt->usableSize; - data[21] = pBt->maxEmbedFrac; - data[22] = pBt->minEmbedFrac; - data[23] = pBt->minLeafFrac; - memset(&data[24], 0, 100-24); - zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); - pBt->pageSizeFixed = 1; -#ifndef SQLITE_OMIT_AUTOVACUUM - assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 ); - assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 ); - put4byte(&data[36 + 4*4], pBt->autoVacuum); - put4byte(&data[36 + 7*4], pBt->incrVacuum); -#endif - return SQLITE_OK; -} - -/* -** Attempt to start a new transaction. A write-transaction -** is started if the second argument is nonzero, otherwise a read- -** transaction. If the second argument is 2 or more and exclusive -** transaction is started, meaning that no other process is allowed -** to access the database. A preexisting transaction may not be -** upgraded to exclusive by calling this routine a second time - the -** exclusivity flag only works for a new transaction. -** -** A write-transaction must be started before attempting any -** changes to the database. None of the following routines -** will work unless a transaction is started first: -** -** sqlite3BtreeCreateTable() -** sqlite3BtreeCreateIndex() -** sqlite3BtreeClearTable() -** sqlite3BtreeDropTable() -** sqlite3BtreeInsert() -** sqlite3BtreeDelete() -** sqlite3BtreeUpdateMeta() -** -** If an initial attempt to acquire the lock fails because of lock contention -** and the database was previously unlocked, then invoke the busy handler -** if there is one. But if there was previously a read-lock, do not -** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is -** returned when there is already a read-lock in order to avoid a deadlock. -** -** Suppose there are two processes A and B. A has a read lock and B has -** a reserved lock. B tries to promote to exclusive but is blocked because -** of A's read lock. A tries to promote to reserved but is blocked by B. -** One or the other of the two processes must give way or there can be -** no progress. By returning SQLITE_BUSY and not invoking the busy callback -** when A already has a read lock, we encourage A to give up and let B -** proceed. -*/ -int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ - BtShared *pBt = p->pBt; - int rc = SQLITE_OK; - - sqlite3BtreeEnter(p); - btreeIntegrity(p); - - /* If the btree is already in a write-transaction, or it - ** is already in a read-transaction and a read-transaction - ** is requested, this is a no-op. - */ - if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){ - goto trans_begun; - } - - /* Write transactions are not possible on a read-only database */ - if( pBt->readOnly && wrflag ){ - rc = SQLITE_READONLY; - goto trans_begun; - } - - /* If another database handle has already opened a write transaction - ** on this shared-btree structure and a second write transaction is - ** requested, return SQLITE_BUSY. - */ - if( pBt->inTransaction==TRANS_WRITE && wrflag ){ - rc = SQLITE_BUSY; - goto trans_begun; - } - - do { - if( pBt->pPage1==0 ){ - rc = lockBtree(pBt); - } - - if( rc==SQLITE_OK && wrflag ){ - if( pBt->readOnly ){ - rc = SQLITE_READONLY; - }else{ - rc = sqlite3PagerBegin(pBt->pPage1->pDbPage, wrflag>1); - if( rc==SQLITE_OK ){ - rc = newDatabase(pBt); - } - } - } - - if( rc==SQLITE_OK ){ - if( wrflag ) pBt->inStmt = 0; - }else{ - unlockBtreeIfUnused(pBt); - } - }while( rc==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && - sqlite3InvokeBusyHandler(pBt->pBusyHandler) ); - - if( rc==SQLITE_OK ){ - if( p->inTrans==TRANS_NONE ){ - pBt->nTransaction++; - } - p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ); - if( p->inTrans>pBt->inTransaction ){ - pBt->inTransaction = p->inTrans; - } - } - - -trans_begun: - btreeIntegrity(p); - sqlite3BtreeLeave(p); - return rc; -} - -#ifndef SQLITE_OMIT_AUTOVACUUM - -/* -** Set the pointer-map entries for all children of page pPage. Also, if -** pPage contains cells that point to overflow pages, set the pointer -** map entries for the overflow pages as well. -*/ -static int setChildPtrmaps(MemPage *pPage){ - int i; /* Counter variable */ - int nCell; /* Number of cells in page pPage */ - int rc; /* Return code */ - BtShared *pBt = pPage->pBt; - int isInitOrig = pPage->isInit; - Pgno pgno = pPage->pgno; - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - rc = sqlite3BtreeInitPage(pPage, pPage->pParent); - if( rc!=SQLITE_OK ){ - goto set_child_ptrmaps_out; - } - nCell = pPage->nCell; - - for(i=0; ileaf ){ - Pgno childPgno = get4byte(pCell); - rc = ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno); - if( rc!=SQLITE_OK ) goto set_child_ptrmaps_out; - } - } - - if( !pPage->leaf ){ - Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); - rc = ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno); - } - -set_child_ptrmaps_out: - pPage->isInit = isInitOrig; - return rc; -} - -/* -** Somewhere on pPage, which is guarenteed to be a btree page, not an overflow -** page, is a pointer to page iFrom. Modify this pointer so that it points to -** iTo. Parameter eType describes the type of pointer to be modified, as -** follows: -** -** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child -** page of pPage. -** -** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow -** page pointed to by one of the cells on pPage. -** -** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next -** overflow page in the list. -*/ -static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( eType==PTRMAP_OVERFLOW2 ){ - /* The pointer is always the first 4 bytes of the page in this case. */ - if( get4byte(pPage->aData)!=iFrom ){ - return SQLITE_CORRUPT_BKPT; - } - put4byte(pPage->aData, iTo); - }else{ - int isInitOrig = pPage->isInit; - int i; - int nCell; - - sqlite3BtreeInitPage(pPage, 0); - nCell = pPage->nCell; - - for(i=0; iaData[pPage->hdrOffset+8])!=iFrom ){ - return SQLITE_CORRUPT_BKPT; - } - put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); - } - - pPage->isInit = isInitOrig; - } - return SQLITE_OK; -} - - -/* -** Move the open database page pDbPage to location iFreePage in the -** database. The pDbPage reference remains valid. -*/ -static int relocatePage( - BtShared *pBt, /* Btree */ - MemPage *pDbPage, /* Open page to move */ - u8 eType, /* Pointer map 'type' entry for pDbPage */ - Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */ - Pgno iFreePage /* The location to move pDbPage to */ -){ - MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */ - Pgno iDbPage = pDbPage->pgno; - Pager *pPager = pBt->pPager; - int rc; - - assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 || - eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); - assert( sqlite3_mutex_held(pBt->mutex) ); - assert( pDbPage->pBt==pBt ); - - /* Move page iDbPage from it's current location to page number iFreePage */ - TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", - iDbPage, iFreePage, iPtrPage, eType)); - rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage); - if( rc!=SQLITE_OK ){ - return rc; - } - pDbPage->pgno = iFreePage; - - /* If pDbPage was a btree-page, then it may have child pages and/or cells - ** that point to overflow pages. The pointer map entries for all these - ** pages need to be changed. - ** - ** If pDbPage is an overflow page, then the first 4 bytes may store a - ** pointer to a subsequent overflow page. If this is the case, then - ** the pointer map needs to be updated for the subsequent overflow page. - */ - if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){ - rc = setChildPtrmaps(pDbPage); - if( rc!=SQLITE_OK ){ - return rc; - } - }else{ - Pgno nextOvfl = get4byte(pDbPage->aData); - if( nextOvfl!=0 ){ - rc = ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage); - if( rc!=SQLITE_OK ){ - return rc; - } - } - } - - /* Fix the database pointer on page iPtrPage that pointed at iDbPage so - ** that it points at iFreePage. Also fix the pointer map entry for - ** iPtrPage. - */ - if( eType!=PTRMAP_ROOTPAGE ){ - rc = sqlite3BtreeGetPage(pBt, iPtrPage, &pPtrPage, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = sqlite3PagerWrite(pPtrPage->pDbPage); - if( rc!=SQLITE_OK ){ - releasePage(pPtrPage); - return rc; - } - rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType); - releasePage(pPtrPage); - if( rc==SQLITE_OK ){ - rc = ptrmapPut(pBt, iFreePage, eType, iPtrPage); - } - } - return rc; -} - -/* Forward declaration required by incrVacuumStep(). */ -static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); - -/* -** Perform a single step of an incremental-vacuum. If successful, -** return SQLITE_OK. If there is no work to do (and therefore no -** point in calling this function again), return SQLITE_DONE. -** -** More specificly, this function attempts to re-organize the -** database so that the last page of the file currently in use -** is no longer in use. -** -** If the nFin parameter is non-zero, the implementation assumes -** that the caller will keep calling incrVacuumStep() until -** it returns SQLITE_DONE or an error, and that nFin is the -** number of pages the database file will contain after this -** process is complete. -*/ -static int incrVacuumStep(BtShared *pBt, Pgno nFin){ - Pgno iLastPg; /* Last page in the database */ - Pgno nFreeList; /* Number of pages still on the free-list */ - - assert( sqlite3_mutex_held(pBt->mutex) ); - iLastPg = pBt->nTrunc; - if( iLastPg==0 ){ - iLastPg = sqlite3PagerPagecount(pBt->pPager); - } - - if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ - int rc; - u8 eType; - Pgno iPtrPage; - - nFreeList = get4byte(&pBt->pPage1->aData[36]); - if( nFreeList==0 || nFin==iLastPg ){ - return SQLITE_DONE; - } - - rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); - if( rc!=SQLITE_OK ){ - return rc; - } - if( eType==PTRMAP_ROOTPAGE ){ - return SQLITE_CORRUPT_BKPT; - } - - if( eType==PTRMAP_FREEPAGE ){ - if( nFin==0 ){ - /* Remove the page from the files free-list. This is not required - ** if nFin is non-zero. In that case, the free-list will be - ** truncated to zero after this function returns, so it doesn't - ** matter if it still contains some garbage entries. - */ - Pgno iFreePg; - MemPage *pFreePg; - rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, 1); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( iFreePg==iLastPg ); - releasePage(pFreePg); - } - } else { - Pgno iFreePg; /* Index of free page to move pLastPg to */ - MemPage *pLastPg; - - rc = sqlite3BtreeGetPage(pBt, iLastPg, &pLastPg, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - /* If nFin is zero, this loop runs exactly once and page pLastPg - ** is swapped with the first free page pulled off the free list. - ** - ** On the other hand, if nFin is greater than zero, then keep - ** looping until a free-page located within the first nFin pages - ** of the file is found. - */ - do { - MemPage *pFreePg; - rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, 0, 0); - if( rc!=SQLITE_OK ){ - releasePage(pLastPg); - return rc; - } - releasePage(pFreePg); - }while( nFin!=0 && iFreePg>nFin ); - assert( iFreePgpDbPage); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg); - releasePage(pLastPg); - if( rc!=SQLITE_OK ){ - return rc; - } - } - } - - pBt->nTrunc = iLastPg - 1; - while( pBt->nTrunc==PENDING_BYTE_PAGE(pBt)||PTRMAP_ISPAGE(pBt, pBt->nTrunc) ){ - pBt->nTrunc--; - } - return SQLITE_OK; -} - -/* -** A write-transaction must be opened before calling this function. -** It performs a single unit of work towards an incremental vacuum. -** -** If the incremental vacuum is finished after this function has run, -** SQLITE_DONE is returned. If it is not finished, but no error occured, -** SQLITE_OK is returned. Otherwise an SQLite error code. -*/ -int sqlite3BtreeIncrVacuum(Btree *p){ - int rc; - BtShared *pBt = p->pBt; - - sqlite3BtreeEnter(p); - assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); - if( !pBt->autoVacuum ){ - rc = SQLITE_DONE; - }else{ - invalidateAllOverflowCache(pBt); - rc = incrVacuumStep(pBt, 0); - } - sqlite3BtreeLeave(p); - return rc; -} - -/* -** This routine is called prior to sqlite3PagerCommit when a transaction -** is commited for an auto-vacuum database. -** -** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages -** the database file should be truncated to during the commit process. -** i.e. the database has been reorganized so that only the first *pnTrunc -** pages are in use. -*/ -static int autoVacuumCommit(BtShared *pBt, Pgno *pnTrunc){ - int rc = SQLITE_OK; - Pager *pPager = pBt->pPager; -#ifndef NDEBUG - int nRef = sqlite3PagerRefcount(pPager); -#endif - - assert( sqlite3_mutex_held(pBt->mutex) ); - invalidateAllOverflowCache(pBt); - assert(pBt->autoVacuum); - if( !pBt->incrVacuum ){ - Pgno nFin = 0; - - if( pBt->nTrunc==0 ){ - Pgno nFree; - Pgno nPtrmap; - const int pgsz = pBt->pageSize; - Pgno nOrig = sqlite3PagerPagecount(pBt->pPager); - - if( PTRMAP_ISPAGE(pBt, nOrig) ){ - return SQLITE_CORRUPT_BKPT; - } - if( nOrig==PENDING_BYTE_PAGE(pBt) ){ - nOrig--; - } - nFree = get4byte(&pBt->pPage1->aData[36]); - nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+pgsz/5)/(pgsz/5); - nFin = nOrig - nFree - nPtrmap; - if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<=PENDING_BYTE_PAGE(pBt) ){ - nFin--; - } - while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){ - nFin--; - } - } - - while( rc==SQLITE_OK ){ - rc = incrVacuumStep(pBt, nFin); - } - if( rc==SQLITE_DONE ){ - assert(nFin==0 || pBt->nTrunc==0 || nFin<=pBt->nTrunc); - rc = SQLITE_OK; - if( pBt->nTrunc ){ - rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); - put4byte(&pBt->pPage1->aData[32], 0); - put4byte(&pBt->pPage1->aData[36], 0); - pBt->nTrunc = nFin; - } - } - if( rc!=SQLITE_OK ){ - sqlite3PagerRollback(pPager); - } - } - - if( rc==SQLITE_OK ){ - *pnTrunc = pBt->nTrunc; - pBt->nTrunc = 0; - } - assert( nRef==sqlite3PagerRefcount(pPager) ); - return rc; -} - -#endif - -/* -** This routine does the first phase of a two-phase commit. This routine -** causes a rollback journal to be created (if it does not already exist) -** and populated with enough information so that if a power loss occurs -** the database can be restored to its original state by playing back -** the journal. Then the contents of the journal are flushed out to -** the disk. After the journal is safely on oxide, the changes to the -** database are written into the database file and flushed to oxide. -** At the end of this call, the rollback journal still exists on the -** disk and we are still holding all locks, so the transaction has not -** committed. See sqlite3BtreeCommit() for the second phase of the -** commit process. -** -** This call is a no-op if no write-transaction is currently active on pBt. -** -** Otherwise, sync the database file for the btree pBt. zMaster points to -** the name of a master journal file that should be written into the -** individual journal file, or is NULL, indicating no master journal file -** (single database transaction). -** -** When this is called, the master journal should already have been -** created, populated with this journal pointer and synced to disk. -** -** Once this is routine has returned, the only thing required to commit -** the write-transaction for this database file is to delete the journal. -*/ -int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){ - int rc = SQLITE_OK; - if( p->inTrans==TRANS_WRITE ){ - BtShared *pBt = p->pBt; - Pgno nTrunc = 0; - sqlite3BtreeEnter(p); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - rc = autoVacuumCommit(pBt, &nTrunc); - if( rc!=SQLITE_OK ){ - sqlite3BtreeLeave(p); - return rc; - } - } -#endif - rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, nTrunc); - sqlite3BtreeLeave(p); - } - return rc; -} - -/* -** Commit the transaction currently in progress. -** -** This routine implements the second phase of a 2-phase commit. The -** sqlite3BtreeSync() routine does the first phase and should be invoked -** prior to calling this routine. The sqlite3BtreeSync() routine did -** all the work of writing information out to disk and flushing the -** contents so that they are written onto the disk platter. All this -** routine has to do is delete or truncate the rollback journal -** (which causes the transaction to commit) and drop locks. -** -** This will release the write lock on the database file. If there -** are no active cursors, it also releases the read lock. -*/ -int sqlite3BtreeCommitPhaseTwo(Btree *p){ - BtShared *pBt = p->pBt; - - sqlite3BtreeEnter(p); - btreeIntegrity(p); - - /* If the handle has a write-transaction open, commit the shared-btrees - ** transaction and set the shared state to TRANS_READ. - */ - if( p->inTrans==TRANS_WRITE ){ - int rc; - assert( pBt->inTransaction==TRANS_WRITE ); - assert( pBt->nTransaction>0 ); - rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); - if( rc!=SQLITE_OK ){ - sqlite3BtreeLeave(p); - return rc; - } - pBt->inTransaction = TRANS_READ; - pBt->inStmt = 0; - } - unlockAllTables(p); - - /* If the handle has any kind of transaction open, decrement the transaction - ** count of the shared btree. If the transaction count reaches 0, set - ** the shared state to TRANS_NONE. The unlockBtreeIfUnused() call below - ** will unlock the pager. - */ - if( p->inTrans!=TRANS_NONE ){ - pBt->nTransaction--; - if( 0==pBt->nTransaction ){ - pBt->inTransaction = TRANS_NONE; - } - } - - /* Set the handles current transaction state to TRANS_NONE and unlock - ** the pager if this call closed the only read or write transaction. - */ - p->inTrans = TRANS_NONE; - unlockBtreeIfUnused(pBt); - - btreeIntegrity(p); - sqlite3BtreeLeave(p); - return SQLITE_OK; -} - -/* -** Do both phases of a commit. -*/ -int sqlite3BtreeCommit(Btree *p){ - int rc; - sqlite3BtreeEnter(p); - rc = sqlite3BtreeCommitPhaseOne(p, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeCommitPhaseTwo(p); - } - sqlite3BtreeLeave(p); - return rc; -} - -#ifndef NDEBUG -/* -** Return the number of write-cursors open on this handle. This is for use -** in assert() expressions, so it is only compiled if NDEBUG is not -** defined. -** -** For the purposes of this routine, a write-cursor is any cursor that -** is capable of writing to the databse. That means the cursor was -** originally opened for writing and the cursor has not be disabled -** by having its state changed to CURSOR_FAULT. -*/ -static int countWriteCursors(BtShared *pBt){ - BtCursor *pCur; - int r = 0; - for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){ - if( pCur->wrFlag && pCur->eState!=CURSOR_FAULT ) r++; - } - return r; -} -#endif - -/* -** This routine sets the state to CURSOR_FAULT and the error -** code to errCode for every cursor on BtShared that pBtree -** references. -** -** Every cursor is tripped, including cursors that belong -** to other database connections that happen to be sharing -** the cache with pBtree. -** -** This routine gets called when a rollback occurs. -** All cursors using the same cache must be tripped -** to prevent them from trying to use the btree after -** the rollback. The rollback may have deleted tables -** or moved root pages, so it is not sufficient to -** save the state of the cursor. The cursor must be -** invalidated. -*/ -void sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode){ - BtCursor *p; - sqlite3BtreeEnter(pBtree); - for(p=pBtree->pBt->pCursor; p; p=p->pNext){ - clearCursorPosition(p); - p->eState = CURSOR_FAULT; - p->skip = errCode; - } - sqlite3BtreeLeave(pBtree); -} - -/* -** Rollback the transaction in progress. All cursors will be -** invalided by this operation. Any attempt to use a cursor -** that was open at the beginning of this operation will result -** in an error. -** -** This will release the write lock on the database file. If there -** are no active cursors, it also releases the read lock. -*/ -int sqlite3BtreeRollback(Btree *p){ - int rc; - BtShared *pBt = p->pBt; - MemPage *pPage1; - - sqlite3BtreeEnter(p); - rc = saveAllCursors(pBt, 0, 0); -#ifndef SQLITE_OMIT_SHARED_CACHE - if( rc!=SQLITE_OK ){ - /* This is a horrible situation. An IO or malloc() error occured whilst - ** trying to save cursor positions. If this is an automatic rollback (as - ** the result of a constraint, malloc() failure or IO error) then - ** the cache may be internally inconsistent (not contain valid trees) so - ** we cannot simply return the error to the caller. Instead, abort - ** all queries that may be using any of the cursors that failed to save. - */ - sqlite3BtreeTripAllCursors(p, rc); - } -#endif - btreeIntegrity(p); - unlockAllTables(p); - - if( p->inTrans==TRANS_WRITE ){ - int rc2; - -#ifndef SQLITE_OMIT_AUTOVACUUM - pBt->nTrunc = 0; -#endif - - assert( TRANS_WRITE==pBt->inTransaction ); - rc2 = sqlite3PagerRollback(pBt->pPager); - if( rc2!=SQLITE_OK ){ - rc = rc2; - } - - /* The rollback may have destroyed the pPage1->aData value. So - ** call sqlite3BtreeGetPage() on page 1 again to make - ** sure pPage1->aData is set correctly. */ - if( sqlite3BtreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){ - releasePage(pPage1); - } - assert( countWriteCursors(pBt)==0 ); - pBt->inTransaction = TRANS_READ; - } - - if( p->inTrans!=TRANS_NONE ){ - assert( pBt->nTransaction>0 ); - pBt->nTransaction--; - if( 0==pBt->nTransaction ){ - pBt->inTransaction = TRANS_NONE; - } - } - - p->inTrans = TRANS_NONE; - pBt->inStmt = 0; - unlockBtreeIfUnused(pBt); - - btreeIntegrity(p); - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Start a statement subtransaction. The subtransaction can -** can be rolled back independently of the main transaction. -** You must start a transaction before starting a subtransaction. -** The subtransaction is ended automatically if the main transaction -** commits or rolls back. -** -** Only one subtransaction may be active at a time. It is an error to try -** to start a new subtransaction if another subtransaction is already active. -** -** Statement subtransactions are used around individual SQL statements -** that are contained within a BEGIN...COMMIT block. If a constraint -** error occurs within the statement, the effect of that one statement -** can be rolled back without having to rollback the entire transaction. -*/ -int sqlite3BtreeBeginStmt(Btree *p){ - int rc; - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - if( (p->inTrans!=TRANS_WRITE) || pBt->inStmt ){ - rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - }else{ - assert( pBt->inTransaction==TRANS_WRITE ); - rc = pBt->readOnly ? SQLITE_OK : sqlite3PagerStmtBegin(pBt->pPager); - pBt->inStmt = 1; - } - sqlite3BtreeLeave(p); - return rc; -} - - -/* -** Commit the statment subtransaction currently in progress. If no -** subtransaction is active, this is a no-op. -*/ -int sqlite3BtreeCommitStmt(Btree *p){ - int rc; - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - if( pBt->inStmt && !pBt->readOnly ){ - rc = sqlite3PagerStmtCommit(pBt->pPager); - }else{ - rc = SQLITE_OK; - } - pBt->inStmt = 0; - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Rollback the active statement subtransaction. If no subtransaction -** is active this routine is a no-op. -** -** All cursors will be invalidated by this operation. Any attempt -** to use a cursor that was open at the beginning of this operation -** will result in an error. -*/ -int sqlite3BtreeRollbackStmt(Btree *p){ - int rc = SQLITE_OK; - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - if( pBt->inStmt && !pBt->readOnly ){ - rc = sqlite3PagerStmtRollback(pBt->pPager); - assert( countWriteCursors(pBt)==0 ); - pBt->inStmt = 0; - } - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Default key comparison function to be used if no comparison function -** is specified on the sqlite3BtreeCursor() call. -*/ -static int dfltCompare( - void *NotUsed, /* User data is not used */ - int n1, const void *p1, /* First key to compare */ - int n2, const void *p2 /* Second key to compare */ -){ - int c; - c = memcmp(p1, p2, n1pBt; - - assert( sqlite3BtreeHoldsMutex(p) ); - *ppCur = 0; - if( wrFlag ){ - if( pBt->readOnly ){ - return SQLITE_READONLY; - } - if( checkReadLocks(p, iTable, 0) ){ - return SQLITE_LOCKED; - } - } - - if( pBt->pPage1==0 ){ - rc = lockBtreeWithRetry(p); - if( rc!=SQLITE_OK ){ - return rc; - } - if( pBt->readOnly && wrFlag ){ - return SQLITE_READONLY; - } - } - pCur = sqlite3MallocZero( sizeof(*pCur) ); - if( pCur==0 ){ - rc = SQLITE_NOMEM; - goto create_cursor_exception; - } - pCur->pgnoRoot = (Pgno)iTable; - if( iTable==1 && sqlite3PagerPagecount(pBt->pPager)==0 ){ - rc = SQLITE_EMPTY; - goto create_cursor_exception; - } - rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->pPage, 0); - if( rc!=SQLITE_OK ){ - goto create_cursor_exception; - } - - /* Now that no other errors can occur, finish filling in the BtCursor - ** variables, link the cursor into the BtShared list and set *ppCur (the - ** output argument to this function). - */ - pCur->xCompare = xCmp ? xCmp : dfltCompare; - pCur->pArg = pArg; - pCur->pBtree = p; - pCur->pBt = pBt; - pCur->wrFlag = wrFlag; - pCur->pNext = pBt->pCursor; - if( pCur->pNext ){ - pCur->pNext->pPrev = pCur; - } - pBt->pCursor = pCur; - pCur->eState = CURSOR_INVALID; - *ppCur = pCur; - - return SQLITE_OK; - -create_cursor_exception: - if( pCur ){ - releasePage(pCur->pPage); - sqlite3_free(pCur); - } - unlockBtreeIfUnused(pBt); - return rc; -} -int sqlite3BtreeCursor( - Btree *p, /* The btree */ - int iTable, /* Root page of table to open */ - int wrFlag, /* 1 to write. 0 read-only */ - int (*xCmp)(void*,int,const void*,int,const void*), /* Key Comparison func */ - void *pArg, /* First arg to xCompare() */ - BtCursor **ppCur /* Write new cursor here */ -){ - int rc; - sqlite3BtreeEnter(p); - rc = btreeCursor(p, iTable, wrFlag, xCmp, pArg, ppCur); - sqlite3BtreeLeave(p); - return rc; -} - - -/* -** Close a cursor. The read lock on the database file is released -** when the last cursor is closed. -*/ -int sqlite3BtreeCloseCursor(BtCursor *pCur){ - BtShared *pBt = pCur->pBt; - Btree *pBtree = pCur->pBtree; - - sqlite3BtreeEnter(pBtree); - clearCursorPosition(pCur); - if( pCur->pPrev ){ - pCur->pPrev->pNext = pCur->pNext; - }else{ - pBt->pCursor = pCur->pNext; - } - if( pCur->pNext ){ - pCur->pNext->pPrev = pCur->pPrev; - } - releasePage(pCur->pPage); - unlockBtreeIfUnused(pBt); - invalidateOverflowCache(pCur); - sqlite3_free(pCur); - sqlite3BtreeLeave(pBtree); - return SQLITE_OK; -} - -/* -** Make a temporary cursor by filling in the fields of pTempCur. -** The temporary cursor is not on the cursor list for the Btree. -*/ -void sqlite3BtreeGetTempCursor(BtCursor *pCur, BtCursor *pTempCur){ - assert( cursorHoldsMutex(pCur) ); - memcpy(pTempCur, pCur, sizeof(*pCur)); - pTempCur->pNext = 0; - pTempCur->pPrev = 0; - if( pTempCur->pPage ){ - sqlite3PagerRef(pTempCur->pPage->pDbPage); - } -} - -/* -** Delete a temporary cursor such as was made by the CreateTemporaryCursor() -** function above. -*/ -void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){ - assert( cursorHoldsMutex(pCur) ); - if( pCur->pPage ){ - sqlite3PagerUnref(pCur->pPage->pDbPage); - } -} - -/* -** Make sure the BtCursor* given in the argument has a valid -** BtCursor.info structure. If it is not already valid, call -** sqlite3BtreeParseCell() to fill it in. -** -** BtCursor.info is a cache of the information in the current cell. -** Using this cache reduces the number of calls to sqlite3BtreeParseCell(). -** -** 2007-06-25: There is a bug in some versions of MSVC that cause the -** compiler to crash when getCellInfo() is implemented as a macro. -** But there is a measureable speed advantage to using the macro on gcc -** (when less compiler optimizations like -Os or -O0 are used and the -** compiler is not doing agressive inlining.) So we use a real function -** for MSVC and a macro for everything else. Ticket #2457. -*/ -#ifndef NDEBUG - static void assertCellInfo(BtCursor *pCur){ - CellInfo info; - memset(&info, 0, sizeof(info)); - sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &info); - assert( memcmp(&info, &pCur->info, sizeof(info))==0 ); - } -#else - #define assertCellInfo(x) -#endif -#ifdef _MSC_VER - /* Use a real function in MSVC to work around bugs in that compiler. */ - static void getCellInfo(BtCursor *pCur){ - if( pCur->info.nSize==0 ){ - sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info); - }else{ - assertCellInfo(pCur); - } - } -#else /* if not _MSC_VER */ - /* Use a macro in all other compilers so that the function is inlined */ -#define getCellInfo(pCur) \ - if( pCur->info.nSize==0 ){ \ - sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info); \ - }else{ \ - assertCellInfo(pCur); \ - } -#endif /* _MSC_VER */ - -/* -** Set *pSize to the size of the buffer needed to hold the value of -** the key for the current entry. If the cursor is not pointing -** to a valid entry, *pSize is set to 0. -** -** For a table with the INTKEY flag set, this routine returns the key -** itself, not the number of bytes in the key. -*/ -int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - rc = restoreOrClearCursorPosition(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID ); - if( pCur->eState==CURSOR_INVALID ){ - *pSize = 0; - }else{ - getCellInfo(pCur); - *pSize = pCur->info.nKey; - } - } - return rc; -} - -/* -** Set *pSize to the number of bytes of data in the entry the -** cursor currently points to. Always return SQLITE_OK. -** Failure is not possible. If the cursor is not currently -** pointing to an entry (which can happen, for example, if -** the database is empty) then *pSize is set to 0. -*/ -int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - rc = restoreOrClearCursorPosition(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID ); - if( pCur->eState==CURSOR_INVALID ){ - /* Not pointing at a valid entry - set *pSize to 0. */ - *pSize = 0; - }else{ - getCellInfo(pCur); - *pSize = pCur->info.nData; - } - } - return rc; -} - -/* -** Given the page number of an overflow page in the database (parameter -** ovfl), this function finds the page number of the next page in the -** linked list of overflow pages. If possible, it uses the auto-vacuum -** pointer-map data instead of reading the content of page ovfl to do so. -** -** If an error occurs an SQLite error code is returned. Otherwise: -** -** Unless pPgnoNext is NULL, the page number of the next overflow -** page in the linked list is written to *pPgnoNext. If page ovfl -** is the last page in it's linked list, *pPgnoNext is set to zero. -** -** If ppPage is not NULL, *ppPage is set to the MemPage* handle -** for page ovfl. The underlying pager page may have been requested -** with the noContent flag set, so the page data accessable via -** this handle may not be trusted. -*/ -static int getOverflowPage( - BtShared *pBt, - Pgno ovfl, /* Overflow page */ - MemPage **ppPage, /* OUT: MemPage handle */ - Pgno *pPgnoNext /* OUT: Next overflow page number */ -){ - Pgno next = 0; - int rc; - - assert( sqlite3_mutex_held(pBt->mutex) ); - /* One of these must not be NULL. Otherwise, why call this function? */ - assert(ppPage || pPgnoNext); - - /* If pPgnoNext is NULL, then this function is being called to obtain - ** a MemPage* reference only. No page-data is required in this case. - */ - if( !pPgnoNext ){ - return sqlite3BtreeGetPage(pBt, ovfl, ppPage, 1); - } - -#ifndef SQLITE_OMIT_AUTOVACUUM - /* Try to find the next page in the overflow list using the - ** autovacuum pointer-map pages. Guess that the next page in - ** the overflow list is page number (ovfl+1). If that guess turns - ** out to be wrong, fall back to loading the data of page - ** number ovfl to determine the next page number. - */ - if( pBt->autoVacuum ){ - Pgno pgno; - Pgno iGuess = ovfl+1; - u8 eType; - - while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){ - iGuess++; - } - - if( iGuess<=sqlite3PagerPagecount(pBt->pPager) ){ - rc = ptrmapGet(pBt, iGuess, &eType, &pgno); - if( rc!=SQLITE_OK ){ - return rc; - } - if( eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){ - next = iGuess; - } - } - } -#endif - - if( next==0 || ppPage ){ - MemPage *pPage = 0; - - rc = sqlite3BtreeGetPage(pBt, ovfl, &pPage, next!=0); - assert(rc==SQLITE_OK || pPage==0); - if( next==0 && rc==SQLITE_OK ){ - next = get4byte(pPage->aData); - } - - if( ppPage ){ - *ppPage = pPage; - }else{ - releasePage(pPage); - } - } - *pPgnoNext = next; - - return rc; -} - -/* -** Copy data from a buffer to a page, or from a page to a buffer. -** -** pPayload is a pointer to data stored on database page pDbPage. -** If argument eOp is false, then nByte bytes of data are copied -** from pPayload to the buffer pointed at by pBuf. If eOp is true, -** then sqlite3PagerWrite() is called on pDbPage and nByte bytes -** of data are copied from the buffer pBuf to pPayload. -** -** SQLITE_OK is returned on success, otherwise an error code. -*/ -static int copyPayload( - void *pPayload, /* Pointer to page data */ - void *pBuf, /* Pointer to buffer */ - int nByte, /* Number of bytes to copy */ - int eOp, /* 0 -> copy from page, 1 -> copy to page */ - DbPage *pDbPage /* Page containing pPayload */ -){ - if( eOp ){ - /* Copy data from buffer to page (a write operation) */ - int rc = sqlite3PagerWrite(pDbPage); - if( rc!=SQLITE_OK ){ - return rc; - } - memcpy(pPayload, pBuf, nByte); - }else{ - /* Copy data from page to buffer (a read operation) */ - memcpy(pBuf, pPayload, nByte); - } - return SQLITE_OK; -} - -/* -** This function is used to read or overwrite payload information -** for the entry that the pCur cursor is pointing to. If the eOp -** parameter is 0, this is a read operation (data copied into -** buffer pBuf). If it is non-zero, a write (data copied from -** buffer pBuf). -** -** A total of "amt" bytes are read or written beginning at "offset". -** Data is read to or from the buffer pBuf. -** -** This routine does not make a distinction between key and data. -** It just reads or writes bytes from the payload area. Data might -** appear on the main page or be scattered out on multiple overflow -** pages. -** -** If the BtCursor.isIncrblobHandle flag is set, and the current -** cursor entry uses one or more overflow pages, this function -** allocates space for and lazily popluates the overflow page-list -** cache array (BtCursor.aOverflow). Subsequent calls use this -** cache to make seeking to the supplied offset more efficient. -** -** Once an overflow page-list cache has been allocated, it may be -** invalidated if some other cursor writes to the same table, or if -** the cursor is moved to a different row. Additionally, in auto-vacuum -** mode, the following events may invalidate an overflow page-list cache. -** -** * An incremental vacuum, -** * A commit in auto_vacuum="full" mode, -** * Creating a table (may require moving an overflow page). -*/ -static int accessPayload( - BtCursor *pCur, /* Cursor pointing to entry to read from */ - int offset, /* Begin reading this far into payload */ - int amt, /* Read this many bytes */ - unsigned char *pBuf, /* Write the bytes into this buffer */ - int skipKey, /* offset begins at data if this is true */ - int eOp /* zero to read. non-zero to write. */ -){ - unsigned char *aPayload; - int rc = SQLITE_OK; - u32 nKey; - int iIdx = 0; - MemPage *pPage = pCur->pPage; /* Btree page of current cursor entry */ - BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */ - - assert( pPage ); - assert( pCur->eState==CURSOR_VALID ); - assert( pCur->idx>=0 && pCur->idxnCell ); - assert( offset>=0 ); - assert( cursorHoldsMutex(pCur) ); - - getCellInfo(pCur); - aPayload = pCur->info.pCell + pCur->info.nHeader; - nKey = (pPage->intKey ? 0 : pCur->info.nKey); - - if( skipKey ){ - offset += nKey; - } - if( offset+amt > nKey+pCur->info.nData ){ - /* Trying to read or write past the end of the data is an error */ - return SQLITE_ERROR; - } - - /* Check if data must be read/written to/from the btree page itself. */ - if( offsetinfo.nLocal ){ - int a = amt; - if( a+offset>pCur->info.nLocal ){ - a = pCur->info.nLocal - offset; - } - rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage); - offset = 0; - pBuf += a; - amt -= a; - }else{ - offset -= pCur->info.nLocal; - } - - if( rc==SQLITE_OK && amt>0 ){ - const int ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */ - Pgno nextPage; - - nextPage = get4byte(&aPayload[pCur->info.nLocal]); - -#ifndef SQLITE_OMIT_INCRBLOB - /* If the isIncrblobHandle flag is set and the BtCursor.aOverflow[] - ** has not been allocated, allocate it now. The array is sized at - ** one entry for each overflow page in the overflow chain. The - ** page number of the first overflow page is stored in aOverflow[0], - ** etc. A value of 0 in the aOverflow[] array means "not yet known" - ** (the cache is lazily populated). - */ - if( pCur->isIncrblobHandle && !pCur->aOverflow ){ - int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize; - pCur->aOverflow = (Pgno *)sqlite3MallocZero(sizeof(Pgno)*nOvfl); - if( nOvfl && !pCur->aOverflow ){ - rc = SQLITE_NOMEM; - } - } - - /* If the overflow page-list cache has been allocated and the - ** entry for the first required overflow page is valid, skip - ** directly to it. - */ - if( pCur->aOverflow && pCur->aOverflow[offset/ovflSize] ){ - iIdx = (offset/ovflSize); - nextPage = pCur->aOverflow[iIdx]; - offset = (offset%ovflSize); - } -#endif - - for( ; rc==SQLITE_OK && amt>0 && nextPage; iIdx++){ - -#ifndef SQLITE_OMIT_INCRBLOB - /* If required, populate the overflow page-list cache. */ - if( pCur->aOverflow ){ - assert(!pCur->aOverflow[iIdx] || pCur->aOverflow[iIdx]==nextPage); - pCur->aOverflow[iIdx] = nextPage; - } -#endif - - if( offset>=ovflSize ){ - /* The only reason to read this page is to obtain the page - ** number for the next page in the overflow chain. The page - ** data is not required. So first try to lookup the overflow - ** page-list cache, if any, then fall back to the getOverflowPage() - ** function. - */ -#ifndef SQLITE_OMIT_INCRBLOB - if( pCur->aOverflow && pCur->aOverflow[iIdx+1] ){ - nextPage = pCur->aOverflow[iIdx+1]; - } else -#endif - rc = getOverflowPage(pBt, nextPage, 0, &nextPage); - offset -= ovflSize; - }else{ - /* Need to read this page properly. It contains some of the - ** range of data that is being read (eOp==0) or written (eOp!=0). - */ - DbPage *pDbPage; - int a = amt; - rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage); - if( rc==SQLITE_OK ){ - aPayload = sqlite3PagerGetData(pDbPage); - nextPage = get4byte(aPayload); - if( a + offset > ovflSize ){ - a = ovflSize - offset; - } - rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); - sqlite3PagerUnref(pDbPage); - offset = 0; - amt -= a; - pBuf += a; - } - } - } - } - - if( rc==SQLITE_OK && amt>0 ){ - return SQLITE_CORRUPT_BKPT; - } - return rc; -} - -/* -** Read part of the key associated with cursor pCur. Exactly -** "amt" bytes will be transfered into pBuf[]. The transfer -** begins at "offset". -** -** Return SQLITE_OK on success or an error code if anything goes -** wrong. An error is returned if "offset+amt" is larger than -** the available payload. -*/ -int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - rc = restoreOrClearCursorPosition(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->eState==CURSOR_VALID ); - assert( pCur->pPage!=0 ); - if( pCur->pPage->intKey ){ - return SQLITE_CORRUPT_BKPT; - } - assert( pCur->pPage->intKey==0 ); - assert( pCur->idx>=0 && pCur->idxpPage->nCell ); - rc = accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0, 0); - } - return rc; -} - -/* -** Read part of the data associated with cursor pCur. Exactly -** "amt" bytes will be transfered into pBuf[]. The transfer -** begins at "offset". -** -** Return SQLITE_OK on success or an error code if anything goes -** wrong. An error is returned if "offset+amt" is larger than -** the available payload. -*/ -int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - rc = restoreOrClearCursorPosition(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->eState==CURSOR_VALID ); - assert( pCur->pPage!=0 ); - assert( pCur->idx>=0 && pCur->idxpPage->nCell ); - rc = accessPayload(pCur, offset, amt, pBuf, 1, 0); - } - return rc; -} - -/* -** Return a pointer to payload information from the entry that the -** pCur cursor is pointing to. The pointer is to the beginning of -** the key if skipKey==0 and it points to the beginning of data if -** skipKey==1. The number of bytes of available key/data is written -** into *pAmt. If *pAmt==0, then the value returned will not be -** a valid pointer. -** -** This routine is an optimization. It is common for the entire key -** and data to fit on the local page and for there to be no overflow -** pages. When that is so, this routine can be used to access the -** key and data without making a copy. If the key and/or data spills -** onto overflow pages, then accessPayload() must be used to reassembly -** the key/data and copy it into a preallocated buffer. -** -** The pointer returned by this routine looks directly into the cached -** page of the database. The data might change or move the next time -** any btree routine is called. -*/ -static const unsigned char *fetchPayload( - BtCursor *pCur, /* Cursor pointing to entry to read from */ - int *pAmt, /* Write the number of available bytes here */ - int skipKey /* read beginning at data if this is true */ -){ - unsigned char *aPayload; - MemPage *pPage; - u32 nKey; - int nLocal; - - assert( pCur!=0 && pCur->pPage!=0 ); - assert( pCur->eState==CURSOR_VALID ); - assert( cursorHoldsMutex(pCur) ); - pPage = pCur->pPage; - assert( pCur->idx>=0 && pCur->idxnCell ); - getCellInfo(pCur); - aPayload = pCur->info.pCell; - aPayload += pCur->info.nHeader; - if( pPage->intKey ){ - nKey = 0; - }else{ - nKey = pCur->info.nKey; - } - if( skipKey ){ - aPayload += nKey; - nLocal = pCur->info.nLocal - nKey; - }else{ - nLocal = pCur->info.nLocal; - if( nLocal>nKey ){ - nLocal = nKey; - } - } - *pAmt = nLocal; - return aPayload; -} - - -/* -** For the entry that cursor pCur is point to, return as -** many bytes of the key or data as are available on the local -** b-tree page. Write the number of available bytes into *pAmt. -** -** The pointer returned is ephemeral. The key/data may move -** or be destroyed on the next call to any Btree routine, -** including calls from other threads against the same cache. -** Hence, a mutex on the BtShared should be held prior to calling -** this routine. -** -** These routines is used to get quick access to key and data -** in the common case where no overflow pages are used. -*/ -const void *sqlite3BtreeKeyFetch(BtCursor *pCur, int *pAmt){ - assert( cursorHoldsMutex(pCur) ); - if( pCur->eState==CURSOR_VALID ){ - return (const void*)fetchPayload(pCur, pAmt, 0); - } - return 0; -} -const void *sqlite3BtreeDataFetch(BtCursor *pCur, int *pAmt){ - assert( cursorHoldsMutex(pCur) ); - if( pCur->eState==CURSOR_VALID ){ - return (const void*)fetchPayload(pCur, pAmt, 1); - } - return 0; -} - - -/* -** Move the cursor down to a new child page. The newPgno argument is the -** page number of the child page to move to. -*/ -static int moveToChild(BtCursor *pCur, u32 newPgno){ - int rc; - MemPage *pNewPage; - MemPage *pOldPage; - BtShared *pBt = pCur->pBt; - - assert( cursorHoldsMutex(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - rc = getAndInitPage(pBt, newPgno, &pNewPage, pCur->pPage); - if( rc ) return rc; - pNewPage->idxParent = pCur->idx; - pOldPage = pCur->pPage; - pOldPage->idxShift = 0; - releasePage(pOldPage); - pCur->pPage = pNewPage; - pCur->idx = 0; - pCur->info.nSize = 0; - if( pNewPage->nCell<1 ){ - return SQLITE_CORRUPT_BKPT; - } - return SQLITE_OK; -} - -/* -** Return true if the page is the virtual root of its table. -** -** The virtual root page is the root page for most tables. But -** for the table rooted on page 1, sometime the real root page -** is empty except for the right-pointer. In such cases the -** virtual root page is the page that the right-pointer of page -** 1 is pointing to. -*/ -int sqlite3BtreeIsRootPage(MemPage *pPage){ - MemPage *pParent; - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - pParent = pPage->pParent; - if( pParent==0 ) return 1; - if( pParent->pgno>1 ) return 0; - if( get2byte(&pParent->aData[pParent->hdrOffset+3])==0 ) return 1; - return 0; -} - -/* -** Move the cursor up to the parent page. -** -** pCur->idx is set to the cell index that contains the pointer -** to the page we are coming from. If we are coming from the -** right-most child page then pCur->idx is set to one more than -** the largest cell index. -*/ -void sqlite3BtreeMoveToParent(BtCursor *pCur){ - MemPage *pParent; - MemPage *pPage; - int idxParent; - - assert( cursorHoldsMutex(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - pPage = pCur->pPage; - assert( pPage!=0 ); - assert( !sqlite3BtreeIsRootPage(pPage) ); - pParent = pPage->pParent; - assert( pParent!=0 ); - idxParent = pPage->idxParent; - sqlite3PagerRef(pParent->pDbPage); - releasePage(pPage); - pCur->pPage = pParent; - pCur->info.nSize = 0; - assert( pParent->idxShift==0 ); - pCur->idx = idxParent; -} - -/* -** Move the cursor to the root page -*/ -static int moveToRoot(BtCursor *pCur){ - MemPage *pRoot; - int rc = SQLITE_OK; - Btree *p = pCur->pBtree; - BtShared *pBt = p->pBt; - - assert( cursorHoldsMutex(pCur) ); - assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); - assert( CURSOR_VALID < CURSOR_REQUIRESEEK ); - assert( CURSOR_FAULT > CURSOR_REQUIRESEEK ); - if( pCur->eState>=CURSOR_REQUIRESEEK ){ - if( pCur->eState==CURSOR_FAULT ){ - return pCur->skip; - } - clearCursorPosition(pCur); - } - pRoot = pCur->pPage; - if( pRoot && pRoot->pgno==pCur->pgnoRoot ){ - assert( pRoot->isInit ); - }else{ - if( - SQLITE_OK!=(rc = getAndInitPage(pBt, pCur->pgnoRoot, &pRoot, 0)) - ){ - pCur->eState = CURSOR_INVALID; - return rc; - } - releasePage(pCur->pPage); - pCur->pPage = pRoot; - } - pCur->idx = 0; - pCur->info.nSize = 0; - if( pRoot->nCell==0 && !pRoot->leaf ){ - Pgno subpage; - assert( pRoot->pgno==1 ); - subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); - assert( subpage>0 ); - pCur->eState = CURSOR_VALID; - rc = moveToChild(pCur, subpage); - } - pCur->eState = ((pCur->pPage->nCell>0)?CURSOR_VALID:CURSOR_INVALID); - return rc; -} - -/* -** Move the cursor down to the left-most leaf entry beneath the -** entry to which it is currently pointing. -** -** The left-most leaf is the one with the smallest key - the first -** in ascending order. -*/ -static int moveToLeftmost(BtCursor *pCur){ - Pgno pgno; - int rc = SQLITE_OK; - MemPage *pPage; - - assert( cursorHoldsMutex(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ - assert( pCur->idx>=0 && pCur->idxnCell ); - pgno = get4byte(findCell(pPage, pCur->idx)); - rc = moveToChild(pCur, pgno); - } - return rc; -} - -/* -** Move the cursor down to the right-most leaf entry beneath the -** page to which it is currently pointing. Notice the difference -** between moveToLeftmost() and moveToRightmost(). moveToLeftmost() -** finds the left-most entry beneath the *entry* whereas moveToRightmost() -** finds the right-most entry beneath the *page*. -** -** The right-most entry is the one with the largest key - the last -** key in ascending order. -*/ -static int moveToRightmost(BtCursor *pCur){ - Pgno pgno; - int rc = SQLITE_OK; - MemPage *pPage; - - assert( cursorHoldsMutex(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ - pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); - pCur->idx = pPage->nCell; - rc = moveToChild(pCur, pgno); - } - if( rc==SQLITE_OK ){ - pCur->idx = pPage->nCell - 1; - pCur->info.nSize = 0; - } - return SQLITE_OK; -} - -/* Move the cursor to the first entry in the table. Return SQLITE_OK -** on success. Set *pRes to 0 if the cursor actually points to something -** or set *pRes to 1 if the table is empty. -*/ -int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); - rc = moveToRoot(pCur); - if( rc==SQLITE_OK ){ - if( pCur->eState==CURSOR_INVALID ){ - assert( pCur->pPage->nCell==0 ); - *pRes = 1; - rc = SQLITE_OK; - }else{ - assert( pCur->pPage->nCell>0 ); - *pRes = 0; - rc = moveToLeftmost(pCur); - } - } - return rc; -} - -/* Move the cursor to the last entry in the table. Return SQLITE_OK -** on success. Set *pRes to 0 if the cursor actually points to something -** or set *pRes to 1 if the table is empty. -*/ -int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); - rc = moveToRoot(pCur); - if( rc==SQLITE_OK ){ - if( CURSOR_INVALID==pCur->eState ){ - assert( pCur->pPage->nCell==0 ); - *pRes = 1; - }else{ - assert( pCur->eState==CURSOR_VALID ); - *pRes = 0; - rc = moveToRightmost(pCur); - } - } - return rc; -} - -/* Move the cursor so that it points to an entry near pKey/nKey. -** Return a success code. -** -** For INTKEY tables, only the nKey parameter is used. pKey is -** ignored. For other tables, nKey is the number of bytes of data -** in pKey. The comparison function specified when the cursor was -** created is used to compare keys. -** -** If an exact match is not found, then the cursor is always -** left pointing at a leaf page which would hold the entry if it -** were present. The cursor might point to an entry that comes -** before or after the key. -** -** The result of comparing the key with the entry to which the -** cursor is written to *pRes if pRes!=NULL. The meaning of -** this value is as follows: -** -** *pRes<0 The cursor is left pointing at an entry that -** is smaller than pKey or if the table is empty -** and the cursor is therefore left point to nothing. -** -** *pRes==0 The cursor is left pointing at an entry that -** exactly matches pKey. -** -** *pRes>0 The cursor is left pointing at an entry that -** is larger than pKey. -** -*/ -int sqlite3BtreeMoveto( - BtCursor *pCur, /* The cursor to be moved */ - const void *pKey, /* The key content for indices. Not used by tables */ - i64 nKey, /* Size of pKey. Or the key for tables */ - int biasRight, /* If true, bias the search to the high end */ - int *pRes /* Search result flag */ -){ - int rc; - - assert( cursorHoldsMutex(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); - rc = moveToRoot(pCur); - if( rc ){ - return rc; - } - assert( pCur->pPage ); - assert( pCur->pPage->isInit ); - if( pCur->eState==CURSOR_INVALID ){ - *pRes = -1; - assert( pCur->pPage->nCell==0 ); - return SQLITE_OK; - } - for(;;){ - int lwr, upr; - Pgno chldPg; - MemPage *pPage = pCur->pPage; - int c = -1; /* pRes return if table is empty must be -1 */ - lwr = 0; - upr = pPage->nCell-1; - if( !pPage->intKey && pKey==0 ){ - return SQLITE_CORRUPT_BKPT; - } - if( biasRight ){ - pCur->idx = upr; - }else{ - pCur->idx = (upr+lwr)/2; - } - if( lwr<=upr ) for(;;){ - void *pCellKey; - i64 nCellKey; - pCur->info.nSize = 0; - if( pPage->intKey ){ - u8 *pCell; - pCell = findCell(pPage, pCur->idx) + pPage->childPtrSize; - if( pPage->hasData ){ - u32 dummy; - pCell += getVarint32(pCell, &dummy); - } - getVarint(pCell, (u64 *)&nCellKey); - if( nCellKeynKey ){ - c = +1; - }else{ - c = 0; - } - }else{ - int available; - pCellKey = (void *)fetchPayload(pCur, &available, 0); - nCellKey = pCur->info.nKey; - if( available>=nCellKey ){ - c = pCur->xCompare(pCur->pArg, nCellKey, pCellKey, nKey, pKey); - }else{ - pCellKey = sqlite3_malloc( nCellKey ); - if( pCellKey==0 ) return SQLITE_NOMEM; - rc = sqlite3BtreeKey(pCur, 0, nCellKey, (void *)pCellKey); - c = pCur->xCompare(pCur->pArg, nCellKey, pCellKey, nKey, pKey); - sqlite3_free(pCellKey); - if( rc ){ - return rc; - } - } - } - if( c==0 ){ - if( pPage->leafData && !pPage->leaf ){ - lwr = pCur->idx; - upr = lwr - 1; - break; - }else{ - if( pRes ) *pRes = 0; - return SQLITE_OK; - } - } - if( c<0 ){ - lwr = pCur->idx+1; - }else{ - upr = pCur->idx-1; - } - if( lwr>upr ){ - break; - } - pCur->idx = (lwr+upr)/2; - } - assert( lwr==upr+1 ); - assert( pPage->isInit ); - if( pPage->leaf ){ - chldPg = 0; - }else if( lwr>=pPage->nCell ){ - chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); - }else{ - chldPg = get4byte(findCell(pPage, lwr)); - } - if( chldPg==0 ){ - assert( pCur->idx>=0 && pCur->idxpPage->nCell ); - if( pRes ) *pRes = c; - return SQLITE_OK; - } - pCur->idx = lwr; - pCur->info.nSize = 0; - rc = moveToChild(pCur, chldPg); - if( rc ){ - return rc; - } - } - /* NOT REACHED */ -} - - -/* -** Return TRUE if the cursor is not pointing at an entry of the table. -** -** TRUE will be returned after a call to sqlite3BtreeNext() moves -** past the last entry in the table or sqlite3BtreePrev() moves past -** the first entry. TRUE is also returned if the table is empty. -*/ -int sqlite3BtreeEof(BtCursor *pCur){ - /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries - ** have been deleted? This API will need to change to return an error code - ** as well as the boolean result value. - */ - return (CURSOR_VALID!=pCur->eState); -} - -/* -** Return the database connection handle for a cursor. -*/ -sqlite3 *sqlite3BtreeCursorDb(const BtCursor *pCur){ - assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); - return pCur->pBtree->pSqlite; -} - -/* -** Advance the cursor to the next entry in the database. If -** successful then set *pRes=0. If the cursor -** was already pointing to the last entry in the database before -** this routine was called, then set *pRes=1. -*/ -static int btreeNext(BtCursor *pCur, int *pRes){ - int rc; - MemPage *pPage; - - assert( cursorHoldsMutex(pCur) ); - rc = restoreOrClearCursorPosition(pCur); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( pRes!=0 ); - pPage = pCur->pPage; - if( CURSOR_INVALID==pCur->eState ){ - *pRes = 1; - return SQLITE_OK; - } - if( pCur->skip>0 ){ - pCur->skip = 0; - *pRes = 0; - return SQLITE_OK; - } - pCur->skip = 0; - - assert( pPage->isInit ); - assert( pCur->idxnCell ); - - pCur->idx++; - pCur->info.nSize = 0; - if( pCur->idx>=pPage->nCell ){ - if( !pPage->leaf ){ - rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); - if( rc ) return rc; - rc = moveToLeftmost(pCur); - *pRes = 0; - return rc; - } - do{ - if( sqlite3BtreeIsRootPage(pPage) ){ - *pRes = 1; - pCur->eState = CURSOR_INVALID; - return SQLITE_OK; - } - sqlite3BtreeMoveToParent(pCur); - pPage = pCur->pPage; - }while( pCur->idx>=pPage->nCell ); - *pRes = 0; - if( pPage->leafData ){ - rc = sqlite3BtreeNext(pCur, pRes); - }else{ - rc = SQLITE_OK; - } - return rc; - } - *pRes = 0; - if( pPage->leaf ){ - return SQLITE_OK; - } - rc = moveToLeftmost(pCur); - return rc; -} -int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ - int rc; - assert( cursorHoldsMutex(pCur) ); - rc = btreeNext(pCur, pRes); - return rc; -} - - -/* -** Step the cursor to the back to the previous entry in the database. If -** successful then set *pRes=0. If the cursor -** was already pointing to the first entry in the database before -** this routine was called, then set *pRes=1. -*/ -static int btreePrevious(BtCursor *pCur, int *pRes){ - int rc; - Pgno pgno; - MemPage *pPage; - - assert( cursorHoldsMutex(pCur) ); - rc = restoreOrClearCursorPosition(pCur); - if( rc!=SQLITE_OK ){ - return rc; - } - if( CURSOR_INVALID==pCur->eState ){ - *pRes = 1; - return SQLITE_OK; - } - if( pCur->skip<0 ){ - pCur->skip = 0; - *pRes = 0; - return SQLITE_OK; - } - pCur->skip = 0; - - pPage = pCur->pPage; - assert( pPage->isInit ); - assert( pCur->idx>=0 ); - if( !pPage->leaf ){ - pgno = get4byte( findCell(pPage, pCur->idx) ); - rc = moveToChild(pCur, pgno); - if( rc ){ - return rc; - } - rc = moveToRightmost(pCur); - }else{ - while( pCur->idx==0 ){ - if( sqlite3BtreeIsRootPage(pPage) ){ - pCur->eState = CURSOR_INVALID; - *pRes = 1; - return SQLITE_OK; - } - sqlite3BtreeMoveToParent(pCur); - pPage = pCur->pPage; - } - pCur->idx--; - pCur->info.nSize = 0; - if( pPage->leafData && !pPage->leaf ){ - rc = sqlite3BtreePrevious(pCur, pRes); - }else{ - rc = SQLITE_OK; - } - } - *pRes = 0; - return rc; -} -int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ - int rc; - assert( cursorHoldsMutex(pCur) ); - rc = btreePrevious(pCur, pRes); - return rc; -} - -/* -** Allocate a new page from the database file. -** -** The new page is marked as dirty. (In other words, sqlite3PagerWrite() -** has already been called on the new page.) The new page has also -** been referenced and the calling routine is responsible for calling -** sqlite3PagerUnref() on the new page when it is done. -** -** SQLITE_OK is returned on success. Any other return value indicates -** an error. *ppPage and *pPgno are undefined in the event of an error. -** Do not invoke sqlite3PagerUnref() on *ppPage if an error is returned. -** -** If the "nearby" parameter is not 0, then a (feeble) effort is made to -** locate a page close to the page number "nearby". This can be used in an -** attempt to keep related pages close to each other in the database file, -** which in turn can make database access faster. -** -** If the "exact" parameter is not 0, and the page-number nearby exists -** anywhere on the free-list, then it is guarenteed to be returned. This -** is only used by auto-vacuum databases when allocating a new table. -*/ -static int allocateBtreePage( - BtShared *pBt, - MemPage **ppPage, - Pgno *pPgno, - Pgno nearby, - u8 exact -){ - MemPage *pPage1; - int rc; - int n; /* Number of pages on the freelist */ - int k; /* Number of leaves on the trunk of the freelist */ - MemPage *pTrunk = 0; - MemPage *pPrevTrunk = 0; - - assert( sqlite3_mutex_held(pBt->mutex) ); - pPage1 = pBt->pPage1; - n = get4byte(&pPage1->aData[36]); - if( n>0 ){ - /* There are pages on the freelist. Reuse one of those pages. */ - Pgno iTrunk; - u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ - - /* If the 'exact' parameter was true and a query of the pointer-map - ** shows that the page 'nearby' is somewhere on the free-list, then - ** the entire-list will be searched for that page. - */ -#ifndef SQLITE_OMIT_AUTOVACUUM - if( exact && nearby<=sqlite3PagerPagecount(pBt->pPager) ){ - u8 eType; - assert( nearby>0 ); - assert( pBt->autoVacuum ); - rc = ptrmapGet(pBt, nearby, &eType, 0); - if( rc ) return rc; - if( eType==PTRMAP_FREEPAGE ){ - searchList = 1; - } - *pPgno = nearby; - } -#endif - - /* Decrement the free-list count by 1. Set iTrunk to the index of the - ** first free-list trunk page. iPrevTrunk is initially 1. - */ - rc = sqlite3PagerWrite(pPage1->pDbPage); - if( rc ) return rc; - put4byte(&pPage1->aData[36], n-1); - - /* The code within this loop is run only once if the 'searchList' variable - ** is not true. Otherwise, it runs once for each trunk-page on the - ** free-list until the page 'nearby' is located. - */ - do { - pPrevTrunk = pTrunk; - if( pPrevTrunk ){ - iTrunk = get4byte(&pPrevTrunk->aData[0]); - }else{ - iTrunk = get4byte(&pPage1->aData[32]); - } - rc = sqlite3BtreeGetPage(pBt, iTrunk, &pTrunk, 0); - if( rc ){ - pTrunk = 0; - goto end_allocate_page; - } - - k = get4byte(&pTrunk->aData[4]); - if( k==0 && !searchList ){ - /* The trunk has no leaves and the list is not being searched. - ** So extract the trunk page itself and use it as the newly - ** allocated page */ - assert( pPrevTrunk==0 ); - rc = sqlite3PagerWrite(pTrunk->pDbPage); - if( rc ){ - goto end_allocate_page; - } - *pPgno = iTrunk; - memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); - *ppPage = pTrunk; - pTrunk = 0; - TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); - }else if( k>pBt->usableSize/4 - 8 ){ - /* Value of k is out of range. Database corruption */ - rc = SQLITE_CORRUPT_BKPT; - goto end_allocate_page; -#ifndef SQLITE_OMIT_AUTOVACUUM - }else if( searchList && nearby==iTrunk ){ - /* The list is being searched and this trunk page is the page - ** to allocate, regardless of whether it has leaves. - */ - assert( *pPgno==iTrunk ); - *ppPage = pTrunk; - searchList = 0; - rc = sqlite3PagerWrite(pTrunk->pDbPage); - if( rc ){ - goto end_allocate_page; - } - if( k==0 ){ - if( !pPrevTrunk ){ - memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); - }else{ - memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4); - } - }else{ - /* The trunk page is required by the caller but it contains - ** pointers to free-list leaves. The first leaf becomes a trunk - ** page in this case. - */ - MemPage *pNewTrunk; - Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); - rc = sqlite3BtreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0); - if( rc!=SQLITE_OK ){ - goto end_allocate_page; - } - rc = sqlite3PagerWrite(pNewTrunk->pDbPage); - if( rc!=SQLITE_OK ){ - releasePage(pNewTrunk); - goto end_allocate_page; - } - memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4); - put4byte(&pNewTrunk->aData[4], k-1); - memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4); - releasePage(pNewTrunk); - if( !pPrevTrunk ){ - put4byte(&pPage1->aData[32], iNewTrunk); - }else{ - rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); - if( rc ){ - goto end_allocate_page; - } - put4byte(&pPrevTrunk->aData[0], iNewTrunk); - } - } - pTrunk = 0; - TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); -#endif - }else{ - /* Extract a leaf from the trunk */ - int closest; - Pgno iPage; - unsigned char *aData = pTrunk->aData; - rc = sqlite3PagerWrite(pTrunk->pDbPage); - if( rc ){ - goto end_allocate_page; - } - if( nearby>0 ){ - int i, dist; - closest = 0; - dist = get4byte(&aData[8]) - nearby; - if( dist<0 ) dist = -dist; - for(i=1; isqlite3PagerPagecount(pBt->pPager) ){ - /* Free page off the end of the file */ - return SQLITE_CORRUPT_BKPT; - } - TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d" - ": %d more free pages\n", - *pPgno, closest+1, k, pTrunk->pgno, n-1)); - if( closestpDbPage); - rc = sqlite3PagerWrite((*ppPage)->pDbPage); - if( rc!=SQLITE_OK ){ - releasePage(*ppPage); - } - } - searchList = 0; - } - } - releasePage(pPrevTrunk); - pPrevTrunk = 0; - }while( searchList ); - }else{ - /* There are no pages on the freelist, so create a new page at the - ** end of the file */ - *pPgno = sqlite3PagerPagecount(pBt->pPager) + 1; - -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->nTrunc ){ - /* An incr-vacuum has already run within this transaction. So the - ** page to allocate is not from the physical end of the file, but - ** at pBt->nTrunc. - */ - *pPgno = pBt->nTrunc+1; - if( *pPgno==PENDING_BYTE_PAGE(pBt) ){ - (*pPgno)++; - } - } - if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, *pPgno) ){ - /* If *pPgno refers to a pointer-map page, allocate two new pages - ** at the end of the file instead of one. The first allocated page - ** becomes a new pointer-map page, the second is used by the caller. - */ - TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", *pPgno)); - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); - (*pPgno)++; - } - if( pBt->nTrunc ){ - pBt->nTrunc = *pPgno; - } -#endif - - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); - rc = sqlite3BtreeGetPage(pBt, *pPgno, ppPage, 0); - if( rc ) return rc; - rc = sqlite3PagerWrite((*ppPage)->pDbPage); - if( rc!=SQLITE_OK ){ - releasePage(*ppPage); - } - TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); - } - - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); - -end_allocate_page: - releasePage(pTrunk); - releasePage(pPrevTrunk); - return rc; -} - -/* -** Add a page of the database file to the freelist. -** -** sqlite3PagerUnref() is NOT called for pPage. -*/ -static int freePage(MemPage *pPage){ - BtShared *pBt = pPage->pBt; - MemPage *pPage1 = pBt->pPage1; - int rc, n, k; - - /* Prepare the page for freeing */ - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - assert( pPage->pgno>1 ); - pPage->isInit = 0; - releasePage(pPage->pParent); - pPage->pParent = 0; - - /* Increment the free page count on pPage1 */ - rc = sqlite3PagerWrite(pPage1->pDbPage); - if( rc ) return rc; - n = get4byte(&pPage1->aData[36]); - put4byte(&pPage1->aData[36], n+1); - -#ifdef SQLITE_SECURE_DELETE - /* If the SQLITE_SECURE_DELETE compile-time option is enabled, then - ** always fully overwrite deleted information with zeros. - */ - rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc ) return rc; - memset(pPage->aData, 0, pPage->pBt->pageSize); -#endif - -#ifndef SQLITE_OMIT_AUTOVACUUM - /* If the database supports auto-vacuum, write an entry in the pointer-map - ** to indicate that the page is free. - */ - if( pBt->autoVacuum ){ - rc = ptrmapPut(pBt, pPage->pgno, PTRMAP_FREEPAGE, 0); - if( rc ) return rc; - } -#endif - - if( n==0 ){ - /* This is the first free page */ - rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc ) return rc; - memset(pPage->aData, 0, 8); - put4byte(&pPage1->aData[32], pPage->pgno); - TRACE(("FREE-PAGE: %d first\n", pPage->pgno)); - }else{ - /* Other free pages already exist. Retrive the first trunk page - ** of the freelist and find out how many leaves it has. */ - MemPage *pTrunk; - rc = sqlite3BtreeGetPage(pBt, get4byte(&pPage1->aData[32]), &pTrunk, 0); - if( rc ) return rc; - k = get4byte(&pTrunk->aData[4]); - if( k>=pBt->usableSize/4 - 8 ){ - /* The trunk is full. Turn the page being freed into a new - ** trunk page with no leaves. */ - rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc==SQLITE_OK ){ - put4byte(pPage->aData, pTrunk->pgno); - put4byte(&pPage->aData[4], 0); - put4byte(&pPage1->aData[32], pPage->pgno); - TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", - pPage->pgno, pTrunk->pgno)); - } - }else if( k<0 ){ - rc = SQLITE_CORRUPT; - }else{ - /* Add the newly freed page as a leaf on the current trunk */ - rc = sqlite3PagerWrite(pTrunk->pDbPage); - if( rc==SQLITE_OK ){ - put4byte(&pTrunk->aData[4], k+1); - put4byte(&pTrunk->aData[8+k*4], pPage->pgno); -#ifndef SQLITE_SECURE_DELETE - sqlite3PagerDontWrite(pPage->pDbPage); -#endif - } - TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); - } - releasePage(pTrunk); - } - return rc; -} - -/* -** Free any overflow pages associated with the given Cell. -*/ -static int clearCell(MemPage *pPage, unsigned char *pCell){ - BtShared *pBt = pPage->pBt; - CellInfo info; - Pgno ovflPgno; - int rc; - int nOvfl; - int ovflPageSize; - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - if( info.iOverflow==0 ){ - return SQLITE_OK; /* No overflow pages. Return without doing anything */ - } - ovflPgno = get4byte(&pCell[info.iOverflow]); - ovflPageSize = pBt->usableSize - 4; - nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; - assert( ovflPgno==0 || nOvfl>0 ); - while( nOvfl-- ){ - MemPage *pOvfl; - if( ovflPgno==0 || ovflPgno>sqlite3PagerPagecount(pBt->pPager) ){ - return SQLITE_CORRUPT_BKPT; - } - - rc = getOverflowPage(pBt, ovflPgno, &pOvfl, (nOvfl==0)?0:&ovflPgno); - if( rc ) return rc; - rc = freePage(pOvfl); - sqlite3PagerUnref(pOvfl->pDbPage); - if( rc ) return rc; - } - return SQLITE_OK; -} - -/* -** Create the byte sequence used to represent a cell on page pPage -** and write that byte sequence into pCell[]. Overflow pages are -** allocated and filled in as necessary. The calling procedure -** is responsible for making sure sufficient space has been allocated -** for pCell[]. -** -** Note that pCell does not necessary need to point to the pPage->aData -** area. pCell might point to some temporary storage. The cell will -** be constructed in this temporary area then copied into pPage->aData -** later. -*/ -static int fillInCell( - MemPage *pPage, /* The page that contains the cell */ - unsigned char *pCell, /* Complete text of the cell */ - const void *pKey, i64 nKey, /* The key */ - const void *pData,int nData, /* The data */ - int nZero, /* Extra zero bytes to append to pData */ - int *pnSize /* Write cell size here */ -){ - int nPayload; - const u8 *pSrc; - int nSrc, n, rc; - int spaceLeft; - MemPage *pOvfl = 0; - MemPage *pToRelease = 0; - unsigned char *pPrior; - unsigned char *pPayload; - BtShared *pBt = pPage->pBt; - Pgno pgnoOvfl = 0; - int nHeader; - CellInfo info; - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - - /* Fill in the header. */ - nHeader = 0; - if( !pPage->leaf ){ - nHeader += 4; - } - if( pPage->hasData ){ - nHeader += putVarint(&pCell[nHeader], nData+nZero); - }else{ - nData = nZero = 0; - } - nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey); - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - assert( info.nHeader==nHeader ); - assert( info.nKey==nKey ); - assert( info.nData==nData+nZero ); - - /* Fill in the payload */ - nPayload = nData + nZero; - if( pPage->intKey ){ - pSrc = pData; - nSrc = nData; - nData = 0; - }else{ - nPayload += nKey; - pSrc = pKey; - nSrc = nKey; - } - *pnSize = info.nSize; - spaceLeft = info.nLocal; - pPayload = &pCell[nHeader]; - pPrior = &pCell[info.iOverflow]; - - while( nPayload>0 ){ - if( spaceLeft==0 ){ - int isExact = 0; -#ifndef SQLITE_OMIT_AUTOVACUUM - Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ - if( pBt->autoVacuum ){ - do{ - pgnoOvfl++; - } while( - PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) - ); - if( pgnoOvfl>1 ){ - /* isExact = 1; */ - } - } -#endif - rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, isExact); -#ifndef SQLITE_OMIT_AUTOVACUUM - /* If the database supports auto-vacuum, and the second or subsequent - ** overflow page is being allocated, add an entry to the pointer-map - ** for that page now. - ** - ** If this is the first overflow page, then write a partial entry - ** to the pointer-map. If we write nothing to this pointer-map slot, - ** then the optimistic overflow chain processing in clearCell() - ** may misinterpret the uninitialised values and delete the - ** wrong pages from the database. - */ - if( pBt->autoVacuum && rc==SQLITE_OK ){ - u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1); - rc = ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap); - if( rc ){ - releasePage(pOvfl); - } - } -#endif - if( rc ){ - releasePage(pToRelease); - return rc; - } - put4byte(pPrior, pgnoOvfl); - releasePage(pToRelease); - pToRelease = pOvfl; - pPrior = pOvfl->aData; - put4byte(pPrior, 0); - pPayload = &pOvfl->aData[4]; - spaceLeft = pBt->usableSize - 4; - } - n = nPayload; - if( n>spaceLeft ) n = spaceLeft; - if( nSrc>0 ){ - if( n>nSrc ) n = nSrc; - assert( pSrc ); - memcpy(pPayload, pSrc, n); - }else{ - memset(pPayload, 0, n); - } - nPayload -= n; - pPayload += n; - pSrc += n; - nSrc -= n; - spaceLeft -= n; - if( nSrc==0 ){ - nSrc = nData; - pSrc = pData; - } - } - releasePage(pToRelease); - return SQLITE_OK; -} - -/* -** Change the MemPage.pParent pointer on the page whose number is -** given in the second argument so that MemPage.pParent holds the -** pointer in the third argument. -*/ -static int reparentPage(BtShared *pBt, Pgno pgno, MemPage *pNewParent, int idx){ - MemPage *pThis; - DbPage *pDbPage; - - assert( sqlite3_mutex_held(pBt->mutex) ); - assert( pNewParent!=0 ); - if( pgno==0 ) return SQLITE_OK; - assert( pBt->pPager!=0 ); - pDbPage = sqlite3PagerLookup(pBt->pPager, pgno); - if( pDbPage ){ - pThis = (MemPage *)sqlite3PagerGetExtra(pDbPage); - if( pThis->isInit ){ - assert( pThis->aData==sqlite3PagerGetData(pDbPage) ); - if( pThis->pParent!=pNewParent ){ - if( pThis->pParent ) sqlite3PagerUnref(pThis->pParent->pDbPage); - pThis->pParent = pNewParent; - sqlite3PagerRef(pNewParent->pDbPage); - } - pThis->idxParent = idx; - } - sqlite3PagerUnref(pDbPage); - } - -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - return ptrmapPut(pBt, pgno, PTRMAP_BTREE, pNewParent->pgno); - } -#endif - return SQLITE_OK; -} - - - -/* -** Change the pParent pointer of all children of pPage to point back -** to pPage. -** -** In other words, for every child of pPage, invoke reparentPage() -** to make sure that each child knows that pPage is its parent. -** -** This routine gets called after you memcpy() one page into -** another. -*/ -static int reparentChildPages(MemPage *pPage){ - int i; - BtShared *pBt = pPage->pBt; - int rc = SQLITE_OK; - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( pPage->leaf ) return SQLITE_OK; - - for(i=0; inCell; i++){ - u8 *pCell = findCell(pPage, i); - if( !pPage->leaf ){ - rc = reparentPage(pBt, get4byte(pCell), pPage, i); - if( rc!=SQLITE_OK ) return rc; - } - } - if( !pPage->leaf ){ - rc = reparentPage(pBt, get4byte(&pPage->aData[pPage->hdrOffset+8]), - pPage, i); - pPage->idxShift = 0; - } - return rc; -} - -/* -** Remove the i-th cell from pPage. This routine effects pPage only. -** The cell content is not freed or deallocated. It is assumed that -** the cell content has been copied someplace else. This routine just -** removes the reference to the cell from pPage. -** -** "sz" must be the number of bytes in the cell. -*/ -static void dropCell(MemPage *pPage, int idx, int sz){ - int i; /* Loop counter */ - int pc; /* Offset to cell content of cell being deleted */ - u8 *data; /* pPage->aData */ - u8 *ptr; /* Used to move bytes around within data[] */ - - assert( idx>=0 && idxnCell ); - assert( sz==cellSize(pPage, idx) ); - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - data = pPage->aData; - ptr = &data[pPage->cellOffset + 2*idx]; - pc = get2byte(ptr); - assert( pc>10 && pc+sz<=pPage->pBt->usableSize ); - freeSpace(pPage, pc, sz); - for(i=idx+1; inCell; i++, ptr+=2){ - ptr[0] = ptr[2]; - ptr[1] = ptr[3]; - } - pPage->nCell--; - put2byte(&data[pPage->hdrOffset+3], pPage->nCell); - pPage->nFree += 2; - pPage->idxShift = 1; -} - -/* -** Insert a new cell on pPage at cell index "i". pCell points to the -** content of the cell. -** -** If the cell content will fit on the page, then put it there. If it -** will not fit, then make a copy of the cell content into pTemp if -** pTemp is not null. Regardless of pTemp, allocate a new entry -** in pPage->aOvfl[] and make it point to the cell content (either -** in pTemp or the original pCell) and also record its index. -** Allocating a new entry in pPage->aCell[] implies that -** pPage->nOverflow is incremented. -** -** If nSkip is non-zero, then do not copy the first nSkip bytes of the -** cell. The caller will overwrite them after this function returns. If -** nSkip is non-zero, then pCell may not point to an invalid memory location -** (but pCell+nSkip is always valid). -*/ -static int insertCell( - MemPage *pPage, /* Page into which we are copying */ - int i, /* New cell becomes the i-th cell of the page */ - u8 *pCell, /* Content of the new cell */ - int sz, /* Bytes of content in pCell */ - u8 *pTemp, /* Temp storage space for pCell, if needed */ - u8 nSkip /* Do not write the first nSkip bytes of the cell */ -){ - int idx; /* Where to write new cell content in data[] */ - int j; /* Loop counter */ - int top; /* First byte of content for any cell in data[] */ - int end; /* First byte past the last cell pointer in data[] */ - int ins; /* Index in data[] where new cell pointer is inserted */ - int hdr; /* Offset into data[] of the page header */ - int cellOffset; /* Address of first cell pointer in data[] */ - u8 *data; /* The content of the whole page */ - u8 *ptr; /* Used for moving information around in data[] */ - - assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); - assert( sz==cellSizePtr(pPage, pCell) ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( pPage->nOverflow || sz+2>pPage->nFree ){ - if( pTemp ){ - memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip); - pCell = pTemp; - } - j = pPage->nOverflow++; - assert( jaOvfl)/sizeof(pPage->aOvfl[0]) ); - pPage->aOvfl[j].pCell = pCell; - pPage->aOvfl[j].idx = i; - pPage->nFree = 0; - }else{ - int rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - data = pPage->aData; - hdr = pPage->hdrOffset; - top = get2byte(&data[hdr+5]); - cellOffset = pPage->cellOffset; - end = cellOffset + 2*pPage->nCell + 2; - ins = cellOffset + 2*i; - if( end > top - sz ){ - rc = defragmentPage(pPage); - if( rc!=SQLITE_OK ) return rc; - top = get2byte(&data[hdr+5]); - assert( end + sz <= top ); - } - idx = allocateSpace(pPage, sz); - assert( idx>0 ); - assert( end <= get2byte(&data[hdr+5]) ); - pPage->nCell++; - pPage->nFree -= 2; - memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip); - for(j=end-2, ptr=&data[j]; j>ins; j-=2, ptr-=2){ - ptr[0] = ptr[-2]; - ptr[1] = ptr[-1]; - } - put2byte(&data[ins], idx); - put2byte(&data[hdr+3], pPage->nCell); - pPage->idxShift = 1; -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pPage->pBt->autoVacuum ){ - /* The cell may contain a pointer to an overflow page. If so, write - ** the entry for the overflow page into the pointer map. - */ - CellInfo info; - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload ); - if( (info.nData+(pPage->intKey?0:info.nKey))>info.nLocal ){ - Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]); - rc = ptrmapPut(pPage->pBt, pgnoOvfl, PTRMAP_OVERFLOW1, pPage->pgno); - if( rc!=SQLITE_OK ) return rc; - } - } -#endif - } - - return SQLITE_OK; -} - -/* -** Add a list of cells to a page. The page should be initially empty. -** The cells are guaranteed to fit on the page. -*/ -static void assemblePage( - MemPage *pPage, /* The page to be assemblied */ - int nCell, /* The number of cells to add to this page */ - u8 **apCell, /* Pointers to cell bodies */ - int *aSize /* Sizes of the cells */ -){ - int i; /* Loop counter */ - int totalSize; /* Total size of all cells */ - int hdr; /* Index of page header */ - int cellptr; /* Address of next cell pointer */ - int cellbody; /* Address of next cell body */ - u8 *data; /* Data for the page */ - - assert( pPage->nOverflow==0 ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - totalSize = 0; - for(i=0; inFree ); - assert( pPage->nCell==0 ); - cellptr = pPage->cellOffset; - data = pPage->aData; - hdr = pPage->hdrOffset; - put2byte(&data[hdr+3], nCell); - if( nCell ){ - cellbody = allocateSpace(pPage, totalSize); - assert( cellbody>0 ); - assert( pPage->nFree >= 2*nCell ); - pPage->nFree -= 2*nCell; - for(i=0; ipBt->usableSize ); - } - pPage->nCell = nCell; -} - -/* -** The following parameters determine how many adjacent pages get involved -** in a balancing operation. NN is the number of neighbors on either side -** of the page that participate in the balancing operation. NB is the -** total number of pages that participate, including the target page and -** NN neighbors on either side. -** -** The minimum value of NN is 1 (of course). Increasing NN above 1 -** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance -** in exchange for a larger degradation in INSERT and UPDATE performance. -** The value of NN appears to give the best results overall. -*/ -#define NN 1 /* Number of neighbors on either side of pPage */ -#define NB (NN*2+1) /* Total pages involved in the balance */ - -/* Forward reference */ -static int balance(MemPage*, int); - -#ifndef SQLITE_OMIT_QUICKBALANCE -/* -** This version of balance() handles the common special case where -** a new entry is being inserted on the extreme right-end of the -** tree, in other words, when the new entry will become the largest -** entry in the tree. -** -** Instead of trying balance the 3 right-most leaf pages, just add -** a new page to the right-hand side and put the one new entry in -** that page. This leaves the right side of the tree somewhat -** unbalanced. But odds are that we will be inserting new entries -** at the end soon afterwards so the nearly empty page will quickly -** fill up. On average. -** -** pPage is the leaf page which is the right-most page in the tree. -** pParent is its parent. pPage must have a single overflow entry -** which is also the right-most entry on the page. -*/ -static int balance_quick(MemPage *pPage, MemPage *pParent){ - int rc; - MemPage *pNew; - Pgno pgnoNew; - u8 *pCell; - int szCell; - CellInfo info; - BtShared *pBt = pPage->pBt; - int parentIdx = pParent->nCell; /* pParent new divider cell index */ - int parentSize; /* Size of new divider cell */ - u8 parentCell[64]; /* Space for the new divider cell */ - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - - /* Allocate a new page. Insert the overflow cell from pPage - ** into it. Then remove the overflow cell from pPage. - */ - rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - pCell = pPage->aOvfl[0].pCell; - szCell = cellSizePtr(pPage, pCell); - zeroPage(pNew, pPage->aData[0]); - assemblePage(pNew, 1, &pCell, &szCell); - pPage->nOverflow = 0; - - /* Set the parent of the newly allocated page to pParent. */ - pNew->pParent = pParent; - sqlite3PagerRef(pParent->pDbPage); - - /* pPage is currently the right-child of pParent. Change this - ** so that the right-child is the new page allocated above and - ** pPage is the next-to-right child. - */ - assert( pPage->nCell>0 ); - pCell = findCell(pPage, pPage->nCell-1); - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - rc = fillInCell(pParent, parentCell, 0, info.nKey, 0, 0, 0, &parentSize); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( parentSize<64 ); - rc = insertCell(pParent, parentIdx, parentCell, parentSize, 0, 4); - if( rc!=SQLITE_OK ){ - return rc; - } - put4byte(findOverflowCell(pParent,parentIdx), pPage->pgno); - put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); - -#ifndef SQLITE_OMIT_AUTOVACUUM - /* If this is an auto-vacuum database, update the pointer map - ** with entries for the new page, and any pointer from the - ** cell on the page to an overflow page. - */ - if( pBt->autoVacuum ){ - rc = ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno); - if( rc==SQLITE_OK ){ - rc = ptrmapPutOvfl(pNew, 0); - } - if( rc!=SQLITE_OK ){ - releasePage(pNew); - return rc; - } - } -#endif - - /* Release the reference to the new page and balance the parent page, - ** in case the divider cell inserted caused it to become overfull. - */ - releasePage(pNew); - return balance(pParent, 0); -} -#endif /* SQLITE_OMIT_QUICKBALANCE */ - -/* -** This routine redistributes Cells on pPage and up to NN*2 siblings -** of pPage so that all pages have about the same amount of free space. -** Usually NN siblings on either side of pPage is used in the balancing, -** though more siblings might come from one side if pPage is the first -** or last child of its parent. If pPage has fewer than 2*NN siblings -** (something which can only happen if pPage is the root page or a -** child of root) then all available siblings participate in the balancing. -** -** The number of siblings of pPage might be increased or decreased by one or -** two in an effort to keep pages nearly full but not over full. The root page -** is special and is allowed to be nearly empty. If pPage is -** the root page, then the depth of the tree might be increased -** or decreased by one, as necessary, to keep the root page from being -** overfull or completely empty. -** -** Note that when this routine is called, some of the Cells on pPage -** might not actually be stored in pPage->aData[]. This can happen -** if the page is overfull. Part of the job of this routine is to -** make sure all Cells for pPage once again fit in pPage->aData[]. -** -** In the course of balancing the siblings of pPage, the parent of pPage -** might become overfull or underfull. If that happens, then this routine -** is called recursively on the parent. -** -** If this routine fails for any reason, it might leave the database -** in a corrupted state. So if this routine fails, the database should -** be rolled back. -*/ -static int balance_nonroot(MemPage *pPage){ - MemPage *pParent; /* The parent of pPage */ - BtShared *pBt; /* The whole database */ - int nCell = 0; /* Number of cells in apCell[] */ - int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ - int nOld; /* Number of pages in apOld[] */ - int nNew; /* Number of pages in apNew[] */ - int nDiv; /* Number of cells in apDiv[] */ - int i, j, k; /* Loop counters */ - int idx; /* Index of pPage in pParent->aCell[] */ - int nxDiv; /* Next divider slot in pParent->aCell[] */ - int rc; /* The return code */ - int leafCorrection; /* 4 if pPage is a leaf. 0 if not */ - int leafData; /* True if pPage is a leaf of a LEAFDATA tree */ - int usableSpace; /* Bytes in pPage beyond the header */ - int pageFlags; /* Value of pPage->aData[0] */ - int subtotal; /* Subtotal of bytes in cells on one page */ - int iSpace = 0; /* First unused byte of aSpace[] */ - MemPage *apOld[NB]; /* pPage and up to two siblings */ - Pgno pgnoOld[NB]; /* Page numbers for each page in apOld[] */ - MemPage *apCopy[NB]; /* Private copies of apOld[] pages */ - MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */ - Pgno pgnoNew[NB+2]; /* Page numbers for each page in apNew[] */ - u8 *apDiv[NB]; /* Divider cells in pParent */ - int cntNew[NB+2]; /* Index in aCell[] of cell after i-th page */ - int szNew[NB+2]; /* Combined size of cells place on i-th page */ - u8 **apCell = 0; /* All cells begin balanced */ - int *szCell; /* Local size of all cells in apCell[] */ - u8 *aCopy[NB]; /* Space for holding data of apCopy[] */ - u8 *aSpace; /* Space to hold copies of dividers cells */ -#ifndef SQLITE_OMIT_AUTOVACUUM - u8 *aFrom = 0; -#endif - - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - - /* - ** Find the parent page. - */ - assert( pPage->isInit ); - assert( sqlite3PagerIswriteable(pPage->pDbPage) || pPage->nOverflow==1 ); - pBt = pPage->pBt; - pParent = pPage->pParent; - assert( pParent ); - if( SQLITE_OK!=(rc = sqlite3PagerWrite(pParent->pDbPage)) ){ - return rc; - } - TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); - -#ifndef SQLITE_OMIT_QUICKBALANCE - /* - ** A special case: If a new entry has just been inserted into a - ** table (that is, a btree with integer keys and all data at the leaves) - ** and the new entry is the right-most entry in the tree (it has the - ** largest key) then use the special balance_quick() routine for - ** balancing. balance_quick() is much faster and results in a tighter - ** packing of data in the common case. - */ - if( pPage->leaf && - pPage->intKey && - pPage->leafData && - pPage->nOverflow==1 && - pPage->aOvfl[0].idx==pPage->nCell && - pPage->pParent->pgno!=1 && - get4byte(&pParent->aData[pParent->hdrOffset+8])==pPage->pgno - ){ - /* - ** TODO: Check the siblings to the left of pPage. It may be that - ** they are not full and no new page is required. - */ - return balance_quick(pPage, pParent); - } -#endif - - if( SQLITE_OK!=(rc = sqlite3PagerWrite(pPage->pDbPage)) ){ - return rc; - } - - /* - ** Find the cell in the parent page whose left child points back - ** to pPage. The "idx" variable is the index of that cell. If pPage - ** is the rightmost child of pParent then set idx to pParent->nCell - */ - if( pParent->idxShift ){ - Pgno pgno; - pgno = pPage->pgno; - assert( pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); - for(idx=0; idxnCell; idx++){ - if( get4byte(findCell(pParent, idx))==pgno ){ - break; - } - } - assert( idxnCell - || get4byte(&pParent->aData[pParent->hdrOffset+8])==pgno ); - }else{ - idx = pPage->idxParent; - } - - /* - ** Initialize variables so that it will be safe to jump - ** directly to balance_cleanup at any moment. - */ - nOld = nNew = 0; - sqlite3PagerRef(pParent->pDbPage); - - /* - ** Find sibling pages to pPage and the cells in pParent that divide - ** the siblings. An attempt is made to find NN siblings on either - ** side of pPage. More siblings are taken from one side, however, if - ** pPage there are fewer than NN siblings on the other side. If pParent - ** has NB or fewer children then all children of pParent are taken. - */ - nxDiv = idx - NN; - if( nxDiv + NB > pParent->nCell ){ - nxDiv = pParent->nCell - NB + 1; - } - if( nxDiv<0 ){ - nxDiv = 0; - } - nDiv = 0; - for(i=0, k=nxDiv; inCell ){ - apDiv[i] = findCell(pParent, k); - nDiv++; - assert( !pParent->leaf ); - pgnoOld[i] = get4byte(apDiv[i]); - }else if( k==pParent->nCell ){ - pgnoOld[i] = get4byte(&pParent->aData[pParent->hdrOffset+8]); - }else{ - break; - } - rc = getAndInitPage(pBt, pgnoOld[i], &apOld[i], pParent); - if( rc ) goto balance_cleanup; - apOld[i]->idxParent = k; - apCopy[i] = 0; - assert( i==nOld ); - nOld++; - nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; - } - - /* Make nMaxCells a multiple of 2 in order to preserve 8-byte - ** alignment */ - nMaxCells = (nMaxCells + 1)&~1; - - /* - ** Allocate space for memory structures - */ - apCell = sqlite3_malloc( - nMaxCells*sizeof(u8*) /* apCell */ - + nMaxCells*sizeof(int) /* szCell */ - + ROUND8(sizeof(MemPage))*NB /* aCopy */ - + pBt->pageSize*(5+NB) /* aSpace */ - + (ISAUTOVACUUM ? nMaxCells : 0) /* aFrom */ - ); - if( apCell==0 ){ - rc = SQLITE_NOMEM; - goto balance_cleanup; - } - szCell = (int*)&apCell[nMaxCells]; - aCopy[0] = (u8*)&szCell[nMaxCells]; - assert( ((aCopy[0] - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */ - for(i=1; ipageSize+ROUND8(sizeof(MemPage))]; - assert( ((aCopy[i] - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */ - } - aSpace = &aCopy[NB-1][pBt->pageSize+ROUND8(sizeof(MemPage))]; - assert( ((aSpace - (u8*)apCell) & 7)==0 ); /* 8-byte alignment required */ -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - aFrom = &aSpace[5*pBt->pageSize]; - } -#endif - - /* - ** Make copies of the content of pPage and its siblings into aOld[]. - ** The rest of this function will use data from the copies rather - ** that the original pages since the original pages will be in the - ** process of being overwritten. - */ - for(i=0; iaData = (void*)&p[1]; - memcpy(p->aData, apOld[i]->aData, pBt->pageSize); - } - - /* - ** Load pointers to all cells on sibling pages and the divider cells - ** into the local apCell[] array. Make copies of the divider cells - ** into space obtained form aSpace[] and remove the the divider Cells - ** from pParent. - ** - ** If the siblings are on leaf pages, then the child pointers of the - ** divider cells are stripped from the cells before they are copied - ** into aSpace[]. In this way, all cells in apCell[] are without - ** child pointers. If siblings are not leaves, then all cell in - ** apCell[] include child pointers. Either way, all cells in apCell[] - ** are alike. - ** - ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf. - ** leafData: 1 if pPage holds key+data and pParent holds only keys. - */ - nCell = 0; - leafCorrection = pPage->leaf*4; - leafData = pPage->leafData && pPage->leaf; - for(i=0; inCell+pOld->nOverflow; - for(j=0; jautoVacuum ){ - int a; - aFrom[nCell] = i; - for(a=0; anOverflow; a++){ - if( pOld->aOvfl[a].pCell==apCell[nCell] ){ - aFrom[nCell] = 0xFF; - break; - } - } - } -#endif - nCell++; - } - if( ipageSize*5 ); - memcpy(pTemp, apDiv[i], sz); - apCell[nCell] = pTemp+leafCorrection; -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - aFrom[nCell] = 0xFF; - } -#endif - dropCell(pParent, nxDiv, sz); - szCell[nCell] -= leafCorrection; - assert( get4byte(pTemp)==pgnoOld[i] ); - if( !pOld->leaf ){ - assert( leafCorrection==0 ); - /* The right pointer of the child page pOld becomes the left - ** pointer of the divider cell */ - memcpy(apCell[nCell], &pOld->aData[pOld->hdrOffset+8], 4); - }else{ - assert( leafCorrection==4 ); - if( szCell[nCell]<4 ){ - /* Do not allow any cells smaller than 4 bytes. */ - szCell[nCell] = 4; - } - } - nCell++; - } - } - } - - /* - ** Figure out the number of pages needed to hold all nCell cells. - ** Store this number in "k". Also compute szNew[] which is the total - ** size of all cells on the i-th page and cntNew[] which is the index - ** in apCell[] of the cell that divides page i from page i+1. - ** cntNew[k] should equal nCell. - ** - ** Values computed by this block: - ** - ** k: The total number of sibling pages - ** szNew[i]: Spaced used on the i-th sibling page. - ** cntNew[i]: Index in apCell[] and szCell[] for the first cell to - ** the right of the i-th sibling page. - ** usableSpace: Number of bytes of space available on each sibling. - ** - */ - usableSpace = pBt->usableSize - 12 + leafCorrection; - for(subtotal=k=i=0; i usableSpace ){ - szNew[k] = subtotal - szCell[i]; - cntNew[k] = i; - if( leafData ){ i--; } - subtotal = 0; - k++; - } - } - szNew[k] = subtotal; - cntNew[k] = nCell; - k++; - - /* - ** The packing computed by the previous block is biased toward the siblings - ** on the left side. The left siblings are always nearly full, while the - ** right-most sibling might be nearly empty. This block of code attempts - ** to adjust the packing of siblings to get a better balance. - ** - ** This adjustment is more than an optimization. The packing above might - ** be so out of balance as to be illegal. For example, the right-most - ** sibling might be completely empty. This adjustment is not optional. - */ - for(i=k-1; i>0; i--){ - int szRight = szNew[i]; /* Size of sibling on the right */ - int szLeft = szNew[i-1]; /* Size of sibling on the left */ - int r; /* Index of right-most cell in left sibling */ - int d; /* Index of first cell to the left of right sibling */ - - r = cntNew[i-1] - 1; - d = r + 1 - leafData; - assert( d0) or we are the - ** a virtual root page. A virtual root page is when the real root - ** page is page 1 and we are the only child of that page. - */ - assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) ); - - /* - ** Allocate k new pages. Reuse old pages where possible. - */ - assert( pPage->pgno>1 ); - pageFlags = pPage->aData[0]; - for(i=0; ipDbPage); - nNew++; - if( rc ) goto balance_cleanup; - }else{ - assert( i>0 ); - rc = allocateBtreePage(pBt, &pNew, &pgnoNew[i], pgnoNew[i-1], 0); - if( rc ) goto balance_cleanup; - apNew[i] = pNew; - nNew++; - } - zeroPage(pNew, pageFlags); - } - - /* Free any old pages that were not reused as new pages. - */ - while( ii ){ - int t; - MemPage *pT; - t = pgnoNew[i]; - pT = apNew[i]; - pgnoNew[i] = pgnoNew[minI]; - apNew[i] = apNew[minI]; - pgnoNew[minI] = t; - apNew[minI] = pT; - } - } - TRACE(("BALANCE: old: %d %d %d new: %d(%d) %d(%d) %d(%d) %d(%d) %d(%d)\n", - pgnoOld[0], - nOld>=2 ? pgnoOld[1] : 0, - nOld>=3 ? pgnoOld[2] : 0, - pgnoNew[0], szNew[0], - nNew>=2 ? pgnoNew[1] : 0, nNew>=2 ? szNew[1] : 0, - nNew>=3 ? pgnoNew[2] : 0, nNew>=3 ? szNew[2] : 0, - nNew>=4 ? pgnoNew[3] : 0, nNew>=4 ? szNew[3] : 0, - nNew>=5 ? pgnoNew[4] : 0, nNew>=5 ? szNew[4] : 0)); - - /* - ** Evenly distribute the data in apCell[] across the new pages. - ** Insert divider cells into pParent as necessary. - */ - j = 0; - for(i=0; ipgno==pgnoNew[i] ); - assemblePage(pNew, cntNew[i]-j, &apCell[j], &szCell[j]); - assert( pNew->nCell>0 || (nNew==1 && cntNew[0]==0) ); - assert( pNew->nOverflow==0 ); - -#ifndef SQLITE_OMIT_AUTOVACUUM - /* If this is an auto-vacuum database, update the pointer map entries - ** that point to the siblings that were rearranged. These can be: left - ** children of cells, the right-child of the page, or overflow pages - ** pointed to by cells. - */ - if( pBt->autoVacuum ){ - for(k=j; kpgno!=pNew->pgno ){ - rc = ptrmapPutOvfl(pNew, k-j); - if( rc!=SQLITE_OK ){ - goto balance_cleanup; - } - } - } - } -#endif - - j = cntNew[i]; - - /* If the sibling page assembled above was not the right-most sibling, - ** insert a divider cell into the parent page. - */ - if( ileaf ){ - memcpy(&pNew->aData[8], pCell, 4); - pTemp = 0; - }else if( leafData ){ - /* If the tree is a leaf-data tree, and the siblings are leaves, - ** then there is no divider cell in apCell[]. Instead, the divider - ** cell consists of the integer key for the right-most cell of - ** the sibling-page assembled above only. - */ - CellInfo info; - j--; - sqlite3BtreeParseCellPtr(pNew, apCell[j], &info); - pCell = &aSpace[iSpace]; - fillInCell(pParent, pCell, 0, info.nKey, 0, 0, 0, &sz); - iSpace += sz; - assert( iSpace<=pBt->pageSize*5 ); - pTemp = 0; - }else{ - pCell -= 4; - pTemp = &aSpace[iSpace]; - iSpace += sz; - assert( iSpace<=pBt->pageSize*5 ); - /* Obscure case for non-leaf-data trees: If the cell at pCell was - ** previously stored on a leaf node, and it's reported size was 4 - ** bytes, then it may actually be smaller than this - ** (see sqlite3BtreeParseCellPtr(), 4 bytes is the minimum size of - ** any cell). But it's important to pass the correct size to - ** insertCell(), so reparse the cell now. - ** - ** Note that this can never happen in an SQLite data file, as all - ** cells are at least 4 bytes. It only happens in b-trees used - ** to evaluate "IN (SELECT ...)" and similar clauses. - */ - if( szCell[j]==4 ){ - assert(leafCorrection==4); - sz = cellSizePtr(pParent, pCell); - } - } - rc = insertCell(pParent, nxDiv, pCell, sz, pTemp, 4); - if( rc!=SQLITE_OK ) goto balance_cleanup; - put4byte(findOverflowCell(pParent,nxDiv), pNew->pgno); -#ifndef SQLITE_OMIT_AUTOVACUUM - /* If this is an auto-vacuum database, and not a leaf-data tree, - ** then update the pointer map with an entry for the overflow page - ** that the cell just inserted points to (if any). - */ - if( pBt->autoVacuum && !leafData ){ - rc = ptrmapPutOvfl(pParent, nxDiv); - if( rc!=SQLITE_OK ){ - goto balance_cleanup; - } - } -#endif - j++; - nxDiv++; - } - } - assert( j==nCell ); - assert( nOld>0 ); - assert( nNew>0 ); - if( (pageFlags & PTF_LEAF)==0 ){ - memcpy(&apNew[nNew-1]->aData[8], &apCopy[nOld-1]->aData[8], 4); - } - if( nxDiv==pParent->nCell+pParent->nOverflow ){ - /* Right-most sibling is the right-most child of pParent */ - put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew[nNew-1]); - }else{ - /* Right-most sibling is the left child of the first entry in pParent - ** past the right-most divider entry */ - put4byte(findOverflowCell(pParent, nxDiv), pgnoNew[nNew-1]); - } - - /* - ** Reparent children of all cells. - */ - for(i=0; iisInit ); - rc = balance(pParent, 0); - - /* - ** Cleanup before returning. - */ -balance_cleanup: - sqlite3_free(apCell); - for(i=0; ipgno, nOld, nNew, nCell)); - return rc; -} - -/* -** This routine is called for the root page of a btree when the root -** page contains no cells. This is an opportunity to make the tree -** shallower by one level. -*/ -static int balance_shallower(MemPage *pPage){ - MemPage *pChild; /* The only child page of pPage */ - Pgno pgnoChild; /* Page number for pChild */ - int rc = SQLITE_OK; /* Return code from subprocedures */ - BtShared *pBt; /* The main BTree structure */ - int mxCellPerPage; /* Maximum number of cells per page */ - u8 **apCell; /* All cells from pages being balanced */ - int *szCell; /* Local size of all cells */ - - assert( pPage->pParent==0 ); - assert( pPage->nCell==0 ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - pBt = pPage->pBt; - mxCellPerPage = MX_CELL(pBt); - apCell = sqlite3_malloc( mxCellPerPage*(sizeof(u8*)+sizeof(int)) ); - if( apCell==0 ) return SQLITE_NOMEM; - szCell = (int*)&apCell[mxCellPerPage]; - if( pPage->leaf ){ - /* The table is completely empty */ - TRACE(("BALANCE: empty table %d\n", pPage->pgno)); - }else{ - /* The root page is empty but has one child. Transfer the - ** information from that one child into the root page if it - ** will fit. This reduces the depth of the tree by one. - ** - ** If the root page is page 1, it has less space available than - ** its child (due to the 100 byte header that occurs at the beginning - ** of the database fle), so it might not be able to hold all of the - ** information currently contained in the child. If this is the - ** case, then do not do the transfer. Leave page 1 empty except - ** for the right-pointer to the child page. The child page becomes - ** the virtual root of the tree. - */ - pgnoChild = get4byte(&pPage->aData[pPage->hdrOffset+8]); - assert( pgnoChild>0 ); - assert( pgnoChild<=sqlite3PagerPagecount(pPage->pBt->pPager) ); - rc = sqlite3BtreeGetPage(pPage->pBt, pgnoChild, &pChild, 0); - if( rc ) goto end_shallow_balance; - if( pPage->pgno==1 ){ - rc = sqlite3BtreeInitPage(pChild, pPage); - if( rc ) goto end_shallow_balance; - assert( pChild->nOverflow==0 ); - if( pChild->nFree>=100 ){ - /* The child information will fit on the root page, so do the - ** copy */ - int i; - zeroPage(pPage, pChild->aData[0]); - for(i=0; inCell; i++){ - apCell[i] = findCell(pChild,i); - szCell[i] = cellSizePtr(pChild, apCell[i]); - } - assemblePage(pPage, pChild->nCell, apCell, szCell); - /* Copy the right-pointer of the child to the parent. */ - put4byte(&pPage->aData[pPage->hdrOffset+8], - get4byte(&pChild->aData[pChild->hdrOffset+8])); - freePage(pChild); - TRACE(("BALANCE: child %d transfer to page 1\n", pChild->pgno)); - }else{ - /* The child has more information that will fit on the root. - ** The tree is already balanced. Do nothing. */ - TRACE(("BALANCE: child %d will not fit on page 1\n", pChild->pgno)); - } - }else{ - memcpy(pPage->aData, pChild->aData, pPage->pBt->usableSize); - pPage->isInit = 0; - pPage->pParent = 0; - rc = sqlite3BtreeInitPage(pPage, 0); - assert( rc==SQLITE_OK ); - freePage(pChild); - TRACE(("BALANCE: transfer child %d into root %d\n", - pChild->pgno, pPage->pgno)); - } - rc = reparentChildPages(pPage); - assert( pPage->nOverflow==0 ); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - int i; - for(i=0; inCell; i++){ - rc = ptrmapPutOvfl(pPage, i); - if( rc!=SQLITE_OK ){ - goto end_shallow_balance; - } - } - } -#endif - releasePage(pChild); - } -end_shallow_balance: - sqlite3_free(apCell); - return rc; -} - - -/* -** The root page is overfull -** -** When this happens, Create a new child page and copy the -** contents of the root into the child. Then make the root -** page an empty page with rightChild pointing to the new -** child. Finally, call balance_internal() on the new child -** to cause it to split. -*/ -static int balance_deeper(MemPage *pPage){ - int rc; /* Return value from subprocedures */ - MemPage *pChild; /* Pointer to a new child page */ - Pgno pgnoChild; /* Page number of the new child page */ - BtShared *pBt; /* The BTree */ - int usableSize; /* Total usable size of a page */ - u8 *data; /* Content of the parent page */ - u8 *cdata; /* Content of the child page */ - int hdr; /* Offset to page header in parent */ - int brk; /* Offset to content of first cell in parent */ - - assert( pPage->pParent==0 ); - assert( pPage->nOverflow>0 ); - pBt = pPage->pBt; - assert( sqlite3_mutex_held(pBt->mutex) ); - rc = allocateBtreePage(pBt, &pChild, &pgnoChild, pPage->pgno, 0); - if( rc ) return rc; - assert( sqlite3PagerIswriteable(pChild->pDbPage) ); - usableSize = pBt->usableSize; - data = pPage->aData; - hdr = pPage->hdrOffset; - brk = get2byte(&data[hdr+5]); - cdata = pChild->aData; - memcpy(cdata, &data[hdr], pPage->cellOffset+2*pPage->nCell-hdr); - memcpy(&cdata[brk], &data[brk], usableSize-brk); - assert( pChild->isInit==0 ); - rc = sqlite3BtreeInitPage(pChild, pPage); - if( rc ) goto balancedeeper_out; - memcpy(pChild->aOvfl, pPage->aOvfl, pPage->nOverflow*sizeof(pPage->aOvfl[0])); - pChild->nOverflow = pPage->nOverflow; - if( pChild->nOverflow ){ - pChild->nFree = 0; - } - assert( pChild->nCell==pPage->nCell ); - zeroPage(pPage, pChild->aData[0] & ~PTF_LEAF); - put4byte(&pPage->aData[pPage->hdrOffset+8], pgnoChild); - TRACE(("BALANCE: copy root %d into %d\n", pPage->pgno, pChild->pgno)); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - int i; - rc = ptrmapPut(pBt, pChild->pgno, PTRMAP_BTREE, pPage->pgno); - if( rc ) goto balancedeeper_out; - for(i=0; inCell; i++){ - rc = ptrmapPutOvfl(pChild, i); - if( rc!=SQLITE_OK ){ - return rc; - } - } - } -#endif - rc = balance_nonroot(pChild); - -balancedeeper_out: - releasePage(pChild); - return rc; -} - -/* -** Decide if the page pPage needs to be balanced. If balancing is -** required, call the appropriate balancing routine. -*/ -static int balance(MemPage *pPage, int insert){ - int rc = SQLITE_OK; - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( pPage->pParent==0 ){ - rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc==SQLITE_OK && pPage->nOverflow>0 ){ - rc = balance_deeper(pPage); - } - if( rc==SQLITE_OK && pPage->nCell==0 ){ - rc = balance_shallower(pPage); - } - }else{ - if( pPage->nOverflow>0 || - (!insert && pPage->nFree>pPage->pBt->usableSize*2/3) ){ - rc = balance_nonroot(pPage); - } - } - return rc; -} - -/* -** This routine checks all cursors that point to table pgnoRoot. -** If any of those cursors were opened with wrFlag==0 in a different -** database connection (a database connection that shares the pager -** cache with the current connection) and that other connection -** is not in the ReadUncommmitted state, then this routine returns -** SQLITE_LOCKED. -** -** In addition to checking for read-locks (where a read-lock -** means a cursor opened with wrFlag==0) this routine also moves -** all write cursors so that they are pointing to the -** first Cell on the root page. This is necessary because an insert -** or delete might change the number of cells on a page or delete -** a page entirely and we do not want to leave any cursors -** pointing to non-existant pages or cells. -*/ -static int checkReadLocks(Btree *pBtree, Pgno pgnoRoot, BtCursor *pExclude){ - BtCursor *p; - BtShared *pBt = pBtree->pBt; - sqlite3 *db = pBtree->pSqlite; - assert( sqlite3BtreeHoldsMutex(pBtree) ); - for(p=pBt->pCursor; p; p=p->pNext){ - if( p==pExclude ) continue; - if( p->eState!=CURSOR_VALID ) continue; - if( p->pgnoRoot!=pgnoRoot ) continue; - if( p->wrFlag==0 ){ - sqlite3 *dbOther = p->pBtree->pSqlite; - if( dbOther==0 || - (dbOther!=db && (dbOther->flags & SQLITE_ReadUncommitted)==0) ){ - return SQLITE_LOCKED; - } - }else if( p->pPage->pgno!=p->pgnoRoot ){ - moveToRoot(p); - } - } - return SQLITE_OK; -} - -/* -** Insert a new record into the BTree. The key is given by (pKey,nKey) -** and the data is given by (pData,nData). The cursor is used only to -** define what table the record should be inserted into. The cursor -** is left pointing at a random location. -** -** For an INTKEY table, only the nKey value of the key is used. pKey is -** ignored. For a ZERODATA table, the pData and nData are both ignored. -*/ -int sqlite3BtreeInsert( - BtCursor *pCur, /* Insert data into the table of this cursor */ - const void *pKey, i64 nKey, /* The key of the new record */ - const void *pData, int nData, /* The data of the new record */ - int nZero, /* Number of extra 0 bytes to append to data */ - int appendBias /* True if this is likely an append */ -){ - int rc; - int loc; - int szNew; - MemPage *pPage; - Btree *p = pCur->pBtree; - BtShared *pBt = p->pBt; - unsigned char *oldCell; - unsigned char *newCell = 0; - - assert( cursorHoldsMutex(pCur) ); - if( pBt->inTransaction!=TRANS_WRITE ){ - /* Must start a transaction before doing an insert */ - rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - return rc; - } - assert( !pBt->readOnly ); - if( !pCur->wrFlag ){ - return SQLITE_PERM; /* Cursor not open for writing */ - } - if( checkReadLocks(pCur->pBtree, pCur->pgnoRoot, pCur) ){ - return SQLITE_LOCKED; /* The table pCur points to has a read lock */ - } - if( pCur->eState==CURSOR_FAULT ){ - return pCur->skip; - } - - /* Save the positions of any other cursors open on this table */ - clearCursorPosition(pCur); - if( - SQLITE_OK!=(rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur)) || - SQLITE_OK!=(rc = sqlite3BtreeMoveto(pCur, pKey, nKey, appendBias, &loc)) - ){ - return rc; - } - - pPage = pCur->pPage; - assert( pPage->intKey || nKey>=0 ); - assert( pPage->leaf || !pPage->leafData ); - TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", - pCur->pgnoRoot, nKey, nData, pPage->pgno, - loc==0 ? "overwrite" : "new entry")); - assert( pPage->isInit ); - newCell = sqlite3_malloc( MX_CELL_SIZE(pBt) ); - if( newCell==0 ) return SQLITE_NOMEM; - rc = fillInCell(pPage, newCell, pKey, nKey, pData, nData, nZero, &szNew); - if( rc ) goto end_insert; - assert( szNew==cellSizePtr(pPage, newCell) ); - assert( szNew<=MX_CELL_SIZE(pBt) ); - if( loc==0 && CURSOR_VALID==pCur->eState ){ - int szOld; - assert( pCur->idx>=0 && pCur->idxnCell ); - rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc ){ - goto end_insert; - } - oldCell = findCell(pPage, pCur->idx); - if( !pPage->leaf ){ - memcpy(newCell, oldCell, 4); - } - szOld = cellSizePtr(pPage, oldCell); - rc = clearCell(pPage, oldCell); - if( rc ) goto end_insert; - dropCell(pPage, pCur->idx, szOld); - }else if( loc<0 && pPage->nCell>0 ){ - assert( pPage->leaf ); - pCur->idx++; - pCur->info.nSize = 0; - }else{ - assert( pPage->leaf ); - } - rc = insertCell(pPage, pCur->idx, newCell, szNew, 0, 0); - if( rc!=SQLITE_OK ) goto end_insert; - rc = balance(pPage, 1); - /* sqlite3BtreePageDump(pCur->pBt, pCur->pgnoRoot, 1); */ - /* fflush(stdout); */ - if( rc==SQLITE_OK ){ - moveToRoot(pCur); - } -end_insert: - sqlite3_free(newCell); - return rc; -} - -/* -** Delete the entry that the cursor is pointing to. The cursor -** is left pointing at a random location. -*/ -int sqlite3BtreeDelete(BtCursor *pCur){ - MemPage *pPage = pCur->pPage; - unsigned char *pCell; - int rc; - Pgno pgnoChild = 0; - Btree *p = pCur->pBtree; - BtShared *pBt = p->pBt; - - assert( cursorHoldsMutex(pCur) ); - assert( pPage->isInit ); - if( pBt->inTransaction!=TRANS_WRITE ){ - /* Must start a transaction before doing a delete */ - rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - return rc; - } - assert( !pBt->readOnly ); - if( pCur->eState==CURSOR_FAULT ){ - return pCur->skip; - } - if( pCur->idx >= pPage->nCell ){ - return SQLITE_ERROR; /* The cursor is not pointing to anything */ - } - if( !pCur->wrFlag ){ - return SQLITE_PERM; /* Did not open this cursor for writing */ - } - if( checkReadLocks(pCur->pBtree, pCur->pgnoRoot, pCur) ){ - return SQLITE_LOCKED; /* The table pCur points to has a read lock */ - } - - /* Restore the current cursor position (a no-op if the cursor is not in - ** CURSOR_REQUIRESEEK state) and save the positions of any other cursors - ** open on the same table. Then call sqlite3PagerWrite() on the page - ** that the entry will be deleted from. - */ - if( - (rc = restoreOrClearCursorPosition(pCur))!=0 || - (rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur))!=0 || - (rc = sqlite3PagerWrite(pPage->pDbPage))!=0 - ){ - return rc; - } - - /* Locate the cell within it's page and leave pCell pointing to the - ** data. The clearCell() call frees any overflow pages associated with the - ** cell. The cell itself is still intact. - */ - pCell = findCell(pPage, pCur->idx); - if( !pPage->leaf ){ - pgnoChild = get4byte(pCell); - } - rc = clearCell(pPage, pCell); - if( rc ){ - return rc; - } - - if( !pPage->leaf ){ - /* - ** The entry we are about to delete is not a leaf so if we do not - ** do something we will leave a hole on an internal page. - ** We have to fill the hole by moving in a cell from a leaf. The - ** next Cell after the one to be deleted is guaranteed to exist and - ** to be a leaf so we can use it. - */ - BtCursor leafCur; - unsigned char *pNext; - int szNext; /* The compiler warning is wrong: szNext is always - ** initialized before use. Adding an extra initialization - ** to silence the compiler slows down the code. */ - int notUsed; - unsigned char *tempCell = 0; - assert( !pPage->leafData ); - sqlite3BtreeGetTempCursor(pCur, &leafCur); - rc = sqlite3BtreeNext(&leafCur, ¬Used); - if( rc==SQLITE_OK ){ - rc = sqlite3PagerWrite(leafCur.pPage->pDbPage); - } - if( rc==SQLITE_OK ){ - TRACE(("DELETE: table=%d delete internal from %d replace from leaf %d\n", - pCur->pgnoRoot, pPage->pgno, leafCur.pPage->pgno)); - dropCell(pPage, pCur->idx, cellSizePtr(pPage, pCell)); - pNext = findCell(leafCur.pPage, leafCur.idx); - szNext = cellSizePtr(leafCur.pPage, pNext); - assert( MX_CELL_SIZE(pBt)>=szNext+4 ); - tempCell = sqlite3_malloc( MX_CELL_SIZE(pBt) ); - if( tempCell==0 ){ - rc = SQLITE_NOMEM; - } - } - if( rc==SQLITE_OK ){ - rc = insertCell(pPage, pCur->idx, pNext-4, szNext+4, tempCell, 0); - } - if( rc==SQLITE_OK ){ - put4byte(findOverflowCell(pPage, pCur->idx), pgnoChild); - rc = balance(pPage, 0); - } - if( rc==SQLITE_OK ){ - dropCell(leafCur.pPage, leafCur.idx, szNext); - rc = balance(leafCur.pPage, 0); - } - sqlite3_free(tempCell); - sqlite3BtreeReleaseTempCursor(&leafCur); - }else{ - TRACE(("DELETE: table=%d delete from leaf %d\n", - pCur->pgnoRoot, pPage->pgno)); - dropCell(pPage, pCur->idx, cellSizePtr(pPage, pCell)); - rc = balance(pPage, 0); - } - if( rc==SQLITE_OK ){ - moveToRoot(pCur); - } - return rc; -} - -/* -** Create a new BTree table. Write into *piTable the page -** number for the root page of the new table. -** -** The type of type is determined by the flags parameter. Only the -** following values of flags are currently in use. Other values for -** flags might not work: -** -** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys -** BTREE_ZERODATA Used for SQL indices -*/ -static int btreeCreateTable(Btree *p, int *piTable, int flags){ - BtShared *pBt = p->pBt; - MemPage *pRoot; - Pgno pgnoRoot; - int rc; - - assert( sqlite3BtreeHoldsMutex(p) ); - if( pBt->inTransaction!=TRANS_WRITE ){ - /* Must start a transaction first */ - rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - return rc; - } - assert( !pBt->readOnly ); - -#ifdef SQLITE_OMIT_AUTOVACUUM - rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); - if( rc ){ - return rc; - } -#else - if( pBt->autoVacuum ){ - Pgno pgnoMove; /* Move a page here to make room for the root-page */ - MemPage *pPageMove; /* The page to move to. */ - - /* Creating a new table may probably require moving an existing database - ** to make room for the new tables root page. In case this page turns - ** out to be an overflow page, delete all overflow page-map caches - ** held by open cursors. - */ - invalidateAllOverflowCache(pBt); - - /* Read the value of meta[3] from the database to determine where the - ** root page of the new table should go. meta[3] is the largest root-page - ** created so far, so the new root-page is (meta[3]+1). - */ - rc = sqlite3BtreeGetMeta(p, 4, &pgnoRoot); - if( rc!=SQLITE_OK ){ - return rc; - } - pgnoRoot++; - - /* The new root-page may not be allocated on a pointer-map page, or the - ** PENDING_BYTE page. - */ - if( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) || - pgnoRoot==PENDING_BYTE_PAGE(pBt) ){ - pgnoRoot++; - } - assert( pgnoRoot>=3 ); - - /* Allocate a page. The page that currently resides at pgnoRoot will - ** be moved to the allocated page (unless the allocated page happens - ** to reside at pgnoRoot). - */ - rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, 1); - if( rc!=SQLITE_OK ){ - return rc; - } - - if( pgnoMove!=pgnoRoot ){ - /* pgnoRoot is the page that will be used for the root-page of - ** the new table (assuming an error did not occur). But we were - ** allocated pgnoMove. If required (i.e. if it was not allocated - ** by extending the file), the current page at position pgnoMove - ** is already journaled. - */ - u8 eType; - Pgno iPtrPage; - - releasePage(pPageMove); - - /* Move the page currently at pgnoRoot to pgnoMove. */ - rc = sqlite3BtreeGetPage(pBt, pgnoRoot, &pRoot, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); - if( rc!=SQLITE_OK || eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ - releasePage(pRoot); - return rc; - } - assert( eType!=PTRMAP_ROOTPAGE ); - assert( eType!=PTRMAP_FREEPAGE ); - rc = sqlite3PagerWrite(pRoot->pDbPage); - if( rc!=SQLITE_OK ){ - releasePage(pRoot); - return rc; - } - rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove); - releasePage(pRoot); - - /* Obtain the page at pgnoRoot */ - if( rc!=SQLITE_OK ){ - return rc; - } - rc = sqlite3BtreeGetPage(pBt, pgnoRoot, &pRoot, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = sqlite3PagerWrite(pRoot->pDbPage); - if( rc!=SQLITE_OK ){ - releasePage(pRoot); - return rc; - } - }else{ - pRoot = pPageMove; - } - - /* Update the pointer-map and meta-data with the new root-page number. */ - rc = ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0); - if( rc ){ - releasePage(pRoot); - return rc; - } - rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot); - if( rc ){ - releasePage(pRoot); - return rc; - } - - }else{ - rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); - if( rc ) return rc; - } -#endif - assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - zeroPage(pRoot, flags | PTF_LEAF); - sqlite3PagerUnref(pRoot->pDbPage); - *piTable = (int)pgnoRoot; - return SQLITE_OK; -} -int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){ - int rc; - sqlite3BtreeEnter(p); - rc = btreeCreateTable(p, piTable, flags); - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Erase the given database page and all its children. Return -** the page to the freelist. -*/ -static int clearDatabasePage( - BtShared *pBt, /* The BTree that contains the table */ - Pgno pgno, /* Page number to clear */ - MemPage *pParent, /* Parent page. NULL for the root */ - int freePageFlag /* Deallocate page if true */ -){ - MemPage *pPage = 0; - int rc; - unsigned char *pCell; - int i; - - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pgno>sqlite3PagerPagecount(pBt->pPager) ){ - return SQLITE_CORRUPT_BKPT; - } - - rc = getAndInitPage(pBt, pgno, &pPage, pParent); - if( rc ) goto cleardatabasepage_out; - for(i=0; inCell; i++){ - pCell = findCell(pPage, i); - if( !pPage->leaf ){ - rc = clearDatabasePage(pBt, get4byte(pCell), pPage->pParent, 1); - if( rc ) goto cleardatabasepage_out; - } - rc = clearCell(pPage, pCell); - if( rc ) goto cleardatabasepage_out; - } - if( !pPage->leaf ){ - rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), pPage->pParent, 1); - if( rc ) goto cleardatabasepage_out; - } - if( freePageFlag ){ - rc = freePage(pPage); - }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ - zeroPage(pPage, pPage->aData[0] | PTF_LEAF); - } - -cleardatabasepage_out: - releasePage(pPage); - return rc; -} - -/* -** Delete all information from a single table in the database. iTable is -** the page number of the root of the table. After this routine returns, -** the root page is empty, but still exists. -** -** This routine will fail with SQLITE_LOCKED if there are any open -** read cursors on the table. Open write cursors are moved to the -** root of the table. -*/ -int sqlite3BtreeClearTable(Btree *p, int iTable){ - int rc; - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - if( p->inTrans!=TRANS_WRITE ){ - rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - }else if( (rc = checkReadLocks(p, iTable, 0))!=SQLITE_OK ){ - /* nothing to do */ - }else if( SQLITE_OK!=(rc = saveAllCursors(pBt, iTable, 0)) ){ - /* nothing to do */ - }else{ - rc = clearDatabasePage(pBt, (Pgno)iTable, 0, 0); - } - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Erase all information in a table and add the root of the table to -** the freelist. Except, the root of the principle table (the one on -** page 1) is never added to the freelist. -** -** This routine will fail with SQLITE_LOCKED if there are any open -** cursors on the table. -** -** If AUTOVACUUM is enabled and the page at iTable is not the last -** root page in the database file, then the last root page -** in the database file is moved into the slot formerly occupied by -** iTable and that last slot formerly occupied by the last root page -** is added to the freelist instead of iTable. In this say, all -** root pages are kept at the beginning of the database file, which -** is necessary for AUTOVACUUM to work right. *piMoved is set to the -** page number that used to be the last root page in the file before -** the move. If no page gets moved, *piMoved is set to 0. -** The last root page is recorded in meta[3] and the value of -** meta[3] is updated by this procedure. -*/ -static int btreeDropTable(Btree *p, int iTable, int *piMoved){ - int rc; - MemPage *pPage = 0; - BtShared *pBt = p->pBt; - - assert( sqlite3BtreeHoldsMutex(p) ); - if( p->inTrans!=TRANS_WRITE ){ - return pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - } - - /* It is illegal to drop a table if any cursors are open on the - ** database. This is because in auto-vacuum mode the backend may - ** need to move another root-page to fill a gap left by the deleted - ** root page. If an open cursor was using this page a problem would - ** occur. - */ - if( pBt->pCursor ){ - return SQLITE_LOCKED; - } - - rc = sqlite3BtreeGetPage(pBt, (Pgno)iTable, &pPage, 0); - if( rc ) return rc; - rc = sqlite3BtreeClearTable(p, iTable); - if( rc ){ - releasePage(pPage); - return rc; - } - - *piMoved = 0; - - if( iTable>1 ){ -#ifdef SQLITE_OMIT_AUTOVACUUM - rc = freePage(pPage); - releasePage(pPage); -#else - if( pBt->autoVacuum ){ - Pgno maxRootPgno; - rc = sqlite3BtreeGetMeta(p, 4, &maxRootPgno); - if( rc!=SQLITE_OK ){ - releasePage(pPage); - return rc; - } - - if( iTable==maxRootPgno ){ - /* If the table being dropped is the table with the largest root-page - ** number in the database, put the root page on the free list. - */ - rc = freePage(pPage); - releasePage(pPage); - if( rc!=SQLITE_OK ){ - return rc; - } - }else{ - /* The table being dropped does not have the largest root-page - ** number in the database. So move the page that does into the - ** gap left by the deleted root-page. - */ - MemPage *pMove; - releasePage(pPage); - rc = sqlite3BtreeGetPage(pBt, maxRootPgno, &pMove, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable); - releasePage(pMove); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = sqlite3BtreeGetPage(pBt, maxRootPgno, &pMove, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = freePage(pMove); - releasePage(pMove); - if( rc!=SQLITE_OK ){ - return rc; - } - *piMoved = maxRootPgno; - } - - /* Set the new 'max-root-page' value in the database header. This - ** is the old value less one, less one more if that happens to - ** be a root-page number, less one again if that is the - ** PENDING_BYTE_PAGE. - */ - maxRootPgno--; - if( maxRootPgno==PENDING_BYTE_PAGE(pBt) ){ - maxRootPgno--; - } - if( maxRootPgno==PTRMAP_PAGENO(pBt, maxRootPgno) ){ - maxRootPgno--; - } - assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); - - rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); - }else{ - rc = freePage(pPage); - releasePage(pPage); - } -#endif - }else{ - /* If sqlite3BtreeDropTable was called on page 1. */ - zeroPage(pPage, PTF_INTKEY|PTF_LEAF ); - releasePage(pPage); - } - return rc; -} -int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ - int rc; - sqlite3BtreeEnter(p); - rc = btreeDropTable(p, iTable, piMoved); - sqlite3BtreeLeave(p); - return rc; -} - - -/* -** Read the meta-information out of a database file. Meta[0] -** is the number of free pages currently in the database. Meta[1] -** through meta[15] are available for use by higher layers. Meta[0] -** is read-only, the others are read/write. -** -** The schema layer numbers meta values differently. At the schema -** layer (and the SetCookie and ReadCookie opcodes) the number of -** free pages is not visible. So Cookie[0] is the same as Meta[1]. -*/ -int sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ - DbPage *pDbPage; - int rc; - unsigned char *pP1; - BtShared *pBt = p->pBt; - - sqlite3BtreeEnter(p); - - /* Reading a meta-data value requires a read-lock on page 1 (and hence - ** the sqlite_master table. We grab this lock regardless of whether or - ** not the SQLITE_ReadUncommitted flag is set (the table rooted at page - ** 1 is treated as a special case by queryTableLock() and lockTable()). - */ - rc = queryTableLock(p, 1, READ_LOCK); - if( rc!=SQLITE_OK ){ - sqlite3BtreeLeave(p); - return rc; - } - - assert( idx>=0 && idx<=15 ); - rc = sqlite3PagerGet(pBt->pPager, 1, &pDbPage); - if( rc ){ - sqlite3BtreeLeave(p); - return rc; - } - pP1 = (unsigned char *)sqlite3PagerGetData(pDbPage); - *pMeta = get4byte(&pP1[36 + idx*4]); - sqlite3PagerUnref(pDbPage); - - /* If autovacuumed is disabled in this build but we are trying to - ** access an autovacuumed database, then make the database readonly. - */ -#ifdef SQLITE_OMIT_AUTOVACUUM - if( idx==4 && *pMeta>0 ) pBt->readOnly = 1; -#endif - - /* Grab the read-lock on page 1. */ - rc = lockTable(p, 1, READ_LOCK); - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Write meta-information back into the database. Meta[0] is -** read-only and may not be written. -*/ -int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ - BtShared *pBt = p->pBt; - unsigned char *pP1; - int rc; - assert( idx>=1 && idx<=15 ); - sqlite3BtreeEnter(p); - if( p->inTrans!=TRANS_WRITE ){ - rc = pBt->readOnly ? SQLITE_READONLY : SQLITE_ERROR; - }else{ - assert( pBt->pPage1!=0 ); - pP1 = pBt->pPage1->aData; - rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); - if( rc==SQLITE_OK ){ - put4byte(&pP1[36 + idx*4], iMeta); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( idx==7 ){ - assert( pBt->autoVacuum || iMeta==0 ); - assert( iMeta==0 || iMeta==1 ); - pBt->incrVacuum = iMeta; - } -#endif - } - } - sqlite3BtreeLeave(p); - return rc; -} - -/* -** Return the flag byte at the beginning of the page that the cursor -** is currently pointing to. -*/ -int sqlite3BtreeFlags(BtCursor *pCur){ - /* TODO: What about CURSOR_REQUIRESEEK state? Probably need to call - ** restoreOrClearCursorPosition() here. - */ - MemPage *pPage = pCur->pPage; - assert( cursorHoldsMutex(pCur) ); - assert( pPage->pBt==pCur->pBt ); - return pPage ? pPage->aData[pPage->hdrOffset] : 0; -} - - -/* -** Return the pager associated with a BTree. This routine is used for -** testing and debugging only. -*/ -Pager *sqlite3BtreePager(Btree *p){ - return p->pBt->pPager; -} - -#ifndef SQLITE_OMIT_INTEGRITY_CHECK -/* -** Append a message to the error message string. -*/ -static void checkAppendMsg( - IntegrityCk *pCheck, - char *zMsg1, - const char *zFormat, - ... -){ - va_list ap; - char *zMsg2; - if( !pCheck->mxErr ) return; - pCheck->mxErr--; - pCheck->nErr++; - va_start(ap, zFormat); - zMsg2 = sqlite3VMPrintf(0, zFormat, ap); - va_end(ap); - if( zMsg1==0 ) zMsg1 = ""; - if( pCheck->zErrMsg ){ - char *zOld = pCheck->zErrMsg; - pCheck->zErrMsg = 0; - sqlite3SetString(&pCheck->zErrMsg, zOld, "\n", zMsg1, zMsg2, (char*)0); - sqlite3_free(zOld); - }else{ - sqlite3SetString(&pCheck->zErrMsg, zMsg1, zMsg2, (char*)0); - } - sqlite3_free(zMsg2); -} -#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ - -#ifndef SQLITE_OMIT_INTEGRITY_CHECK -/* -** Add 1 to the reference count for page iPage. If this is the second -** reference to the page, add an error message to pCheck->zErrMsg. -** Return 1 if there are 2 ore more references to the page and 0 if -** if this is the first reference to the page. -** -** Also check that the page number is in bounds. -*/ -static int checkRef(IntegrityCk *pCheck, int iPage, char *zContext){ - if( iPage==0 ) return 1; - if( iPage>pCheck->nPage || iPage<0 ){ - checkAppendMsg(pCheck, zContext, "invalid page number %d", iPage); - return 1; - } - if( pCheck->anRef[iPage]==1 ){ - checkAppendMsg(pCheck, zContext, "2nd reference to page %d", iPage); - return 1; - } - return (pCheck->anRef[iPage]++)>1; -} - -#ifndef SQLITE_OMIT_AUTOVACUUM -/* -** Check that the entry in the pointer-map for page iChild maps to -** page iParent, pointer type ptrType. If not, append an error message -** to pCheck. -*/ -static void checkPtrmap( - IntegrityCk *pCheck, /* Integrity check context */ - Pgno iChild, /* Child page number */ - u8 eType, /* Expected pointer map type */ - Pgno iParent, /* Expected pointer map parent page number */ - char *zContext /* Context description (used for error msg) */ -){ - int rc; - u8 ePtrmapType; - Pgno iPtrmapParent; - - rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent); - if( rc!=SQLITE_OK ){ - checkAppendMsg(pCheck, zContext, "Failed to read ptrmap key=%d", iChild); - return; - } - - if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ - checkAppendMsg(pCheck, zContext, - "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", - iChild, eType, iParent, ePtrmapType, iPtrmapParent); - } -} -#endif - -/* -** Check the integrity of the freelist or of an overflow page list. -** Verify that the number of pages on the list is N. -*/ -static void checkList( - IntegrityCk *pCheck, /* Integrity checking context */ - int isFreeList, /* True for a freelist. False for overflow page list */ - int iPage, /* Page number for first page in the list */ - int N, /* Expected number of pages in the list */ - char *zContext /* Context for error messages */ -){ - int i; - int expected = N; - int iFirst = iPage; - while( N-- > 0 && pCheck->mxErr ){ - DbPage *pOvflPage; - unsigned char *pOvflData; - if( iPage<1 ){ - checkAppendMsg(pCheck, zContext, - "%d of %d pages missing from overflow list starting at %d", - N+1, expected, iFirst); - break; - } - if( checkRef(pCheck, iPage, zContext) ) break; - if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage) ){ - checkAppendMsg(pCheck, zContext, "failed to get page %d", iPage); - break; - } - pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); - if( isFreeList ){ - int n = get4byte(&pOvflData[4]); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pCheck->pBt->autoVacuum ){ - checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0, zContext); - } -#endif - if( n>pCheck->pBt->usableSize/4-8 ){ - checkAppendMsg(pCheck, zContext, - "freelist leaf count too big on page %d", iPage); - N--; - }else{ - for(i=0; ipBt->autoVacuum ){ - checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0, zContext); - } -#endif - checkRef(pCheck, iFreePage, zContext); - } - N -= n; - } - } -#ifndef SQLITE_OMIT_AUTOVACUUM - else{ - /* If this database supports auto-vacuum and iPage is not the last - ** page in this overflow list, check that the pointer-map entry for - ** the following page matches iPage. - */ - if( pCheck->pBt->autoVacuum && N>0 ){ - i = get4byte(pOvflData); - checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage, zContext); - } - } -#endif - iPage = get4byte(pOvflData); - sqlite3PagerUnref(pOvflPage); - } -} -#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ - -#ifndef SQLITE_OMIT_INTEGRITY_CHECK -/* -** Do various sanity checks on a single page of a tree. Return -** the tree depth. Root pages return 0. Parents of root pages -** return 1, and so forth. -** -** These checks are done: -** -** 1. Make sure that cells and freeblocks do not overlap -** but combine to completely cover the page. -** NO 2. Make sure cell keys are in order. -** NO 3. Make sure no key is less than or equal to zLowerBound. -** NO 4. Make sure no key is greater than or equal to zUpperBound. -** 5. Check the integrity of overflow pages. -** 6. Recursively call checkTreePage on all children. -** 7. Verify that the depth of all children is the same. -** 8. Make sure this page is at least 33% full or else it is -** the root of the tree. -*/ -static int checkTreePage( - IntegrityCk *pCheck, /* Context for the sanity check */ - int iPage, /* Page number of the page to check */ - MemPage *pParent, /* Parent page */ - char *zParentContext /* Parent context */ -){ - MemPage *pPage; - int i, rc, depth, d2, pgno, cnt; - int hdr, cellStart; - int nCell; - u8 *data; - BtShared *pBt; - int usableSize; - char zContext[100]; - char *hit; - - sqlite3_snprintf(sizeof(zContext), zContext, "Page %d: ", iPage); - - /* Check that the page exists - */ - pBt = pCheck->pBt; - usableSize = pBt->usableSize; - if( iPage==0 ) return 0; - if( checkRef(pCheck, iPage, zParentContext) ) return 0; - if( (rc = sqlite3BtreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){ - checkAppendMsg(pCheck, zContext, - "unable to get the page. error code=%d", rc); - return 0; - } - if( (rc = sqlite3BtreeInitPage(pPage, pParent))!=0 ){ - checkAppendMsg(pCheck, zContext, - "sqlite3BtreeInitPage() returns error code %d", rc); - releasePage(pPage); - return 0; - } - - /* Check out all the cells. - */ - depth = 0; - for(i=0; inCell && pCheck->mxErr; i++){ - u8 *pCell; - int sz; - CellInfo info; - - /* Check payload overflow pages - */ - sqlite3_snprintf(sizeof(zContext), zContext, - "On tree page %d cell %d: ", iPage, i); - pCell = findCell(pPage,i); - sqlite3BtreeParseCellPtr(pPage, pCell, &info); - sz = info.nData; - if( !pPage->intKey ) sz += info.nKey; - assert( sz==info.nPayload ); - if( sz>info.nLocal ){ - int nPage = (sz - info.nLocal + usableSize - 5)/(usableSize - 4); - Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage, zContext); - } -#endif - checkList(pCheck, 0, pgnoOvfl, nPage, zContext); - } - - /* Check sanity of left child page. - */ - if( !pPage->leaf ){ - pgno = get4byte(pCell); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext); - } -#endif - d2 = checkTreePage(pCheck,pgno,pPage,zContext); - if( i>0 && d2!=depth ){ - checkAppendMsg(pCheck, zContext, "Child page depth differs"); - } - depth = d2; - } - } - if( !pPage->leaf ){ - pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); - sqlite3_snprintf(sizeof(zContext), zContext, - "On page %d at right child: ", iPage); -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, 0); - } -#endif - checkTreePage(pCheck, pgno, pPage, zContext); - } - - /* Check for complete coverage of the page - */ - data = pPage->aData; - hdr = pPage->hdrOffset; - hit = sqlite3MallocZero( usableSize ); - if( hit ){ - memset(hit, 1, get2byte(&data[hdr+5])); - nCell = get2byte(&data[hdr+3]); - cellStart = hdr + 12 - 4*pPage->leaf; - for(i=0; i=usableSize || pc<0 ){ - checkAppendMsg(pCheck, 0, - "Corruption detected in cell %d on page %d",i,iPage,0); - }else{ - for(j=pc+size-1; j>=pc; j--) hit[j]++; - } - } - for(cnt=0, i=get2byte(&data[hdr+1]); i>0 && i=usableSize || i<0 ){ - checkAppendMsg(pCheck, 0, - "Corruption detected in cell %d on page %d",i,iPage,0); - }else{ - for(j=i+size-1; j>=i; j--) hit[j]++; - } - i = get2byte(&data[i]); - } - for(i=cnt=0; i1 ){ - checkAppendMsg(pCheck, 0, - "Multiple uses for byte %d of page %d", i, iPage); - break; - } - } - if( cnt!=data[hdr+7] ){ - checkAppendMsg(pCheck, 0, - "Fragmented space is %d byte reported as %d on page %d", - cnt, data[hdr+7], iPage); - } - } - sqlite3_free(hit); - - releasePage(pPage); - return depth+1; -} -#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ - -#ifndef SQLITE_OMIT_INTEGRITY_CHECK -/* -** This routine does a complete check of the given BTree file. aRoot[] is -** an array of pages numbers were each page number is the root page of -** a table. nRoot is the number of entries in aRoot. -** -** If everything checks out, this routine returns NULL. If something is -** amiss, an error message is written into memory obtained from malloc() -** and a pointer to that error message is returned. The calling function -** is responsible for freeing the error message when it is done. -*/ -char *sqlite3BtreeIntegrityCheck( - Btree *p, /* The btree to be checked */ - int *aRoot, /* An array of root pages numbers for individual trees */ - int nRoot, /* Number of entries in aRoot[] */ - int mxErr, /* Stop reporting errors after this many */ - int *pnErr /* Write number of errors seen to this variable */ -){ - int i; - int nRef; - IntegrityCk sCheck; - BtShared *pBt = p->pBt; - - sqlite3BtreeEnter(p); - nRef = sqlite3PagerRefcount(pBt->pPager); - if( lockBtreeWithRetry(p)!=SQLITE_OK ){ - sqlite3BtreeLeave(p); - return sqlite3StrDup("Unable to acquire a read lock on the database"); - } - sCheck.pBt = pBt; - sCheck.pPager = pBt->pPager; - sCheck.nPage = sqlite3PagerPagecount(sCheck.pPager); - sCheck.mxErr = mxErr; - sCheck.nErr = 0; - *pnErr = 0; -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->nTrunc!=0 ){ - sCheck.nPage = pBt->nTrunc; - } -#endif - if( sCheck.nPage==0 ){ - unlockBtreeIfUnused(pBt); - sqlite3BtreeLeave(p); - return 0; - } - sCheck.anRef = sqlite3_malloc( (sCheck.nPage+1)*sizeof(sCheck.anRef[0]) ); - if( !sCheck.anRef ){ - unlockBtreeIfUnused(pBt); - *pnErr = 1; - sqlite3BtreeLeave(p); - return sqlite3MPrintf(p->pSqlite, "Unable to malloc %d bytes", - (sCheck.nPage+1)*sizeof(sCheck.anRef[0])); - } - for(i=0; i<=sCheck.nPage; i++){ sCheck.anRef[i] = 0; } - i = PENDING_BYTE_PAGE(pBt); - if( i<=sCheck.nPage ){ - sCheck.anRef[i] = 1; - } - sCheck.zErrMsg = 0; - - /* Check the integrity of the freelist - */ - checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), - get4byte(&pBt->pPage1->aData[36]), "Main freelist: "); - - /* Check all the tables. - */ - for(i=0; iautoVacuum && aRoot[i]>1 ){ - checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0, 0); - } -#endif - checkTreePage(&sCheck, aRoot[i], 0, "List of tree roots: "); - } - - /* Make sure every page in the file is referenced - */ - for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ -#ifdef SQLITE_OMIT_AUTOVACUUM - if( sCheck.anRef[i]==0 ){ - checkAppendMsg(&sCheck, 0, "Page %d is never used", i); - } -#else - /* If the database supports auto-vacuum, make sure no tables contain - ** references to pointer-map pages. - */ - if( sCheck.anRef[i]==0 && - (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ - checkAppendMsg(&sCheck, 0, "Page %d is never used", i); - } - if( sCheck.anRef[i]!=0 && - (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ - checkAppendMsg(&sCheck, 0, "Pointer map page %d is referenced", i); - } -#endif - } - - /* Make sure this analysis did not leave any unref() pages - */ - unlockBtreeIfUnused(pBt); - if( nRef != sqlite3PagerRefcount(pBt->pPager) ){ - checkAppendMsg(&sCheck, 0, - "Outstanding page count goes from %d to %d during this analysis", - nRef, sqlite3PagerRefcount(pBt->pPager) - ); - } - - /* Clean up and report errors. - */ - sqlite3BtreeLeave(p); - sqlite3_free(sCheck.anRef); - *pnErr = sCheck.nErr; - return sCheck.zErrMsg; -} -#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ - -/* -** Return the full pathname of the underlying database file. -** -** The pager filename is invariant as long as the pager is -** open so it is safe to access without the BtShared mutex. -*/ -const char *sqlite3BtreeGetFilename(Btree *p){ - assert( p->pBt->pPager!=0 ); - return sqlite3PagerFilename(p->pBt->pPager); -} - -/* -** Return the pathname of the directory that contains the database file. -** -** The pager directory name is invariant as long as the pager is -** open so it is safe to access without the BtShared mutex. -*/ -const char *sqlite3BtreeGetDirname(Btree *p){ - assert( p->pBt->pPager!=0 ); - return sqlite3PagerDirname(p->pBt->pPager); -} - -/* -** Return the pathname of the journal file for this database. The return -** value of this routine is the same regardless of whether the journal file -** has been created or not. -** -** The pager journal filename is invariant as long as the pager is -** open so it is safe to access without the BtShared mutex. -*/ -const char *sqlite3BtreeGetJournalname(Btree *p){ - assert( p->pBt->pPager!=0 ); - return sqlite3PagerJournalname(p->pBt->pPager); -} - -#ifndef SQLITE_OMIT_VACUUM -/* -** Copy the complete content of pBtFrom into pBtTo. A transaction -** must be active for both files. -** -** The size of file pBtFrom may be reduced by this operation. -** If anything goes wrong, the transaction on pBtFrom is rolled back. -*/ -static int btreeCopyFile(Btree *pTo, Btree *pFrom){ - int rc = SQLITE_OK; - Pgno i, nPage, nToPage, iSkip; - - BtShared *pBtTo = pTo->pBt; - BtShared *pBtFrom = pFrom->pBt; - - if( pTo->inTrans!=TRANS_WRITE || pFrom->inTrans!=TRANS_WRITE ){ - return SQLITE_ERROR; - } - if( pBtTo->pCursor ) return SQLITE_BUSY; - nToPage = sqlite3PagerPagecount(pBtTo->pPager); - nPage = sqlite3PagerPagecount(pBtFrom->pPager); - iSkip = PENDING_BYTE_PAGE(pBtTo); - for(i=1; rc==SQLITE_OK && i<=nPage; i++){ - DbPage *pDbPage; - if( i==iSkip ) continue; - rc = sqlite3PagerGet(pBtFrom->pPager, i, &pDbPage); - if( rc ) break; - rc = sqlite3PagerOverwrite(pBtTo->pPager, i, sqlite3PagerGetData(pDbPage)); - sqlite3PagerUnref(pDbPage); - } - - /* If the file is shrinking, journal the pages that are being truncated - ** so that they can be rolled back if the commit fails. - */ - for(i=nPage+1; rc==SQLITE_OK && i<=nToPage; i++){ - DbPage *pDbPage; - if( i==iSkip ) continue; - rc = sqlite3PagerGet(pBtTo->pPager, i, &pDbPage); - if( rc ) break; - rc = sqlite3PagerWrite(pDbPage); - sqlite3PagerDontWrite(pDbPage); - /* Yeah. It seems wierd to call DontWrite() right after Write(). But - ** that is because the names of those procedures do not exactly - ** represent what they do. Write() really means "put this page in the - ** rollback journal and mark it as dirty so that it will be written - ** to the database file later." DontWrite() undoes the second part of - ** that and prevents the page from being written to the database. The - ** page is still on the rollback journal, though. And that is the whole - ** point of this loop: to put pages on the rollback journal. */ - sqlite3PagerUnref(pDbPage); - } - if( !rc && nPagepPager, nPage); - } - - if( rc ){ - sqlite3BtreeRollback(pTo); - } - return rc; -} -int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ - int rc; - sqlite3BtreeEnter(pTo); - sqlite3BtreeEnter(pFrom); - rc = btreeCopyFile(pTo, pFrom); - sqlite3BtreeLeave(pFrom); - sqlite3BtreeLeave(pTo); - return rc; -} - -#endif /* SQLITE_OMIT_VACUUM */ - -/* -** Return non-zero if a transaction is active. -*/ -int sqlite3BtreeIsInTrans(Btree *p){ - assert( p==0 || sqlite3_mutex_held(p->pSqlite->mutex) ); - return (p && (p->inTrans==TRANS_WRITE)); -} - -/* -** Return non-zero if a statement transaction is active. -*/ -int sqlite3BtreeIsInStmt(Btree *p){ - assert( sqlite3BtreeHoldsMutex(p) ); - return (p->pBt && p->pBt->inStmt); -} - -/* -** Return non-zero if a read (or write) transaction is active. -*/ -int sqlite3BtreeIsInReadTrans(Btree *p){ - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - return (p && (p->inTrans!=TRANS_NONE)); -} - -/* -** This function returns a pointer to a blob of memory associated with -** a single shared-btree. The memory is used by client code for it's own -** purposes (for example, to store a high-level schema associated with -** the shared-btree). The btree layer manages reference counting issues. -** -** The first time this is called on a shared-btree, nBytes bytes of memory -** are allocated, zeroed, and returned to the caller. For each subsequent -** call the nBytes parameter is ignored and a pointer to the same blob -** of memory returned. -** -** Just before the shared-btree is closed, the function passed as the -** xFree argument when the memory allocation was made is invoked on the -** blob of allocated memory. This function should not call sqlite3_free() -** on the memory, the btree layer does that. -*/ -void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){ - BtShared *pBt = p->pBt; - sqlite3BtreeEnter(p); - if( !pBt->pSchema ){ - pBt->pSchema = sqlite3MallocZero(nBytes); - pBt->xFreeSchema = xFree; - } - sqlite3BtreeLeave(p); - return pBt->pSchema; -} - -/* -** Return true if another user of the same shared btree as the argument -** handle holds an exclusive lock on the sqlite_master table. -*/ -int sqlite3BtreeSchemaLocked(Btree *p){ - int rc; - assert( sqlite3_mutex_held(p->pSqlite->mutex) ); - sqlite3BtreeEnter(p); - rc = (queryTableLock(p, MASTER_ROOT, READ_LOCK)!=SQLITE_OK); - sqlite3BtreeLeave(p); - return rc; -} - - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** Obtain a lock on the table whose root page is iTab. The -** lock is a write lock if isWritelock is true or a read lock -** if it is false. -*/ -int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ - int rc = SQLITE_OK; - u8 lockType = (isWriteLock?WRITE_LOCK:READ_LOCK); - sqlite3BtreeEnter(p); - rc = queryTableLock(p, iTab, lockType); - if( rc==SQLITE_OK ){ - rc = lockTable(p, iTab, lockType); - } - sqlite3BtreeLeave(p); - return rc; -} -#endif - -#ifndef SQLITE_OMIT_INCRBLOB -/* -** Argument pCsr must be a cursor opened for writing on an -** INTKEY table currently pointing at a valid table entry. -** This function modifies the data stored as part of that entry. -** Only the data content may only be modified, it is not possible -** to change the length of the data stored. -*/ -int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){ - assert( cursorHoldsMutex(pCsr) ); - assert( sqlite3_mutex_held(pCsr->pBtree->pSqlite->mutex) ); - assert(pCsr->isIncrblobHandle); - if( pCsr->eState>=CURSOR_REQUIRESEEK ){ - if( pCsr->eState==CURSOR_FAULT ){ - return pCsr->skip; - }else{ - return SQLITE_ABORT; - } - } - - /* Check some preconditions: - ** (a) the cursor is open for writing, - ** (b) there is no read-lock on the table being modified and - ** (c) the cursor points at a valid row of an intKey table. - */ - if( !pCsr->wrFlag ){ - return SQLITE_READONLY; - } - assert( !pCsr->pBt->readOnly - && pCsr->pBt->inTransaction==TRANS_WRITE ); - if( checkReadLocks(pCsr->pBtree, pCsr->pgnoRoot, pCsr) ){ - return SQLITE_LOCKED; /* The table pCur points to has a read lock */ - } - if( pCsr->eState==CURSOR_INVALID || !pCsr->pPage->intKey ){ - return SQLITE_ERROR; - } - - return accessPayload(pCsr, offset, amt, (unsigned char *)z, 0, 1); -} - -/* -** Set a flag on this cursor to cache the locations of pages from the -** overflow list for the current row. This is used by cursors opened -** for incremental blob IO only. -** -** This function sets a flag only. The actual page location cache -** (stored in BtCursor.aOverflow[]) is allocated and used by function -** accessPayload() (the worker function for sqlite3BtreeData() and -** sqlite3BtreePutData()). -*/ -void sqlite3BtreeCacheOverflow(BtCursor *pCur){ - assert( cursorHoldsMutex(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->pSqlite->mutex) ); - assert(!pCur->isIncrblobHandle); - assert(!pCur->aOverflow); - pCur->isIncrblobHandle = 1; -} -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btree.h b/libraries/sqlite/unix/sqlite-3.5.1/src/btree.h deleted file mode 100644 index f7bc8e12d9..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/btree.h +++ /dev/null @@ -1,204 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite B-Tree file -** subsystem. See comments in the source code for a detailed description -** of what each interface routine does. -** -** @(#) $Id: btree.h,v 1.93 2007/09/03 15:19:35 drh Exp $ -*/ -#ifndef _BTREE_H_ -#define _BTREE_H_ - -/* TODO: This definition is just included so other modules compile. It -** needs to be revisited. -*/ -#define SQLITE_N_BTREE_META 10 - -/* -** If defined as non-zero, auto-vacuum is enabled by default. Otherwise -** it must be turned on for each database using "PRAGMA auto_vacuum = 1". -*/ -#ifndef SQLITE_DEFAULT_AUTOVACUUM - #define SQLITE_DEFAULT_AUTOVACUUM 0 -#endif - -#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ -#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ -#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ - -/* -** Forward declarations of structure -*/ -typedef struct Btree Btree; -typedef struct BtCursor BtCursor; -typedef struct BtShared BtShared; -typedef struct BtreeMutexArray BtreeMutexArray; - -/* -** This structure records all of the Btrees that need to hold -** a mutex before we enter sqlite3VdbeExec(). The Btrees are -** are placed in aBtree[] in order of aBtree[]->pBt. That way, -** we can always lock and unlock them all quickly. -*/ -struct BtreeMutexArray { - int nMutex; - Btree *aBtree[SQLITE_MAX_ATTACHED+1]; -}; - - -int sqlite3BtreeOpen( - const char *zFilename, /* Name of database file to open */ - sqlite3 *db, /* Associated database connection */ - Btree **, /* Return open Btree* here */ - int flags, /* Flags */ - int vfsFlags /* Flags passed through to VFS open */ -); - -/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the -** following values. -** -** NOTE: These values must match the corresponding PAGER_ values in -** pager.h. -*/ -#define BTREE_OMIT_JOURNAL 1 /* Do not use journal. No argument */ -#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */ -#define BTREE_MEMORY 4 /* In-memory DB. No argument */ -#define BTREE_READONLY 8 /* Open the database in read-only mode */ -#define BTREE_READWRITE 16 /* Open for both reading and writing */ -#define BTREE_CREATE 32 /* Create the database if it does not exist */ - -/* Additional values for the 4th argument of sqlite3BtreeOpen that -** are not associated with PAGER_ values. -*/ -#define BTREE_PRIVATE 64 /* Never share with other connections */ - -int sqlite3BtreeClose(Btree*); -int sqlite3BtreeSetBusyHandler(Btree*,BusyHandler*); -int sqlite3BtreeSetCacheSize(Btree*,int); -int sqlite3BtreeSetSafetyLevel(Btree*,int,int); -int sqlite3BtreeSyncDisabled(Btree*); -int sqlite3BtreeSetPageSize(Btree*,int,int); -int sqlite3BtreeGetPageSize(Btree*); -int sqlite3BtreeMaxPageCount(Btree*,int); -int sqlite3BtreeGetReserve(Btree*); -int sqlite3BtreeSetAutoVacuum(Btree *, int); -int sqlite3BtreeGetAutoVacuum(Btree *); -int sqlite3BtreeBeginTrans(Btree*,int); -int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); -int sqlite3BtreeCommitPhaseTwo(Btree*); -int sqlite3BtreeCommit(Btree*); -int sqlite3BtreeRollback(Btree*); -int sqlite3BtreeBeginStmt(Btree*); -int sqlite3BtreeCommitStmt(Btree*); -int sqlite3BtreeRollbackStmt(Btree*); -int sqlite3BtreeCreateTable(Btree*, int*, int flags); -int sqlite3BtreeIsInTrans(Btree*); -int sqlite3BtreeIsInStmt(Btree*); -int sqlite3BtreeIsInReadTrans(Btree*); -void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); -int sqlite3BtreeSchemaLocked(Btree *); -int sqlite3BtreeLockTable(Btree *, int, u8); - -const char *sqlite3BtreeGetFilename(Btree *); -const char *sqlite3BtreeGetDirname(Btree *); -const char *sqlite3BtreeGetJournalname(Btree *); -int sqlite3BtreeCopyFile(Btree *, Btree *); - -int sqlite3BtreeIncrVacuum(Btree *); - -/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR -** of the following flags: -*/ -#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ -#define BTREE_ZERODATA 2 /* Table has keys only - no data */ -#define BTREE_LEAFDATA 4 /* Data stored in leaves only. Implies INTKEY */ - -int sqlite3BtreeDropTable(Btree*, int, int*); -int sqlite3BtreeClearTable(Btree*, int); -int sqlite3BtreeGetMeta(Btree*, int idx, u32 *pValue); -int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); -void sqlite3BtreeTripAllCursors(Btree*, int); - -int sqlite3BtreeCursor( - Btree*, /* BTree containing table to open */ - int iTable, /* Index of root page */ - int wrFlag, /* 1 for writing. 0 for read-only */ - int(*)(void*,int,const void*,int,const void*), /* Key comparison function */ - void*, /* First argument to compare function */ - BtCursor **ppCursor /* Returned cursor */ -); - -int sqlite3BtreeCloseCursor(BtCursor*); -int sqlite3BtreeMoveto(BtCursor*,const void *pKey,i64 nKey,int bias,int *pRes); -int sqlite3BtreeDelete(BtCursor*); -int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, - const void *pData, int nData, - int nZero, int bias); -int sqlite3BtreeFirst(BtCursor*, int *pRes); -int sqlite3BtreeLast(BtCursor*, int *pRes); -int sqlite3BtreeNext(BtCursor*, int *pRes); -int sqlite3BtreeEof(BtCursor*); -int sqlite3BtreeFlags(BtCursor*); -int sqlite3BtreePrevious(BtCursor*, int *pRes); -int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); -int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); -sqlite3 *sqlite3BtreeCursorDb(const BtCursor*); -const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); -const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); -int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); -int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); - -char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); -struct Pager *sqlite3BtreePager(Btree*); - -int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); -void sqlite3BtreeCacheOverflow(BtCursor *); - -#ifdef SQLITE_TEST -int sqlite3BtreeCursorInfo(BtCursor*, int*, int); -void sqlite3BtreeCursorList(Btree*); -int sqlite3BtreePageDump(Btree*, int, int recursive); -#endif - -/* -** If we are not using shared cache, then there is no need to -** use mutexes to access the BtShared structures. So make the -** Enter and Leave procedures no-ops. -*/ -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE - void sqlite3BtreeEnter(Btree*); - void sqlite3BtreeLeave(Btree*); - int sqlite3BtreeHoldsMutex(Btree*); - void sqlite3BtreeEnterCursor(BtCursor*); - void sqlite3BtreeLeaveCursor(BtCursor*); - void sqlite3BtreeEnterAll(sqlite3*); - void sqlite3BtreeLeaveAll(sqlite3*); - int sqlite3BtreeHoldsAllMutexes(sqlite3*); - void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*); - void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*); - void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*); -#else -# define sqlite3BtreeEnter(X) -# define sqlite3BtreeLeave(X) -# define sqlite3BtreeHoldsMutex(X) 1 -# define sqlite3BtreeEnterCursor(X) -# define sqlite3BtreeLeaveCursor(X) -# define sqlite3BtreeEnterAll(X) -# define sqlite3BtreeLeaveAll(X) -# define sqlite3BtreeHoldsAllMutexes(X) 1 -# define sqlite3BtreeMutexArrayEnter(X) -# define sqlite3BtreeMutexArrayLeave(X) -# define sqlite3BtreeMutexArrayInsert(X,Y) -#endif - - -#endif /* _BTREE_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h b/libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h deleted file mode 100644 index 09f1474239..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/btreeInt.h +++ /dev/null @@ -1,648 +0,0 @@ -/* -** 2004 April 6 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** $Id: btreeInt.h,v 1.13 2007/08/30 01:19:59 drh Exp $ -** -** This file implements a external (disk-based) database using BTrees. -** For a detailed discussion of BTrees, refer to -** -** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: -** "Sorting And Searching", pages 473-480. Addison-Wesley -** Publishing Company, Reading, Massachusetts. -** -** The basic idea is that each page of the file contains N database -** entries and N+1 pointers to subpages. -** -** ---------------------------------------------------------------- -** | Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) | -** ---------------------------------------------------------------- -** -** All of the keys on the page that Ptr(0) points to have values less -** than Key(0). All of the keys on page Ptr(1) and its subpages have -** values greater than Key(0) and less than Key(1). All of the keys -** on Ptr(N) and its subpages have values greater than Key(N-1). And -** so forth. -** -** Finding a particular key requires reading O(log(M)) pages from the -** disk where M is the number of entries in the tree. -** -** In this implementation, a single file can hold one or more separate -** BTrees. Each BTree is identified by the index of its root page. The -** key and data for any entry are combined to form the "payload". A -** fixed amount of payload can be carried directly on the database -** page. If the payload is larger than the preset amount then surplus -** bytes are stored on overflow pages. The payload for an entry -** and the preceding pointer are combined to form a "Cell". Each -** page has a small header which contains the Ptr(N) pointer and other -** information such as the size of key and data. -** -** FORMAT DETAILS -** -** The file is divided into pages. The first page is called page 1, -** the second is page 2, and so forth. A page number of zero indicates -** "no such page". The page size can be anything between 512 and 65536. -** Each page can be either a btree page, a freelist page or an overflow -** page. -** -** The first page is always a btree page. The first 100 bytes of the first -** page contain a special header (the "file header") that describes the file. -** The format of the file header is as follows: -** -** OFFSET SIZE DESCRIPTION -** 0 16 Header string: "SQLite format 3\000" -** 16 2 Page size in bytes. -** 18 1 File format write version -** 19 1 File format read version -** 20 1 Bytes of unused space at the end of each page -** 21 1 Max embedded payload fraction -** 22 1 Min embedded payload fraction -** 23 1 Min leaf payload fraction -** 24 4 File change counter -** 28 4 Reserved for future use -** 32 4 First freelist page -** 36 4 Number of freelist pages in the file -** 40 60 15 4-byte meta values passed to higher layers -** -** All of the integer values are big-endian (most significant byte first). -** -** The file change counter is incremented when the database is changed -** This counter allows other processes to know when the file has changed -** and thus when they need to flush their cache. -** -** The max embedded payload fraction is the amount of the total usable -** space in a page that can be consumed by a single cell for standard -** B-tree (non-LEAFDATA) tables. A value of 255 means 100%. The default -** is to limit the maximum cell size so that at least 4 cells will fit -** on one page. Thus the default max embedded payload fraction is 64. -** -** If the payload for a cell is larger than the max payload, then extra -** payload is spilled to overflow pages. Once an overflow page is allocated, -** as many bytes as possible are moved into the overflow pages without letting -** the cell size drop below the min embedded payload fraction. -** -** The min leaf payload fraction is like the min embedded payload fraction -** except that it applies to leaf nodes in a LEAFDATA tree. The maximum -** payload fraction for a LEAFDATA tree is always 100% (or 255) and it -** not specified in the header. -** -** Each btree pages is divided into three sections: The header, the -** cell pointer array, and the cell content area. Page 1 also has a 100-byte -** file header that occurs before the page header. -** -** |----------------| -** | file header | 100 bytes. Page 1 only. -** |----------------| -** | page header | 8 bytes for leaves. 12 bytes for interior nodes -** |----------------| -** | cell pointer | | 2 bytes per cell. Sorted order. -** | array | | Grows downward -** | | v -** |----------------| -** | unallocated | -** | space | -** |----------------| ^ Grows upwards -** | cell content | | Arbitrary order interspersed with freeblocks. -** | area | | and free space fragments. -** |----------------| -** -** The page headers looks like this: -** -** OFFSET SIZE DESCRIPTION -** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf -** 1 2 byte offset to the first freeblock -** 3 2 number of cells on this page -** 5 2 first byte of the cell content area -** 7 1 number of fragmented free bytes -** 8 4 Right child (the Ptr(N) value). Omitted on leaves. -** -** The flags define the format of this btree page. The leaf flag means that -** this page has no children. The zerodata flag means that this page carries -** only keys and no data. The intkey flag means that the key is a integer -** which is stored in the key size entry of the cell header rather than in -** the payload area. -** -** The cell pointer array begins on the first byte after the page header. -** The cell pointer array contains zero or more 2-byte numbers which are -** offsets from the beginning of the page to the cell content in the cell -** content area. The cell pointers occur in sorted order. The system strives -** to keep free space after the last cell pointer so that new cells can -** be easily added without having to defragment the page. -** -** Cell content is stored at the very end of the page and grows toward the -** beginning of the page. -** -** Unused space within the cell content area is collected into a linked list of -** freeblocks. Each freeblock is at least 4 bytes in size. The byte offset -** to the first freeblock is given in the header. Freeblocks occur in -** increasing order. Because a freeblock must be at least 4 bytes in size, -** any group of 3 or fewer unused bytes in the cell content area cannot -** exist on the freeblock chain. A group of 3 or fewer free bytes is called -** a fragment. The total number of bytes in all fragments is recorded. -** in the page header at offset 7. -** -** SIZE DESCRIPTION -** 2 Byte offset of the next freeblock -** 2 Bytes in this freeblock -** -** Cells are of variable length. Cells are stored in the cell content area at -** the end of the page. Pointers to the cells are in the cell pointer array -** that immediately follows the page header. Cells is not necessarily -** contiguous or in order, but cell pointers are contiguous and in order. -** -** Cell content makes use of variable length integers. A variable -** length integer is 1 to 9 bytes where the lower 7 bits of each -** byte are used. The integer consists of all bytes that have bit 8 set and -** the first byte with bit 8 clear. The most significant byte of the integer -** appears first. A variable-length integer may not be more than 9 bytes long. -** As a special case, all 8 bytes of the 9th byte are used as data. This -** allows a 64-bit integer to be encoded in 9 bytes. -** -** 0x00 becomes 0x00000000 -** 0x7f becomes 0x0000007f -** 0x81 0x00 becomes 0x00000080 -** 0x82 0x00 becomes 0x00000100 -** 0x80 0x7f becomes 0x0000007f -** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678 -** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081 -** -** Variable length integers are used for rowids and to hold the number of -** bytes of key and data in a btree cell. -** -** The content of a cell looks like this: -** -** SIZE DESCRIPTION -** 4 Page number of the left child. Omitted if leaf flag is set. -** var Number of bytes of data. Omitted if the zerodata flag is set. -** var Number of bytes of key. Or the key itself if intkey flag is set. -** * Payload -** 4 First page of the overflow chain. Omitted if no overflow -** -** Overflow pages form a linked list. Each page except the last is completely -** filled with data (pagesize - 4 bytes). The last page can have as little -** as 1 byte of data. -** -** SIZE DESCRIPTION -** 4 Page number of next overflow page -** * Data -** -** Freelist pages come in two subtypes: trunk pages and leaf pages. The -** file header points to the first in a linked list of trunk page. Each trunk -** page points to multiple leaf pages. The content of a leaf page is -** unspecified. A trunk page looks like this: -** -** SIZE DESCRIPTION -** 4 Page number of next trunk page -** 4 Number of leaf pointers on this page -** * zero or more pages numbers of leaves -*/ -#include "sqliteInt.h" -#include "pager.h" -#include "btree.h" -#include "os.h" -#include - -/* Round up a number to the next larger multiple of 8. This is used -** to force 8-byte alignment on 64-bit architectures. -*/ -#define ROUND8(x) ((x+7)&~7) - - -/* The following value is the maximum cell size assuming a maximum page -** size give above. -*/ -#define MX_CELL_SIZE(pBt) (pBt->pageSize-8) - -/* The maximum number of cells on a single page of the database. This -** assumes a minimum cell size of 3 bytes. Such small cells will be -** exceedingly rare, but they are possible. -*/ -#define MX_CELL(pBt) ((pBt->pageSize-8)/3) - -/* Forward declarations */ -typedef struct MemPage MemPage; -typedef struct BtLock BtLock; - -/* -** This is a magic string that appears at the beginning of every -** SQLite database in order to identify the file as a real database. -** -** You can change this value at compile-time by specifying a -** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The -** header must be exactly 16 bytes including the zero-terminator so -** the string itself should be 15 characters long. If you change -** the header, then your custom library will not be able to read -** databases generated by the standard tools and the standard tools -** will not be able to read databases created by your custom library. -*/ -#ifndef SQLITE_FILE_HEADER /* 123456789 123456 */ -# define SQLITE_FILE_HEADER "SQLite format 3" -#endif - -/* -** Page type flags. An ORed combination of these flags appear as the -** first byte of on-disk image of every BTree page. -*/ -#define PTF_INTKEY 0x01 -#define PTF_ZERODATA 0x02 -#define PTF_LEAFDATA 0x04 -#define PTF_LEAF 0x08 - -/* -** As each page of the file is loaded into memory, an instance of the following -** structure is appended and initialized to zero. This structure stores -** information about the page that is decoded from the raw file page. -** -** The pParent field points back to the parent page. This allows us to -** walk up the BTree from any leaf to the root. Care must be taken to -** unref() the parent page pointer when this page is no longer referenced. -** The pageDestructor() routine handles that chore. -** -** Access to all fields of this structure is controlled by the mutex -** stored in MemPage.pBt->mutex. -*/ -struct MemPage { - u8 isInit; /* True if previously initialized. MUST BE FIRST! */ - u8 idxShift; /* True if Cell indices have changed */ - u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ - u8 intKey; /* True if intkey flag is set */ - u8 leaf; /* True if leaf flag is set */ - u8 zeroData; /* True if table stores keys only */ - u8 leafData; /* True if tables stores data on leaves only */ - u8 hasData; /* True if this page stores data */ - u8 hdrOffset; /* 100 for page 1. 0 otherwise */ - u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ - u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ - u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ - u16 cellOffset; /* Index in aData of first cell pointer */ - u16 idxParent; /* Index in parent of this node */ - u16 nFree; /* Number of free bytes on the page */ - u16 nCell; /* Number of cells on this page, local and ovfl */ - struct _OvflCell { /* Cells that will not fit on aData[] */ - u8 *pCell; /* Pointers to the body of the overflow cell */ - u16 idx; /* Insert this cell before idx-th non-overflow cell */ - } aOvfl[5]; - BtShared *pBt; /* Pointer to BtShared that this page is part of */ - u8 *aData; /* Pointer to disk image of the page data */ - DbPage *pDbPage; /* Pager page handle */ - Pgno pgno; /* Page number for this page */ - MemPage *pParent; /* The parent of this page. NULL for root */ -}; - -/* -** The in-memory image of a disk page has the auxiliary information appended -** to the end. EXTRA_SIZE is the number of bytes of space needed to hold -** that extra information. -*/ -#define EXTRA_SIZE sizeof(MemPage) - -/* A Btree handle -** -** A database connection contains a pointer to an instance of -** this object for every database file that it has open. This structure -** is opaque to the database connection. The database connection cannot -** see the internals of this structure and only deals with pointers to -** this structure. -** -** For some database files, the same underlying database cache might be -** shared between multiple connections. In that case, each contection -** has it own pointer to this object. But each instance of this object -** points to the same BtShared object. The database cache and the -** schema associated with the database file are all contained within -** the BtShared object. -** -** All fields in this structure are accessed under sqlite3.mutex. -** The pBt pointer itself may not be changed while there exists cursors -** in the referenced BtShared that point back to this Btree since those -** cursors have to do go through this Btree to find their BtShared and -** they often do so without holding sqlite3.mutex. -*/ -struct Btree { - sqlite3 *pSqlite; /* The database connection holding this btree */ - BtShared *pBt; /* Sharable content of this btree */ - u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */ - u8 sharable; /* True if we can share pBt with other pSqlite */ - u8 locked; /* True if pSqlite currently has pBt locked */ - int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */ - Btree *pNext; /* List of other sharable Btrees from the same pSqlite */ - Btree *pPrev; /* Back pointer of the same list */ -}; - -/* -** Btree.inTrans may take one of the following values. -** -** If the shared-data extension is enabled, there may be multiple users -** of the Btree structure. At most one of these may open a write transaction, -** but any number may have active read transactions. -*/ -#define TRANS_NONE 0 -#define TRANS_READ 1 -#define TRANS_WRITE 2 - -/* -** An instance of this object represents a single database file. -** -** A single database file can be in use as the same time by two -** or more database connections. When two or more connections are -** sharing the same database file, each connection has it own -** private Btree object for the file and each of those Btrees points -** to this one BtShared object. BtShared.nRef is the number of -** connections currently sharing this database file. -** -** Fields in this structure are accessed under the BtShared.mutex -** mutex, except for nRef and pNext which are accessed under the -** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field -** may not be modified once it is initially set as long as nRef>0. -** The pSchema field may be set once under BtShared.mutex and -** thereafter is unchanged as long as nRef>0. -*/ -struct BtShared { - Pager *pPager; /* The page cache */ - BtCursor *pCursor; /* A list of all open cursors */ - MemPage *pPage1; /* First page of the database */ - u8 inStmt; /* True if we are in a statement subtransaction */ - u8 readOnly; /* True if the underlying file is readonly */ - u8 maxEmbedFrac; /* Maximum payload as % of total page size */ - u8 minEmbedFrac; /* Minimum payload as % of total page size */ - u8 minLeafFrac; /* Minimum leaf payload as % of total page size */ - u8 pageSizeFixed; /* True if the page size can no longer be changed */ -#ifndef SQLITE_OMIT_AUTOVACUUM - u8 autoVacuum; /* True if auto-vacuum is enabled */ - u8 incrVacuum; /* True if incr-vacuum is enabled */ - Pgno nTrunc; /* Non-zero if the db will be truncated (incr vacuum) */ -#endif - u16 pageSize; /* Total number of bytes on a page */ - u16 usableSize; /* Number of usable bytes on each page */ - int maxLocal; /* Maximum local payload in non-LEAFDATA tables */ - int minLocal; /* Minimum local payload in non-LEAFDATA tables */ - int maxLeaf; /* Maximum local payload in a LEAFDATA table */ - int minLeaf; /* Minimum local payload in a LEAFDATA table */ - BusyHandler *pBusyHandler; /* Callback for when there is lock contention */ - u8 inTransaction; /* Transaction state */ - int nTransaction; /* Number of open transactions (read + write) */ - void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */ - void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */ - sqlite3_mutex *mutex; /* Non-recursive mutex required to access this struct */ -#ifndef SQLITE_OMIT_SHARED_CACHE - int nRef; /* Number of references to this structure */ - BtShared *pNext; /* Next on a list of sharable BtShared structs */ - BtLock *pLock; /* List of locks held on this shared-btree struct */ -#endif -}; - -/* -** An instance of the following structure is used to hold information -** about a cell. The parseCellPtr() function fills in this structure -** based on information extract from the raw disk page. -*/ -typedef struct CellInfo CellInfo; -struct CellInfo { - u8 *pCell; /* Pointer to the start of cell content */ - i64 nKey; /* The key for INTKEY tables, or number of bytes in key */ - u32 nData; /* Number of bytes of data */ - u32 nPayload; /* Total amount of payload */ - u16 nHeader; /* Size of the cell content header in bytes */ - u16 nLocal; /* Amount of payload held locally */ - u16 iOverflow; /* Offset to overflow page number. Zero if no overflow */ - u16 nSize; /* Size of the cell content on the main b-tree page */ -}; - -/* -** A cursor is a pointer to a particular entry within a particular -** b-tree within a database file. -** -** The entry is identified by its MemPage and the index in -** MemPage.aCell[] of the entry. -** -** When a single database file can shared by two more database connections, -** but cursors cannot be shared. Each cursor is associated with a -** particular database connection identified BtCursor.pBtree.pSqlite. -** -** Fields in this structure are accessed under the BtShared.mutex -** found at self->pBt->mutex. -*/ -struct BtCursor { - Btree *pBtree; /* The Btree to which this cursor belongs */ - BtShared *pBt; /* The BtShared this cursor points to */ - BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */ - int (*xCompare)(void*,int,const void*,int,const void*); /* Key comp func */ - void *pArg; /* First arg to xCompare() */ - Pgno pgnoRoot; /* The root page of this tree */ - MemPage *pPage; /* Page that contains the entry */ - int idx; /* Index of the entry in pPage->aCell[] */ - CellInfo info; /* A parse of the cell we are pointing at */ - u8 wrFlag; /* True if writable */ - u8 eState; /* One of the CURSOR_XXX constants (see below) */ - void *pKey; /* Saved key that was cursor's last known position */ - i64 nKey; /* Size of pKey, or last integer key */ - int skip; /* (skip<0) -> Prev() is a no-op. (skip>0) -> Next() is */ -#ifndef SQLITE_OMIT_INCRBLOB - u8 isIncrblobHandle; /* True if this cursor is an incr. io handle */ - Pgno *aOverflow; /* Cache of overflow page locations */ -#endif -}; - -/* -** Potential values for BtCursor.eState. -** -** CURSOR_VALID: -** Cursor points to a valid entry. getPayload() etc. may be called. -** -** CURSOR_INVALID: -** Cursor does not point to a valid entry. This can happen (for example) -** because the table is empty or because BtreeCursorFirst() has not been -** called. -** -** CURSOR_REQUIRESEEK: -** The table that this cursor was opened on still exists, but has been -** modified since the cursor was last used. The cursor position is saved -** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in -** this state, restoreOrClearCursorPosition() can be called to attempt to -** seek the cursor to the saved position. -** -** CURSOR_FAULT: -** A unrecoverable error (an I/O error or a malloc failure) has occurred -** on a different connection that shares the BtShared cache with this -** cursor. The error has left the cache in an inconsistent state. -** Do nothing else with this cursor. Any attempt to use the cursor -** should return the error code stored in BtCursor.skip -*/ -#define CURSOR_INVALID 0 -#define CURSOR_VALID 1 -#define CURSOR_REQUIRESEEK 2 -#define CURSOR_FAULT 3 - -/* -** The TRACE macro will print high-level status information about the -** btree operation when the global variable sqlite3_btree_trace is -** enabled. -*/ -#if SQLITE_TEST -# define TRACE(X) if( sqlite3_btree_trace ){ printf X; fflush(stdout); } -#else -# define TRACE(X) -#endif - -/* -** Routines to read and write variable-length integers. These used to -** be defined locally, but now we use the varint routines in the util.c -** file. -*/ -#define getVarint sqlite3GetVarint -#define getVarint32(A,B) ((*B=*(A))<=0x7f?1:sqlite3GetVarint32(A,B)) -#define putVarint sqlite3PutVarint - -/* The database page the PENDING_BYTE occupies. This page is never used. -** TODO: This macro is very similary to PAGER_MJ_PGNO() in pager.c. They -** should possibly be consolidated (presumably in pager.h). -** -** If disk I/O is omitted (meaning that the database is stored purely -** in memory) then there is no pending byte. -*/ -#ifdef SQLITE_OMIT_DISKIO -# define PENDING_BYTE_PAGE(pBt) 0x7fffffff -#else -# define PENDING_BYTE_PAGE(pBt) ((PENDING_BYTE/(pBt)->pageSize)+1) -#endif - -/* -** A linked list of the following structures is stored at BtShared.pLock. -** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor -** is opened on the table with root page BtShared.iTable. Locks are removed -** from this list when a transaction is committed or rolled back, or when -** a btree handle is closed. -*/ -struct BtLock { - Btree *pBtree; /* Btree handle holding this lock */ - Pgno iTable; /* Root page of table */ - u8 eLock; /* READ_LOCK or WRITE_LOCK */ - BtLock *pNext; /* Next in BtShared.pLock list */ -}; - -/* Candidate values for BtLock.eLock */ -#define READ_LOCK 1 -#define WRITE_LOCK 2 - -/* -** These macros define the location of the pointer-map entry for a -** database page. The first argument to each is the number of usable -** bytes on each page of the database (often 1024). The second is the -** page number to look up in the pointer map. -** -** PTRMAP_PAGENO returns the database page number of the pointer-map -** page that stores the required pointer. PTRMAP_PTROFFSET returns -** the offset of the requested map entry. -** -** If the pgno argument passed to PTRMAP_PAGENO is a pointer-map page, -** then pgno is returned. So (pgno==PTRMAP_PAGENO(pgsz, pgno)) can be -** used to test if pgno is a pointer-map page. PTRMAP_ISPAGE implements -** this test. -*/ -#define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno) -#define PTRMAP_PTROFFSET(pBt, pgno) (5*(pgno-ptrmapPageno(pBt, pgno)-1)) -#define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno)) - -/* -** The pointer map is a lookup table that identifies the parent page for -** each child page in the database file. The parent page is the page that -** contains a pointer to the child. Every page in the database contains -** 0 or 1 parent pages. (In this context 'database page' refers -** to any page that is not part of the pointer map itself.) Each pointer map -** entry consists of a single byte 'type' and a 4 byte parent page number. -** The PTRMAP_XXX identifiers below are the valid types. -** -** The purpose of the pointer map is to facility moving pages from one -** position in the file to another as part of autovacuum. When a page -** is moved, the pointer in its parent must be updated to point to the -** new location. The pointer map is used to locate the parent page quickly. -** -** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not -** used in this case. -** -** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number -** is not used in this case. -** -** PTRMAP_OVERFLOW1: The database page is the first page in a list of -** overflow pages. The page number identifies the page that -** contains the cell with a pointer to this overflow page. -** -** PTRMAP_OVERFLOW2: The database page is the second or later page in a list of -** overflow pages. The page-number identifies the previous -** page in the overflow page list. -** -** PTRMAP_BTREE: The database page is a non-root btree page. The page number -** identifies the parent page in the btree. -*/ -#define PTRMAP_ROOTPAGE 1 -#define PTRMAP_FREEPAGE 2 -#define PTRMAP_OVERFLOW1 3 -#define PTRMAP_OVERFLOW2 4 -#define PTRMAP_BTREE 5 - -/* A bunch of assert() statements to check the transaction state variables -** of handle p (type Btree*) are internally consistent. -*/ -#define btreeIntegrity(p) \ - assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \ - assert( p->pBt->inTransaction>=p->inTrans ); - - -/* -** The ISAUTOVACUUM macro is used within balance_nonroot() to determine -** if the database supports auto-vacuum or not. Because it is used -** within an expression that is an argument to another macro -** (sqliteMallocRaw), it is not possible to use conditional compilation. -** So, this macro is defined instead. -*/ -#ifndef SQLITE_OMIT_AUTOVACUUM -#define ISAUTOVACUUM (pBt->autoVacuum) -#else -#define ISAUTOVACUUM 0 -#endif - - -/* -** This structure is passed around through all the sanity checking routines -** in order to keep track of some global state information. -*/ -typedef struct IntegrityCk IntegrityCk; -struct IntegrityCk { - BtShared *pBt; /* The tree being checked out */ - Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ - int nPage; /* Number of pages in the database */ - int *anRef; /* Number of times each page is referenced */ - int mxErr; /* Stop accumulating errors when this reaches zero */ - char *zErrMsg; /* An error message. NULL if no errors seen. */ - int nErr; /* Number of messages written to zErrMsg so far */ -}; - -/* -** Read or write a two- and four-byte big-endian integer values. -*/ -#define get2byte(x) ((x)[0]<<8 | (x)[1]) -#define put2byte(p,v) ((p)[0] = (v)>>8, (p)[1] = (v)) -#define get4byte sqlite3Get4byte -#define put4byte sqlite3Put4byte - -/* -** Internal routines that should be accessed by the btree layer only. -*/ -int sqlite3BtreeGetPage(BtShared*, Pgno, MemPage**, int); -int sqlite3BtreeInitPage(MemPage *pPage, MemPage *pParent); -void sqlite3BtreeParseCellPtr(MemPage*, u8*, CellInfo*); -void sqlite3BtreeParseCell(MemPage*, int, CellInfo*); -#ifdef SQLITE_TEST -u8 *sqlite3BtreeFindCell(MemPage *pPage, int iCell); -#endif -int sqlite3BtreeRestoreOrClearCursorPosition(BtCursor *pCur); -void sqlite3BtreeGetTempCursor(BtCursor *pCur, BtCursor *pTempCur); -void sqlite3BtreeReleaseTempCursor(BtCursor *pCur); -int sqlite3BtreeIsRootPage(MemPage *pPage); -void sqlite3BtreeMoveToParent(BtCursor *pCur); diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/build.c b/libraries/sqlite/unix/sqlite-3.5.1/src/build.c deleted file mode 100644 index f46d28ee1e..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/build.c +++ /dev/null @@ -1,3409 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains C code routines that are called by the SQLite parser -** when syntax rules are reduced. The routines in this file handle the -** following kinds of SQL syntax: -** -** CREATE TABLE -** DROP TABLE -** CREATE INDEX -** DROP INDEX -** creating ID lists -** BEGIN TRANSACTION -** COMMIT -** ROLLBACK -** -** $Id: build.c,v 1.444 2007/09/03 15:19:35 drh Exp $ -*/ -#include "sqliteInt.h" -#include - -/* -** This routine is called when a new SQL statement is beginning to -** be parsed. Initialize the pParse structure as needed. -*/ -void sqlite3BeginParse(Parse *pParse, int explainFlag){ - pParse->explain = explainFlag; - pParse->nVar = 0; -} - -#ifndef SQLITE_OMIT_SHARED_CACHE -/* -** The TableLock structure is only used by the sqlite3TableLock() and -** codeTableLocks() functions. -*/ -struct TableLock { - int iDb; /* The database containing the table to be locked */ - int iTab; /* The root page of the table to be locked */ - u8 isWriteLock; /* True for write lock. False for a read lock */ - const char *zName; /* Name of the table */ -}; - -/* -** Record the fact that we want to lock a table at run-time. -** -** The table to be locked has root page iTab and is found in database iDb. -** A read or a write lock can be taken depending on isWritelock. -** -** This routine just records the fact that the lock is desired. The -** code to make the lock occur is generated by a later call to -** codeTableLocks() which occurs during sqlite3FinishCoding(). -*/ -void sqlite3TableLock( - Parse *pParse, /* Parsing context */ - int iDb, /* Index of the database containing the table to lock */ - int iTab, /* Root page number of the table to be locked */ - u8 isWriteLock, /* True for a write lock */ - const char *zName /* Name of the table to be locked */ -){ - int i; - int nBytes; - TableLock *p; - - if( iDb<0 ){ - return; - } - - for(i=0; inTableLock; i++){ - p = &pParse->aTableLock[i]; - if( p->iDb==iDb && p->iTab==iTab ){ - p->isWriteLock = (p->isWriteLock || isWriteLock); - return; - } - } - - nBytes = sizeof(TableLock) * (pParse->nTableLock+1); - pParse->aTableLock = - sqlite3DbReallocOrFree(pParse->db, pParse->aTableLock, nBytes); - if( pParse->aTableLock ){ - p = &pParse->aTableLock[pParse->nTableLock++]; - p->iDb = iDb; - p->iTab = iTab; - p->isWriteLock = isWriteLock; - p->zName = zName; - }else{ - pParse->nTableLock = 0; - pParse->db->mallocFailed = 1; - } -} - -/* -** Code an OP_TableLock instruction for each table locked by the -** statement (configured by calls to sqlite3TableLock()). -*/ -static void codeTableLocks(Parse *pParse){ - int i; - Vdbe *pVdbe; - - if( 0==(pVdbe = sqlite3GetVdbe(pParse)) ){ - return; - } - - for(i=0; inTableLock; i++){ - TableLock *p = &pParse->aTableLock[i]; - int p1 = p->iDb; - if( p->isWriteLock ){ - p1 = -1*(p1+1); - } - sqlite3VdbeOp3(pVdbe, OP_TableLock, p1, p->iTab, p->zName, P3_STATIC); - } -} -#else - #define codeTableLocks(x) -#endif - -/* -** This routine is called after a single SQL statement has been -** parsed and a VDBE program to execute that statement has been -** prepared. This routine puts the finishing touches on the -** VDBE program and resets the pParse structure for the next -** parse. -** -** Note that if an error occurred, it might be the case that -** no VDBE code was generated. -*/ -void sqlite3FinishCoding(Parse *pParse){ - sqlite3 *db; - Vdbe *v; - - db = pParse->db; - if( db->mallocFailed ) return; - if( pParse->nested ) return; - if( !pParse->pVdbe ){ - if( pParse->rc==SQLITE_OK && pParse->nErr ){ - pParse->rc = SQLITE_ERROR; - return; - } - } - - /* Begin by generating some termination code at the end of the - ** vdbe program - */ - v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp(v, OP_Halt, 0, 0); - - /* The cookie mask contains one bit for each database file open. - ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are - ** set for each database that is used. Generate code to start a - ** transaction on each used database and to verify the schema cookie - ** on each used database. - */ - if( pParse->cookieGoto>0 ){ - u32 mask; - int iDb; - sqlite3VdbeJumpHere(v, pParse->cookieGoto-1); - for(iDb=0, mask=1; iDbnDb; mask<<=1, iDb++){ - if( (mask & pParse->cookieMask)==0 ) continue; - sqlite3VdbeUsesBtree(v, iDb); - sqlite3VdbeAddOp(v, OP_Transaction, iDb, (mask & pParse->writeMask)!=0); - sqlite3VdbeAddOp(v, OP_VerifyCookie, iDb, pParse->cookieValue[iDb]); - } -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( pParse->pVirtualLock ){ - char *vtab = (char *)pParse->pVirtualLock->pVtab; - sqlite3VdbeOp3(v, OP_VBegin, 0, 0, vtab, P3_VTAB); - } -#endif - - /* Once all the cookies have been verified and transactions opened, - ** obtain the required table-locks. This is a no-op unless the - ** shared-cache feature is enabled. - */ - codeTableLocks(pParse); - sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto); - } - -#ifndef SQLITE_OMIT_TRACE - /* Add a No-op that contains the complete text of the compiled SQL - ** statement as its P3 argument. This does not change the functionality - ** of the program. - ** - ** This is used to implement sqlite3_trace(). - */ - sqlite3VdbeOp3(v, OP_Noop, 0, 0, pParse->zSql, pParse->zTail-pParse->zSql); -#endif /* SQLITE_OMIT_TRACE */ - } - - - /* Get the VDBE program ready for execution - */ - if( v && pParse->nErr==0 && !db->mallocFailed ){ -#ifdef SQLITE_DEBUG - FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0; - sqlite3VdbeTrace(v, trace); -#endif - sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem+3, - pParse->nTab+3, pParse->explain); - pParse->rc = SQLITE_DONE; - pParse->colNamesSet = 0; - }else if( pParse->rc==SQLITE_OK ){ - pParse->rc = SQLITE_ERROR; - } - pParse->nTab = 0; - pParse->nMem = 0; - pParse->nSet = 0; - pParse->nVar = 0; - pParse->cookieMask = 0; - pParse->cookieGoto = 0; -} - -/* -** Run the parser and code generator recursively in order to generate -** code for the SQL statement given onto the end of the pParse context -** currently under construction. When the parser is run recursively -** this way, the final OP_Halt is not appended and other initialization -** and finalization steps are omitted because those are handling by the -** outermost parser. -** -** Not everything is nestable. This facility is designed to permit -** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use -** care if you decide to try to use this routine for some other purposes. -*/ -void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ - va_list ap; - char *zSql; -# define SAVE_SZ (sizeof(Parse) - offsetof(Parse,nVar)) - char saveBuf[SAVE_SZ]; - - if( pParse->nErr ) return; - assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ - va_start(ap, zFormat); - zSql = sqlite3VMPrintf(pParse->db, zFormat, ap); - va_end(ap); - if( zSql==0 ){ - pParse->db->mallocFailed = 1; - return; /* A malloc must have failed */ - } - pParse->nested++; - memcpy(saveBuf, &pParse->nVar, SAVE_SZ); - memset(&pParse->nVar, 0, SAVE_SZ); - sqlite3RunParser(pParse, zSql, 0); - sqlite3_free(zSql); - memcpy(&pParse->nVar, saveBuf, SAVE_SZ); - pParse->nested--; -} - -/* -** Locate the in-memory structure that describes a particular database -** table given the name of that table and (optionally) the name of the -** database containing the table. Return NULL if not found. -** -** If zDatabase is 0, all databases are searched for the table and the -** first matching table is returned. (No checking for duplicate table -** names is done.) The search order is TEMP first, then MAIN, then any -** auxiliary databases added using the ATTACH command. -** -** See also sqlite3LocateTable(). -*/ -Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ - Table *p = 0; - int i; - assert( zName!=0 ); - for(i=OMIT_TEMPDB; inDb; i++){ - int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ - if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; - p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, strlen(zName)+1); - if( p ) break; - } - return p; -} - -/* -** Locate the in-memory structure that describes a particular database -** table given the name of that table and (optionally) the name of the -** database containing the table. Return NULL if not found. Also leave an -** error message in pParse->zErrMsg. -** -** The difference between this routine and sqlite3FindTable() is that this -** routine leaves an error message in pParse->zErrMsg where -** sqlite3FindTable() does not. -*/ -Table *sqlite3LocateTable(Parse *pParse, const char *zName, const char *zDbase){ - Table *p; - - /* Read the database schema. If an error occurs, leave an error message - ** and code in pParse and return NULL. */ - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ - return 0; - } - - p = sqlite3FindTable(pParse->db, zName, zDbase); - if( p==0 ){ - if( zDbase ){ - sqlite3ErrorMsg(pParse, "no such table: %s.%s", zDbase, zName); - }else{ - sqlite3ErrorMsg(pParse, "no such table: %s", zName); - } - pParse->checkSchema = 1; - } - return p; -} - -/* -** Locate the in-memory structure that describes -** a particular index given the name of that index -** and the name of the database that contains the index. -** Return NULL if not found. -** -** If zDatabase is 0, all databases are searched for the -** table and the first matching index is returned. (No checking -** for duplicate index names is done.) The search order is -** TEMP first, then MAIN, then any auxiliary databases added -** using the ATTACH command. -*/ -Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ - Index *p = 0; - int i; - for(i=OMIT_TEMPDB; inDb; i++){ - int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ - Schema *pSchema = db->aDb[j].pSchema; - if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue; - assert( pSchema || (j==1 && !db->aDb[1].pBt) ); - if( pSchema ){ - p = sqlite3HashFind(&pSchema->idxHash, zName, strlen(zName)+1); - } - if( p ) break; - } - return p; -} - -/* -** Reclaim the memory used by an index -*/ -static void freeIndex(Index *p){ - sqlite3_free(p->zColAff); - sqlite3_free(p); -} - -/* -** Remove the given index from the index hash table, and free -** its memory structures. -** -** The index is removed from the database hash tables but -** it is not unlinked from the Table that it indexes. -** Unlinking from the Table must be done by the calling function. -*/ -static void sqliteDeleteIndex(Index *p){ - Index *pOld; - const char *zName = p->zName; - - pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName, strlen( zName)+1, 0); - assert( pOld==0 || pOld==p ); - freeIndex(p); -} - -/* -** For the index called zIdxName which is found in the database iDb, -** unlike that index from its Table then remove the index from -** the index hash table and free all memory structures associated -** with the index. -*/ -void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ - Index *pIndex; - int len; - Hash *pHash = &db->aDb[iDb].pSchema->idxHash; - - len = strlen(zIdxName); - pIndex = sqlite3HashInsert(pHash, zIdxName, len+1, 0); - if( pIndex ){ - if( pIndex->pTable->pIndex==pIndex ){ - pIndex->pTable->pIndex = pIndex->pNext; - }else{ - Index *p; - for(p=pIndex->pTable->pIndex; p && p->pNext!=pIndex; p=p->pNext){} - if( p && p->pNext==pIndex ){ - p->pNext = pIndex->pNext; - } - } - freeIndex(pIndex); - } - db->flags |= SQLITE_InternChanges; -} - -/* -** Erase all schema information from the in-memory hash tables of -** a single database. This routine is called to reclaim memory -** before the database closes. It is also called during a rollback -** if there were schema changes during the transaction or if a -** schema-cookie mismatch occurs. -** -** If iDb<=0 then reset the internal schema tables for all database -** files. If iDb>=2 then reset the internal schema for only the -** single file indicated. -*/ -void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ - int i, j; - - assert( iDb>=0 && iDbnDb ); - for(i=iDb; inDb; i++){ - Db *pDb = &db->aDb[i]; - if( pDb->pSchema ){ - sqlite3SchemaFree(pDb->pSchema); - } - if( iDb>0 ) return; - } - assert( iDb==0 ); - db->flags &= ~SQLITE_InternChanges; - - /* If one or more of the auxiliary database files has been closed, - ** then remove them from the auxiliary database list. We take the - ** opportunity to do this here since we have just deleted all of the - ** schema hash tables and therefore do not have to make any changes - ** to any of those tables. - */ - for(i=0; inDb; i++){ - struct Db *pDb = &db->aDb[i]; - if( pDb->pBt==0 ){ - if( pDb->pAux && pDb->xFreeAux ) pDb->xFreeAux(pDb->pAux); - pDb->pAux = 0; - } - } - for(i=j=2; inDb; i++){ - struct Db *pDb = &db->aDb[i]; - if( pDb->pBt==0 ){ - sqlite3_free(pDb->zName); - pDb->zName = 0; - continue; - } - if( jaDb[j] = db->aDb[i]; - } - j++; - } - memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j])); - db->nDb = j; - if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ - memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); - sqlite3_free(db->aDb); - db->aDb = db->aDbStatic; - } -} - -/* -** This routine is called when a commit occurs. -*/ -void sqlite3CommitInternalChanges(sqlite3 *db){ - db->flags &= ~SQLITE_InternChanges; -} - -/* -** Clear the column names from a table or view. -*/ -static void sqliteResetColumnNames(Table *pTable){ - int i; - Column *pCol; - assert( pTable!=0 ); - if( (pCol = pTable->aCol)!=0 ){ - for(i=0; inCol; i++, pCol++){ - sqlite3_free(pCol->zName); - sqlite3ExprDelete(pCol->pDflt); - sqlite3_free(pCol->zType); - sqlite3_free(pCol->zColl); - } - sqlite3_free(pTable->aCol); - } - pTable->aCol = 0; - pTable->nCol = 0; -} - -/* -** Remove the memory data structures associated with the given -** Table. No changes are made to disk by this routine. -** -** This routine just deletes the data structure. It does not unlink -** the table data structure from the hash table. Nor does it remove -** foreign keys from the sqlite.aFKey hash table. But it does destroy -** memory structures of the indices and foreign keys associated with -** the table. -*/ -void sqlite3DeleteTable(Table *pTable){ - Index *pIndex, *pNext; - FKey *pFKey, *pNextFKey; - - if( pTable==0 ) return; - - /* Do not delete the table until the reference count reaches zero. */ - pTable->nRef--; - if( pTable->nRef>0 ){ - return; - } - assert( pTable->nRef==0 ); - - /* Delete all indices associated with this table - */ - for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ - pNext = pIndex->pNext; - assert( pIndex->pSchema==pTable->pSchema ); - sqliteDeleteIndex(pIndex); - } - -#ifndef SQLITE_OMIT_FOREIGN_KEY - /* Delete all foreign keys associated with this table. The keys - ** should have already been unlinked from the pSchema->aFKey hash table - */ - for(pFKey=pTable->pFKey; pFKey; pFKey=pNextFKey){ - pNextFKey = pFKey->pNextFrom; - assert( sqlite3HashFind(&pTable->pSchema->aFKey, - pFKey->zTo, strlen(pFKey->zTo)+1)!=pFKey ); - sqlite3_free(pFKey); - } -#endif - - /* Delete the Table structure itself. - */ - sqliteResetColumnNames(pTable); - sqlite3_free(pTable->zName); - sqlite3_free(pTable->zColAff); - sqlite3SelectDelete(pTable->pSelect); -#ifndef SQLITE_OMIT_CHECK - sqlite3ExprDelete(pTable->pCheck); -#endif - sqlite3VtabClear(pTable); - sqlite3_free(pTable); -} - -/* -** Unlink the given table from the hash tables and the delete the -** table structure with all its indices and foreign keys. -*/ -void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ - Table *p; - FKey *pF1, *pF2; - Db *pDb; - - assert( db!=0 ); - assert( iDb>=0 && iDbnDb ); - assert( zTabName && zTabName[0] ); - pDb = &db->aDb[iDb]; - p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, strlen(zTabName)+1,0); - if( p ){ -#ifndef SQLITE_OMIT_FOREIGN_KEY - for(pF1=p->pFKey; pF1; pF1=pF1->pNextFrom){ - int nTo = strlen(pF1->zTo) + 1; - pF2 = sqlite3HashFind(&pDb->pSchema->aFKey, pF1->zTo, nTo); - if( pF2==pF1 ){ - sqlite3HashInsert(&pDb->pSchema->aFKey, pF1->zTo, nTo, pF1->pNextTo); - }else{ - while( pF2 && pF2->pNextTo!=pF1 ){ pF2=pF2->pNextTo; } - if( pF2 ){ - pF2->pNextTo = pF1->pNextTo; - } - } - } -#endif - sqlite3DeleteTable(p); - } - db->flags |= SQLITE_InternChanges; -} - -/* -** Given a token, return a string that consists of the text of that -** token with any quotations removed. Space to hold the returned string -** is obtained from sqliteMalloc() and must be freed by the calling -** function. -** -** Tokens are often just pointers into the original SQL text and so -** are not \000 terminated and are not persistent. The returned string -** is \000 terminated and is persistent. -*/ -char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ - char *zName; - if( pName ){ - zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n); - sqlite3Dequote(zName); - }else{ - zName = 0; - } - return zName; -} - -/* -** Open the sqlite_master table stored in database number iDb for -** writing. The table is opened using cursor 0. -*/ -void sqlite3OpenMasterTable(Parse *p, int iDb){ - Vdbe *v = sqlite3GetVdbe(p); - sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb)); - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - sqlite3VdbeAddOp(v, OP_OpenWrite, 0, MASTER_ROOT); - sqlite3VdbeAddOp(v, OP_SetNumColumns, 0, 5); /* sqlite_master has 5 columns */ -} - -/* -** The token *pName contains the name of a database (either "main" or -** "temp" or the name of an attached db). This routine returns the -** index of the named database in db->aDb[], or -1 if the named db -** does not exist. -*/ -int sqlite3FindDb(sqlite3 *db, Token *pName){ - int i = -1; /* Database number */ - int n; /* Number of characters in the name */ - Db *pDb; /* A database whose name space is being searched */ - char *zName; /* Name we are searching for */ - - zName = sqlite3NameFromToken(db, pName); - if( zName ){ - n = strlen(zName); - for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ - if( (!OMIT_TEMPDB || i!=1 ) && n==strlen(pDb->zName) && - 0==sqlite3StrICmp(pDb->zName, zName) ){ - break; - } - } - sqlite3_free(zName); - } - return i; -} - -/* The table or view or trigger name is passed to this routine via tokens -** pName1 and pName2. If the table name was fully qualified, for example: -** -** CREATE TABLE xxx.yyy (...); -** -** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if -** the table name is not fully qualified, i.e.: -** -** CREATE TABLE yyy(...); -** -** Then pName1 is set to "yyy" and pName2 is "". -** -** This routine sets the *ppUnqual pointer to point at the token (pName1 or -** pName2) that stores the unqualified table name. The index of the -** database "xxx" is returned. -*/ -int sqlite3TwoPartName( - Parse *pParse, /* Parsing and code generating context */ - Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */ - Token *pName2, /* The "yyy" in the name "xxx.yyy" */ - Token **pUnqual /* Write the unqualified object name here */ -){ - int iDb; /* Database holding the object */ - sqlite3 *db = pParse->db; - - if( pName2 && pName2->n>0 ){ - assert( !db->init.busy ); - *pUnqual = pName2; - iDb = sqlite3FindDb(db, pName1); - if( iDb<0 ){ - sqlite3ErrorMsg(pParse, "unknown database %T", pName1); - pParse->nErr++; - return -1; - } - }else{ - assert( db->init.iDb==0 || db->init.busy ); - iDb = db->init.iDb; - *pUnqual = pName1; - } - return iDb; -} - -/* -** This routine is used to check if the UTF-8 string zName is a legal -** unqualified name for a new schema object (table, index, view or -** trigger). All names are legal except those that begin with the string -** "sqlite_" (in upper, lower or mixed case). This portion of the namespace -** is reserved for internal use. -*/ -int sqlite3CheckObjectName(Parse *pParse, const char *zName){ - if( !pParse->db->init.busy && pParse->nested==0 - && (pParse->db->flags & SQLITE_WriteSchema)==0 - && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); - return SQLITE_ERROR; - } - return SQLITE_OK; -} - -/* -** Begin constructing a new table representation in memory. This is -** the first of several action routines that get called in response -** to a CREATE TABLE statement. In particular, this routine is called -** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp -** flag is true if the table should be stored in the auxiliary database -** file instead of in the main database file. This is normally the case -** when the "TEMP" or "TEMPORARY" keyword occurs in between -** CREATE and TABLE. -** -** The new table record is initialized and put in pParse->pNewTable. -** As more of the CREATE TABLE statement is parsed, additional action -** routines will be called to add more information to this record. -** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine -** is called to complete the construction of the new table record. -*/ -void sqlite3StartTable( - Parse *pParse, /* Parser context */ - Token *pName1, /* First part of the name of the table or view */ - Token *pName2, /* Second part of the name of the table or view */ - int isTemp, /* True if this is a TEMP table */ - int isView, /* True if this is a VIEW */ - int isVirtual, /* True if this is a VIRTUAL table */ - int noErr /* Do nothing if table already exists */ -){ - Table *pTable; - char *zName = 0; /* The name of the new table */ - sqlite3 *db = pParse->db; - Vdbe *v; - int iDb; /* Database number to create the table in */ - Token *pName; /* Unqualified name of the table to create */ - - /* The table or view name to create is passed to this routine via tokens - ** pName1 and pName2. If the table name was fully qualified, for example: - ** - ** CREATE TABLE xxx.yyy (...); - ** - ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if - ** the table name is not fully qualified, i.e.: - ** - ** CREATE TABLE yyy(...); - ** - ** Then pName1 is set to "yyy" and pName2 is "". - ** - ** The call below sets the pName pointer to point at the token (pName1 or - ** pName2) that stores the unqualified table name. The variable iDb is - ** set to the index of the database that the table or view is to be - ** created in. - */ - iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); - if( iDb<0 ) return; - if( !OMIT_TEMPDB && isTemp && iDb>1 ){ - /* If creating a temp table, the name may not be qualified */ - sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); - return; - } - if( !OMIT_TEMPDB && isTemp ) iDb = 1; - - pParse->sNameToken = *pName; - zName = sqlite3NameFromToken(db, pName); - if( zName==0 ) return; - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ - goto begin_table_error; - } - if( db->init.iDb==1 ) isTemp = 1; -#ifndef SQLITE_OMIT_AUTHORIZATION - assert( (isTemp & 1)==isTemp ); - { - int code; - char *zDb = db->aDb[iDb].zName; - if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ - goto begin_table_error; - } - if( isView ){ - if( !OMIT_TEMPDB && isTemp ){ - code = SQLITE_CREATE_TEMP_VIEW; - }else{ - code = SQLITE_CREATE_VIEW; - } - }else{ - if( !OMIT_TEMPDB && isTemp ){ - code = SQLITE_CREATE_TEMP_TABLE; - }else{ - code = SQLITE_CREATE_TABLE; - } - } - if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){ - goto begin_table_error; - } - } -#endif - - /* Make sure the new table name does not collide with an existing - ** index or table name in the same database. Issue an error message if - ** it does. The exception is if the statement being parsed was passed - ** to an sqlite3_declare_vtab() call. In that case only the column names - ** and types will be used, so there is no need to test for namespace - ** collisions. - */ - if( !IN_DECLARE_VTAB ){ - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ - goto begin_table_error; - } - pTable = sqlite3FindTable(db, zName, db->aDb[iDb].zName); - if( pTable ){ - if( !noErr ){ - sqlite3ErrorMsg(pParse, "table %T already exists", pName); - } - goto begin_table_error; - } - if( sqlite3FindIndex(db, zName, 0)!=0 && (iDb==0 || !db->init.busy) ){ - sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); - goto begin_table_error; - } - } - - pTable = sqlite3DbMallocZero(db, sizeof(Table)); - if( pTable==0 ){ - db->mallocFailed = 1; - pParse->rc = SQLITE_NOMEM; - pParse->nErr++; - goto begin_table_error; - } - pTable->zName = zName; - pTable->iPKey = -1; - pTable->pSchema = db->aDb[iDb].pSchema; - pTable->nRef = 1; - if( pParse->pNewTable ) sqlite3DeleteTable(pParse->pNewTable); - pParse->pNewTable = pTable; - - /* If this is the magic sqlite_sequence table used by autoincrement, - ** then record a pointer to this table in the main database structure - ** so that INSERT can find the table easily. - */ -#ifndef SQLITE_OMIT_AUTOINCREMENT - if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){ - pTable->pSchema->pSeqTab = pTable; - } -#endif - - /* Begin generating the code that will insert the table record into - ** the SQLITE_MASTER table. Note in particular that we must go ahead - ** and allocate the record number for the table entry now. Before any - ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause - ** indices to be created and the table record must come before the - ** indices. Hence, the record number for the table must be allocated - ** now. - */ - if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ - int lbl; - int fileFormat; - sqlite3BeginWriteOperation(pParse, 0, iDb); - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( isVirtual ){ - sqlite3VdbeAddOp(v, OP_VBegin, 0, 0); - } -#endif - - /* If the file format and encoding in the database have not been set, - ** set them now. - */ - sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 1); /* file_format */ - sqlite3VdbeUsesBtree(v, iDb); - lbl = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp(v, OP_If, 0, lbl); - fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? - 1 : SQLITE_MAX_FILE_FORMAT; - sqlite3VdbeAddOp(v, OP_Integer, fileFormat, 0); - sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 1); - sqlite3VdbeAddOp(v, OP_Integer, ENC(db), 0); - sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 4); - sqlite3VdbeResolveLabel(v, lbl); - - /* This just creates a place-holder record in the sqlite_master table. - ** The record created does not contain anything yet. It will be replaced - ** by the real entry in code generated at sqlite3EndTable(). - ** - ** The rowid for the new entry is left on the top of the stack. - ** The rowid value is needed by the code that sqlite3EndTable will - ** generate. - */ -#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) - if( isView || isVirtual ){ - sqlite3VdbeAddOp(v, OP_Integer, 0, 0); - }else -#endif - { - sqlite3VdbeAddOp(v, OP_CreateTable, iDb, 0); - } - sqlite3OpenMasterTable(pParse, iDb); - sqlite3VdbeAddOp(v, OP_NewRowid, 0, 0); - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - sqlite3VdbeAddOp(v, OP_Insert, 0, OPFLAG_APPEND); - sqlite3VdbeAddOp(v, OP_Close, 0, 0); - sqlite3VdbeAddOp(v, OP_Pull, 1, 0); - } - - /* Normal (non-error) return. */ - return; - - /* If an error occurs, we jump here */ -begin_table_error: - sqlite3_free(zName); - return; -} - -/* -** This macro is used to compare two strings in a case-insensitive manner. -** It is slightly faster than calling sqlite3StrICmp() directly, but -** produces larger code. -** -** WARNING: This macro is not compatible with the strcmp() family. It -** returns true if the two strings are equal, otherwise false. -*/ -#define STRICMP(x, y) (\ -sqlite3UpperToLower[*(unsigned char *)(x)]== \ -sqlite3UpperToLower[*(unsigned char *)(y)] \ -&& sqlite3StrICmp((x)+1,(y)+1)==0 ) - -/* -** Add a new column to the table currently being constructed. -** -** The parser calls this routine once for each column declaration -** in a CREATE TABLE statement. sqlite3StartTable() gets called -** first to get things going. Then this routine is called for each -** column. -*/ -void sqlite3AddColumn(Parse *pParse, Token *pName){ - Table *p; - int i; - char *z; - Column *pCol; - if( (p = pParse->pNewTable)==0 ) return; - if( p->nCol+1>SQLITE_MAX_COLUMN ){ - sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); - return; - } - z = sqlite3NameFromToken(pParse->db, pName); - if( z==0 ) return; - for(i=0; inCol; i++){ - if( STRICMP(z, p->aCol[i].zName) ){ - sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); - sqlite3_free(z); - return; - } - } - if( (p->nCol & 0x7)==0 ){ - Column *aNew; - aNew = sqlite3DbRealloc(pParse->db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0])); - if( aNew==0 ){ - sqlite3_free(z); - return; - } - p->aCol = aNew; - } - pCol = &p->aCol[p->nCol]; - memset(pCol, 0, sizeof(p->aCol[0])); - pCol->zName = z; - - /* If there is no type specified, columns have the default affinity - ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will - ** be called next to set pCol->affinity correctly. - */ - pCol->affinity = SQLITE_AFF_NONE; - p->nCol++; -} - -/* -** This routine is called by the parser while in the middle of -** parsing a CREATE TABLE statement. A "NOT NULL" constraint has -** been seen on a column. This routine sets the notNull flag on -** the column currently under construction. -*/ -void sqlite3AddNotNull(Parse *pParse, int onError){ - Table *p; - int i; - if( (p = pParse->pNewTable)==0 ) return; - i = p->nCol-1; - if( i>=0 ) p->aCol[i].notNull = onError; -} - -/* -** Scan the column type name zType (length nType) and return the -** associated affinity type. -** -** This routine does a case-independent search of zType for the -** substrings in the following table. If one of the substrings is -** found, the corresponding affinity is returned. If zType contains -** more than one of the substrings, entries toward the top of -** the table take priority. For example, if zType is 'BLOBINT', -** SQLITE_AFF_INTEGER is returned. -** -** Substring | Affinity -** -------------------------------- -** 'INT' | SQLITE_AFF_INTEGER -** 'CHAR' | SQLITE_AFF_TEXT -** 'CLOB' | SQLITE_AFF_TEXT -** 'TEXT' | SQLITE_AFF_TEXT -** 'BLOB' | SQLITE_AFF_NONE -** 'REAL' | SQLITE_AFF_REAL -** 'FLOA' | SQLITE_AFF_REAL -** 'DOUB' | SQLITE_AFF_REAL -** -** If none of the substrings in the above table are found, -** SQLITE_AFF_NUMERIC is returned. -*/ -char sqlite3AffinityType(const Token *pType){ - u32 h = 0; - char aff = SQLITE_AFF_NUMERIC; - const unsigned char *zIn = pType->z; - const unsigned char *zEnd = &pType->z[pType->n]; - - while( zIn!=zEnd ){ - h = (h<<8) + sqlite3UpperToLower[*zIn]; - zIn++; - if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ - aff = SQLITE_AFF_TEXT; - }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */ - aff = SQLITE_AFF_TEXT; - }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */ - aff = SQLITE_AFF_TEXT; - }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */ - && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){ - aff = SQLITE_AFF_NONE; -#ifndef SQLITE_OMIT_FLOATING_POINT - }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */ - && aff==SQLITE_AFF_NUMERIC ){ - aff = SQLITE_AFF_REAL; - }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */ - && aff==SQLITE_AFF_NUMERIC ){ - aff = SQLITE_AFF_REAL; - }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */ - && aff==SQLITE_AFF_NUMERIC ){ - aff = SQLITE_AFF_REAL; -#endif - }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */ - aff = SQLITE_AFF_INTEGER; - break; - } - } - - return aff; -} - -/* -** This routine is called by the parser while in the middle of -** parsing a CREATE TABLE statement. The pFirst token is the first -** token in the sequence of tokens that describe the type of the -** column currently under construction. pLast is the last token -** in the sequence. Use this information to construct a string -** that contains the typename of the column and store that string -** in zType. -*/ -void sqlite3AddColumnType(Parse *pParse, Token *pType){ - Table *p; - int i; - Column *pCol; - - if( (p = pParse->pNewTable)==0 ) return; - i = p->nCol-1; - if( i<0 ) return; - pCol = &p->aCol[i]; - sqlite3_free(pCol->zType); - pCol->zType = sqlite3NameFromToken(pParse->db, pType); - pCol->affinity = sqlite3AffinityType(pType); -} - -/* -** The expression is the default value for the most recently added column -** of the table currently under construction. -** -** Default value expressions must be constant. Raise an exception if this -** is not the case. -** -** This routine is called by the parser while in the middle of -** parsing a CREATE TABLE statement. -*/ -void sqlite3AddDefaultValue(Parse *pParse, Expr *pExpr){ - Table *p; - Column *pCol; - if( (p = pParse->pNewTable)!=0 ){ - pCol = &(p->aCol[p->nCol-1]); - if( !sqlite3ExprIsConstantOrFunction(pExpr) ){ - sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", - pCol->zName); - }else{ - Expr *pCopy; - sqlite3 *db = pParse->db; - sqlite3ExprDelete(pCol->pDflt); - pCol->pDflt = pCopy = sqlite3ExprDup(db, pExpr); - if( pCopy ){ - sqlite3TokenCopy(db, &pCopy->span, &pExpr->span); - } - } - } - sqlite3ExprDelete(pExpr); -} - -/* -** Designate the PRIMARY KEY for the table. pList is a list of names -** of columns that form the primary key. If pList is NULL, then the -** most recently added column of the table is the primary key. -** -** A table can have at most one primary key. If the table already has -** a primary key (and this is the second primary key) then create an -** error. -** -** If the PRIMARY KEY is on a single column whose datatype is INTEGER, -** then we will try to use that column as the rowid. Set the Table.iPKey -** field of the table under construction to be the index of the -** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is -** no INTEGER PRIMARY KEY. -** -** If the key is not an INTEGER PRIMARY KEY, then create a unique -** index for the key. No index is created for INTEGER PRIMARY KEYs. -*/ -void sqlite3AddPrimaryKey( - Parse *pParse, /* Parsing context */ - ExprList *pList, /* List of field names to be indexed */ - int onError, /* What to do with a uniqueness conflict */ - int autoInc, /* True if the AUTOINCREMENT keyword is present */ - int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ -){ - Table *pTab = pParse->pNewTable; - char *zType = 0; - int iCol = -1, i; - if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit; - if( pTab->hasPrimKey ){ - sqlite3ErrorMsg(pParse, - "table \"%s\" has more than one primary key", pTab->zName); - goto primary_key_exit; - } - pTab->hasPrimKey = 1; - if( pList==0 ){ - iCol = pTab->nCol - 1; - pTab->aCol[iCol].isPrimKey = 1; - }else{ - for(i=0; inExpr; i++){ - for(iCol=0; iColnCol; iCol++){ - if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){ - break; - } - } - if( iColnCol ){ - pTab->aCol[iCol].isPrimKey = 1; - } - } - if( pList->nExpr>1 ) iCol = -1; - } - if( iCol>=0 && iColnCol ){ - zType = pTab->aCol[iCol].zType; - } - if( zType && sqlite3StrICmp(zType, "INTEGER")==0 - && sortOrder==SQLITE_SO_ASC ){ - pTab->iPKey = iCol; - pTab->keyConf = onError; - pTab->autoInc = autoInc; - }else if( autoInc ){ -#ifndef SQLITE_OMIT_AUTOINCREMENT - sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " - "INTEGER PRIMARY KEY"); -#endif - }else{ - sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0); - pList = 0; - } - -primary_key_exit: - sqlite3ExprListDelete(pList); - return; -} - -/* -** Add a new CHECK constraint to the table currently under construction. -*/ -void sqlite3AddCheckConstraint( - Parse *pParse, /* Parsing context */ - Expr *pCheckExpr /* The check expression */ -){ -#ifndef SQLITE_OMIT_CHECK - Table *pTab = pParse->pNewTable; - sqlite3 *db = pParse->db; - if( pTab && !IN_DECLARE_VTAB ){ - /* The CHECK expression must be duplicated so that tokens refer - ** to malloced space and not the (ephemeral) text of the CREATE TABLE - ** statement */ - pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck, - sqlite3ExprDup(db, pCheckExpr)); - } -#endif - sqlite3ExprDelete(pCheckExpr); -} - -/* -** Set the collation function of the most recently parsed table column -** to the CollSeq given. -*/ -void sqlite3AddCollateType(Parse *pParse, const char *zType, int nType){ - Table *p; - int i; - - if( (p = pParse->pNewTable)==0 ) return; - i = p->nCol-1; - - if( sqlite3LocateCollSeq(pParse, zType, nType) ){ - Index *pIdx; - p->aCol[i].zColl = sqlite3DbStrNDup(pParse->db, zType, nType); - - /* If the column is declared as " PRIMARY KEY COLLATE ", - ** then an index may have been created on this column before the - ** collation type was added. Correct this if it is the case. - */ - for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ - assert( pIdx->nColumn==1 ); - if( pIdx->aiColumn[0]==i ){ - pIdx->azColl[0] = p->aCol[i].zColl; - } - } - } -} - -/* -** This function returns the collation sequence for database native text -** encoding identified by the string zName, length nName. -** -** If the requested collation sequence is not available, or not available -** in the database native encoding, the collation factory is invoked to -** request it. If the collation factory does not supply such a sequence, -** and the sequence is available in another text encoding, then that is -** returned instead. -** -** If no versions of the requested collations sequence are available, or -** another error occurs, NULL is returned and an error message written into -** pParse. -** -** This routine is a wrapper around sqlite3FindCollSeq(). This routine -** invokes the collation factory if the named collation cannot be found -** and generates an error message. -*/ -CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName, int nName){ - sqlite3 *db = pParse->db; - u8 enc = ENC(db); - u8 initbusy = db->init.busy; - CollSeq *pColl; - - pColl = sqlite3FindCollSeq(db, enc, zName, nName, initbusy); - if( !initbusy && (!pColl || !pColl->xCmp) ){ - pColl = sqlite3GetCollSeq(db, pColl, zName, nName); - if( !pColl ){ - if( nName<0 ){ - nName = strlen(zName); - } - sqlite3ErrorMsg(pParse, "no such collation sequence: %.*s", nName, zName); - pColl = 0; - } - } - - return pColl; -} - - -/* -** Generate code that will increment the schema cookie. -** -** The schema cookie is used to determine when the schema for the -** database changes. After each schema change, the cookie value -** changes. When a process first reads the schema it records the -** cookie. Thereafter, whenever it goes to access the database, -** it checks the cookie to make sure the schema has not changed -** since it was last read. -** -** This plan is not completely bullet-proof. It is possible for -** the schema to change multiple times and for the cookie to be -** set back to prior value. But schema changes are infrequent -** and the probability of hitting the same cookie value is only -** 1 chance in 2^32. So we're safe enough. -*/ -void sqlite3ChangeCookie(sqlite3 *db, Vdbe *v, int iDb){ - sqlite3VdbeAddOp(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, 0); - sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 0); -} - -/* -** Measure the number of characters needed to output the given -** identifier. The number returned includes any quotes used -** but does not include the null terminator. -** -** The estimate is conservative. It might be larger that what is -** really needed. -*/ -static int identLength(const char *z){ - int n; - for(n=0; *z; n++, z++){ - if( *z=='"' ){ n++; } - } - return n + 2; -} - -/* -** Write an identifier onto the end of the given string. Add -** quote characters as needed. -*/ -static void identPut(char *z, int *pIdx, char *zSignedIdent){ - unsigned char *zIdent = (unsigned char*)zSignedIdent; - int i, j, needQuote; - i = *pIdx; - for(j=0; zIdent[j]; j++){ - if( !isalnum(zIdent[j]) && zIdent[j]!='_' ) break; - } - needQuote = zIdent[j]!=0 || isdigit(zIdent[0]) - || sqlite3KeywordCode(zIdent, j)!=TK_ID; - if( needQuote ) z[i++] = '"'; - for(j=0; zIdent[j]; j++){ - z[i++] = zIdent[j]; - if( zIdent[j]=='"' ) z[i++] = '"'; - } - if( needQuote ) z[i++] = '"'; - z[i] = 0; - *pIdx = i; -} - -/* -** Generate a CREATE TABLE statement appropriate for the given -** table. Memory to hold the text of the statement is obtained -** from sqliteMalloc() and must be freed by the calling function. -*/ -static char *createTableStmt(Table *p, int isTemp){ - int i, k, n; - char *zStmt; - char *zSep, *zSep2, *zEnd, *z; - Column *pCol; - n = 0; - for(pCol = p->aCol, i=0; inCol; i++, pCol++){ - n += identLength(pCol->zName); - z = pCol->zType; - if( z ){ - n += (strlen(z) + 1); - } - } - n += identLength(p->zName); - if( n<50 ){ - zSep = ""; - zSep2 = ","; - zEnd = ")"; - }else{ - zSep = "\n "; - zSep2 = ",\n "; - zEnd = "\n)"; - } - n += 35 + 6*p->nCol; - zStmt = sqlite3_malloc( n ); - if( zStmt==0 ) return 0; - sqlite3_snprintf(n, zStmt, - !OMIT_TEMPDB&&isTemp ? "CREATE TEMP TABLE ":"CREATE TABLE "); - k = strlen(zStmt); - identPut(zStmt, &k, p->zName); - zStmt[k++] = '('; - for(pCol=p->aCol, i=0; inCol; i++, pCol++){ - sqlite3_snprintf(n-k, &zStmt[k], zSep); - k += strlen(&zStmt[k]); - zSep = zSep2; - identPut(zStmt, &k, pCol->zName); - if( (z = pCol->zType)!=0 ){ - zStmt[k++] = ' '; - assert( strlen(z)+k+1<=n ); - sqlite3_snprintf(n-k, &zStmt[k], "%s", z); - k += strlen(z); - } - } - sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); - return zStmt; -} - -/* -** This routine is called to report the final ")" that terminates -** a CREATE TABLE statement. -** -** The table structure that other action routines have been building -** is added to the internal hash tables, assuming no errors have -** occurred. -** -** An entry for the table is made in the master table on disk, unless -** this is a temporary table or db->init.busy==1. When db->init.busy==1 -** it means we are reading the sqlite_master table because we just -** connected to the database or because the sqlite_master table has -** recently changed, so the entry for this table already exists in -** the sqlite_master table. We do not want to create it again. -** -** If the pSelect argument is not NULL, it means that this routine -** was called to create a table generated from a -** "CREATE TABLE ... AS SELECT ..." statement. The column names of -** the new table will match the result set of the SELECT. -*/ -void sqlite3EndTable( - Parse *pParse, /* Parse context */ - Token *pCons, /* The ',' token after the last column defn. */ - Token *pEnd, /* The final ')' token in the CREATE TABLE */ - Select *pSelect /* Select from a "CREATE ... AS SELECT" */ -){ - Table *p; - sqlite3 *db = pParse->db; - int iDb; - - if( (pEnd==0 && pSelect==0) || pParse->nErr || db->mallocFailed ) { - return; - } - p = pParse->pNewTable; - if( p==0 ) return; - - assert( !db->init.busy || !pSelect ); - - iDb = sqlite3SchemaToIndex(db, p->pSchema); - -#ifndef SQLITE_OMIT_CHECK - /* Resolve names in all CHECK constraint expressions. - */ - if( p->pCheck ){ - SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ - NameContext sNC; /* Name context for pParse->pNewTable */ - - memset(&sNC, 0, sizeof(sNC)); - memset(&sSrc, 0, sizeof(sSrc)); - sSrc.nSrc = 1; - sSrc.a[0].zName = p->zName; - sSrc.a[0].pTab = p; - sSrc.a[0].iCursor = -1; - sNC.pParse = pParse; - sNC.pSrcList = &sSrc; - sNC.isCheck = 1; - if( sqlite3ExprResolveNames(&sNC, p->pCheck) ){ - return; - } - } -#endif /* !defined(SQLITE_OMIT_CHECK) */ - - /* If the db->init.busy is 1 it means we are reading the SQL off the - ** "sqlite_master" or "sqlite_temp_master" table on the disk. - ** So do not write to the disk again. Extract the root page number - ** for the table from the db->init.newTnum field. (The page number - ** should have been put there by the sqliteOpenCb routine.) - */ - if( db->init.busy ){ - p->tnum = db->init.newTnum; - } - - /* If not initializing, then create a record for the new table - ** in the SQLITE_MASTER table of the database. The record number - ** for the new table entry should already be on the stack. - ** - ** If this is a TEMPORARY table, write the entry into the auxiliary - ** file instead of into the main database file. - */ - if( !db->init.busy ){ - int n; - Vdbe *v; - char *zType; /* "view" or "table" */ - char *zType2; /* "VIEW" or "TABLE" */ - char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */ - - v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - - sqlite3VdbeAddOp(v, OP_Close, 0, 0); - - /* Create the rootpage for the new table and push it onto the stack. - ** A view has no rootpage, so just push a zero onto the stack for - ** views. Initialize zType at the same time. - */ - if( p->pSelect==0 ){ - /* A regular table */ - zType = "table"; - zType2 = "TABLE"; -#ifndef SQLITE_OMIT_VIEW - }else{ - /* A view */ - zType = "view"; - zType2 = "VIEW"; -#endif - } - - /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT - ** statement to populate the new table. The root-page number for the - ** new table is on the top of the vdbe stack. - ** - ** Once the SELECT has been coded by sqlite3Select(), it is in a - ** suitable state to query for the column names and types to be used - ** by the new table. - ** - ** A shared-cache write-lock is not required to write to the new table, - ** as a schema-lock must have already been obtained to create it. Since - ** a schema-lock excludes all other database users, the write-lock would - ** be redundant. - */ - if( pSelect ){ - Table *pSelTab; - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - sqlite3VdbeAddOp(v, OP_OpenWrite, 1, 0); - pParse->nTab = 2; - sqlite3Select(pParse, pSelect, SRT_Table, 1, 0, 0, 0, 0); - sqlite3VdbeAddOp(v, OP_Close, 1, 0); - if( pParse->nErr==0 ){ - pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSelect); - if( pSelTab==0 ) return; - assert( p->aCol==0 ); - p->nCol = pSelTab->nCol; - p->aCol = pSelTab->aCol; - pSelTab->nCol = 0; - pSelTab->aCol = 0; - sqlite3DeleteTable(pSelTab); - } - } - - /* Compute the complete text of the CREATE statement */ - if( pSelect ){ - zStmt = createTableStmt(p, p->pSchema==db->aDb[1].pSchema); - }else{ - n = pEnd->z - pParse->sNameToken.z + 1; - zStmt = sqlite3MPrintf(db, - "CREATE %s %.*s", zType2, n, pParse->sNameToken.z - ); - } - - /* A slot for the record has already been allocated in the - ** SQLITE_MASTER table. We just need to update that slot with all - ** the information we've collected. The rowid for the preallocated - ** slot is the 2nd item on the stack. The top of the stack is the - ** root page for the new table (or a 0 if this is a view). - */ - sqlite3NestedParse(pParse, - "UPDATE %Q.%s " - "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#0, sql=%Q " - "WHERE rowid=#1", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), - zType, - p->zName, - p->zName, - zStmt - ); - sqlite3_free(zStmt); - sqlite3ChangeCookie(db, v, iDb); - -#ifndef SQLITE_OMIT_AUTOINCREMENT - /* Check to see if we need to create an sqlite_sequence table for - ** keeping track of autoincrement keys. - */ - if( p->autoInc ){ - Db *pDb = &db->aDb[iDb]; - if( pDb->pSchema->pSeqTab==0 ){ - sqlite3NestedParse(pParse, - "CREATE TABLE %Q.sqlite_sequence(name,seq)", - pDb->zName - ); - } - } -#endif - - /* Reparse everything to update our internal data structures */ - sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, - sqlite3MPrintf(db, "tbl_name='%q'",p->zName), P3_DYNAMIC); - } - - - /* Add the table to the in-memory representation of the database. - */ - if( db->init.busy && pParse->nErr==0 ){ - Table *pOld; - FKey *pFKey; - Schema *pSchema = p->pSchema; - pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, strlen(p->zName)+1,p); - if( pOld ){ - assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ - db->mallocFailed = 1; - return; - } -#ifndef SQLITE_OMIT_FOREIGN_KEY - for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){ - void *data; - int nTo = strlen(pFKey->zTo) + 1; - pFKey->pNextTo = sqlite3HashFind(&pSchema->aFKey, pFKey->zTo, nTo); - data = sqlite3HashInsert(&pSchema->aFKey, pFKey->zTo, nTo, pFKey); - if( data==(void *)pFKey ){ - db->mallocFailed = 1; - } - } -#endif - pParse->pNewTable = 0; - db->nTable++; - db->flags |= SQLITE_InternChanges; - -#ifndef SQLITE_OMIT_ALTERTABLE - if( !p->pSelect ){ - const char *zName = (const char *)pParse->sNameToken.z; - int nName; - assert( !pSelect && pCons && pEnd ); - if( pCons->z==0 ){ - pCons = pEnd; - } - nName = (const char *)pCons->z - zName; - p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName); - } -#endif - } -} - -#ifndef SQLITE_OMIT_VIEW -/* -** The parser calls this routine in order to create a new VIEW -*/ -void sqlite3CreateView( - Parse *pParse, /* The parsing context */ - Token *pBegin, /* The CREATE token that begins the statement */ - Token *pName1, /* The token that holds the name of the view */ - Token *pName2, /* The token that holds the name of the view */ - Select *pSelect, /* A SELECT statement that will become the new view */ - int isTemp, /* TRUE for a TEMPORARY view */ - int noErr /* Suppress error messages if VIEW already exists */ -){ - Table *p; - int n; - const unsigned char *z; - Token sEnd; - DbFixer sFix; - Token *pName; - int iDb; - sqlite3 *db = pParse->db; - - if( pParse->nVar>0 ){ - sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); - sqlite3SelectDelete(pSelect); - return; - } - sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); - p = pParse->pNewTable; - if( p==0 || pParse->nErr ){ - sqlite3SelectDelete(pSelect); - return; - } - sqlite3TwoPartName(pParse, pName1, pName2, &pName); - iDb = sqlite3SchemaToIndex(db, p->pSchema); - if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName) - && sqlite3FixSelect(&sFix, pSelect) - ){ - sqlite3SelectDelete(pSelect); - return; - } - - /* Make a copy of the entire SELECT statement that defines the view. - ** This will force all the Expr.token.z values to be dynamically - ** allocated rather than point to the input string - which means that - ** they will persist after the current sqlite3_exec() call returns. - */ - p->pSelect = sqlite3SelectDup(db, pSelect); - sqlite3SelectDelete(pSelect); - if( db->mallocFailed ){ - return; - } - if( !db->init.busy ){ - sqlite3ViewGetColumnNames(pParse, p); - } - - /* Locate the end of the CREATE VIEW statement. Make sEnd point to - ** the end. - */ - sEnd = pParse->sLastToken; - if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){ - sEnd.z += sEnd.n; - } - sEnd.n = 0; - n = sEnd.z - pBegin->z; - z = (const unsigned char*)pBegin->z; - while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; } - sEnd.z = &z[n-1]; - sEnd.n = 1; - - /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ - sqlite3EndTable(pParse, 0, &sEnd, 0); - return; -} -#endif /* SQLITE_OMIT_VIEW */ - -#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) -/* -** The Table structure pTable is really a VIEW. Fill in the names of -** the columns of the view in the pTable structure. Return the number -** of errors. If an error is seen leave an error message in pParse->zErrMsg. -*/ -int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ - Table *pSelTab; /* A fake table from which we get the result set */ - Select *pSel; /* Copy of the SELECT that implements the view */ - int nErr = 0; /* Number of errors encountered */ - int n; /* Temporarily holds the number of cursors assigned */ - sqlite3 *db = pParse->db; /* Database connection for malloc errors */ - - assert( pTable ); - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3VtabCallConnect(pParse, pTable) ){ - return SQLITE_ERROR; - } - if( IsVirtual(pTable) ) return 0; -#endif - -#ifndef SQLITE_OMIT_VIEW - /* A positive nCol means the columns names for this view are - ** already known. - */ - if( pTable->nCol>0 ) return 0; - - /* A negative nCol is a special marker meaning that we are currently - ** trying to compute the column names. If we enter this routine with - ** a negative nCol, it means two or more views form a loop, like this: - ** - ** CREATE VIEW one AS SELECT * FROM two; - ** CREATE VIEW two AS SELECT * FROM one; - ** - ** Actually, this error is caught previously and so the following test - ** should always fail. But we will leave it in place just to be safe. - */ - if( pTable->nCol<0 ){ - sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName); - return 1; - } - assert( pTable->nCol>=0 ); - - /* If we get this far, it means we need to compute the table names. - ** Note that the call to sqlite3ResultSetOfSelect() will expand any - ** "*" elements in the results set of the view and will assign cursors - ** to the elements of the FROM clause. But we do not want these changes - ** to be permanent. So the computation is done on a copy of the SELECT - ** statement that defines the view. - */ - assert( pTable->pSelect ); - pSel = sqlite3SelectDup(db, pTable->pSelect); - if( pSel ){ - n = pParse->nTab; - sqlite3SrcListAssignCursors(pParse, pSel->pSrc); - pTable->nCol = -1; - pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSel); - pParse->nTab = n; - if( pSelTab ){ - assert( pTable->aCol==0 ); - pTable->nCol = pSelTab->nCol; - pTable->aCol = pSelTab->aCol; - pSelTab->nCol = 0; - pSelTab->aCol = 0; - sqlite3DeleteTable(pSelTab); - pTable->pSchema->flags |= DB_UnresetViews; - }else{ - pTable->nCol = 0; - nErr++; - } - sqlite3SelectDelete(pSel); - } else { - nErr++; - } -#endif /* SQLITE_OMIT_VIEW */ - return nErr; -} -#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ - -#ifndef SQLITE_OMIT_VIEW -/* -** Clear the column names from every VIEW in database idx. -*/ -static void sqliteViewResetAll(sqlite3 *db, int idx){ - HashElem *i; - if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; - for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ - Table *pTab = sqliteHashData(i); - if( pTab->pSelect ){ - sqliteResetColumnNames(pTab); - } - } - DbClearProperty(db, idx, DB_UnresetViews); -} -#else -# define sqliteViewResetAll(A,B) -#endif /* SQLITE_OMIT_VIEW */ - -/* -** This function is called by the VDBE to adjust the internal schema -** used by SQLite when the btree layer moves a table root page. The -** root-page of a table or index in database iDb has changed from iFrom -** to iTo. -** -** Ticket #1728: The symbol table might still contain information -** on tables and/or indices that are the process of being deleted. -** If you are unlucky, one of those deleted indices or tables might -** have the same rootpage number as the real table or index that is -** being moved. So we cannot stop searching after the first match -** because the first match might be for one of the deleted indices -** or tables and not the table/index that is actually being moved. -** We must continue looping until all tables and indices with -** rootpage==iFrom have been converted to have a rootpage of iTo -** in order to be certain that we got the right one. -*/ -#ifndef SQLITE_OMIT_AUTOVACUUM -void sqlite3RootPageMoved(Db *pDb, int iFrom, int iTo){ - HashElem *pElem; - Hash *pHash; - - pHash = &pDb->pSchema->tblHash; - for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ - Table *pTab = sqliteHashData(pElem); - if( pTab->tnum==iFrom ){ - pTab->tnum = iTo; - } - } - pHash = &pDb->pSchema->idxHash; - for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ - Index *pIdx = sqliteHashData(pElem); - if( pIdx->tnum==iFrom ){ - pIdx->tnum = iTo; - } - } -} -#endif - -/* -** Write code to erase the table with root-page iTable from database iDb. -** Also write code to modify the sqlite_master table and internal schema -** if a root-page of another table is moved by the btree-layer whilst -** erasing iTable (this can happen with an auto-vacuum database). -*/ -static void destroyRootPage(Parse *pParse, int iTable, int iDb){ - Vdbe *v = sqlite3GetVdbe(pParse); - sqlite3VdbeAddOp(v, OP_Destroy, iTable, iDb); -#ifndef SQLITE_OMIT_AUTOVACUUM - /* OP_Destroy pushes an integer onto the stack. If this integer - ** is non-zero, then it is the root page number of a table moved to - ** location iTable. The following code modifies the sqlite_master table to - ** reflect this. - ** - ** The "#0" in the SQL is a special constant that means whatever value - ** is on the top of the stack. See sqlite3RegisterExpr(). - */ - sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET rootpage=%d WHERE #0 AND rootpage=#0", - pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable); -#endif -} - -/* -** Write VDBE code to erase table pTab and all associated indices on disk. -** Code to update the sqlite_master tables and internal schema definitions -** in case a root-page belonging to another table is moved by the btree layer -** is also added (this can happen with an auto-vacuum database). -*/ -static void destroyTable(Parse *pParse, Table *pTab){ -#ifdef SQLITE_OMIT_AUTOVACUUM - Index *pIdx; - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - destroyRootPage(pParse, pTab->tnum, iDb); - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - destroyRootPage(pParse, pIdx->tnum, iDb); - } -#else - /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM - ** is not defined), then it is important to call OP_Destroy on the - ** table and index root-pages in order, starting with the numerically - ** largest root-page number. This guarantees that none of the root-pages - ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the - ** following were coded: - ** - ** OP_Destroy 4 0 - ** ... - ** OP_Destroy 5 0 - ** - ** and root page 5 happened to be the largest root-page number in the - ** database, then root page 5 would be moved to page 4 by the - ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit - ** a free-list page. - */ - int iTab = pTab->tnum; - int iDestroyed = 0; - - while( 1 ){ - Index *pIdx; - int iLargest = 0; - - if( iDestroyed==0 || iTabpIndex; pIdx; pIdx=pIdx->pNext){ - int iIdx = pIdx->tnum; - assert( pIdx->pSchema==pTab->pSchema ); - if( (iDestroyed==0 || (iIdxiLargest ){ - iLargest = iIdx; - } - } - if( iLargest==0 ){ - return; - }else{ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - destroyRootPage(pParse, iLargest, iDb); - iDestroyed = iLargest; - } - } -#endif -} - -/* -** This routine is called to do the work of a DROP TABLE statement. -** pName is the name of the table to be dropped. -*/ -void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){ - Table *pTab; - Vdbe *v; - sqlite3 *db = pParse->db; - int iDb; - - if( pParse->nErr || db->mallocFailed ){ - goto exit_drop_table; - } - assert( pName->nSrc==1 ); - pTab = sqlite3LocateTable(pParse, pName->a[0].zName, pName->a[0].zDatabase); - - if( pTab==0 ){ - if( noErr ){ - sqlite3ErrorClear(pParse); - } - goto exit_drop_table; - } - iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - assert( iDb>=0 && iDbnDb ); -#ifndef SQLITE_OMIT_AUTHORIZATION - { - int code; - const char *zTab = SCHEMA_TABLE(iDb); - const char *zDb = db->aDb[iDb].zName; - const char *zArg2 = 0; - if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ - goto exit_drop_table; - } - if( isView ){ - if( !OMIT_TEMPDB && iDb==1 ){ - code = SQLITE_DROP_TEMP_VIEW; - }else{ - code = SQLITE_DROP_VIEW; - } -#ifndef SQLITE_OMIT_VIRTUALTABLE - }else if( IsVirtual(pTab) ){ - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ - goto exit_drop_table; - } - code = SQLITE_DROP_VTABLE; - zArg2 = pTab->pMod->zName; -#endif - }else{ - if( !OMIT_TEMPDB && iDb==1 ){ - code = SQLITE_DROP_TEMP_TABLE; - }else{ - code = SQLITE_DROP_TABLE; - } - } - if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){ - goto exit_drop_table; - } - if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ - goto exit_drop_table; - } - } -#endif - if( pTab->readOnly || pTab==db->aDb[iDb].pSchema->pSeqTab ){ - sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); - goto exit_drop_table; - } - -#ifndef SQLITE_OMIT_VIEW - /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used - ** on a table. - */ - if( isView && pTab->pSelect==0 ){ - sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); - goto exit_drop_table; - } - if( !isView && pTab->pSelect ){ - sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); - goto exit_drop_table; - } -#endif - - /* Generate code to remove the table from the master table - ** on disk. - */ - v = sqlite3GetVdbe(pParse); - if( v ){ - Trigger *pTrigger; - Db *pDb = &db->aDb[iDb]; - sqlite3BeginWriteOperation(pParse, 0, iDb); - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - Vdbe *v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp(v, OP_VBegin, 0, 0); - } - } -#endif - - /* Drop all triggers associated with the table being dropped. Code - ** is generated to remove entries from sqlite_master and/or - ** sqlite_temp_master if required. - */ - pTrigger = pTab->pTrigger; - while( pTrigger ){ - assert( pTrigger->pSchema==pTab->pSchema || - pTrigger->pSchema==db->aDb[1].pSchema ); - sqlite3DropTriggerPtr(pParse, pTrigger); - pTrigger = pTrigger->pNext; - } - -#ifndef SQLITE_OMIT_AUTOINCREMENT - /* Remove any entries of the sqlite_sequence table associated with - ** the table being dropped. This is done before the table is dropped - ** at the btree level, in case the sqlite_sequence table needs to - ** move as a result of the drop (can happen in auto-vacuum mode). - */ - if( pTab->autoInc ){ - sqlite3NestedParse(pParse, - "DELETE FROM %s.sqlite_sequence WHERE name=%Q", - pDb->zName, pTab->zName - ); - } -#endif - - /* Drop all SQLITE_MASTER table and index entries that refer to the - ** table. The program name loops through the master table and deletes - ** every row that refers to a table of the same name as the one being - ** dropped. Triggers are handled seperately because a trigger can be - ** created in the temp database that refers to a table in another - ** database. - */ - sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", - pDb->zName, SCHEMA_TABLE(iDb), pTab->zName); - if( !isView && !IsVirtual(pTab) ){ - destroyTable(pParse, pTab); - } - - /* Remove the table entry from SQLite's internal schema and modify - ** the schema cookie. - */ - if( IsVirtual(pTab) ){ - sqlite3VdbeOp3(v, OP_VDestroy, iDb, 0, pTab->zName, 0); - } - sqlite3VdbeOp3(v, OP_DropTable, iDb, 0, pTab->zName, 0); - sqlite3ChangeCookie(db, v, iDb); - } - sqliteViewResetAll(db, iDb); - -exit_drop_table: - sqlite3SrcListDelete(pName); -} - -/* -** This routine is called to create a new foreign key on the table -** currently under construction. pFromCol determines which columns -** in the current table point to the foreign key. If pFromCol==0 then -** connect the key to the last column inserted. pTo is the name of -** the table referred to. pToCol is a list of tables in the other -** pTo table that the foreign key points to. flags contains all -** information about the conflict resolution algorithms specified -** in the ON DELETE, ON UPDATE and ON INSERT clauses. -** -** An FKey structure is created and added to the table currently -** under construction in the pParse->pNewTable field. The new FKey -** is not linked into db->aFKey at this point - that does not happen -** until sqlite3EndTable(). -** -** The foreign key is set for IMMEDIATE processing. A subsequent call -** to sqlite3DeferForeignKey() might change this to DEFERRED. -*/ -void sqlite3CreateForeignKey( - Parse *pParse, /* Parsing context */ - ExprList *pFromCol, /* Columns in this table that point to other table */ - Token *pTo, /* Name of the other table */ - ExprList *pToCol, /* Columns in the other table */ - int flags /* Conflict resolution algorithms. */ -){ -#ifndef SQLITE_OMIT_FOREIGN_KEY - FKey *pFKey = 0; - Table *p = pParse->pNewTable; - int nByte; - int i; - int nCol; - char *z; - - assert( pTo!=0 ); - if( p==0 || pParse->nErr || IN_DECLARE_VTAB ) goto fk_end; - if( pFromCol==0 ){ - int iCol = p->nCol-1; - if( iCol<0 ) goto fk_end; - if( pToCol && pToCol->nExpr!=1 ){ - sqlite3ErrorMsg(pParse, "foreign key on %s" - " should reference only one column of table %T", - p->aCol[iCol].zName, pTo); - goto fk_end; - } - nCol = 1; - }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){ - sqlite3ErrorMsg(pParse, - "number of columns in foreign key does not match the number of " - "columns in the referenced table"); - goto fk_end; - }else{ - nCol = pFromCol->nExpr; - } - nByte = sizeof(*pFKey) + nCol*sizeof(pFKey->aCol[0]) + pTo->n + 1; - if( pToCol ){ - for(i=0; inExpr; i++){ - nByte += strlen(pToCol->a[i].zName) + 1; - } - } - pFKey = sqlite3DbMallocZero(pParse->db, nByte ); - if( pFKey==0 ){ - goto fk_end; - } - pFKey->pFrom = p; - pFKey->pNextFrom = p->pFKey; - z = (char*)&pFKey[1]; - pFKey->aCol = (struct sColMap*)z; - z += sizeof(struct sColMap)*nCol; - pFKey->zTo = z; - memcpy(z, pTo->z, pTo->n); - z[pTo->n] = 0; - z += pTo->n+1; - pFKey->pNextTo = 0; - pFKey->nCol = nCol; - if( pFromCol==0 ){ - pFKey->aCol[0].iFrom = p->nCol-1; - }else{ - for(i=0; inCol; j++){ - if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){ - pFKey->aCol[i].iFrom = j; - break; - } - } - if( j>=p->nCol ){ - sqlite3ErrorMsg(pParse, - "unknown column \"%s\" in foreign key definition", - pFromCol->a[i].zName); - goto fk_end; - } - } - } - if( pToCol ){ - for(i=0; ia[i].zName); - pFKey->aCol[i].zCol = z; - memcpy(z, pToCol->a[i].zName, n); - z[n] = 0; - z += n+1; - } - } - pFKey->isDeferred = 0; - pFKey->deleteConf = flags & 0xff; - pFKey->updateConf = (flags >> 8 ) & 0xff; - pFKey->insertConf = (flags >> 16 ) & 0xff; - - /* Link the foreign key to the table as the last step. - */ - p->pFKey = pFKey; - pFKey = 0; - -fk_end: - sqlite3_free(pFKey); -#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ - sqlite3ExprListDelete(pFromCol); - sqlite3ExprListDelete(pToCol); -} - -/* -** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED -** clause is seen as part of a foreign key definition. The isDeferred -** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE. -** The behavior of the most recently created foreign key is adjusted -** accordingly. -*/ -void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ -#ifndef SQLITE_OMIT_FOREIGN_KEY - Table *pTab; - FKey *pFKey; - if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return; - pFKey->isDeferred = isDeferred; -#endif -} - -/* -** Generate code that will erase and refill index *pIdx. This is -** used to initialize a newly created index or to recompute the -** content of an index in response to a REINDEX command. -** -** if memRootPage is not negative, it means that the index is newly -** created. The memory cell specified by memRootPage contains the -** root page number of the index. If memRootPage is negative, then -** the index already exists and must be cleared before being refilled and -** the root page number of the index is taken from pIndex->tnum. -*/ -static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ - Table *pTab = pIndex->pTable; /* The table that is indexed */ - int iTab = pParse->nTab; /* Btree cursor used for pTab */ - int iIdx = pParse->nTab+1; /* Btree cursor used for pIndex */ - int addr1; /* Address of top of loop */ - int tnum; /* Root page of index */ - Vdbe *v; /* Generate code into this virtual machine */ - KeyInfo *pKey; /* KeyInfo for index */ - sqlite3 *db = pParse->db; /* The database connection */ - int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); - -#ifndef SQLITE_OMIT_AUTHORIZATION - if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, - db->aDb[iDb].zName ) ){ - return; - } -#endif - - /* Require a write-lock on the table to perform this operation */ - sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); - - v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - if( memRootPage>=0 ){ - sqlite3VdbeAddOp(v, OP_MemLoad, memRootPage, 0); - tnum = 0; - }else{ - tnum = pIndex->tnum; - sqlite3VdbeAddOp(v, OP_Clear, tnum, iDb); - } - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - pKey = sqlite3IndexKeyinfo(pParse, pIndex); - sqlite3VdbeOp3(v, OP_OpenWrite, iIdx, tnum, (char *)pKey, P3_KEYINFO_HANDOFF); - sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); - addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iTab, 0); - sqlite3GenerateIndexKey(v, pIndex, iTab); - if( pIndex->onError!=OE_None ){ - int curaddr = sqlite3VdbeCurrentAddr(v); - int addr2 = curaddr+4; - sqlite3VdbeChangeP2(v, curaddr-1, addr2); - sqlite3VdbeAddOp(v, OP_Rowid, iTab, 0); - sqlite3VdbeAddOp(v, OP_AddImm, 1, 0); - sqlite3VdbeAddOp(v, OP_IsUnique, iIdx, addr2); - sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, OE_Abort, - "indexed columns are not unique", P3_STATIC); - assert( db->mallocFailed || addr2==sqlite3VdbeCurrentAddr(v) ); - } - sqlite3VdbeAddOp(v, OP_IdxInsert, iIdx, 0); - sqlite3VdbeAddOp(v, OP_Next, iTab, addr1+1); - sqlite3VdbeJumpHere(v, addr1); - sqlite3VdbeAddOp(v, OP_Close, iTab, 0); - sqlite3VdbeAddOp(v, OP_Close, iIdx, 0); -} - -/* -** Create a new index for an SQL table. pName1.pName2 is the name of the index -** and pTblList is the name of the table that is to be indexed. Both will -** be NULL for a primary key or an index that is created to satisfy a -** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable -** as the table to be indexed. pParse->pNewTable is a table that is -** currently being constructed by a CREATE TABLE statement. -** -** pList is a list of columns to be indexed. pList will be NULL if this -** is a primary key or unique-constraint on the most recent column added -** to the table currently under construction. -*/ -void sqlite3CreateIndex( - Parse *pParse, /* All information about this parse */ - Token *pName1, /* First part of index name. May be NULL */ - Token *pName2, /* Second part of index name. May be NULL */ - SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */ - ExprList *pList, /* A list of columns to be indexed */ - int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - Token *pStart, /* The CREATE token that begins this statement */ - Token *pEnd, /* The ")" that closes the CREATE INDEX statement */ - int sortOrder, /* Sort order of primary key when pList==NULL */ - int ifNotExist /* Omit error if index already exists */ -){ - Table *pTab = 0; /* Table to be indexed */ - Index *pIndex = 0; /* The index to be created */ - char *zName = 0; /* Name of the index */ - int nName; /* Number of characters in zName */ - int i, j; - Token nullId; /* Fake token for an empty ID list */ - DbFixer sFix; /* For assigning database names to pTable */ - int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */ - sqlite3 *db = pParse->db; - Db *pDb; /* The specific table containing the indexed database */ - int iDb; /* Index of the database that is being written */ - Token *pName = 0; /* Unqualified name of the index to create */ - struct ExprList_item *pListItem; /* For looping over pList */ - int nCol; - int nExtra = 0; - char *zExtra; - - if( pParse->nErr || db->mallocFailed || IN_DECLARE_VTAB ){ - goto exit_create_index; - } - - /* - ** Find the table that is to be indexed. Return early if not found. - */ - if( pTblName!=0 ){ - - /* Use the two-part index name to determine the database - ** to search for the table. 'Fix' the table name to this db - ** before looking up the table. - */ - assert( pName1 && pName2 ); - iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); - if( iDb<0 ) goto exit_create_index; - -#ifndef SQLITE_OMIT_TEMPDB - /* If the index name was unqualified, check if the the table - ** is a temp table. If so, set the database to 1. - */ - pTab = sqlite3SrcListLookup(pParse, pTblName); - if( pName2 && pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ - iDb = 1; - } -#endif - - if( sqlite3FixInit(&sFix, pParse, iDb, "index", pName) && - sqlite3FixSrcList(&sFix, pTblName) - ){ - /* Because the parser constructs pTblName from a single identifier, - ** sqlite3FixSrcList can never fail. */ - assert(0); - } - pTab = sqlite3LocateTable(pParse, pTblName->a[0].zName, - pTblName->a[0].zDatabase); - if( !pTab ) goto exit_create_index; - assert( db->aDb[iDb].pSchema==pTab->pSchema ); - }else{ - assert( pName==0 ); - pTab = pParse->pNewTable; - if( !pTab ) goto exit_create_index; - iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - } - pDb = &db->aDb[iDb]; - - if( pTab==0 || pParse->nErr ) goto exit_create_index; - if( pTab->readOnly ){ - sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); - goto exit_create_index; - } -#ifndef SQLITE_OMIT_VIEW - if( pTab->pSelect ){ - sqlite3ErrorMsg(pParse, "views may not be indexed"); - goto exit_create_index; - } -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - sqlite3ErrorMsg(pParse, "virtual tables may not be indexed"); - goto exit_create_index; - } -#endif - - /* - ** Find the name of the index. Make sure there is not already another - ** index or table with the same name. - ** - ** Exception: If we are reading the names of permanent indices from the - ** sqlite_master table (because some other process changed the schema) and - ** one of the index names collides with the name of a temporary table or - ** index, then we will continue to process this index. - ** - ** If pName==0 it means that we are - ** dealing with a primary key or UNIQUE constraint. We have to invent our - ** own name. - */ - if( pName ){ - zName = sqlite3NameFromToken(db, pName); - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index; - if( zName==0 ) goto exit_create_index; - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ - goto exit_create_index; - } - if( !db->init.busy ){ - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index; - if( sqlite3FindTable(db, zName, 0)!=0 ){ - sqlite3ErrorMsg(pParse, "there is already a table named %s", zName); - goto exit_create_index; - } - } - if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){ - if( !ifNotExist ){ - sqlite3ErrorMsg(pParse, "index %s already exists", zName); - } - goto exit_create_index; - } - }else{ - char zBuf[30]; - int n; - Index *pLoop; - for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){} - sqlite3_snprintf(sizeof(zBuf),zBuf,"_%d",n); - zName = 0; - sqlite3SetString(&zName, "sqlite_autoindex_", pTab->zName, zBuf, (char*)0); - if( zName==0 ){ - db->mallocFailed = 1; - goto exit_create_index; - } - } - - /* Check for authorization to create an index. - */ -#ifndef SQLITE_OMIT_AUTHORIZATION - { - const char *zDb = pDb->zName; - if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ - goto exit_create_index; - } - i = SQLITE_CREATE_INDEX; - if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX; - if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){ - goto exit_create_index; - } - } -#endif - - /* If pList==0, it means this routine was called to make a primary - ** key out of the last column added to the table under construction. - ** So create a fake list to simulate this. - */ - if( pList==0 ){ - nullId.z = (u8*)pTab->aCol[pTab->nCol-1].zName; - nullId.n = strlen((char*)nullId.z); - pList = sqlite3ExprListAppend(pParse, 0, 0, &nullId); - if( pList==0 ) goto exit_create_index; - pList->a[0].sortOrder = sortOrder; - } - - /* Figure out how many bytes of space are required to store explicitly - ** specified collation sequence names. - */ - for(i=0; inExpr; i++){ - Expr *pExpr = pList->a[i].pExpr; - if( pExpr ){ - nExtra += (1 + strlen(pExpr->pColl->zName)); - } - } - - /* - ** Allocate the index structure. - */ - nName = strlen(zName); - nCol = pList->nExpr; - pIndex = sqlite3DbMallocZero(db, - sizeof(Index) + /* Index structure */ - sizeof(int)*nCol + /* Index.aiColumn */ - sizeof(int)*(nCol+1) + /* Index.aiRowEst */ - sizeof(char *)*nCol + /* Index.azColl */ - sizeof(u8)*nCol + /* Index.aSortOrder */ - nName + 1 + /* Index.zName */ - nExtra /* Collation sequence names */ - ); - if( db->mallocFailed ){ - goto exit_create_index; - } - pIndex->azColl = (char**)(&pIndex[1]); - pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]); - pIndex->aiRowEst = (unsigned *)(&pIndex->aiColumn[nCol]); - pIndex->aSortOrder = (u8 *)(&pIndex->aiRowEst[nCol+1]); - pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]); - zExtra = (char *)(&pIndex->zName[nName+1]); - memcpy(pIndex->zName, zName, nName+1); - pIndex->pTable = pTab; - pIndex->nColumn = pList->nExpr; - pIndex->onError = onError; - pIndex->autoIndex = pName==0; - pIndex->pSchema = db->aDb[iDb].pSchema; - - /* Check to see if we should honor DESC requests on index columns - */ - if( pDb->pSchema->file_format>=4 ){ - sortOrderMask = -1; /* Honor DESC */ - }else{ - sortOrderMask = 0; /* Ignore DESC */ - } - - /* Scan the names of the columns of the table to be indexed and - ** load the column indices into the Index structure. Report an error - ** if any column is not found. - */ - for(i=0, pListItem=pList->a; inExpr; i++, pListItem++){ - const char *zColName = pListItem->zName; - Column *pTabCol; - int requestedSortOrder; - char *zColl; /* Collation sequence name */ - - for(j=0, pTabCol=pTab->aCol; jnCol; j++, pTabCol++){ - if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break; - } - if( j>=pTab->nCol ){ - sqlite3ErrorMsg(pParse, "table %s has no column named %s", - pTab->zName, zColName); - goto exit_create_index; - } - /* TODO: Add a test to make sure that the same column is not named - ** more than once within the same index. Only the first instance of - ** the column will ever be used by the optimizer. Note that using the - ** same column more than once cannot be an error because that would - ** break backwards compatibility - it needs to be a warning. - */ - pIndex->aiColumn[i] = j; - if( pListItem->pExpr ){ - assert( pListItem->pExpr->pColl ); - zColl = zExtra; - sqlite3_snprintf(nExtra, zExtra, "%s", pListItem->pExpr->pColl->zName); - zExtra += (strlen(zColl) + 1); - }else{ - zColl = pTab->aCol[j].zColl; - if( !zColl ){ - zColl = db->pDfltColl->zName; - } - } - if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl, -1) ){ - goto exit_create_index; - } - pIndex->azColl[i] = zColl; - requestedSortOrder = pListItem->sortOrder & sortOrderMask; - pIndex->aSortOrder[i] = requestedSortOrder; - } - sqlite3DefaultRowEst(pIndex); - - if( pTab==pParse->pNewTable ){ - /* This routine has been called to create an automatic index as a - ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or - ** a PRIMARY KEY or UNIQUE clause following the column definitions. - ** i.e. one of: - ** - ** CREATE TABLE t(x PRIMARY KEY, y); - ** CREATE TABLE t(x, y, UNIQUE(x, y)); - ** - ** Either way, check to see if the table already has such an index. If - ** so, don't bother creating this one. This only applies to - ** automatically created indices. Users can do as they wish with - ** explicit indices. - */ - Index *pIdx; - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - int k; - assert( pIdx->onError!=OE_None ); - assert( pIdx->autoIndex ); - assert( pIndex->onError!=OE_None ); - - if( pIdx->nColumn!=pIndex->nColumn ) continue; - for(k=0; knColumn; k++){ - const char *z1 = pIdx->azColl[k]; - const char *z2 = pIndex->azColl[k]; - if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break; - if( pIdx->aSortOrder[k]!=pIndex->aSortOrder[k] ) break; - if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break; - } - if( k==pIdx->nColumn ){ - if( pIdx->onError!=pIndex->onError ){ - /* This constraint creates the same index as a previous - ** constraint specified somewhere in the CREATE TABLE statement. - ** However the ON CONFLICT clauses are different. If both this - ** constraint and the previous equivalent constraint have explicit - ** ON CONFLICT clauses this is an error. Otherwise, use the - ** explicitly specified behaviour for the index. - */ - if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){ - sqlite3ErrorMsg(pParse, - "conflicting ON CONFLICT clauses specified", 0); - } - if( pIdx->onError==OE_Default ){ - pIdx->onError = pIndex->onError; - } - } - goto exit_create_index; - } - } - } - - /* Link the new Index structure to its table and to the other - ** in-memory database structures. - */ - if( db->init.busy ){ - Index *p; - p = sqlite3HashInsert(&pIndex->pSchema->idxHash, - pIndex->zName, strlen(pIndex->zName)+1, pIndex); - if( p ){ - assert( p==pIndex ); /* Malloc must have failed */ - db->mallocFailed = 1; - goto exit_create_index; - } - db->flags |= SQLITE_InternChanges; - if( pTblName!=0 ){ - pIndex->tnum = db->init.newTnum; - } - } - - /* If the db->init.busy is 0 then create the index on disk. This - ** involves writing the index into the master table and filling in the - ** index with the current table contents. - ** - ** The db->init.busy is 0 when the user first enters a CREATE INDEX - ** command. db->init.busy is 1 when a database is opened and - ** CREATE INDEX statements are read out of the master table. In - ** the latter case the index already exists on disk, which is why - ** we don't want to recreate it. - ** - ** If pTblName==0 it means this index is generated as a primary key - ** or UNIQUE constraint of a CREATE TABLE statement. Since the table - ** has just been created, it contains no data and the index initialization - ** step can be skipped. - */ - else if( db->init.busy==0 ){ - Vdbe *v; - char *zStmt; - int iMem = pParse->nMem++; - - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto exit_create_index; - - - /* Create the rootpage for the index - */ - sqlite3BeginWriteOperation(pParse, 1, iDb); - sqlite3VdbeAddOp(v, OP_CreateIndex, iDb, 0); - sqlite3VdbeAddOp(v, OP_MemStore, iMem, 0); - - /* Gather the complete text of the CREATE INDEX statement into - ** the zStmt variable - */ - if( pStart && pEnd ){ - /* A named index with an explicit CREATE INDEX statement */ - zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s", - onError==OE_None ? "" : " UNIQUE", - pEnd->z - pName->z + 1, - pName->z); - }else{ - /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */ - /* zStmt = sqlite3MPrintf(""); */ - zStmt = 0; - } - - /* Add an entry in sqlite_master for this index - */ - sqlite3NestedParse(pParse, - "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#0,%Q);", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), - pIndex->zName, - pTab->zName, - zStmt - ); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3_free(zStmt); - - /* Fill the index with data and reparse the schema. Code an OP_Expire - ** to invalidate all pre-compiled statements. - */ - if( pTblName ){ - sqlite3RefillIndex(pParse, pIndex, iMem); - sqlite3ChangeCookie(db, v, iDb); - sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, - sqlite3MPrintf(db, "name='%q'", pIndex->zName), P3_DYNAMIC); - sqlite3VdbeAddOp(v, OP_Expire, 0, 0); - } - } - - /* When adding an index to the list of indices for a table, make - ** sure all indices labeled OE_Replace come after all those labeled - ** OE_Ignore. This is necessary for the correct operation of UPDATE - ** and INSERT. - */ - if( db->init.busy || pTblName==0 ){ - if( onError!=OE_Replace || pTab->pIndex==0 - || pTab->pIndex->onError==OE_Replace){ - pIndex->pNext = pTab->pIndex; - pTab->pIndex = pIndex; - }else{ - Index *pOther = pTab->pIndex; - while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){ - pOther = pOther->pNext; - } - pIndex->pNext = pOther->pNext; - pOther->pNext = pIndex; - } - pIndex = 0; - } - - /* Clean up before exiting */ -exit_create_index: - if( pIndex ){ - freeIndex(pIndex); - } - sqlite3ExprListDelete(pList); - sqlite3SrcListDelete(pTblName); - sqlite3_free(zName); - return; -} - -/* -** Generate code to make sure the file format number is at least minFormat. -** The generated code will increase the file format number if necessary. -*/ -void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){ - Vdbe *v; - v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 1); - sqlite3VdbeUsesBtree(v, iDb); - sqlite3VdbeAddOp(v, OP_Integer, minFormat, 0); - sqlite3VdbeAddOp(v, OP_Ge, 0, sqlite3VdbeCurrentAddr(v)+3); - sqlite3VdbeAddOp(v, OP_Integer, minFormat, 0); - sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 1); - } -} - -/* -** Fill the Index.aiRowEst[] array with default information - information -** to be used when we have not run the ANALYZE command. -** -** aiRowEst[0] is suppose to contain the number of elements in the index. -** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the -** number of rows in the table that match any particular value of the -** first column of the index. aiRowEst[2] is an estimate of the number -** of rows that match any particular combiniation of the first 2 columns -** of the index. And so forth. It must always be the case that -* -** aiRowEst[N]<=aiRowEst[N-1] -** aiRowEst[N]>=1 -** -** Apart from that, we have little to go on besides intuition as to -** how aiRowEst[] should be initialized. The numbers generated here -** are based on typical values found in actual indices. -*/ -void sqlite3DefaultRowEst(Index *pIdx){ - unsigned *a = pIdx->aiRowEst; - int i; - assert( a!=0 ); - a[0] = 1000000; - for(i=pIdx->nColumn; i>=5; i--){ - a[i] = 5; - } - while( i>=1 ){ - a[i] = 11 - i; - i--; - } - if( pIdx->onError!=OE_None ){ - a[pIdx->nColumn] = 1; - } -} - -/* -** This routine will drop an existing named index. This routine -** implements the DROP INDEX statement. -*/ -void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ - Index *pIndex; - Vdbe *v; - sqlite3 *db = pParse->db; - int iDb; - - if( pParse->nErr || db->mallocFailed ){ - goto exit_drop_index; - } - assert( pName->nSrc==1 ); - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ - goto exit_drop_index; - } - pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); - if( pIndex==0 ){ - if( !ifExists ){ - sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0); - } - pParse->checkSchema = 1; - goto exit_drop_index; - } - if( pIndex->autoIndex ){ - sqlite3ErrorMsg(pParse, "index associated with UNIQUE " - "or PRIMARY KEY constraint cannot be dropped", 0); - goto exit_drop_index; - } - iDb = sqlite3SchemaToIndex(db, pIndex->pSchema); -#ifndef SQLITE_OMIT_AUTHORIZATION - { - int code = SQLITE_DROP_INDEX; - Table *pTab = pIndex->pTable; - const char *zDb = db->aDb[iDb].zName; - const char *zTab = SCHEMA_TABLE(iDb); - if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ - goto exit_drop_index; - } - if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX; - if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){ - goto exit_drop_index; - } - } -#endif - - /* Generate code to remove the index and from the master table */ - v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE name=%Q", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), - pIndex->zName - ); - sqlite3ChangeCookie(db, v, iDb); - destroyRootPage(pParse, pIndex->tnum, iDb); - sqlite3VdbeOp3(v, OP_DropIndex, iDb, 0, pIndex->zName, 0); - } - -exit_drop_index: - sqlite3SrcListDelete(pName); -} - -/* -** pArray is a pointer to an array of objects. Each object in the -** array is szEntry bytes in size. This routine allocates a new -** object on the end of the array. -** -** *pnEntry is the number of entries already in use. *pnAlloc is -** the previously allocated size of the array. initSize is the -** suggested initial array size allocation. -** -** The index of the new entry is returned in *pIdx. -** -** This routine returns a pointer to the array of objects. This -** might be the same as the pArray parameter or it might be a different -** pointer if the array was resized. -*/ -void *sqlite3ArrayAllocate( - sqlite3 *db, /* Connection to notify of malloc failures */ - void *pArray, /* Array of objects. Might be reallocated */ - int szEntry, /* Size of each object in the array */ - int initSize, /* Suggested initial allocation, in elements */ - int *pnEntry, /* Number of objects currently in use */ - int *pnAlloc, /* Current size of the allocation, in elements */ - int *pIdx /* Write the index of a new slot here */ -){ - char *z; - if( *pnEntry >= *pnAlloc ){ - void *pNew; - int newSize; - newSize = (*pnAlloc)*2 + initSize; - pNew = sqlite3DbRealloc(db, pArray, newSize*szEntry); - if( pNew==0 ){ - *pIdx = -1; - return pArray; - } - *pnAlloc = newSize; - pArray = pNew; - } - z = (char*)pArray; - memset(&z[*pnEntry * szEntry], 0, szEntry); - *pIdx = *pnEntry; - ++*pnEntry; - return pArray; -} - -/* -** Append a new element to the given IdList. Create a new IdList if -** need be. -** -** A new IdList is returned, or NULL if malloc() fails. -*/ -IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){ - int i; - if( pList==0 ){ - pList = sqlite3DbMallocZero(db, sizeof(IdList) ); - if( pList==0 ) return 0; - pList->nAlloc = 0; - } - pList->a = sqlite3ArrayAllocate( - db, - pList->a, - sizeof(pList->a[0]), - 5, - &pList->nId, - &pList->nAlloc, - &i - ); - if( i<0 ){ - sqlite3IdListDelete(pList); - return 0; - } - pList->a[i].zName = sqlite3NameFromToken(db, pToken); - return pList; -} - -/* -** Delete an IdList. -*/ -void sqlite3IdListDelete(IdList *pList){ - int i; - if( pList==0 ) return; - for(i=0; inId; i++){ - sqlite3_free(pList->a[i].zName); - } - sqlite3_free(pList->a); - sqlite3_free(pList); -} - -/* -** Return the index in pList of the identifier named zId. Return -1 -** if not found. -*/ -int sqlite3IdListIndex(IdList *pList, const char *zName){ - int i; - if( pList==0 ) return -1; - for(i=0; inId; i++){ - if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; - } - return -1; -} - -/* -** Append a new table name to the given SrcList. Create a new SrcList if -** need be. A new entry is created in the SrcList even if pToken is NULL. -** -** A new SrcList is returned, or NULL if malloc() fails. -** -** If pDatabase is not null, it means that the table has an optional -** database name prefix. Like this: "database.table". The pDatabase -** points to the table name and the pTable points to the database name. -** The SrcList.a[].zName field is filled with the table name which might -** come from pTable (if pDatabase is NULL) or from pDatabase. -** SrcList.a[].zDatabase is filled with the database name from pTable, -** or with NULL if no database is specified. -** -** In other words, if call like this: -** -** sqlite3SrcListAppend(D,A,B,0); -** -** Then B is a table name and the database name is unspecified. If called -** like this: -** -** sqlite3SrcListAppend(D,A,B,C); -** -** Then C is the table name and B is the database name. -*/ -SrcList *sqlite3SrcListAppend( - sqlite3 *db, /* Connection to notify of malloc failures */ - SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ - Token *pTable, /* Table to append */ - Token *pDatabase /* Database of the table */ -){ - struct SrcList_item *pItem; - if( pList==0 ){ - pList = sqlite3DbMallocZero(db, sizeof(SrcList) ); - if( pList==0 ) return 0; - pList->nAlloc = 1; - } - if( pList->nSrc>=pList->nAlloc ){ - SrcList *pNew; - pList->nAlloc *= 2; - pNew = sqlite3DbRealloc(db, pList, - sizeof(*pList) + (pList->nAlloc-1)*sizeof(pList->a[0]) ); - if( pNew==0 ){ - sqlite3SrcListDelete(pList); - return 0; - } - pList = pNew; - } - pItem = &pList->a[pList->nSrc]; - memset(pItem, 0, sizeof(pList->a[0])); - if( pDatabase && pDatabase->z==0 ){ - pDatabase = 0; - } - if( pDatabase && pTable ){ - Token *pTemp = pDatabase; - pDatabase = pTable; - pTable = pTemp; - } - pItem->zName = sqlite3NameFromToken(db, pTable); - pItem->zDatabase = sqlite3NameFromToken(db, pDatabase); - pItem->iCursor = -1; - pItem->isPopulated = 0; - pList->nSrc++; - return pList; -} - -/* -** Assign cursors to all tables in a SrcList -*/ -void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ - int i; - struct SrcList_item *pItem; - assert(pList || pParse->db->mallocFailed ); - if( pList ){ - for(i=0, pItem=pList->a; inSrc; i++, pItem++){ - if( pItem->iCursor>=0 ) break; - pItem->iCursor = pParse->nTab++; - if( pItem->pSelect ){ - sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); - } - } - } -} - -/* -** Delete an entire SrcList including all its substructure. -*/ -void sqlite3SrcListDelete(SrcList *pList){ - int i; - struct SrcList_item *pItem; - if( pList==0 ) return; - for(pItem=pList->a, i=0; inSrc; i++, pItem++){ - sqlite3_free(pItem->zDatabase); - sqlite3_free(pItem->zName); - sqlite3_free(pItem->zAlias); - sqlite3DeleteTable(pItem->pTab); - sqlite3SelectDelete(pItem->pSelect); - sqlite3ExprDelete(pItem->pOn); - sqlite3IdListDelete(pItem->pUsing); - } - sqlite3_free(pList); -} - -/* -** This routine is called by the parser to add a new term to the -** end of a growing FROM clause. The "p" parameter is the part of -** the FROM clause that has already been constructed. "p" is NULL -** if this is the first term of the FROM clause. pTable and pDatabase -** are the name of the table and database named in the FROM clause term. -** pDatabase is NULL if the database name qualifier is missing - the -** usual case. If the term has a alias, then pAlias points to the -** alias token. If the term is a subquery, then pSubquery is the -** SELECT statement that the subquery encodes. The pTable and -** pDatabase parameters are NULL for subqueries. The pOn and pUsing -** parameters are the content of the ON and USING clauses. -** -** Return a new SrcList which encodes is the FROM with the new -** term added. -*/ -SrcList *sqlite3SrcListAppendFromTerm( - Parse *pParse, /* Parsing context */ - SrcList *p, /* The left part of the FROM clause already seen */ - Token *pTable, /* Name of the table to add to the FROM clause */ - Token *pDatabase, /* Name of the database containing pTable */ - Token *pAlias, /* The right-hand side of the AS subexpression */ - Select *pSubquery, /* A subquery used in place of a table name */ - Expr *pOn, /* The ON clause of a join */ - IdList *pUsing /* The USING clause of a join */ -){ - struct SrcList_item *pItem; - sqlite3 *db = pParse->db; - p = sqlite3SrcListAppend(db, p, pTable, pDatabase); - if( p==0 || p->nSrc==0 ){ - sqlite3ExprDelete(pOn); - sqlite3IdListDelete(pUsing); - sqlite3SelectDelete(pSubquery); - return p; - } - pItem = &p->a[p->nSrc-1]; - if( pAlias && pAlias->n ){ - pItem->zAlias = sqlite3NameFromToken(db, pAlias); - } - pItem->pSelect = pSubquery; - pItem->pOn = pOn; - pItem->pUsing = pUsing; - return p; -} - -/* -** When building up a FROM clause in the parser, the join operator -** is initially attached to the left operand. But the code generator -** expects the join operator to be on the right operand. This routine -** Shifts all join operators from left to right for an entire FROM -** clause. -** -** Example: Suppose the join is like this: -** -** A natural cross join B -** -** The operator is "natural cross join". The A and B operands are stored -** in p->a[0] and p->a[1], respectively. The parser initially stores the -** operator with A. This routine shifts that operator over to B. -*/ -void sqlite3SrcListShiftJoinType(SrcList *p){ - if( p && p->a ){ - int i; - for(i=p->nSrc-1; i>0; i--){ - p->a[i].jointype = p->a[i-1].jointype; - } - p->a[0].jointype = 0; - } -} - -/* -** Begin a transaction -*/ -void sqlite3BeginTransaction(Parse *pParse, int type){ - sqlite3 *db; - Vdbe *v; - int i; - - if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; - if( pParse->nErr || db->mallocFailed ) return; - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return; - - v = sqlite3GetVdbe(pParse); - if( !v ) return; - if( type!=TK_DEFERRED ){ - for(i=0; inDb; i++){ - sqlite3VdbeAddOp(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1); - sqlite3VdbeUsesBtree(v, i); - } - } - sqlite3VdbeAddOp(v, OP_AutoCommit, 0, 0); -} - -/* -** Commit a transaction -*/ -void sqlite3CommitTransaction(Parse *pParse){ - sqlite3 *db; - Vdbe *v; - - if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; - if( pParse->nErr || db->mallocFailed ) return; - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return; - - v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp(v, OP_AutoCommit, 1, 0); - } -} - -/* -** Rollback a transaction -*/ -void sqlite3RollbackTransaction(Parse *pParse){ - sqlite3 *db; - Vdbe *v; - - if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return; - if( pParse->nErr || db->mallocFailed ) return; - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return; - - v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp(v, OP_AutoCommit, 1, 1); - } -} - -/* -** Make sure the TEMP database is open and available for use. Return -** the number of errors. Leave any error messages in the pParse structure. -*/ -int sqlite3OpenTempDatabase(Parse *pParse){ - sqlite3 *db = pParse->db; - if( db->aDb[1].pBt==0 && !pParse->explain ){ - int rc; - static const int flags = - SQLITE_OPEN_READWRITE | - SQLITE_OPEN_CREATE | - SQLITE_OPEN_EXCLUSIVE | - SQLITE_OPEN_DELETEONCLOSE | - SQLITE_OPEN_TEMP_DB; - - rc = sqlite3BtreeFactory(db, 0, 0, SQLITE_DEFAULT_CACHE_SIZE, flags, - &db->aDb[1].pBt); - if( rc!=SQLITE_OK ){ - sqlite3ErrorMsg(pParse, "unable to open a temporary database " - "file for storing temporary tables"); - pParse->rc = rc; - return 1; - } - if( db->flags & !db->autoCommit ){ - rc = sqlite3BtreeBeginTrans(db->aDb[1].pBt, 1); - if( rc!=SQLITE_OK ){ - sqlite3ErrorMsg(pParse, "unable to get a write lock on " - "the temporary database file"); - pParse->rc = rc; - return 1; - } - } - assert( db->aDb[1].pSchema ); - } - return 0; -} - -/* -** Generate VDBE code that will verify the schema cookie and start -** a read-transaction for all named database files. -** -** It is important that all schema cookies be verified and all -** read transactions be started before anything else happens in -** the VDBE program. But this routine can be called after much other -** code has been generated. So here is what we do: -** -** The first time this routine is called, we code an OP_Goto that -** will jump to a subroutine at the end of the program. Then we -** record every database that needs its schema verified in the -** pParse->cookieMask field. Later, after all other code has been -** generated, the subroutine that does the cookie verifications and -** starts the transactions will be coded and the OP_Goto P2 value -** will be made to point to that subroutine. The generation of the -** cookie verification subroutine code happens in sqlite3FinishCoding(). -** -** If iDb<0 then code the OP_Goto only - don't set flag to verify the -** schema on any databases. This can be used to position the OP_Goto -** early in the code, before we know if any database tables will be used. -*/ -void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ - sqlite3 *db; - Vdbe *v; - int mask; - - v = sqlite3GetVdbe(pParse); - if( v==0 ) return; /* This only happens if there was a prior error */ - db = pParse->db; - if( pParse->cookieGoto==0 ){ - pParse->cookieGoto = sqlite3VdbeAddOp(v, OP_Goto, 0, 0)+1; - } - if( iDb>=0 ){ - assert( iDbnDb ); - assert( db->aDb[iDb].pBt!=0 || iDb==1 ); - assert( iDbcookieMask & mask)==0 ){ - pParse->cookieMask |= mask; - pParse->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie; - if( !OMIT_TEMPDB && iDb==1 ){ - sqlite3OpenTempDatabase(pParse); - } - } - } -} - -/* -** Generate VDBE code that prepares for doing an operation that -** might change the database. -** -** This routine starts a new transaction if we are not already within -** a transaction. If we are already within a transaction, then a checkpoint -** is set if the setStatement parameter is true. A checkpoint should -** be set for operations that might fail (due to a constraint) part of -** the way through and which will need to undo some writes without having to -** rollback the whole transaction. For operations where all constraints -** can be checked before any changes are made to the database, it is never -** necessary to undo a write and the checkpoint should not be set. -** -** Only database iDb and the temp database are made writable by this call. -** If iDb==0, then the main and temp databases are made writable. If -** iDb==1 then only the temp database is made writable. If iDb>1 then the -** specified auxiliary database and the temp database are made writable. -*/ -void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){ - Vdbe *v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - sqlite3CodeVerifySchema(pParse, iDb); - pParse->writeMask |= 1<nested==0 ){ - sqlite3VdbeAddOp(v, OP_Statement, iDb, 0); - } - if( (OMIT_TEMPDB || iDb!=1) && pParse->db->aDb[1].pBt!=0 ){ - sqlite3BeginWriteOperation(pParse, setStatement, 1); - } -} - -/* -** Check to see if pIndex uses the collating sequence pColl. Return -** true if it does and false if it does not. -*/ -#ifndef SQLITE_OMIT_REINDEX -static int collationMatch(const char *zColl, Index *pIndex){ - int i; - for(i=0; inColumn; i++){ - const char *z = pIndex->azColl[i]; - if( z==zColl || (z && zColl && 0==sqlite3StrICmp(z, zColl)) ){ - return 1; - } - } - return 0; -} -#endif - -/* -** Recompute all indices of pTab that use the collating sequence pColl. -** If pColl==0 then recompute all indices of pTab. -*/ -#ifndef SQLITE_OMIT_REINDEX -static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ - Index *pIndex; /* An index associated with pTab */ - - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( zColl==0 || collationMatch(zColl, pIndex) ){ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); - } - } -} -#endif - -/* -** Recompute all indices of all tables in all databases where the -** indices use the collating sequence pColl. If pColl==0 then recompute -** all indices everywhere. -*/ -#ifndef SQLITE_OMIT_REINDEX -static void reindexDatabases(Parse *pParse, char const *zColl){ - Db *pDb; /* A single database */ - int iDb; /* The database index number */ - sqlite3 *db = pParse->db; /* The database connection */ - HashElem *k; /* For looping over tables in pDb */ - Table *pTab; /* A table in the database */ - - for(iDb=0, pDb=db->aDb; iDbnDb; iDb++, pDb++){ - assert( pDb!=0 ); - for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){ - pTab = (Table*)sqliteHashData(k); - reindexTable(pParse, pTab, zColl); - } - } -} -#endif - -/* -** Generate code for the REINDEX command. -** -** REINDEX -- 1 -** REINDEX -- 2 -** REINDEX ?.? -- 3 -** REINDEX ?.? -- 4 -** -** Form 1 causes all indices in all attached databases to be rebuilt. -** Form 2 rebuilds all indices in all databases that use the named -** collating function. Forms 3 and 4 rebuild the named index or all -** indices associated with the named table. -*/ -#ifndef SQLITE_OMIT_REINDEX -void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ - CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */ - char *z; /* Name of a table or index */ - const char *zDb; /* Name of the database */ - Table *pTab; /* A table in the database */ - Index *pIndex; /* An index associated with pTab */ - int iDb; /* The database index number */ - sqlite3 *db = pParse->db; /* The database connection */ - Token *pObjName; /* Name of the table or index to be reindexed */ - - /* Read the database schema. If an error occurs, leave an error message - ** and code in pParse and return NULL. */ - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ - return; - } - - if( pName1==0 || pName1->z==0 ){ - reindexDatabases(pParse, 0); - return; - }else if( pName2==0 || pName2->z==0 ){ - assert( pName1->z ); - pColl = sqlite3FindCollSeq(db, ENC(db), (char*)pName1->z, pName1->n, 0); - if( pColl ){ - char *zColl = sqlite3DbStrNDup(db, (const char *)pName1->z, pName1->n); - if( zColl ){ - reindexDatabases(pParse, zColl); - sqlite3_free(zColl); - } - return; - } - } - iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); - if( iDb<0 ) return; - z = sqlite3NameFromToken(db, pObjName); - if( z==0 ) return; - zDb = db->aDb[iDb].zName; - pTab = sqlite3FindTable(db, z, zDb); - if( pTab ){ - reindexTable(pParse, pTab, 0); - sqlite3_free(z); - return; - } - pIndex = sqlite3FindIndex(db, z, zDb); - sqlite3_free(z); - if( pIndex ){ - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); - return; - } - sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed"); -} -#endif - -/* -** Return a dynamicly allocated KeyInfo structure that can be used -** with OP_OpenRead or OP_OpenWrite to access database index pIdx. -** -** If successful, a pointer to the new structure is returned. In this case -** the caller is responsible for calling sqlite3_free() on the returned -** pointer. If an error occurs (out of memory or missing collation -** sequence), NULL is returned and the state of pParse updated to reflect -** the error. -*/ -KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){ - int i; - int nCol = pIdx->nColumn; - int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol; - KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(pParse->db, nBytes); - - if( pKey ){ - pKey->db = pParse->db; - pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]); - assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) ); - for(i=0; iazColl[i]; - assert( zColl ); - pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl, -1); - pKey->aSortOrder[i] = pIdx->aSortOrder[i]; - } - pKey->nField = nCol; - } - - if( pParse->nErr ){ - sqlite3_free(pKey); - pKey = 0; - } - return pKey; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/callback.c b/libraries/sqlite/unix/sqlite-3.5.1/src/callback.c deleted file mode 100644 index 009cfd740e..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/callback.c +++ /dev/null @@ -1,378 +0,0 @@ -/* -** 2005 May 23 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file contains functions used to access the internal hash tables -** of user defined functions and collation sequences. -** -** $Id: callback.c,v 1.23 2007/08/29 12:31:26 danielk1977 Exp $ -*/ - -#include "sqliteInt.h" - -/* -** Invoke the 'collation needed' callback to request a collation sequence -** in the database text encoding of name zName, length nName. -** If the collation sequence -*/ -static void callCollNeeded(sqlite3 *db, const char *zName, int nName){ - assert( !db->xCollNeeded || !db->xCollNeeded16 ); - if( nName<0 ) nName = strlen(zName); - if( db->xCollNeeded ){ - char *zExternal = sqlite3DbStrNDup(db, zName, nName); - if( !zExternal ) return; - db->xCollNeeded(db->pCollNeededArg, db, (int)ENC(db), zExternal); - sqlite3_free(zExternal); - } -#ifndef SQLITE_OMIT_UTF16 - if( db->xCollNeeded16 ){ - char const *zExternal; - sqlite3_value *pTmp = sqlite3ValueNew(db); - sqlite3ValueSetStr(pTmp, nName, zName, SQLITE_UTF8, SQLITE_STATIC); - zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE); - if( zExternal ){ - db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); - } - sqlite3ValueFree(pTmp); - } -#endif -} - -/* -** This routine is called if the collation factory fails to deliver a -** collation function in the best encoding but there may be other versions -** of this collation function (for other text encodings) available. Use one -** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if -** possible. -*/ -static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ - CollSeq *pColl2; - char *z = pColl->zName; - int n = strlen(z); - int i; - static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 }; - for(i=0; i<3; i++){ - pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, n, 0); - if( pColl2->xCmp!=0 ){ - memcpy(pColl, pColl2, sizeof(CollSeq)); - pColl->xDel = 0; /* Do not copy the destructor */ - return SQLITE_OK; - } - } - return SQLITE_ERROR; -} - -/* -** This function is responsible for invoking the collation factory callback -** or substituting a collation sequence of a different encoding when the -** requested collation sequence is not available in the database native -** encoding. -** -** If it is not NULL, then pColl must point to the database native encoding -** collation sequence with name zName, length nName. -** -** The return value is either the collation sequence to be used in database -** db for collation type name zName, length nName, or NULL, if no collation -** sequence can be found. -*/ -CollSeq *sqlite3GetCollSeq( - sqlite3* db, - CollSeq *pColl, - const char *zName, - int nName -){ - CollSeq *p; - - p = pColl; - if( !p ){ - p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0); - } - if( !p || !p->xCmp ){ - /* No collation sequence of this type for this encoding is registered. - ** Call the collation factory to see if it can supply us with one. - */ - callCollNeeded(db, zName, nName); - p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0); - } - if( p && !p->xCmp && synthCollSeq(db, p) ){ - p = 0; - } - assert( !p || p->xCmp ); - return p; -} - -/* -** This routine is called on a collation sequence before it is used to -** check that it is defined. An undefined collation sequence exists when -** a database is loaded that contains references to collation sequences -** that have not been defined by sqlite3_create_collation() etc. -** -** If required, this routine calls the 'collation needed' callback to -** request a definition of the collating sequence. If this doesn't work, -** an equivalent collating sequence that uses a text encoding different -** from the main database is substituted, if one is available. -*/ -int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ - if( pColl ){ - const char *zName = pColl->zName; - CollSeq *p = sqlite3GetCollSeq(pParse->db, pColl, zName, -1); - if( !p ){ - if( pParse->nErr==0 ){ - sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); - } - pParse->nErr++; - return SQLITE_ERROR; - } - assert( p==pColl ); - } - return SQLITE_OK; -} - - - -/* -** Locate and return an entry from the db.aCollSeq hash table. If the entry -** specified by zName and nName is not found and parameter 'create' is -** true, then create a new entry. Otherwise return NULL. -** -** Each pointer stored in the sqlite3.aCollSeq hash table contains an -** array of three CollSeq structures. The first is the collation sequence -** prefferred for UTF-8, the second UTF-16le, and the third UTF-16be. -** -** Stored immediately after the three collation sequences is a copy of -** the collation sequence name. A pointer to this string is stored in -** each collation sequence structure. -*/ -static CollSeq *findCollSeqEntry( - sqlite3 *db, - const char *zName, - int nName, - int create -){ - CollSeq *pColl; - if( nName<0 ) nName = strlen(zName); - pColl = sqlite3HashFind(&db->aCollSeq, zName, nName); - - if( 0==pColl && create ){ - pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName + 1 ); - if( pColl ){ - CollSeq *pDel = 0; - pColl[0].zName = (char*)&pColl[3]; - pColl[0].enc = SQLITE_UTF8; - pColl[1].zName = (char*)&pColl[3]; - pColl[1].enc = SQLITE_UTF16LE; - pColl[2].zName = (char*)&pColl[3]; - pColl[2].enc = SQLITE_UTF16BE; - memcpy(pColl[0].zName, zName, nName); - pColl[0].zName[nName] = 0; - pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, nName, pColl); - - /* If a malloc() failure occured in sqlite3HashInsert(), it will - ** return the pColl pointer to be deleted (because it wasn't added - ** to the hash table). - */ - assert( pDel==0 || pDel==pColl ); - if( pDel!=0 ){ - db->mallocFailed = 1; - sqlite3_free(pDel); - pColl = 0; - } - } - } - return pColl; -} - -/* -** Parameter zName points to a UTF-8 encoded string nName bytes long. -** Return the CollSeq* pointer for the collation sequence named zName -** for the encoding 'enc' from the database 'db'. -** -** If the entry specified is not found and 'create' is true, then create a -** new entry. Otherwise return NULL. -** -** A separate function sqlite3LocateCollSeq() is a wrapper around -** this routine. sqlite3LocateCollSeq() invokes the collation factory -** if necessary and generates an error message if the collating sequence -** cannot be found. -*/ -CollSeq *sqlite3FindCollSeq( - sqlite3 *db, - u8 enc, - const char *zName, - int nName, - int create -){ - CollSeq *pColl; - if( zName ){ - pColl = findCollSeqEntry(db, zName, nName, create); - }else{ - pColl = db->pDfltColl; - } - assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); - assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); - if( pColl ) pColl += enc-1; - return pColl; -} - -/* -** Locate a user function given a name, a number of arguments and a flag -** indicating whether the function prefers UTF-16 over UTF-8. Return a -** pointer to the FuncDef structure that defines that function, or return -** NULL if the function does not exist. -** -** If the createFlag argument is true, then a new (blank) FuncDef -** structure is created and liked into the "db" structure if a -** no matching function previously existed. When createFlag is true -** and the nArg parameter is -1, then only a function that accepts -** any number of arguments will be returned. -** -** If createFlag is false and nArg is -1, then the first valid -** function found is returned. A function is valid if either xFunc -** or xStep is non-zero. -** -** If createFlag is false, then a function with the required name and -** number of arguments may be returned even if the eTextRep flag does not -** match that requested. -*/ -FuncDef *sqlite3FindFunction( - sqlite3 *db, /* An open database */ - const char *zName, /* Name of the function. Not null-terminated */ - int nName, /* Number of characters in the name */ - int nArg, /* Number of arguments. -1 means any number */ - u8 enc, /* Preferred text encoding */ - int createFlag /* Create new entry if true and does not otherwise exist */ -){ - FuncDef *p; /* Iterator variable */ - FuncDef *pFirst; /* First function with this name */ - FuncDef *pBest = 0; /* Best match found so far */ - int bestmatch = 0; - - - assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); - if( nArg<-1 ) nArg = -1; - - pFirst = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName); - for(p=pFirst; p; p=p->pNext){ - /* During the search for the best function definition, bestmatch is set - ** as follows to indicate the quality of the match with the definition - ** pointed to by pBest: - ** - ** 0: pBest is NULL. No match has been found. - ** 1: A variable arguments function that prefers UTF-8 when a UTF-16 - ** encoding is requested, or vice versa. - ** 2: A variable arguments function that uses UTF-16BE when UTF-16LE is - ** requested, or vice versa. - ** 3: A variable arguments function using the same text encoding. - ** 4: A function with the exact number of arguments requested that - ** prefers UTF-8 when a UTF-16 encoding is requested, or vice versa. - ** 5: A function with the exact number of arguments requested that - ** prefers UTF-16LE when UTF-16BE is requested, or vice versa. - ** 6: An exact match. - ** - ** A larger value of 'matchqual' indicates a more desirable match. - */ - if( p->nArg==-1 || p->nArg==nArg || nArg==-1 ){ - int match = 1; /* Quality of this match */ - if( p->nArg==nArg || nArg==-1 ){ - match = 4; - } - if( enc==p->iPrefEnc ){ - match += 2; - } - else if( (enc==SQLITE_UTF16LE && p->iPrefEnc==SQLITE_UTF16BE) || - (enc==SQLITE_UTF16BE && p->iPrefEnc==SQLITE_UTF16LE) ){ - match += 1; - } - - if( match>bestmatch ){ - pBest = p; - bestmatch = match; - } - } - } - - /* If the createFlag parameter is true, and the seach did not reveal an - ** exact match for the name, number of arguments and encoding, then add a - ** new entry to the hash table and return it. - */ - if( createFlag && bestmatch<6 && - (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName))!=0 ){ - pBest->nArg = nArg; - pBest->pNext = pFirst; - pBest->iPrefEnc = enc; - memcpy(pBest->zName, zName, nName); - pBest->zName[nName] = 0; - if( pBest==sqlite3HashInsert(&db->aFunc,pBest->zName,nName,(void*)pBest) ){ - db->mallocFailed = 1; - sqlite3_free(pBest); - return 0; - } - } - - if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){ - return pBest; - } - return 0; -} - -/* -** Free all resources held by the schema structure. The void* argument points -** at a Schema struct. This function does not call sqlite3_free() on the -** pointer itself, it just cleans up subsiduary resources (i.e. the contents -** of the schema hash tables). -*/ -void sqlite3SchemaFree(void *p){ - Hash temp1; - Hash temp2; - HashElem *pElem; - Schema *pSchema = (Schema *)p; - - temp1 = pSchema->tblHash; - temp2 = pSchema->trigHash; - sqlite3HashInit(&pSchema->trigHash, SQLITE_HASH_STRING, 0); - sqlite3HashClear(&pSchema->aFKey); - sqlite3HashClear(&pSchema->idxHash); - for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ - sqlite3DeleteTrigger((Trigger*)sqliteHashData(pElem)); - } - sqlite3HashClear(&temp2); - sqlite3HashInit(&pSchema->tblHash, SQLITE_HASH_STRING, 0); - for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ - Table *pTab = sqliteHashData(pElem); - sqlite3DeleteTable(pTab); - } - sqlite3HashClear(&temp1); - pSchema->pSeqTab = 0; - pSchema->flags &= ~DB_SchemaLoaded; -} - -/* -** Find and return the schema associated with a BTree. Create -** a new one if necessary. -*/ -Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ - Schema * p; - if( pBt ){ - p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaFree); - }else{ - p = (Schema *)sqlite3MallocZero(sizeof(Schema)); - } - if( !p ){ - db->mallocFailed = 1; - }else if ( 0==p->file_format ){ - sqlite3HashInit(&p->tblHash, SQLITE_HASH_STRING, 0); - sqlite3HashInit(&p->idxHash, SQLITE_HASH_STRING, 0); - sqlite3HashInit(&p->trigHash, SQLITE_HASH_STRING, 0); - sqlite3HashInit(&p->aFKey, SQLITE_HASH_STRING, 1); - p->enc = SQLITE_UTF8; - } - return p; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/complete.c b/libraries/sqlite/unix/sqlite-3.5.1/src/complete.c deleted file mode 100644 index ae61d8ab06..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/complete.c +++ /dev/null @@ -1,271 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** An tokenizer for SQL -** -** This file contains C code that implements the sqlite3_complete() API. -** This code used to be part of the tokenizer.c source file. But by -** separating it out, the code will be automatically omitted from -** static links that do not use it. -** -** $Id: complete.c,v 1.6 2007/08/27 23:26:59 drh Exp $ -*/ -#include "sqliteInt.h" -#ifndef SQLITE_OMIT_COMPLETE - -/* -** This is defined in tokenize.c. We just have to import the definition. -*/ -#ifndef SQLITE_AMALGAMATION -#ifdef SQLITE_ASCII -extern const char sqlite3IsAsciiIdChar[]; -#define IdChar(C) (((c=C)&0x80)!=0 || (c>0x1f && sqlite3IsAsciiIdChar[c-0x20])) -#endif -#ifdef SQLITE_EBCDIC -extern const char sqlite3IsEbcdicIdChar[]; -#define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) -#endif -#endif /* SQLITE_AMALGAMATION */ - - -/* -** Token types used by the sqlite3_complete() routine. See the header -** comments on that procedure for additional information. -*/ -#define tkSEMI 0 -#define tkWS 1 -#define tkOTHER 2 -#define tkEXPLAIN 3 -#define tkCREATE 4 -#define tkTEMP 5 -#define tkTRIGGER 6 -#define tkEND 7 - -/* -** Return TRUE if the given SQL string ends in a semicolon. -** -** Special handling is require for CREATE TRIGGER statements. -** Whenever the CREATE TRIGGER keywords are seen, the statement -** must end with ";END;". -** -** This implementation uses a state machine with 7 states: -** -** (0) START At the beginning or end of an SQL statement. This routine -** returns 1 if it ends in the START state and 0 if it ends -** in any other state. -** -** (1) NORMAL We are in the middle of statement which ends with a single -** semicolon. -** -** (2) EXPLAIN The keyword EXPLAIN has been seen at the beginning of -** a statement. -** -** (3) CREATE The keyword CREATE has been seen at the beginning of a -** statement, possibly preceeded by EXPLAIN and/or followed by -** TEMP or TEMPORARY -** -** (4) TRIGGER We are in the middle of a trigger definition that must be -** ended by a semicolon, the keyword END, and another semicolon. -** -** (5) SEMI We've seen the first semicolon in the ";END;" that occurs at -** the end of a trigger definition. -** -** (6) END We've seen the ";END" of the ";END;" that occurs at the end -** of a trigger difinition. -** -** Transitions between states above are determined by tokens extracted -** from the input. The following tokens are significant: -** -** (0) tkSEMI A semicolon. -** (1) tkWS Whitespace -** (2) tkOTHER Any other SQL token. -** (3) tkEXPLAIN The "explain" keyword. -** (4) tkCREATE The "create" keyword. -** (5) tkTEMP The "temp" or "temporary" keyword. -** (6) tkTRIGGER The "trigger" keyword. -** (7) tkEND The "end" keyword. -** -** Whitespace never causes a state transition and is always ignored. -** -** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed -** to recognize the end of a trigger can be omitted. All we have to do -** is look for a semicolon that is not part of an string or comment. -*/ -int sqlite3_complete(const char *zSql){ - u8 state = 0; /* Current state, using numbers defined in header comment */ - u8 token; /* Value of the next token */ - -#ifndef SQLITE_OMIT_TRIGGER - /* A complex statement machine used to detect the end of a CREATE TRIGGER - ** statement. This is the normal case. - */ - static const u8 trans[7][8] = { - /* Token: */ - /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */ - /* 0 START: */ { 0, 0, 1, 2, 3, 1, 1, 1, }, - /* 1 NORMAL: */ { 0, 1, 1, 1, 1, 1, 1, 1, }, - /* 2 EXPLAIN: */ { 0, 2, 1, 1, 3, 1, 1, 1, }, - /* 3 CREATE: */ { 0, 3, 1, 1, 1, 3, 4, 1, }, - /* 4 TRIGGER: */ { 5, 4, 4, 4, 4, 4, 4, 4, }, - /* 5 SEMI: */ { 5, 5, 4, 4, 4, 4, 4, 6, }, - /* 6 END: */ { 0, 6, 4, 4, 4, 4, 4, 4, }, - }; -#else - /* If triggers are not suppored by this compile then the statement machine - ** used to detect the end of a statement is much simplier - */ - static const u8 trans[2][3] = { - /* Token: */ - /* State: ** SEMI WS OTHER */ - /* 0 START: */ { 0, 0, 1, }, - /* 1 NORMAL: */ { 0, 1, 1, }, - }; -#endif /* SQLITE_OMIT_TRIGGER */ - - while( *zSql ){ - switch( *zSql ){ - case ';': { /* A semicolon */ - token = tkSEMI; - break; - } - case ' ': - case '\r': - case '\t': - case '\n': - case '\f': { /* White space is ignored */ - token = tkWS; - break; - } - case '/': { /* C-style comments */ - if( zSql[1]!='*' ){ - token = tkOTHER; - break; - } - zSql += 2; - while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; } - if( zSql[0]==0 ) return 0; - zSql++; - token = tkWS; - break; - } - case '-': { /* SQL-style comments from "--" to end of line */ - if( zSql[1]!='-' ){ - token = tkOTHER; - break; - } - while( *zSql && *zSql!='\n' ){ zSql++; } - if( *zSql==0 ) return state==0; - token = tkWS; - break; - } - case '[': { /* Microsoft-style identifiers in [...] */ - zSql++; - while( *zSql && *zSql!=']' ){ zSql++; } - if( *zSql==0 ) return 0; - token = tkOTHER; - break; - } - case '`': /* Grave-accent quoted symbols used by MySQL */ - case '"': /* single- and double-quoted strings */ - case '\'': { - int c = *zSql; - zSql++; - while( *zSql && *zSql!=c ){ zSql++; } - if( *zSql==0 ) return 0; - token = tkOTHER; - break; - } - default: { - int c; - if( IdChar((u8)*zSql) ){ - /* Keywords and unquoted identifiers */ - int nId; - for(nId=1; IdChar(zSql[nId]); nId++){} -#ifdef SQLITE_OMIT_TRIGGER - token = tkOTHER; -#else - switch( *zSql ){ - case 'c': case 'C': { - if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){ - token = tkCREATE; - }else{ - token = tkOTHER; - } - break; - } - case 't': case 'T': { - if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ - token = tkTRIGGER; - }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ - token = tkTEMP; - }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ - token = tkTEMP; - }else{ - token = tkOTHER; - } - break; - } - case 'e': case 'E': { - if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ - token = tkEND; - }else -#ifndef SQLITE_OMIT_EXPLAIN - if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ - token = tkEXPLAIN; - }else -#endif - { - token = tkOTHER; - } - break; - } - default: { - token = tkOTHER; - break; - } - } -#endif /* SQLITE_OMIT_TRIGGER */ - zSql += nId-1; - }else{ - /* Operators and special symbols */ - token = tkOTHER; - } - break; - } - } - state = trans[state][token]; - zSql++; - } - return state==0; -} - -#ifndef SQLITE_OMIT_UTF16 -/* -** This routine is the same as the sqlite3_complete() routine described -** above, except that the parameter is required to be UTF-16 encoded, not -** UTF-8. -*/ -int sqlite3_complete16(const void *zSql){ - sqlite3_value *pVal; - char const *zSql8; - int rc = SQLITE_NOMEM; - - pVal = sqlite3ValueNew(0); - sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); - zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); - if( zSql8 ){ - rc = sqlite3_complete(zSql8); - } - sqlite3ValueFree(pVal); - return sqlite3ApiExit(0, rc); -} -#endif /* SQLITE_OMIT_UTF16 */ -#endif /* SQLITE_OMIT_COMPLETE */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/date.c b/libraries/sqlite/unix/sqlite-3.5.1/src/date.c deleted file mode 100644 index ce1c6c7b39..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/date.c +++ /dev/null @@ -1,1045 +0,0 @@ -/* -** 2003 October 31 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement date and time -** functions for SQLite. -** -** There is only one exported symbol in this file - the function -** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. -** All other code has file scope. -** -** $Id: date.c,v 1.73 2007/09/12 17:01:45 danielk1977 Exp $ -** -** SQLite processes all times and dates as Julian Day numbers. The -** dates and times are stored as the number of days since noon -** in Greenwich on November 24, 4714 B.C. according to the Gregorian -** calendar system. -** -** 1970-01-01 00:00:00 is JD 2440587.5 -** 2000-01-01 00:00:00 is JD 2451544.5 -** -** This implemention requires years to be expressed as a 4-digit number -** which means that only dates between 0000-01-01 and 9999-12-31 can -** be represented, even though julian day numbers allow a much wider -** range of dates. -** -** The Gregorian calendar system is used for all dates and times, -** even those that predate the Gregorian calendar. Historians usually -** use the Julian calendar for dates prior to 1582-10-15 and for some -** dates afterwards, depending on locale. Beware of this difference. -** -** The conversion algorithms are implemented based on descriptions -** in the following text: -** -** Jean Meeus -** Astronomical Algorithms, 2nd Edition, 1998 -** ISBM 0-943396-61-1 -** Willmann-Bell, Inc -** Richmond, Virginia (USA) -*/ -#include "sqliteInt.h" -#include -#include -#include -#include - -#ifndef SQLITE_OMIT_DATETIME_FUNCS - -/* -** A structure for holding a single date and time. -*/ -typedef struct DateTime DateTime; -struct DateTime { - double rJD; /* The julian day number */ - int Y, M, D; /* Year, month, and day */ - int h, m; /* Hour and minutes */ - int tz; /* Timezone offset in minutes */ - double s; /* Seconds */ - char validYMD; /* True if Y,M,D are valid */ - char validHMS; /* True if h,m,s are valid */ - char validJD; /* True if rJD is valid */ - char validTZ; /* True if tz is valid */ -}; - - -/* -** Convert zDate into one or more integers. Additional arguments -** come in groups of 5 as follows: -** -** N number of digits in the integer -** min minimum allowed value of the integer -** max maximum allowed value of the integer -** nextC first character after the integer -** pVal where to write the integers value. -** -** Conversions continue until one with nextC==0 is encountered. -** The function returns the number of successful conversions. -*/ -static int getDigits(const char *zDate, ...){ - va_list ap; - int val; - int N; - int min; - int max; - int nextC; - int *pVal; - int cnt = 0; - va_start(ap, zDate); - do{ - N = va_arg(ap, int); - min = va_arg(ap, int); - max = va_arg(ap, int); - nextC = va_arg(ap, int); - pVal = va_arg(ap, int*); - val = 0; - while( N-- ){ - if( !isdigit(*(u8*)zDate) ){ - goto end_getDigits; - } - val = val*10 + *zDate - '0'; - zDate++; - } - if( valmax || (nextC!=0 && nextC!=*zDate) ){ - goto end_getDigits; - } - *pVal = val; - zDate++; - cnt++; - }while( nextC ); -end_getDigits: - va_end(ap); - return cnt; -} - -/* -** Read text from z[] and convert into a floating point number. Return -** the number of digits converted. -*/ -#define getValue sqlite3AtoF - -/* -** Parse a timezone extension on the end of a date-time. -** The extension is of the form: -** -** (+/-)HH:MM -** -** If the parse is successful, write the number of minutes -** of change in *pnMin and return 0. If a parser error occurs, -** return 0. -** -** A missing specifier is not considered an error. -*/ -static int parseTimezone(const char *zDate, DateTime *p){ - int sgn = 0; - int nHr, nMn; - while( isspace(*(u8*)zDate) ){ zDate++; } - p->tz = 0; - if( *zDate=='-' ){ - sgn = -1; - }else if( *zDate=='+' ){ - sgn = +1; - }else{ - return *zDate!=0; - } - zDate++; - if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){ - return 1; - } - zDate += 5; - p->tz = sgn*(nMn + nHr*60); - while( isspace(*(u8*)zDate) ){ zDate++; } - return *zDate!=0; -} - -/* -** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF. -** The HH, MM, and SS must each be exactly 2 digits. The -** fractional seconds FFFF can be one or more digits. -** -** Return 1 if there is a parsing error and 0 on success. -*/ -static int parseHhMmSs(const char *zDate, DateTime *p){ - int h, m, s; - double ms = 0.0; - if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){ - return 1; - } - zDate += 5; - if( *zDate==':' ){ - zDate++; - if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){ - return 1; - } - zDate += 2; - if( *zDate=='.' && isdigit((u8)zDate[1]) ){ - double rScale = 1.0; - zDate++; - while( isdigit(*(u8*)zDate) ){ - ms = ms*10.0 + *zDate - '0'; - rScale *= 10.0; - zDate++; - } - ms /= rScale; - } - }else{ - s = 0; - } - p->validJD = 0; - p->validHMS = 1; - p->h = h; - p->m = m; - p->s = s + ms; - if( parseTimezone(zDate, p) ) return 1; - p->validTZ = p->tz!=0; - return 0; -} - -/* -** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume -** that the YYYY-MM-DD is according to the Gregorian calendar. -** -** Reference: Meeus page 61 -*/ -static void computeJD(DateTime *p){ - int Y, M, D, A, B, X1, X2; - - if( p->validJD ) return; - if( p->validYMD ){ - Y = p->Y; - M = p->M; - D = p->D; - }else{ - Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ - M = 1; - D = 1; - } - if( M<=2 ){ - Y--; - M += 12; - } - A = Y/100; - B = 2 - A + (A/4); - X1 = 365.25*(Y+4716); - X2 = 30.6001*(M+1); - p->rJD = X1 + X2 + D + B - 1524.5; - p->validJD = 1; - if( p->validHMS ){ - p->rJD += (p->h*3600.0 + p->m*60.0 + p->s)/86400.0; - if( p->validTZ ){ - p->rJD -= p->tz*60/86400.0; - p->validYMD = 0; - p->validHMS = 0; - p->validTZ = 0; - } - } -} - -/* -** Parse dates of the form -** -** YYYY-MM-DD HH:MM:SS.FFF -** YYYY-MM-DD HH:MM:SS -** YYYY-MM-DD HH:MM -** YYYY-MM-DD -** -** Write the result into the DateTime structure and return 0 -** on success and 1 if the input string is not a well-formed -** date. -*/ -static int parseYyyyMmDd(const char *zDate, DateTime *p){ - int Y, M, D, neg; - - if( zDate[0]=='-' ){ - zDate++; - neg = 1; - }else{ - neg = 0; - } - if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){ - return 1; - } - zDate += 10; - while( isspace(*(u8*)zDate) || 'T'==*(u8*)zDate ){ zDate++; } - if( parseHhMmSs(zDate, p)==0 ){ - /* We got the time */ - }else if( *zDate==0 ){ - p->validHMS = 0; - }else{ - return 1; - } - p->validJD = 0; - p->validYMD = 1; - p->Y = neg ? -Y : Y; - p->M = M; - p->D = D; - if( p->validTZ ){ - computeJD(p); - } - return 0; -} - -/* -** Attempt to parse the given string into a Julian Day Number. Return -** the number of errors. -** -** The following are acceptable forms for the input string: -** -** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM -** DDDD.DD -** now -** -** In the first form, the +/-HH:MM is always optional. The fractional -** seconds extension (the ".FFF") is optional. The seconds portion -** (":SS.FFF") is option. The year and date can be omitted as long -** as there is a time string. The time string can be omitted as long -** as there is a year and date. -*/ -static int parseDateOrTime( - sqlite3_context *context, - const char *zDate, - DateTime *p -){ - memset(p, 0, sizeof(*p)); - if( parseYyyyMmDd(zDate,p)==0 ){ - return 0; - }else if( parseHhMmSs(zDate, p)==0 ){ - return 0; - }else if( sqlite3StrICmp(zDate,"now")==0){ - double r; - sqlite3OsCurrentTime((sqlite3_vfs *)sqlite3_user_data(context), &r); - p->rJD = r; - p->validJD = 1; - return 0; - }else if( sqlite3IsNumber(zDate, 0, SQLITE_UTF8) ){ - getValue(zDate, &p->rJD); - p->validJD = 1; - return 0; - } - return 1; -} - -/* -** Compute the Year, Month, and Day from the julian day number. -*/ -static void computeYMD(DateTime *p){ - int Z, A, B, C, D, E, X1; - if( p->validYMD ) return; - if( !p->validJD ){ - p->Y = 2000; - p->M = 1; - p->D = 1; - }else{ - Z = p->rJD + 0.5; - A = (Z - 1867216.25)/36524.25; - A = Z + 1 + A - (A/4); - B = A + 1524; - C = (B - 122.1)/365.25; - D = 365.25*C; - E = (B-D)/30.6001; - X1 = 30.6001*E; - p->D = B - D - X1; - p->M = E<14 ? E-1 : E-13; - p->Y = p->M>2 ? C - 4716 : C - 4715; - } - p->validYMD = 1; -} - -/* -** Compute the Hour, Minute, and Seconds from the julian day number. -*/ -static void computeHMS(DateTime *p){ - int Z, s; - if( p->validHMS ) return; - computeJD(p); - Z = p->rJD + 0.5; - s = (p->rJD + 0.5 - Z)*86400000.0 + 0.5; - p->s = 0.001*s; - s = p->s; - p->s -= s; - p->h = s/3600; - s -= p->h*3600; - p->m = s/60; - p->s += s - p->m*60; - p->validHMS = 1; -} - -/* -** Compute both YMD and HMS -*/ -static void computeYMD_HMS(DateTime *p){ - computeYMD(p); - computeHMS(p); -} - -/* -** Clear the YMD and HMS and the TZ -*/ -static void clearYMD_HMS_TZ(DateTime *p){ - p->validYMD = 0; - p->validHMS = 0; - p->validTZ = 0; -} - -/* -** Compute the difference (in days) between localtime and UTC (a.k.a. GMT) -** for the time value p where p is in UTC. -*/ -static double localtimeOffset(DateTime *p){ - DateTime x, y; - time_t t; - x = *p; - computeYMD_HMS(&x); - if( x.Y<1971 || x.Y>=2038 ){ - x.Y = 2000; - x.M = 1; - x.D = 1; - x.h = 0; - x.m = 0; - x.s = 0.0; - } else { - int s = x.s + 0.5; - x.s = s; - } - x.tz = 0; - x.validJD = 0; - computeJD(&x); - t = (x.rJD-2440587.5)*86400.0 + 0.5; -#ifdef HAVE_LOCALTIME_R - { - struct tm sLocal; - localtime_r(&t, &sLocal); - y.Y = sLocal.tm_year + 1900; - y.M = sLocal.tm_mon + 1; - y.D = sLocal.tm_mday; - y.h = sLocal.tm_hour; - y.m = sLocal.tm_min; - y.s = sLocal.tm_sec; - } -#else - { - struct tm *pTm; - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); - pTm = localtime(&t); - y.Y = pTm->tm_year + 1900; - y.M = pTm->tm_mon + 1; - y.D = pTm->tm_mday; - y.h = pTm->tm_hour; - y.m = pTm->tm_min; - y.s = pTm->tm_sec; - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); - } -#endif - y.validYMD = 1; - y.validHMS = 1; - y.validJD = 0; - y.validTZ = 0; - computeJD(&y); - return y.rJD - x.rJD; -} - -/* -** Process a modifier to a date-time stamp. The modifiers are -** as follows: -** -** NNN days -** NNN hours -** NNN minutes -** NNN.NNNN seconds -** NNN months -** NNN years -** start of month -** start of year -** start of week -** start of day -** weekday N -** unixepoch -** localtime -** utc -** -** Return 0 on success and 1 if there is any kind of error. -*/ -static int parseModifier(const char *zMod, DateTime *p){ - int rc = 1; - int n; - double r; - char *z, zBuf[30]; - z = zBuf; - for(n=0; nrJD += localtimeOffset(p); - clearYMD_HMS_TZ(p); - rc = 0; - } - break; - } - case 'u': { - /* - ** unixepoch - ** - ** Treat the current value of p->rJD as the number of - ** seconds since 1970. Convert to a real julian day number. - */ - if( strcmp(z, "unixepoch")==0 && p->validJD ){ - p->rJD = p->rJD/86400.0 + 2440587.5; - clearYMD_HMS_TZ(p); - rc = 0; - }else if( strcmp(z, "utc")==0 ){ - double c1; - computeJD(p); - c1 = localtimeOffset(p); - p->rJD -= c1; - clearYMD_HMS_TZ(p); - p->rJD += c1 - localtimeOffset(p); - rc = 0; - } - break; - } - case 'w': { - /* - ** weekday N - ** - ** Move the date to the same time on the next occurrence of - ** weekday N where 0==Sunday, 1==Monday, and so forth. If the - ** date is already on the appropriate weekday, this is a no-op. - */ - if( strncmp(z, "weekday ", 8)==0 && getValue(&z[8],&r)>0 - && (n=r)==r && n>=0 && r<7 ){ - int Z; - computeYMD_HMS(p); - p->validTZ = 0; - p->validJD = 0; - computeJD(p); - Z = p->rJD + 1.5; - Z %= 7; - if( Z>n ) Z -= 7; - p->rJD += n - Z; - clearYMD_HMS_TZ(p); - rc = 0; - } - break; - } - case 's': { - /* - ** start of TTTTT - ** - ** Move the date backwards to the beginning of the current day, - ** or month or year. - */ - if( strncmp(z, "start of ", 9)!=0 ) break; - z += 9; - computeYMD(p); - p->validHMS = 1; - p->h = p->m = 0; - p->s = 0.0; - p->validTZ = 0; - p->validJD = 0; - if( strcmp(z,"month")==0 ){ - p->D = 1; - rc = 0; - }else if( strcmp(z,"year")==0 ){ - computeYMD(p); - p->M = 1; - p->D = 1; - rc = 0; - }else if( strcmp(z,"day")==0 ){ - rc = 0; - } - break; - } - case '+': - case '-': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': { - n = getValue(z, &r); - assert( n>=1 ); - if( z[n]==':' ){ - /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the - ** specified number of hours, minutes, seconds, and fractional seconds - ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be - ** omitted. - */ - const char *z2 = z; - DateTime tx; - int day; - if( !isdigit(*(u8*)z2) ) z2++; - memset(&tx, 0, sizeof(tx)); - if( parseHhMmSs(z2, &tx) ) break; - computeJD(&tx); - tx.rJD -= 0.5; - day = (int)tx.rJD; - tx.rJD -= day; - if( z[0]=='-' ) tx.rJD = -tx.rJD; - computeJD(p); - clearYMD_HMS_TZ(p); - p->rJD += tx.rJD; - rc = 0; - break; - } - z += n; - while( isspace(*(u8*)z) ) z++; - n = strlen(z); - if( n>10 || n<3 ) break; - if( z[n-1]=='s' ){ z[n-1] = 0; n--; } - computeJD(p); - rc = 0; - if( n==3 && strcmp(z,"day")==0 ){ - p->rJD += r; - }else if( n==4 && strcmp(z,"hour")==0 ){ - p->rJD += r/24.0; - }else if( n==6 && strcmp(z,"minute")==0 ){ - p->rJD += r/(24.0*60.0); - }else if( n==6 && strcmp(z,"second")==0 ){ - p->rJD += r/(24.0*60.0*60.0); - }else if( n==5 && strcmp(z,"month")==0 ){ - int x, y; - computeYMD_HMS(p); - p->M += r; - x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; - p->Y += x; - p->M -= x*12; - p->validJD = 0; - computeJD(p); - y = r; - if( y!=r ){ - p->rJD += (r - y)*30.0; - } - }else if( n==4 && strcmp(z,"year")==0 ){ - computeYMD_HMS(p); - p->Y += r; - p->validJD = 0; - computeJD(p); - }else{ - rc = 1; - } - clearYMD_HMS_TZ(p); - break; - } - default: { - break; - } - } - return rc; -} - -/* -** Process time function arguments. argv[0] is a date-time stamp. -** argv[1] and following are modifiers. Parse them all and write -** the resulting time into the DateTime structure p. Return 0 -** on success and 1 if there are any errors. -*/ -static int isDate( - sqlite3_context *context, - int argc, - sqlite3_value **argv, - DateTime *p -){ - int i; - const unsigned char *z; - if( argc==0 ) return 1; - z = sqlite3_value_text(argv[0]); - if( !z || parseDateOrTime(context, (char*)z, p) ){ - return 1; - } - for(i=1; iSQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - return; - }else{ - z = sqlite3_malloc( n ); - if( z==0 ) return; - } - computeJD(&x); - computeYMD_HMS(&x); - for(i=j=0; zFmt[i]; i++){ - if( zFmt[i]!='%' ){ - z[j++] = zFmt[i]; - }else{ - i++; - switch( zFmt[i] ){ - case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; - case 'f': { - double s = x.s; - if( s>59.999 ) s = 59.999; - sqlite3_snprintf(7, &z[j],"%06.3f", s); - j += strlen(&z[j]); - break; - } - case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; - case 'W': /* Fall thru */ - case 'j': { - int nDay; /* Number of days since 1st day of year */ - DateTime y = x; - y.validJD = 0; - y.M = 1; - y.D = 1; - computeJD(&y); - nDay = x.rJD - y.rJD + 0.5; - if( zFmt[i]=='W' ){ - int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ - wd = ((int)(x.rJD+0.5)) % 7; - sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); - j += 2; - }else{ - sqlite3_snprintf(4, &z[j],"%03d",nDay+1); - j += 3; - } - break; - } - case 'J': { - sqlite3_snprintf(20, &z[j],"%.16g",x.rJD); - j+=strlen(&z[j]); - break; - } - case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; - case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; - case 's': { - sqlite3_snprintf(30,&z[j],"%d", - (int)((x.rJD-2440587.5)*86400.0 + 0.5)); - j += strlen(&z[j]); - break; - } - case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; - case 'w': z[j++] = (((int)(x.rJD+1.5)) % 7) + '0'; break; - case 'Y': sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=strlen(&z[j]);break; - case '%': z[j++] = '%'; break; - } - } - } - z[j] = 0; - sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); - if( z!=zBuf ){ - sqlite3_free(z); - } -} - -/* -** current_time() -** -** This function returns the same value as time('now'). -*/ -static void ctimeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - sqlite3_value *pVal = sqlite3ValueNew(0); - if( pVal ){ - sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); - timeFunc(context, 1, &pVal); - sqlite3ValueFree(pVal); - } -} - -/* -** current_date() -** -** This function returns the same value as date('now'). -*/ -static void cdateFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - sqlite3_value *pVal = sqlite3ValueNew(0); - if( pVal ){ - sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); - dateFunc(context, 1, &pVal); - sqlite3ValueFree(pVal); - } -} - -/* -** current_timestamp() -** -** This function returns the same value as datetime('now'). -*/ -static void ctimestampFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - sqlite3_value *pVal = sqlite3ValueNew(0); - if( pVal ){ - sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC); - datetimeFunc(context, 1, &pVal); - sqlite3ValueFree(pVal); - } -} -#endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */ - -#ifdef SQLITE_OMIT_DATETIME_FUNCS -/* -** If the library is compiled to omit the full-scale date and time -** handling (to get a smaller binary), the following minimal version -** of the functions current_time(), current_date() and current_timestamp() -** are included instead. This is to support column declarations that -** include "DEFAULT CURRENT_TIME" etc. -** -** This function uses the C-library functions time(), gmtime() -** and strftime(). The format string to pass to strftime() is supplied -** as the user-data for the function. -*/ -static void currentTimeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - time_t t; - char *zFormat = (char *)sqlite3_user_data(context); - char zBuf[20]; - - time(&t); -#ifdef SQLITE_TEST - { - extern int sqlite3_current_time; /* See os_XXX.c */ - if( sqlite3_current_time ){ - t = sqlite3_current_time; - } - } -#endif - -#ifdef HAVE_GMTIME_R - { - struct tm sNow; - gmtime_r(&t, &sNow); - strftime(zBuf, 20, zFormat, &sNow); - } -#else - { - struct tm *pTm; - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); - pTm = gmtime(&t); - strftime(zBuf, 20, zFormat, pTm); - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); - } -#endif - - sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); -} -#endif - -/* -** This function registered all of the above C functions as SQL -** functions. This should be the only routine in this file with -** external linkage. -*/ -void sqlite3RegisterDateTimeFunctions(sqlite3 *db){ -#ifndef SQLITE_OMIT_DATETIME_FUNCS - static const struct { - char *zName; - int nArg; - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - } aFuncs[] = { - { "julianday", -1, juliandayFunc }, - { "date", -1, dateFunc }, - { "time", -1, timeFunc }, - { "datetime", -1, datetimeFunc }, - { "strftime", -1, strftimeFunc }, - { "current_time", 0, ctimeFunc }, - { "current_timestamp", 0, ctimestampFunc }, - { "current_date", 0, cdateFunc }, - }; - int i; - - for(i=0; ipVfs), aFuncs[i].xFunc, 0, 0); - } -#else - static const struct { - char *zName; - char *zFormat; - } aFuncs[] = { - { "current_time", "%H:%M:%S" }, - { "current_date", "%Y-%m-%d" }, - { "current_timestamp", "%Y-%m-%d %H:%M:%S" } - }; - int i; - - for(i=0; izErrMsg and return NULL. If all tables -** are found, return a pointer to the last table. -*/ -Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ - Table *pTab = 0; - int i; - struct SrcList_item *pItem; - for(i=0, pItem=pSrc->a; inSrc; i++, pItem++){ - pTab = sqlite3LocateTable(pParse, pItem->zName, pItem->zDatabase); - sqlite3DeleteTable(pItem->pTab); - pItem->pTab = pTab; - if( pTab ){ - pTab->nRef++; - } - } - return pTab; -} - -/* -** Check to make sure the given table is writable. If it is not -** writable, generate an error message and return 1. If it is -** writable return 0; -*/ -int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ - if( (pTab->readOnly && (pParse->db->flags & SQLITE_WriteSchema)==0 - && pParse->nested==0) -#ifndef SQLITE_OMIT_VIRTUALTABLE - || (pTab->pMod && pTab->pMod->pModule->xUpdate==0) -#endif - ){ - sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); - return 1; - } -#ifndef SQLITE_OMIT_VIEW - if( !viewOk && pTab->pSelect ){ - sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); - return 1; - } -#endif - return 0; -} - -/* -** Generate code that will open a table for reading. -*/ -void sqlite3OpenTable( - Parse *p, /* Generate code into this VDBE */ - int iCur, /* The cursor number of the table */ - int iDb, /* The database index in sqlite3.aDb[] */ - Table *pTab, /* The table to be opened */ - int opcode /* OP_OpenRead or OP_OpenWrite */ -){ - Vdbe *v; - if( IsVirtual(pTab) ) return; - v = sqlite3GetVdbe(p); - assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); - sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite), pTab->zName); - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - VdbeComment((v, "# %s", pTab->zName)); - sqlite3VdbeAddOp(v, opcode, iCur, pTab->tnum); - sqlite3VdbeAddOp(v, OP_SetNumColumns, iCur, pTab->nCol); -} - - -/* -** Generate code for a DELETE FROM statement. -** -** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; -** \________/ \________________/ -** pTabList pWhere -*/ -void sqlite3DeleteFrom( - Parse *pParse, /* The parser context */ - SrcList *pTabList, /* The table from which we should delete things */ - Expr *pWhere /* The WHERE clause. May be null */ -){ - Vdbe *v; /* The virtual database engine */ - Table *pTab; /* The table from which records will be deleted */ - const char *zDb; /* Name of database holding pTab */ - int end, addr = 0; /* A couple addresses of generated code */ - int i; /* Loop counter */ - WhereInfo *pWInfo; /* Information about the WHERE clause */ - Index *pIdx; /* For looping over indices of the table */ - int iCur; /* VDBE Cursor number for pTab */ - sqlite3 *db; /* Main database structure */ - AuthContext sContext; /* Authorization context */ - int oldIdx = -1; /* Cursor for the OLD table of AFTER triggers */ - NameContext sNC; /* Name context to resolve expressions in */ - int iDb; /* Database number */ - int memCnt = 0; /* Memory cell used for change counting */ - -#ifndef SQLITE_OMIT_TRIGGER - int isView; /* True if attempting to delete from a view */ - int triggers_exist = 0; /* True if any triggers exist */ -#endif - - sContext.pParse = 0; - db = pParse->db; - if( pParse->nErr || db->mallocFailed ){ - goto delete_from_cleanup; - } - assert( pTabList->nSrc==1 ); - - /* Locate the table which we want to delete. This table has to be - ** put in an SrcList structure because some of the subroutines we - ** will be calling are designed to work with multiple tables and expect - ** an SrcList* parameter instead of just a Table* parameter. - */ - pTab = sqlite3SrcListLookup(pParse, pTabList); - if( pTab==0 ) goto delete_from_cleanup; - - /* Figure out if we have any triggers and if the table being - ** deleted from is a view - */ -#ifndef SQLITE_OMIT_TRIGGER - triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0); - isView = pTab->pSelect!=0; -#else -# define triggers_exist 0 -# define isView 0 -#endif -#ifdef SQLITE_OMIT_VIEW -# undef isView -# define isView 0 -#endif - - if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){ - goto delete_from_cleanup; - } - iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - assert( iDbnDb ); - zDb = db->aDb[iDb].zName; - if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ - goto delete_from_cleanup; - } - - /* If pTab is really a view, make sure it has been initialized. - */ - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ - goto delete_from_cleanup; - } - - /* Allocate a cursor used to store the old.* data for a trigger. - */ - if( triggers_exist ){ - oldIdx = pParse->nTab++; - } - - /* Resolve the column names in the WHERE clause. - */ - assert( pTabList->nSrc==1 ); - iCur = pTabList->a[0].iCursor = pParse->nTab++; - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - sNC.pSrcList = pTabList; - if( sqlite3ExprResolveNames(&sNC, pWhere) ){ - goto delete_from_cleanup; - } - - /* Start the view context - */ - if( isView ){ - sqlite3AuthContextPush(pParse, &sContext, pTab->zName); - } - - /* Begin generating code. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ){ - goto delete_from_cleanup; - } - if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); - sqlite3BeginWriteOperation(pParse, triggers_exist, iDb); - - /* If we are trying to delete from a view, realize that view into - ** a ephemeral table. - */ - if( isView ){ - Select *pView = sqlite3SelectDup(db, pTab->pSelect); - sqlite3Select(pParse, pView, SRT_EphemTab, iCur, 0, 0, 0, 0); - sqlite3SelectDelete(pView); - } - - /* Initialize the counter of the number of rows deleted, if - ** we are counting rows. - */ - if( db->flags & SQLITE_CountRows ){ - memCnt = pParse->nMem++; - sqlite3VdbeAddOp(v, OP_MemInt, 0, memCnt); - } - - /* Special case: A DELETE without a WHERE clause deletes everything. - ** It is easier just to erase the whole table. Note, however, that - ** this means that the row change count will be incorrect. - */ - if( pWhere==0 && !triggers_exist && !IsVirtual(pTab) ){ - if( db->flags & SQLITE_CountRows ){ - /* If counting rows deleted, just count the total number of - ** entries in the table. */ - int endOfLoop = sqlite3VdbeMakeLabel(v); - int addr2; - if( !isView ){ - sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); - } - sqlite3VdbeAddOp(v, OP_Rewind, iCur, sqlite3VdbeCurrentAddr(v)+2); - addr2 = sqlite3VdbeAddOp(v, OP_MemIncr, 1, memCnt); - sqlite3VdbeAddOp(v, OP_Next, iCur, addr2); - sqlite3VdbeResolveLabel(v, endOfLoop); - sqlite3VdbeAddOp(v, OP_Close, iCur, 0); - } - if( !isView ){ - sqlite3VdbeAddOp(v, OP_Clear, pTab->tnum, iDb); - if( !pParse->nested ){ - sqlite3VdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - } - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - assert( pIdx->pSchema==pTab->pSchema ); - sqlite3VdbeAddOp(v, OP_Clear, pIdx->tnum, iDb); - } - } - } - /* The usual case: There is a WHERE clause so we have to scan through - ** the table and pick which records to delete. - */ - else{ - /* Begin the database scan - */ - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0); - if( pWInfo==0 ) goto delete_from_cleanup; - - /* Remember the rowid of every item to be deleted. - */ - sqlite3VdbeAddOp(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, 0); - sqlite3VdbeAddOp(v, OP_FifoWrite, 0, 0); - if( db->flags & SQLITE_CountRows ){ - sqlite3VdbeAddOp(v, OP_MemIncr, 1, memCnt); - } - - /* End the database scan loop. - */ - sqlite3WhereEnd(pWInfo); - - /* Open the pseudo-table used to store OLD if there are triggers. - */ - if( triggers_exist ){ - sqlite3VdbeAddOp(v, OP_OpenPseudo, oldIdx, 0); - sqlite3VdbeAddOp(v, OP_SetNumColumns, oldIdx, pTab->nCol); - } - - /* Delete every item whose key was written to the list during the - ** database scan. We have to delete items after the scan is complete - ** because deleting an item can change the scan order. - */ - end = sqlite3VdbeMakeLabel(v); - - /* This is the beginning of the delete loop when there are - ** row triggers. - */ - if( triggers_exist ){ - addr = sqlite3VdbeAddOp(v, OP_FifoRead, 0, end); - if( !isView ){ - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); - } - sqlite3VdbeAddOp(v, OP_MoveGe, iCur, 0); - sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); - sqlite3VdbeAddOp(v, OP_RowData, iCur, 0); - sqlite3VdbeAddOp(v, OP_Insert, oldIdx, 0); - if( !isView ){ - sqlite3VdbeAddOp(v, OP_Close, iCur, 0); - } - - (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_BEFORE, pTab, - -1, oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default, - addr); - } - - if( !isView ){ - /* Open cursors for the table we are deleting from and all its - ** indices. If there are row triggers, this happens inside the - ** OP_FifoRead loop because the cursor have to all be closed - ** before the trigger fires. If there are no row triggers, the - ** cursors are opened only once on the outside the loop. - */ - sqlite3OpenTableAndIndices(pParse, pTab, iCur, OP_OpenWrite); - - /* This is the beginning of the delete loop when there are no - ** row triggers */ - if( !triggers_exist ){ - addr = sqlite3VdbeAddOp(v, OP_FifoRead, 0, end); - } - - /* Delete the row */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - pParse->pVirtualLock = pTab; - sqlite3VdbeOp3(v, OP_VUpdate, 0, 1, (const char*)pTab->pVtab, P3_VTAB); - }else -#endif - { - sqlite3GenerateRowDelete(db, v, pTab, iCur, pParse->nested==0); - } - } - - /* If there are row triggers, close all cursors then invoke - ** the AFTER triggers - */ - if( triggers_exist ){ - if( !isView ){ - for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqlite3VdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); - } - sqlite3VdbeAddOp(v, OP_Close, iCur, 0); - } - (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_AFTER, pTab, -1, - oldIdx, (pParse->trigStack)?pParse->trigStack->orconf:OE_Default, - addr); - } - - /* End of the delete loop */ - sqlite3VdbeAddOp(v, OP_Goto, 0, addr); - sqlite3VdbeResolveLabel(v, end); - - /* Close the cursors after the loop if there are no row triggers */ - if( !triggers_exist && !IsVirtual(pTab) ){ - for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqlite3VdbeAddOp(v, OP_Close, iCur + i, pIdx->tnum); - } - sqlite3VdbeAddOp(v, OP_Close, iCur, 0); - } - } - - /* - ** Return the number of rows that were deleted. If this routine is - ** generating code because of a call to sqlite3NestedParse(), do not - ** invoke the callback function. - */ - if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){ - sqlite3VdbeAddOp(v, OP_MemLoad, memCnt, 0); - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", P3_STATIC); - } - -delete_from_cleanup: - sqlite3AuthContextPop(&sContext); - sqlite3SrcListDelete(pTabList); - sqlite3ExprDelete(pWhere); - return; -} - -/* -** This routine generates VDBE code that causes a single row of a -** single table to be deleted. -** -** The VDBE must be in a particular state when this routine is called. -** These are the requirements: -** -** 1. A read/write cursor pointing to pTab, the table containing the row -** to be deleted, must be opened as cursor number "base". -** -** 2. Read/write cursors for all indices of pTab must be open as -** cursor number base+i for the i-th index. -** -** 3. The record number of the row to be deleted must be on the top -** of the stack. -** -** This routine pops the top of the stack to remove the record number -** and then generates code to remove both the table record and all index -** entries that point to that record. -*/ -void sqlite3GenerateRowDelete( - sqlite3 *db, /* The database containing the index */ - Vdbe *v, /* Generate code into this VDBE */ - Table *pTab, /* Table containing the row to be deleted */ - int iCur, /* Cursor number for the table */ - int count /* Increment the row change counter */ -){ - int addr; - addr = sqlite3VdbeAddOp(v, OP_NotExists, iCur, 0); - sqlite3GenerateRowIndexDelete(v, pTab, iCur, 0); - sqlite3VdbeAddOp(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0)); - if( count ){ - sqlite3VdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - } - sqlite3VdbeJumpHere(v, addr); -} - -/* -** This routine generates VDBE code that causes the deletion of all -** index entries associated with a single row of a single table. -** -** The VDBE must be in a particular state when this routine is called. -** These are the requirements: -** -** 1. A read/write cursor pointing to pTab, the table containing the row -** to be deleted, must be opened as cursor number "iCur". -** -** 2. Read/write cursors for all indices of pTab must be open as -** cursor number iCur+i for the i-th index. -** -** 3. The "iCur" cursor must be pointing to the row that is to be -** deleted. -*/ -void sqlite3GenerateRowIndexDelete( - Vdbe *v, /* Generate code into this VDBE */ - Table *pTab, /* Table containing the row to be deleted */ - int iCur, /* Cursor number for the table */ - char *aIdxUsed /* Only delete if aIdxUsed!=0 && aIdxUsed[i]!=0 */ -){ - int i; - Index *pIdx; - - for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - if( aIdxUsed!=0 && aIdxUsed[i-1]==0 ) continue; - sqlite3GenerateIndexKey(v, pIdx, iCur); - sqlite3VdbeAddOp(v, OP_IdxDelete, iCur+i, 0); - } -} - -/* -** Generate code that will assemble an index key and put it on the top -** of the tack. The key with be for index pIdx which is an index on pTab. -** iCur is the index of a cursor open on the pTab table and pointing to -** the entry that needs indexing. -*/ -void sqlite3GenerateIndexKey( - Vdbe *v, /* Generate code into this VDBE */ - Index *pIdx, /* The index for which to generate a key */ - int iCur /* Cursor number for the pIdx->pTable table */ -){ - int j; - Table *pTab = pIdx->pTable; - - sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); - for(j=0; jnColumn; j++){ - int idx = pIdx->aiColumn[j]; - if( idx==pTab->iPKey ){ - sqlite3VdbeAddOp(v, OP_Dup, j, 0); - }else{ - sqlite3VdbeAddOp(v, OP_Column, iCur, idx); - sqlite3ColumnDefault(v, pTab, idx); - } - } - sqlite3VdbeAddOp(v, OP_MakeIdxRec, pIdx->nColumn, 0); - sqlite3IndexAffinityStr(v, pIdx); -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt b/libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt deleted file mode 100644 index 55560ef057..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/dump.txt +++ /dev/null @@ -1,2267 +0,0 @@ -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** 2003 September 6 -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** The author disclaims copyright to this source code. In place of -1.1 (drh 06-Sep-03): ** a legal notice, here is a blessing: -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** May you do good and not evil. -1.1 (drh 06-Sep-03): ** May you find forgiveness for yourself and forgive others. -1.1 (drh 06-Sep-03): ** May you share freely, never taking more than you give. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ************************************************************************* -1.1 (drh 06-Sep-03): ** This file contains code used for creating, destroying, and populating -1.65 (danielk1 26-May-04): ** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) Prior -1.1 (drh 06-Sep-03): ** to version 2.8.7, all this code was combined into the vdbe.c source file. -1.1 (drh 06-Sep-03): ** But that file was getting too big so this subroutines were split out. -1.1 (drh 06-Sep-03): */ -1.1 (drh 06-Sep-03): #include "sqliteInt.h" -1.1 (drh 06-Sep-03): #include -1.1 (drh 06-Sep-03): #include "vdbeInt.h" -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): -1.311 (drh 27-Aug-07): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** When debugging the code generator in a symbolic debugger, one can -1.24 (danielk1 10-May-04): ** set the sqlite3_vdbe_addop_trace to 1 and all opcodes will be printed -1.1 (drh 06-Sep-03): ** as they are added to the instruction stream. -1.1 (drh 06-Sep-03): */ -1.182 (drh 14-Jun-05): #ifdef SQLITE_DEBUG -1.24 (danielk1 10-May-04): int sqlite3_vdbe_addop_trace = 0; -1.1 (drh 06-Sep-03): #endif -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Create a new virtual database engine. -1.1 (drh 06-Sep-03): */ -1.140 (drh 06-Sep-04): Vdbe *sqlite3VdbeCreate(sqlite3 *db){ -1.1 (drh 06-Sep-03): Vdbe *p; -1.299 (drh 16-Aug-07): p = sqlite3DbMallocZero(db, sizeof(Vdbe) ); -1.1 (drh 06-Sep-03): if( p==0 ) return 0; -1.1 (drh 06-Sep-03): p->db = db; -1.1 (drh 06-Sep-03): if( db->pVdbe ){ -1.1 (drh 06-Sep-03): db->pVdbe->pPrev = p; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): p->pNext = db->pVdbe; -1.1 (drh 06-Sep-03): p->pPrev = 0; -1.1 (drh 06-Sep-03): db->pVdbe = p; -1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_INIT; -1.1 (drh 06-Sep-03): return p; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.268 (drh 09-Nov-06): ** Remember the SQL string for a prepared statement. -1.268 (drh 09-Nov-06): */ -1.268 (drh 09-Nov-06): void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n){ -1.268 (drh 09-Nov-06): if( p==0 ) return; -1.268 (drh 09-Nov-06): assert( p->zSql==0 ); -1.299 (drh 16-Aug-07): p->zSql = sqlite3DbStrNDup(p->db, z, n); -1.268 (drh 09-Nov-06): } -1.268 (drh 09-Nov-06): -1.268 (drh 09-Nov-06): /* -1.268 (drh 09-Nov-06): ** Return the SQL associated with a prepared statement -1.268 (drh 09-Nov-06): */ -1.268 (drh 09-Nov-06): const char *sqlite3VdbeGetSql(Vdbe *p){ -1.268 (drh 09-Nov-06): return p->zSql; -1.268 (drh 09-Nov-06): } -1.268 (drh 09-Nov-06): -1.268 (drh 09-Nov-06): /* -1.269 (drh 08-Jan-07): ** Swap all content between two VDBE structures. -1.268 (drh 09-Nov-06): */ -1.269 (drh 08-Jan-07): void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ -1.269 (drh 08-Jan-07): Vdbe tmp, *pTmp; -1.269 (drh 08-Jan-07): char *zTmp; -1.269 (drh 08-Jan-07): int nTmp; -1.269 (drh 08-Jan-07): tmp = *pA; -1.269 (drh 08-Jan-07): *pA = *pB; -1.269 (drh 08-Jan-07): *pB = tmp; -1.269 (drh 08-Jan-07): pTmp = pA->pNext; -1.269 (drh 08-Jan-07): pA->pNext = pB->pNext; -1.269 (drh 08-Jan-07): pB->pNext = pTmp; -1.269 (drh 08-Jan-07): pTmp = pA->pPrev; -1.269 (drh 08-Jan-07): pA->pPrev = pB->pPrev; -1.269 (drh 08-Jan-07): pB->pPrev = pTmp; -1.269 (drh 08-Jan-07): zTmp = pA->zSql; -1.269 (drh 08-Jan-07): pA->zSql = pB->zSql; -1.269 (drh 08-Jan-07): pB->zSql = zTmp; -1.269 (drh 08-Jan-07): nTmp = pA->nSql; -1.269 (drh 08-Jan-07): pA->nSql = pB->nSql; -1.269 (drh 08-Jan-07): pB->nSql = nTmp; -1.268 (drh 09-Nov-06): } -1.268 (drh 09-Nov-06): -1.287 (drh 08-May-07): #ifdef SQLITE_DEBUG -1.268 (drh 09-Nov-06): /* -1.1 (drh 06-Sep-03): ** Turn tracing on or off -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeTrace(Vdbe *p, FILE *trace){ -1.1 (drh 06-Sep-03): p->trace = trace; -1.1 (drh 06-Sep-03): } -1.287 (drh 08-May-07): #endif -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.146 (drh 24-Sep-04): ** Resize the Vdbe.aOp array so that it contains at least N -1.170 (danielk1 28-Mar-05): ** elements. If the Vdbe is in VDBE_MAGIC_RUN state, then -1.235 (danielk1 26-Jan-06): ** the Vdbe.aOp array will be sized to contain exactly N -1.235 (danielk1 26-Jan-06): ** elements. Vdbe.nOpAlloc is set to reflect the new size of -1.235 (danielk1 26-Jan-06): ** the array. -1.235 (danielk1 26-Jan-06): ** -1.235 (danielk1 26-Jan-06): ** If an out-of-memory error occurs while resizing the array, -1.235 (danielk1 26-Jan-06): ** Vdbe.aOp and Vdbe.nOpAlloc remain unchanged (this is so that -1.235 (danielk1 26-Jan-06): ** any opcodes already allocated can be correctly deallocated -1.235 (danielk1 26-Jan-06): ** along with the rest of the Vdbe). -1.146 (drh 24-Sep-04): */ -1.146 (drh 24-Sep-04): static void resizeOpArray(Vdbe *p, int N){ -1.199 (drh 16-Sep-05): int runMode = p->magic==VDBE_MAGIC_RUN; -1.199 (drh 16-Sep-05): if( runMode || p->nOpAllocnOpAlloc; -1.315 (danielk1 29-Aug-07): pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op)); -1.198 (drh 16-Sep-05): if( pNew ){ -1.199 (drh 16-Sep-05): p->nOpAlloc = nNew; -1.198 (drh 16-Sep-05): p->aOp = pNew; -1.199 (drh 16-Sep-05): if( nNew>oldSize ){ -1.199 (drh 16-Sep-05): memset(&p->aOp[oldSize], 0, (nNew-oldSize)*sizeof(Op)); -1.199 (drh 16-Sep-05): } -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): -1.146 (drh 24-Sep-04): /* -1.1 (drh 06-Sep-03): ** Add a new instruction to the list of instructions current in the -1.1 (drh 06-Sep-03): ** VDBE. Return the address of the new instruction. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** Parameters: -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** p Pointer to the VDBE -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** op The opcode for this instruction -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** p1, p2 First two of the three possible operands. -1.1 (drh 06-Sep-03): ** -1.19 (danielk1 08-May-04): ** Use the sqlite3VdbeResolveLabel() function to fix an address and -1.19 (danielk1 08-May-04): ** the sqlite3VdbeChangeP3() function to change the value of the P3 -1.1 (drh 06-Sep-03): ** operand. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): int sqlite3VdbeAddOp(Vdbe *p, int op, int p1, int p2){ -1.1 (drh 06-Sep-03): int i; -1.18 (drh 22-Feb-04): VdbeOp *pOp; -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): i = p->nOp; -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.241 (drh 15-Mar-06): if( p->nOpAlloc<=i ){ -1.241 (drh 15-Mar-06): resizeOpArray(p, i+1); -1.299 (drh 16-Aug-07): if( p->db->mallocFailed ){ -1.241 (drh 15-Mar-06): return 0; -1.241 (drh 15-Mar-06): } -1.1 (drh 06-Sep-03): } -1.282 (danielk1 18-Apr-07): p->nOp++; -1.18 (drh 22-Feb-04): pOp = &p->aOp[i]; -1.18 (drh 22-Feb-04): pOp->opcode = op; -1.18 (drh 22-Feb-04): pOp->p1 = p1; -1.18 (drh 22-Feb-04): pOp->p2 = p2; -1.18 (drh 22-Feb-04): pOp->p3 = 0; -1.18 (drh 22-Feb-04): pOp->p3type = P3_NOTUSED; -1.185 (drh 14-Aug-05): p->expired = 0; -1.156 (danielk1 12-Jan-05): #ifdef SQLITE_DEBUG -1.24 (danielk1 10-May-04): if( sqlite3_vdbe_addop_trace ) sqlite3VdbePrintOp(0, i, &p->aOp[i]); -1.1 (drh 06-Sep-03): #endif -1.1 (drh 06-Sep-03): return i; -1.1 (drh 06-Sep-03): } -1.18 (drh 22-Feb-04): -1.18 (drh 22-Feb-04): /* -1.18 (drh 22-Feb-04): ** Add an opcode that includes the p3 value. -1.18 (drh 22-Feb-04): */ -1.69 (drh 27-May-04): int sqlite3VdbeOp3(Vdbe *p, int op, int p1, int p2, const char *zP3,int p3type){ -1.19 (danielk1 08-May-04): int addr = sqlite3VdbeAddOp(p, op, p1, p2); -1.19 (danielk1 08-May-04): sqlite3VdbeChangeP3(p, addr, zP3, p3type); -1.18 (drh 22-Feb-04): return addr; -1.18 (drh 22-Feb-04): } -1.18 (drh 22-Feb-04): -1.18 (drh 22-Feb-04): /* -1.1 (drh 06-Sep-03): ** Create a new symbolic label for an instruction that has yet to be -1.1 (drh 06-Sep-03): ** coded. The symbolic label is really just a negative number. The -1.1 (drh 06-Sep-03): ** label can be used as the P2 value of an operation. Later, when -1.1 (drh 06-Sep-03): ** the label is resolved to a specific address, the VDBE will scan -1.1 (drh 06-Sep-03): ** through its operation list and change all values of P2 which match -1.1 (drh 06-Sep-03): ** the label into the resolved address. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** The VDBE knows that a P2 value is a label because labels are -1.1 (drh 06-Sep-03): ** always negative and P2 values are suppose to be non-negative. -1.1 (drh 06-Sep-03): ** Hence, a negative P2 value is a label that has yet to be resolved. -1.129 (danielk1 26-Jun-04): ** -1.129 (danielk1 26-Jun-04): ** Zero is returned if a malloc() fails. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): int sqlite3VdbeMakeLabel(Vdbe *p){ -1.1 (drh 06-Sep-03): int i; -1.1 (drh 06-Sep-03): i = p->nLabel++; -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.1 (drh 06-Sep-03): if( i>=p->nLabelAlloc ){ -1.1 (drh 06-Sep-03): p->nLabelAlloc = p->nLabelAlloc*2 + 10; -1.300 (danielk1 16-Aug-07): p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, -1.273 (drh 27-Mar-07): p->nLabelAlloc*sizeof(p->aLabel[0])); -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): if( p->aLabel ){ -1.146 (drh 24-Sep-04): p->aLabel[i] = -1; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): return -1-i; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Resolve label "x" to be the address of the next instruction to -1.1 (drh 06-Sep-03): ** be inserted. The parameter "x" must have been obtained from -1.19 (danielk1 08-May-04): ** a prior call to sqlite3VdbeMakeLabel(). -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeResolveLabel(Vdbe *p, int x){ -1.146 (drh 24-Sep-04): int j = -1-x; -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.146 (drh 24-Sep-04): assert( j>=0 && jnLabel ); -1.146 (drh 24-Sep-04): if( p->aLabel ){ -1.146 (drh 24-Sep-04): p->aLabel[j] = p->nOp; -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): -1.146 (drh 24-Sep-04): /* -1.171 (danielk1 29-Mar-05): ** Return non-zero if opcode 'op' is guarenteed not to push more values -1.171 (danielk1 29-Mar-05): ** onto the VDBE stack than it pops off. -1.171 (danielk1 29-Mar-05): */ -1.172 (danielk1 29-Mar-05): static int opcodeNoPush(u8 op){ -1.172 (danielk1 29-Mar-05): /* The 10 NOPUSH_MASK_n constants are defined in the automatically -1.171 (danielk1 29-Mar-05): ** generated header file opcodes.h. Each is a 16-bit bitmask, one -1.171 (danielk1 29-Mar-05): ** bit corresponding to each opcode implemented by the virtual -1.172 (danielk1 29-Mar-05): ** machine in vdbe.c. The bit is true if the word "no-push" appears -1.171 (danielk1 29-Mar-05): ** in a comment on the same line as the "case OP_XXX:" in -1.171 (danielk1 29-Mar-05): ** sqlite3VdbeExec() in vdbe.c. -1.171 (danielk1 29-Mar-05): ** -1.171 (danielk1 29-Mar-05): ** If the bit is true, then the corresponding opcode is guarenteed not -1.171 (danielk1 29-Mar-05): ** to grow the stack when it is executed. Otherwise, it may grow the -1.171 (danielk1 29-Mar-05): ** stack by at most one entry. -1.171 (danielk1 29-Mar-05): ** -1.172 (danielk1 29-Mar-05): ** NOPUSH_MASK_0 corresponds to opcodes 0 to 15. NOPUSH_MASK_1 contains -1.171 (danielk1 29-Mar-05): ** one bit for opcodes 16 to 31, and so on. -1.171 (danielk1 29-Mar-05): ** -1.171 (danielk1 29-Mar-05): ** 16-bit bitmasks (rather than 32-bit) are specified in opcodes.h -1.171 (danielk1 29-Mar-05): ** because the file is generated by an awk program. Awk manipulates -1.171 (danielk1 29-Mar-05): ** all numbers as floating-point and we don't want to risk a rounding -1.171 (danielk1 29-Mar-05): ** error if someone builds with an awk that uses (for example) 32-bit -1.171 (danielk1 29-Mar-05): ** IEEE floats. -1.171 (danielk1 29-Mar-05): */ -1.173 (drh 31-Mar-05): static const u32 masks[5] = { -1.238 (drh 24-Feb-06): NOPUSH_MASK_0 + (((unsigned)NOPUSH_MASK_1)<<16), -1.238 (drh 24-Feb-06): NOPUSH_MASK_2 + (((unsigned)NOPUSH_MASK_3)<<16), -1.238 (drh 24-Feb-06): NOPUSH_MASK_4 + (((unsigned)NOPUSH_MASK_5)<<16), -1.238 (drh 24-Feb-06): NOPUSH_MASK_6 + (((unsigned)NOPUSH_MASK_7)<<16), -1.238 (drh 24-Feb-06): NOPUSH_MASK_8 + (((unsigned)NOPUSH_MASK_9)<<16) -1.171 (danielk1 29-Mar-05): }; -1.206 (drh 29-Nov-05): assert( op<32*5 ); -1.171 (danielk1 29-Mar-05): return (masks[op>>5] & (1<<(op&0x1F))); -1.171 (danielk1 29-Mar-05): } -1.171 (danielk1 29-Mar-05): -1.171 (danielk1 29-Mar-05): #ifndef NDEBUG -1.172 (danielk1 29-Mar-05): int sqlite3VdbeOpcodeNoPush(u8 op){ -1.172 (danielk1 29-Mar-05): return opcodeNoPush(op); -1.171 (danielk1 29-Mar-05): } -1.171 (danielk1 29-Mar-05): #endif -1.171 (danielk1 29-Mar-05): -1.171 (danielk1 29-Mar-05): /* -1.146 (drh 24-Sep-04): ** Loop through the program looking for P2 values that are negative. -1.146 (drh 24-Sep-04): ** Each such value is a label. Resolve the label by setting the P2 -1.146 (drh 24-Sep-04): ** value to its correct non-zero value. -1.146 (drh 24-Sep-04): ** -1.146 (drh 24-Sep-04): ** This routine is called once after all opcodes have been inserted. -1.170 (danielk1 28-Mar-05): ** -1.195 (drh 07-Sep-05): ** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument -1.247 (danielk1 14-Jun-06): ** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by -1.170 (danielk1 28-Mar-05): ** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array. -1.171 (danielk1 29-Mar-05): ** -1.171 (danielk1 29-Mar-05): ** The integer *pMaxStack is set to the maximum number of vdbe stack -1.171 (danielk1 29-Mar-05): ** entries that static analysis reveals this program might need. -1.180 (drh 07-Jun-05): ** -1.180 (drh 07-Jun-05): ** This routine also does the following optimization: It scans for -1.180 (drh 07-Jun-05): ** Halt instructions where P1==SQLITE_CONSTRAINT or P2==OE_Abort or for -1.181 (drh 12-Jun-05): ** IdxInsert instructions where P2!=0. If no such instruction is -1.180 (drh 07-Jun-05): ** found, then every Statement instruction is changed to a Noop. In -1.180 (drh 07-Jun-05): ** this way, we avoid creating the statement journal file unnecessarily. -1.146 (drh 24-Sep-04): */ -1.171 (danielk1 29-Mar-05): static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs, int *pMaxStack){ -1.146 (drh 24-Sep-04): int i; -1.171 (danielk1 29-Mar-05): int nMaxArgs = 0; -1.171 (danielk1 29-Mar-05): int nMaxStack = p->nOp; -1.146 (drh 24-Sep-04): Op *pOp; -1.146 (drh 24-Sep-04): int *aLabel = p->aLabel; -1.180 (drh 07-Jun-05): int doesStatementRollback = 0; -1.180 (drh 07-Jun-05): int hasStatementBegin = 0; -1.146 (drh 24-Sep-04): for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ -1.170 (danielk1 28-Mar-05): u8 opcode = pOp->opcode; -1.170 (danielk1 28-Mar-05): -1.251 (danielk1 20-Jun-06): if( opcode==OP_Function || opcode==OP_AggStep -1.247 (danielk1 14-Jun-06): #ifndef SQLITE_OMIT_VIRTUALTABLE -1.251 (danielk1 20-Jun-06): || opcode==OP_VUpdate -1.247 (danielk1 14-Jun-06): #endif -1.247 (danielk1 14-Jun-06): ){ -1.171 (danielk1 29-Mar-05): if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; -1.294 (danielk1 27-Jun-07): } -1.294 (danielk1 27-Jun-07): if( opcode==OP_Halt ){ -1.180 (drh 07-Jun-05): if( pOp->p1==SQLITE_CONSTRAINT && pOp->p2==OE_Abort ){ -1.180 (drh 07-Jun-05): doesStatementRollback = 1; -1.180 (drh 07-Jun-05): } -1.180 (drh 07-Jun-05): }else if( opcode==OP_Statement ){ -1.180 (drh 07-Jun-05): hasStatementBegin = 1; -1.294 (danielk1 27-Jun-07): #ifndef SQLITE_OMIT_VIRTUALTABLE -1.294 (danielk1 27-Jun-07): }else if( opcode==OP_VUpdate || opcode==OP_VRename ){ -1.294 (danielk1 27-Jun-07): doesStatementRollback = 1; -1.246 (drh 13-Jun-06): }else if( opcode==OP_VFilter ){ -1.246 (drh 13-Jun-06): int n; -1.246 (drh 13-Jun-06): assert( p->nOp - i >= 3 ); -1.246 (drh 13-Jun-06): assert( pOp[-2].opcode==OP_Integer ); -1.246 (drh 13-Jun-06): n = pOp[-2].p1; -1.246 (drh 13-Jun-06): if( n>nMaxArgs ) nMaxArgs = n; -1.294 (danielk1 27-Jun-07): #endif -1.171 (danielk1 29-Mar-05): } -1.172 (danielk1 29-Mar-05): if( opcodeNoPush(opcode) ){ -1.171 (danielk1 29-Mar-05): nMaxStack--; -1.170 (danielk1 28-Mar-05): } -1.170 (danielk1 28-Mar-05): -1.146 (drh 24-Sep-04): if( pOp->p2>=0 ) continue; -1.146 (drh 24-Sep-04): assert( -1-pOp->p2nLabel ); -1.146 (drh 24-Sep-04): pOp->p2 = aLabel[-1-pOp->p2]; -1.1 (drh 06-Sep-03): } -1.299 (drh 16-Aug-07): sqlite3_free(p->aLabel); -1.146 (drh 24-Sep-04): p->aLabel = 0; -1.171 (danielk1 29-Mar-05): -1.171 (danielk1 29-Mar-05): *pMaxFuncArgs = nMaxArgs; -1.171 (danielk1 29-Mar-05): *pMaxStack = nMaxStack; -1.180 (drh 07-Jun-05): -1.180 (drh 07-Jun-05): /* If we never rollback a statement transaction, then statement -1.180 (drh 07-Jun-05): ** transactions are not needed. So change every OP_Statement -1.218 (drh 06-Jan-06): ** opcode into an OP_Noop. This avoid a call to sqlite3OsOpenExclusive() -1.180 (drh 07-Jun-05): ** which can be expensive on some platforms. -1.180 (drh 07-Jun-05): */ -1.180 (drh 07-Jun-05): if( hasStatementBegin && !doesStatementRollback ){ -1.180 (drh 07-Jun-05): for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ -1.180 (drh 07-Jun-05): if( pOp->opcode==OP_Statement ){ -1.180 (drh 07-Jun-05): pOp->opcode = OP_Noop; -1.180 (drh 07-Jun-05): } -1.180 (drh 07-Jun-05): } -1.180 (drh 07-Jun-05): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Return the address of the next instruction to be inserted. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): int sqlite3VdbeCurrentAddr(Vdbe *p){ -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.1 (drh 06-Sep-03): return p->nOp; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Add a whole list of operations to the operation stack. Return the -1.1 (drh 06-Sep-03): ** address of the first operation added. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){ -1.1 (drh 06-Sep-03): int addr; -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.146 (drh 24-Sep-04): resizeOpArray(p, p->nOp + nOp); -1.299 (drh 16-Aug-07): if( p->db->mallocFailed ){ -1.146 (drh 24-Sep-04): return 0; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): addr = p->nOp; -1.1 (drh 06-Sep-03): if( nOp>0 ){ -1.1 (drh 06-Sep-03): int i; -1.16 (drh 21-Feb-04): VdbeOpList const *pIn = aOp; -1.16 (drh 21-Feb-04): for(i=0; ip2; -1.16 (drh 21-Feb-04): VdbeOp *pOut = &p->aOp[i+addr]; -1.16 (drh 21-Feb-04): pOut->opcode = pIn->opcode; -1.16 (drh 21-Feb-04): pOut->p1 = pIn->p1; -1.16 (drh 21-Feb-04): pOut->p2 = p2<0 ? addr + ADDR(p2) : p2; -1.16 (drh 21-Feb-04): pOut->p3 = pIn->p3; -1.16 (drh 21-Feb-04): pOut->p3type = pIn->p3 ? P3_STATIC : P3_NOTUSED; -1.156 (danielk1 12-Jan-05): #ifdef SQLITE_DEBUG -1.24 (danielk1 10-May-04): if( sqlite3_vdbe_addop_trace ){ -1.19 (danielk1 08-May-04): sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): #endif -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): p->nOp += nOp; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): return addr; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Change the value of the P1 operand for a specific instruction. -1.1 (drh 06-Sep-03): ** This routine is useful when a large program is loaded from a -1.19 (danielk1 08-May-04): ** static array using sqlite3VdbeAddOpList but we want to make a -1.1 (drh 06-Sep-03): ** few minor changes to the program. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ -1.240 (drh 13-Mar-06): assert( p==0 || p->magic==VDBE_MAGIC_INIT ); -1.1 (drh 06-Sep-03): if( p && addr>=0 && p->nOp>addr && p->aOp ){ -1.1 (drh 06-Sep-03): p->aOp[addr].p1 = val; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Change the value of the P2 operand for a specific instruction. -1.1 (drh 06-Sep-03): ** This routine is useful for setting a jump destination. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ -1.1 (drh 06-Sep-03): assert( val>=0 ); -1.240 (drh 13-Mar-06): assert( p==0 || p->magic==VDBE_MAGIC_INIT ); -1.1 (drh 06-Sep-03): if( p && addr>=0 && p->nOp>addr && p->aOp ){ -1.1 (drh 06-Sep-03): p->aOp[addr].p2 = val; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.202 (drh 20-Sep-05): /* -1.242 (drh 17-Mar-06): ** Change the P2 operand of instruction addr so that it points to -1.202 (drh 20-Sep-05): ** the address of the next instruction to be coded. -1.202 (drh 20-Sep-05): */ -1.202 (drh 20-Sep-05): void sqlite3VdbeJumpHere(Vdbe *p, int addr){ -1.202 (drh 20-Sep-05): sqlite3VdbeChangeP2(p, addr, p->nOp); -1.202 (drh 20-Sep-05): } -1.198 (drh 16-Sep-05): -1.257 (drh 08-Jul-06): -1.257 (drh 08-Jul-06): /* -1.257 (drh 08-Jul-06): ** If the input FuncDef structure is ephemeral, then free it. If -1.257 (drh 08-Jul-06): ** the FuncDef is not ephermal, then do nothing. -1.257 (drh 08-Jul-06): */ -1.257 (drh 08-Jul-06): static void freeEphemeralFunction(FuncDef *pDef){ -1.257 (drh 08-Jul-06): if( pDef && (pDef->flags & SQLITE_FUNC_EPHEM)!=0 ){ -1.299 (drh 16-Aug-07): sqlite3_free(pDef); -1.257 (drh 08-Jul-06): } -1.257 (drh 08-Jul-06): } -1.257 (drh 08-Jul-06): -1.198 (drh 16-Sep-05): /* -1.198 (drh 16-Sep-05): ** Delete a P3 value if necessary. -1.198 (drh 16-Sep-05): */ -1.198 (drh 16-Sep-05): static void freeP3(int p3type, void *p3){ -1.198 (drh 16-Sep-05): if( p3 ){ -1.201 (drh 17-Sep-05): switch( p3type ){ -1.201 (drh 17-Sep-05): case P3_DYNAMIC: -1.201 (drh 17-Sep-05): case P3_KEYINFO: -1.201 (drh 17-Sep-05): case P3_KEYINFO_HANDOFF: { -1.299 (drh 16-Aug-07): sqlite3_free(p3); -1.201 (drh 17-Sep-05): break; -1.201 (drh 17-Sep-05): } -1.246 (drh 13-Jun-06): case P3_MPRINTF: { -1.246 (drh 13-Jun-06): sqlite3_free(p3); -1.246 (drh 13-Jun-06): break; -1.246 (drh 13-Jun-06): } -1.201 (drh 17-Sep-05): case P3_VDBEFUNC: { -1.201 (drh 17-Sep-05): VdbeFunc *pVdbeFunc = (VdbeFunc *)p3; -1.257 (drh 08-Jul-06): freeEphemeralFunction(pVdbeFunc->pFunc); -1.201 (drh 17-Sep-05): sqlite3VdbeDeleteAuxData(pVdbeFunc, 0); -1.299 (drh 16-Aug-07): sqlite3_free(pVdbeFunc); -1.201 (drh 17-Sep-05): break; -1.201 (drh 17-Sep-05): } -1.257 (drh 08-Jul-06): case P3_FUNCDEF: { -1.257 (drh 08-Jul-06): freeEphemeralFunction((FuncDef*)p3); -1.257 (drh 08-Jul-06): break; -1.257 (drh 08-Jul-06): } -1.201 (drh 17-Sep-05): case P3_MEM: { -1.201 (drh 17-Sep-05): sqlite3ValueFree((sqlite3_value*)p3); -1.201 (drh 17-Sep-05): break; -1.201 (drh 17-Sep-05): } -1.198 (drh 16-Sep-05): } -1.198 (drh 16-Sep-05): } -1.198 (drh 16-Sep-05): } -1.198 (drh 16-Sep-05): -1.198 (drh 16-Sep-05): -1.1 (drh 06-Sep-03): /* -1.242 (drh 17-Mar-06): ** Change N opcodes starting at addr to No-ops. -1.242 (drh 17-Mar-06): */ -1.242 (drh 17-Mar-06): void sqlite3VdbeChangeToNoop(Vdbe *p, int addr, int N){ -1.285 (danielk1 04-May-07): if( p && p->aOp ){ -1.285 (danielk1 04-May-07): VdbeOp *pOp = &p->aOp[addr]; -1.285 (danielk1 04-May-07): while( N-- ){ -1.285 (danielk1 04-May-07): freeP3(pOp->p3type, pOp->p3); -1.285 (danielk1 04-May-07): memset(pOp, 0, sizeof(pOp[0])); -1.285 (danielk1 04-May-07): pOp->opcode = OP_Noop; -1.285 (danielk1 04-May-07): pOp++; -1.285 (danielk1 04-May-07): } -1.242 (drh 17-Mar-06): } -1.242 (drh 17-Mar-06): } -1.242 (drh 17-Mar-06): -1.242 (drh 17-Mar-06): /* -1.1 (drh 06-Sep-03): ** Change the value of the P3 operand for a specific instruction. -1.1 (drh 06-Sep-03): ** This routine is useful when a large program is loaded from a -1.19 (danielk1 08-May-04): ** static array using sqlite3VdbeAddOpList but we want to make a -1.1 (drh 06-Sep-03): ** few minor changes to the program. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** If n>=0 then the P3 operand is dynamic, meaning that a copy of -1.299 (drh 16-Aug-07): ** the string is made into memory obtained from sqlite3_malloc(). -1.1 (drh 06-Sep-03): ** A value of n==0 means copy bytes of zP3 up to and including the -1.1 (drh 06-Sep-03): ** first null byte. If n>0 then copy n+1 bytes of zP3. -1.1 (drh 06-Sep-03): ** -1.176 (danielk1 19-May-05): ** If n==P3_KEYINFO it means that zP3 is a pointer to a KeyInfo structure. -1.176 (danielk1 19-May-05): ** A copy is made of the KeyInfo structure into memory obtained from -1.299 (drh 16-Aug-07): ** sqlite3_malloc, to be freed when the Vdbe is finalized. -1.176 (danielk1 19-May-05): ** n==P3_KEYINFO_HANDOFF indicates that zP3 points to a KeyInfo structure -1.299 (drh 16-Aug-07): ** stored in memory that the caller has obtained from sqlite3_malloc. The -1.176 (danielk1 19-May-05): ** caller should not free the allocation, it will be freed when the Vdbe is -1.176 (danielk1 19-May-05): ** finalized. -1.176 (danielk1 19-May-05): ** -1.176 (danielk1 19-May-05): ** Other values of n (P3_STATIC, P3_COLLSEQ etc.) indicate that zP3 points -1.176 (danielk1 19-May-05): ** to a string or structure that is guaranteed to exist for the lifetime of -1.176 (danielk1 19-May-05): ** the Vdbe. In these cases we can just copy the pointer. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** If addr<0 then change P3 on the most recently inserted instruction. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeChangeP3(Vdbe *p, int addr, const char *zP3, int n){ -1.1 (drh 06-Sep-03): Op *pOp; -1.240 (drh 13-Mar-06): assert( p==0 || p->magic==VDBE_MAGIC_INIT ); -1.299 (drh 16-Aug-07): if( p==0 || p->aOp==0 || p->db->mallocFailed ){ -1.208 (danielk1 06-Dec-05): if (n != P3_KEYINFO) { -1.208 (danielk1 06-Dec-05): freeP3(n, (void*)*(char**)&zP3); -1.208 (danielk1 06-Dec-05): } -1.168 (danielk1 16-Mar-05): return; -1.168 (danielk1 16-Mar-05): } -1.1 (drh 06-Sep-03): if( addr<0 || addr>=p->nOp ){ -1.1 (drh 06-Sep-03): addr = p->nOp - 1; -1.1 (drh 06-Sep-03): if( addr<0 ) return; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): pOp = &p->aOp[addr]; -1.198 (drh 16-Sep-05): freeP3(pOp->p3type, pOp->p3); -1.198 (drh 16-Sep-05): pOp->p3 = 0; -1.1 (drh 06-Sep-03): if( zP3==0 ){ -1.1 (drh 06-Sep-03): pOp->p3 = 0; -1.1 (drh 06-Sep-03): pOp->p3type = P3_NOTUSED; -1.50 (drh 20-May-04): }else if( n==P3_KEYINFO ){ -1.50 (drh 20-May-04): KeyInfo *pKeyInfo; -1.50 (drh 20-May-04): int nField, nByte; -1.192 (drh 01-Sep-05): -1.50 (drh 20-May-04): nField = ((KeyInfo*)zP3)->nField; -1.211 (drh 16-Dec-05): nByte = sizeof(*pKeyInfo) + (nField-1)*sizeof(pKeyInfo->aColl[0]) + nField; -1.299 (drh 16-Aug-07): pKeyInfo = sqlite3_malloc( nByte ); -1.50 (drh 20-May-04): pOp->p3 = (char*)pKeyInfo; -1.50 (drh 20-May-04): if( pKeyInfo ){ -1.226 (danielk1 16-Jan-06): unsigned char *aSortOrder; -1.50 (drh 20-May-04): memcpy(pKeyInfo, zP3, nByte); -1.211 (drh 16-Dec-05): aSortOrder = pKeyInfo->aSortOrder; -1.211 (drh 16-Dec-05): if( aSortOrder ){ -1.226 (danielk1 16-Jan-06): pKeyInfo->aSortOrder = (unsigned char*)&pKeyInfo->aColl[nField]; -1.211 (drh 16-Dec-05): memcpy(pKeyInfo->aSortOrder, aSortOrder, nField); -1.211 (drh 16-Dec-05): } -1.50 (drh 20-May-04): pOp->p3type = P3_KEYINFO; -1.50 (drh 20-May-04): }else{ -1.299 (drh 16-Aug-07): p->db->mallocFailed = 1; -1.50 (drh 20-May-04): pOp->p3type = P3_NOTUSED; -1.50 (drh 20-May-04): } -1.51 (drh 21-May-04): }else if( n==P3_KEYINFO_HANDOFF ){ -1.51 (drh 21-May-04): pOp->p3 = (char*)zP3; -1.51 (drh 21-May-04): pOp->p3type = P3_KEYINFO; -1.1 (drh 06-Sep-03): }else if( n<0 ){ -1.1 (drh 06-Sep-03): pOp->p3 = (char*)zP3; -1.1 (drh 06-Sep-03): pOp->p3type = n; -1.1 (drh 06-Sep-03): }else{ -1.147 (drh 25-Sep-04): if( n==0 ) n = strlen(zP3); -1.299 (drh 16-Aug-07): pOp->p3 = sqlite3DbStrNDup(p->db, zP3, n); -1.1 (drh 06-Sep-03): pOp->p3type = P3_DYNAMIC; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.144 (drh 19-Sep-04): #ifndef NDEBUG -1.144 (drh 19-Sep-04): /* -1.144 (drh 19-Sep-04): ** Replace the P3 field of the most recently coded instruction with -1.144 (drh 19-Sep-04): ** comment text. -1.144 (drh 19-Sep-04): */ -1.144 (drh 19-Sep-04): void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){ -1.144 (drh 19-Sep-04): va_list ap; -1.282 (danielk1 18-Apr-07): assert( p->nOp>0 || p->aOp==0 ); -1.299 (drh 16-Aug-07): assert( p->aOp==0 || p->aOp[p->nOp-1].p3==0 || p->db->mallocFailed ); -1.144 (drh 19-Sep-04): va_start(ap, zFormat); -1.300 (danielk1 16-Aug-07): sqlite3VdbeChangeP3(p, -1, sqlite3VMPrintf(p->db, zFormat, ap), P3_DYNAMIC); -1.144 (drh 19-Sep-04): va_end(ap); -1.144 (drh 19-Sep-04): } -1.144 (drh 19-Sep-04): #endif -1.144 (drh 19-Sep-04): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Return the opcode for a given address. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.299 (drh 16-Aug-07): assert( (addr>=0 && addrnOp) || p->db->mallocFailed ); -1.282 (danielk1 18-Apr-07): return ((addr>=0 && addrnOp)?(&p->aOp[addr]):0); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.151 (drh 31-Oct-04): #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ -1.151 (drh 31-Oct-04): || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) -1.1 (drh 06-Sep-03): /* -1.50 (drh 20-May-04): ** Compute a string that describes the P3 parameter for an opcode. -1.50 (drh 20-May-04): ** Use zTemp for any required temporary buffer space. -1.50 (drh 20-May-04): */ -1.50 (drh 20-May-04): static char *displayP3(Op *pOp, char *zTemp, int nTemp){ -1.50 (drh 20-May-04): char *zP3; -1.50 (drh 20-May-04): assert( nTemp>=20 ); -1.50 (drh 20-May-04): switch( pOp->p3type ){ -1.50 (drh 20-May-04): case P3_KEYINFO: { -1.50 (drh 20-May-04): int i, j; -1.50 (drh 20-May-04): KeyInfo *pKeyInfo = (KeyInfo*)pOp->p3; -1.286 (drh 04-May-07): sqlite3_snprintf(nTemp, zTemp, "keyinfo(%d", pKeyInfo->nField); -1.50 (drh 20-May-04): i = strlen(zTemp); -1.50 (drh 20-May-04): for(j=0; jnField; j++){ -1.50 (drh 20-May-04): CollSeq *pColl = pKeyInfo->aColl[j]; -1.50 (drh 20-May-04): if( pColl ){ -1.50 (drh 20-May-04): int n = strlen(pColl->zName); -1.50 (drh 20-May-04): if( i+n>nTemp-6 ){ -1.286 (drh 04-May-07): memcpy(&zTemp[i],",...",4); -1.50 (drh 20-May-04): break; -1.50 (drh 20-May-04): } -1.50 (drh 20-May-04): zTemp[i++] = ','; -1.51 (drh 21-May-04): if( pKeyInfo->aSortOrder && pKeyInfo->aSortOrder[j] ){ -1.50 (drh 20-May-04): zTemp[i++] = '-'; -1.50 (drh 20-May-04): } -1.286 (drh 04-May-07): memcpy(&zTemp[i], pColl->zName,n+1); -1.50 (drh 20-May-04): i += n; -1.50 (drh 20-May-04): }else if( i+4p3; -1.286 (drh 04-May-07): sqlite3_snprintf(nTemp, zTemp, "collseq(%.20s)", pColl->zName); -1.50 (drh 20-May-04): zP3 = zTemp; -1.50 (drh 20-May-04): break; -1.50 (drh 20-May-04): } -1.67 (drh 26-May-04): case P3_FUNCDEF: { -1.67 (drh 26-May-04): FuncDef *pDef = (FuncDef*)pOp->p3; -1.244 (drh 13-Jun-06): sqlite3_snprintf(nTemp, zTemp, "%s(%d)", pDef->zName, pDef->nArg); -1.244 (drh 13-Jun-06): zP3 = zTemp; -1.244 (drh 13-Jun-06): break; -1.244 (drh 13-Jun-06): } -1.244 (drh 13-Jun-06): #ifndef SQLITE_OMIT_VIRTUALTABLE -1.244 (drh 13-Jun-06): case P3_VTAB: { -1.244 (drh 13-Jun-06): sqlite3_vtab *pVtab = (sqlite3_vtab*)pOp->p3; -1.256 (drh 26-Jun-06): sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", pVtab, pVtab->pModule); -1.67 (drh 26-May-04): zP3 = zTemp; -1.67 (drh 26-May-04): break; -1.67 (drh 26-May-04): } -1.244 (drh 13-Jun-06): #endif -1.50 (drh 20-May-04): default: { -1.50 (drh 20-May-04): zP3 = pOp->p3; -1.135 (drh 24-Jul-04): if( zP3==0 || pOp->opcode==OP_Noop ){ -1.50 (drh 20-May-04): zP3 = ""; -1.50 (drh 20-May-04): } -1.50 (drh 20-May-04): } -1.50 (drh 20-May-04): } -1.249 (drh 15-Jun-06): assert( zP3!=0 ); -1.50 (drh 20-May-04): return zP3; -1.50 (drh 20-May-04): } -1.151 (drh 31-Oct-04): #endif -1.50 (drh 20-May-04): -1.312 (drh 28-Aug-07): /* -1.313 (drh 28-Aug-07): ** Declare to the Vdbe that the BTree object at db->aDb[i] is used. -1.313 (drh 28-Aug-07): ** -1.312 (drh 28-Aug-07): */ -1.317 (drh 30-Aug-07): void sqlite3VdbeUsesBtree(Vdbe *p, int i){ -1.317 (drh 30-Aug-07): int mask; -1.313 (drh 28-Aug-07): assert( i>=0 && idb->nDb ); -1.313 (drh 28-Aug-07): assert( ibtreeMask)*8 ); -1.317 (drh 30-Aug-07): mask = 1<btreeMask & mask)==0 ){ -1.317 (drh 30-Aug-07): p->btreeMask |= mask; -1.317 (drh 30-Aug-07): sqlite3BtreeMutexArrayInsert(&p->aMutex, p->db->aDb[i].pBt); -1.317 (drh 30-Aug-07): } -1.312 (drh 28-Aug-07): } -1.312 (drh 28-Aug-07): -1.50 (drh 20-May-04): -1.156 (danielk1 12-Jan-05): #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Print a single opcode. This routine is used for debugging only. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ -1.1 (drh 06-Sep-03): char *zP3; -1.50 (drh 20-May-04): char zPtr[50]; -1.50 (drh 20-May-04): static const char *zFormat1 = "%4d %-13s %4d %4d %s\n"; -1.1 (drh 06-Sep-03): if( pOut==0 ) pOut = stdout; -1.50 (drh 20-May-04): zP3 = displayP3(pOp, zPtr, sizeof(zPtr)); -1.50 (drh 20-May-04): fprintf(pOut, zFormat1, -1.311 (drh 27-Aug-07): pc, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, zP3); -1.1 (drh 06-Sep-03): fflush(pOut); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): #endif -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.146 (drh 24-Sep-04): ** Release an array of N Mem elements -1.146 (drh 24-Sep-04): */ -1.146 (drh 24-Sep-04): static void releaseMemArray(Mem *p, int N){ -1.146 (drh 24-Sep-04): if( p ){ -1.146 (drh 24-Sep-04): while( N-->0 ){ -1.307 (drh 21-Aug-07): assert( N<2 || p[0].db==p[1].db ); -1.146 (drh 24-Sep-04): sqlite3VdbeMemRelease(p++); -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): } -1.146 (drh 24-Sep-04): -1.151 (drh 31-Oct-04): #ifndef SQLITE_OMIT_EXPLAIN -1.146 (drh 24-Sep-04): /* -1.1 (drh 06-Sep-03): ** Give a listing of the program in the virtual machine. -1.1 (drh 06-Sep-03): ** -1.19 (danielk1 08-May-04): ** The interface is the same as sqlite3VdbeExec(). But instead of -1.1 (drh 06-Sep-03): ** running the code, it invokes the callback once for each instruction. -1.1 (drh 06-Sep-03): ** This feature is used to implement "EXPLAIN". -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): int sqlite3VdbeList( -1.1 (drh 06-Sep-03): Vdbe *p /* The VDBE */ -1.1 (drh 06-Sep-03): ){ -1.140 (drh 06-Sep-04): sqlite3 *db = p->db; -1.1 (drh 06-Sep-03): int i; -1.14 (drh 14-Feb-04): int rc = SQLITE_OK; -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): assert( p->explain ); -1.155 (drh 11-Jan-05): if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE; -1.155 (drh 11-Jan-05): assert( db->magic==SQLITE_MAGIC_BUSY ); -1.155 (drh 11-Jan-05): assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY ); -1.56 (danielk1 22-May-04): -1.56 (danielk1 22-May-04): /* Even though this opcode does not put dynamic strings onto the -1.56 (danielk1 22-May-04): ** the stack, they may become dynamic if the user calls -1.68 (drh 26-May-04): ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. -1.56 (danielk1 22-May-04): */ -1.56 (danielk1 22-May-04): if( p->pTos==&p->aStack[4] ){ -1.146 (drh 24-Sep-04): releaseMemArray(p->aStack, 5); -1.56 (danielk1 22-May-04): } -1.56 (danielk1 22-May-04): p->resOnStack = 0; -1.56 (danielk1 22-May-04): -1.197 (drh 10-Sep-05): do{ -1.197 (drh 10-Sep-05): i = p->pc++; -1.197 (drh 10-Sep-05): }while( inOp && p->explain==2 && p->aOp[i].opcode!=OP_Explain ); -1.14 (drh 14-Feb-04): if( i>=p->nOp ){ -1.14 (drh 14-Feb-04): p->rc = SQLITE_OK; -1.14 (drh 14-Feb-04): rc = SQLITE_DONE; -1.259 (drh 26-Jul-06): }else if( db->u1.isInterrupted ){ -1.155 (drh 11-Jan-05): p->rc = SQLITE_INTERRUPT; -1.14 (drh 14-Feb-04): rc = SQLITE_ERROR; -1.89 (danielk1 31-May-04): sqlite3SetString(&p->zErrMsg, sqlite3ErrStr(p->rc), (char*)0); -1.14 (drh 14-Feb-04): }else{ -1.50 (drh 20-May-04): Op *pOp = &p->aOp[i]; -1.69 (drh 27-May-04): Mem *pMem = p->aStack; -1.69 (drh 27-May-04): pMem->flags = MEM_Int; -1.88 (drh 31-May-04): pMem->type = SQLITE_INTEGER; -1.276 (drh 30-Mar-07): pMem->u.i = i; /* Program counter */ -1.69 (drh 27-May-04): pMem++; -1.69 (drh 27-May-04): -1.69 (drh 27-May-04): pMem->flags = MEM_Static|MEM_Str|MEM_Term; -1.311 (drh 27-Aug-07): pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ -1.249 (drh 15-Jun-06): assert( pMem->z!=0 ); -1.69 (drh 27-May-04): pMem->n = strlen(pMem->z); -1.88 (drh 31-May-04): pMem->type = SQLITE_TEXT; -1.104 (danielk1 12-Jun-04): pMem->enc = SQLITE_UTF8; -1.69 (drh 27-May-04): pMem++; -1.69 (drh 27-May-04): -1.69 (drh 27-May-04): pMem->flags = MEM_Int; -1.276 (drh 30-Mar-07): pMem->u.i = pOp->p1; /* P1 */ -1.88 (drh 31-May-04): pMem->type = SQLITE_INTEGER; -1.69 (drh 27-May-04): pMem++; -1.69 (drh 27-May-04): -1.69 (drh 27-May-04): pMem->flags = MEM_Int; -1.276 (drh 30-Mar-07): pMem->u.i = pOp->p2; /* P2 */ -1.88 (drh 31-May-04): pMem->type = SQLITE_INTEGER; -1.69 (drh 27-May-04): pMem++; -1.69 (drh 27-May-04): -1.239 (drh 03-Mar-06): pMem->flags = MEM_Ephem|MEM_Str|MEM_Term; /* P3 */ -1.69 (drh 27-May-04): pMem->z = displayP3(pOp, pMem->zShort, sizeof(pMem->zShort)); -1.249 (drh 15-Jun-06): assert( pMem->z!=0 ); -1.239 (drh 03-Mar-06): pMem->n = strlen(pMem->z); -1.88 (drh 31-May-04): pMem->type = SQLITE_TEXT; -1.104 (danielk1 12-Jun-04): pMem->enc = SQLITE_UTF8; -1.69 (drh 27-May-04): -1.197 (drh 10-Sep-05): p->nResColumn = 5 - 2*(p->explain-1); -1.69 (drh 27-May-04): p->pTos = pMem; -1.14 (drh 14-Feb-04): p->rc = SQLITE_OK; -1.56 (danielk1 22-May-04): p->resOnStack = 1; -1.14 (drh 14-Feb-04): rc = SQLITE_ROW; -1.1 (drh 06-Sep-03): } -1.14 (drh 14-Feb-04): return rc; -1.1 (drh 06-Sep-03): } -1.151 (drh 31-Oct-04): #endif /* SQLITE_OMIT_EXPLAIN */ -1.1 (drh 06-Sep-03): -1.281 (drh 05-Apr-07): #ifdef SQLITE_DEBUG -1.1 (drh 06-Sep-03): /* -1.135 (drh 24-Jul-04): ** Print the SQL that was used to generate a VDBE program. -1.135 (drh 24-Jul-04): */ -1.135 (drh 24-Jul-04): void sqlite3VdbePrintSql(Vdbe *p){ -1.135 (drh 24-Jul-04): int nOp = p->nOp; -1.135 (drh 24-Jul-04): VdbeOp *pOp; -1.142 (drh 15-Sep-04): if( nOp<1 ) return; -1.142 (drh 15-Sep-04): pOp = &p->aOp[nOp-1]; -1.135 (drh 24-Jul-04): if( pOp->opcode==OP_Noop && pOp->p3!=0 ){ -1.135 (drh 24-Jul-04): const char *z = pOp->p3; -1.136 (drh 08-Aug-04): while( isspace(*(u8*)z) ) z++; -1.135 (drh 24-Jul-04): printf("SQL: [%s]\n", z); -1.135 (drh 24-Jul-04): } -1.281 (drh 05-Apr-07): } -1.135 (drh 24-Jul-04): #endif -1.135 (drh 24-Jul-04): -1.271 (drh 01-Mar-07): #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) -1.271 (drh 01-Mar-07): /* -1.271 (drh 01-Mar-07): ** Print an IOTRACE message showing SQL content. -1.271 (drh 01-Mar-07): */ -1.271 (drh 01-Mar-07): void sqlite3VdbeIOTraceSql(Vdbe *p){ -1.271 (drh 01-Mar-07): int nOp = p->nOp; -1.271 (drh 01-Mar-07): VdbeOp *pOp; -1.271 (drh 01-Mar-07): if( sqlite3_io_trace==0 ) return; -1.271 (drh 01-Mar-07): if( nOp<1 ) return; -1.271 (drh 01-Mar-07): pOp = &p->aOp[nOp-1]; -1.271 (drh 01-Mar-07): if( pOp->opcode==OP_Noop && pOp->p3!=0 ){ -1.271 (drh 01-Mar-07): int i, j; -1.297 (drh 13-Aug-07): char z[1000]; -1.297 (drh 13-Aug-07): sqlite3_snprintf(sizeof(z), z, "%s", pOp->p3); -1.288 (danielk1 16-May-07): for(i=0; isspace((unsigned char)z[i]); i++){} -1.271 (drh 01-Mar-07): for(j=0; z[i]; i++){ -1.288 (danielk1 16-May-07): if( isspace((unsigned char)z[i]) ){ -1.271 (drh 01-Mar-07): if( z[i-1]!=' ' ){ -1.271 (drh 01-Mar-07): z[j++] = ' '; -1.271 (drh 01-Mar-07): } -1.271 (drh 01-Mar-07): }else{ -1.271 (drh 01-Mar-07): z[j++] = z[i]; -1.271 (drh 01-Mar-07): } -1.271 (drh 01-Mar-07): } -1.271 (drh 01-Mar-07): z[j] = 0; -1.271 (drh 01-Mar-07): sqlite3_io_trace("SQL %s\n", z); -1.271 (drh 01-Mar-07): } -1.271 (drh 01-Mar-07): } -1.271 (drh 01-Mar-07): #endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ -1.271 (drh 01-Mar-07): -1.271 (drh 01-Mar-07): -1.135 (drh 24-Jul-04): /* -1.1 (drh 06-Sep-03): ** Prepare a virtual machine for execution. This involves things such -1.1 (drh 06-Sep-03): ** as allocating stack space and initializing the program counter. -1.1 (drh 06-Sep-03): ** After the VDBE has be prepped, it can be executed by one or more -1.19 (danielk1 08-May-04): ** calls to sqlite3VdbeExec(). -1.139 (drh 02-Sep-04): ** -1.139 (drh 02-Sep-04): ** This is the only way to move a VDBE from VDBE_MAGIC_INIT to -1.139 (drh 02-Sep-04): ** VDBE_MAGIC_RUN. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeMakeReady( -1.1 (drh 06-Sep-03): Vdbe *p, /* The VDBE */ -1.2 (drh 06-Sep-03): int nVar, /* Number of '?' see in the SQL statement */ -1.138 (drh 21-Aug-04): int nMem, /* Number of memory cells to allocate */ -1.138 (drh 21-Aug-04): int nCursor, /* Number of cursors to allocate */ -1.1 (drh 06-Sep-03): int isExplain /* True if the EXPLAIN keywords is present */ -1.1 (drh 06-Sep-03): ){ -1.1 (drh 06-Sep-03): int n; -1.300 (danielk1 16-Aug-07): sqlite3 *db = p->db; -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): assert( p!=0 ); -1.1 (drh 06-Sep-03): assert( p->magic==VDBE_MAGIC_INIT ); -1.1 (drh 06-Sep-03): -1.142 (drh 15-Sep-04): /* There should be at least one opcode. -1.1 (drh 06-Sep-03): */ -1.142 (drh 15-Sep-04): assert( p->nOp>0 ); -1.1 (drh 06-Sep-03): -1.170 (danielk1 28-Mar-05): /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. This -1.170 (danielk1 28-Mar-05): * is because the call to resizeOpArray() below may shrink the -1.170 (danielk1 28-Mar-05): * p->aOp[] array to save memory if called when in VDBE_MAGIC_RUN -1.170 (danielk1 28-Mar-05): * state. -1.170 (danielk1 28-Mar-05): */ -1.170 (danielk1 28-Mar-05): p->magic = VDBE_MAGIC_RUN; -1.170 (danielk1 28-Mar-05): -1.1 (drh 06-Sep-03): /* No instruction ever pushes more than a single element onto the -1.1 (drh 06-Sep-03): ** stack. And the stack never grows on successive executions of the -1.1 (drh 06-Sep-03): ** same loop. So the total number of instructions is an upper bound -1.180 (drh 07-Jun-05): ** on the maximum stack depth required. (Added later:) The -1.180 (drh 07-Jun-05): ** resolveP2Values() call computes a tighter upper bound on the -1.180 (drh 07-Jun-05): ** stack size. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** Allocation all the stack space we will ever need. -1.1 (drh 06-Sep-03): */ -1.3 (drh 06-Sep-03): if( p->aStack==0 ){ -1.170 (danielk1 28-Mar-05): int nArg; /* Maximum number of args passed to a user function. */ -1.171 (danielk1 29-Mar-05): int nStack; /* Maximum number of stack entries required */ -1.171 (danielk1 29-Mar-05): resolveP2Values(p, &nArg, &nStack); -1.170 (danielk1 28-Mar-05): resizeOpArray(p, p->nOp); -1.3 (drh 06-Sep-03): assert( nVar>=0 ); -1.171 (danielk1 29-Mar-05): assert( nStacknOp ); -1.261 (drh 08-Aug-06): if( isExplain ){ -1.261 (drh 08-Aug-06): nStack = 10; -1.261 (drh 08-Aug-06): } -1.300 (danielk1 16-Aug-07): p->aStack = sqlite3DbMallocZero(db, -1.171 (danielk1 29-Mar-05): nStack*sizeof(p->aStack[0]) /* aStack */ -1.170 (danielk1 28-Mar-05): + nArg*sizeof(Mem*) /* apArg */ -1.149 (drh 05-Oct-04): + nVar*sizeof(Mem) /* aVar */ -1.149 (drh 05-Oct-04): + nVar*sizeof(char*) /* azVar */ -1.149 (drh 05-Oct-04): + nMem*sizeof(Mem) /* aMem */ -1.149 (drh 05-Oct-04): + nCursor*sizeof(Cursor*) /* apCsr */ -1.3 (drh 06-Sep-03): ); -1.299 (drh 16-Aug-07): if( !db->mallocFailed ){ -1.171 (danielk1 29-Mar-05): p->aMem = &p->aStack[nStack]; -1.149 (drh 05-Oct-04): p->nMem = nMem; -1.149 (drh 05-Oct-04): p->aVar = &p->aMem[nMem]; -1.149 (drh 05-Oct-04): p->nVar = nVar; -1.138 (drh 21-Aug-04): p->okVar = 0; -1.149 (drh 05-Oct-04): p->apArg = (Mem**)&p->aVar[nVar]; -1.170 (danielk1 28-Mar-05): p->azVar = (char**)&p->apArg[nArg]; -1.149 (drh 05-Oct-04): p->apCsr = (Cursor**)&p->azVar[nVar]; -1.138 (drh 21-Aug-04): p->nCursor = nCursor; -1.138 (drh 21-Aug-04): for(n=0; naVar[n].flags = MEM_Null; -1.307 (drh 21-Aug-07): p->aVar[n].db = db; -1.307 (drh 21-Aug-07): } -1.307 (drh 21-Aug-07): for(n=0; naStack[n].db = db; -1.138 (drh 21-Aug-04): } -1.42 (danielk1 19-May-04): } -1.3 (drh 06-Sep-03): } -1.166 (danielk1 29-Jan-05): for(n=0; nnMem; n++){ -1.166 (danielk1 29-Jan-05): p->aMem[n].flags = MEM_Null; -1.307 (drh 21-Aug-07): p->aMem[n].db = db; -1.166 (danielk1 29-Jan-05): } -1.1 (drh 06-Sep-03): -1.10 (drh 31-Jan-04): p->pTos = &p->aStack[-1]; -1.85 (danielk1 31-May-04): p->pc = -1; -1.1 (drh 06-Sep-03): p->rc = SQLITE_OK; -1.1 (drh 06-Sep-03): p->uniqueCnt = 0; -1.1 (drh 06-Sep-03): p->returnDepth = 0; -1.1 (drh 06-Sep-03): p->errorAction = OE_Abort; -1.1 (drh 06-Sep-03): p->popStack = 0; -1.1 (drh 06-Sep-03): p->explain |= isExplain; -1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_RUN; -1.121 (danielk1 21-Jun-04): p->nChange = 0; -1.219 (drh 07-Jan-06): p->cacheCtr = 1; -1.215 (drh 29-Dec-05): p->minWriteFileFormat = 255; -1.294 (danielk1 27-Jun-07): p->openedStatement = 0; -1.1 (drh 06-Sep-03): #ifdef VDBE_PROFILE -1.6 (drh 31-Dec-03): { -1.6 (drh 31-Dec-03): int i; -1.6 (drh 31-Dec-03): for(i=0; inOp; i++){ -1.6 (drh 31-Dec-03): p->aOp[i].cnt = 0; -1.6 (drh 31-Dec-03): p->aOp[i].cycles = 0; -1.6 (drh 31-Dec-03): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): #endif -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.316 (drh 29-Aug-07): ** Close a VDBE cursor and release all the resources that cursor happens -1.1 (drh 06-Sep-03): ** to hold. -1.1 (drh 06-Sep-03): */ -1.252 (danielk1 23-Jun-06): void sqlite3VdbeFreeCursor(Vdbe *p, Cursor *pCx){ -1.106 (drh 12-Jun-04): if( pCx==0 ){ -1.106 (drh 12-Jun-04): return; -1.106 (drh 12-Jun-04): } -1.1 (drh 06-Sep-03): if( pCx->pCursor ){ -1.19 (danielk1 08-May-04): sqlite3BtreeCloseCursor(pCx->pCursor); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): if( pCx->pBt ){ -1.19 (danielk1 08-May-04): sqlite3BtreeClose(pCx->pBt); -1.1 (drh 06-Sep-03): } -1.243 (drh 12-Jun-06): #ifndef SQLITE_OMIT_VIRTUALTABLE -1.243 (drh 12-Jun-06): if( pCx->pVtabCursor ){ -1.243 (drh 12-Jun-06): sqlite3_vtab_cursor *pVtabCursor = pCx->pVtabCursor; -1.252 (danielk1 23-Jun-06): const sqlite3_module *pModule = pCx->pModule; -1.252 (danielk1 23-Jun-06): p->inVtabMethod = 1; -1.258 (danielk1 25-Jul-06): sqlite3SafetyOff(p->db); -1.243 (drh 12-Jun-06): pModule->xClose(pVtabCursor); -1.258 (danielk1 25-Jul-06): sqlite3SafetyOn(p->db); -1.252 (danielk1 23-Jun-06): p->inVtabMethod = 0; -1.243 (drh 12-Jun-06): } -1.243 (drh 12-Jun-06): #endif -1.299 (drh 16-Aug-07): sqlite3_free(pCx->pData); -1.299 (drh 16-Aug-07): sqlite3_free(pCx->aType); -1.299 (drh 16-Aug-07): sqlite3_free(pCx); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.316 (drh 29-Aug-07): ** Close all cursors except for VTab cursors that are currently -1.316 (drh 29-Aug-07): ** in use. -1.1 (drh 06-Sep-03): */ -1.316 (drh 29-Aug-07): static void closeAllCursorsExceptActiveVtabs(Vdbe *p){ -1.1 (drh 06-Sep-03): int i; -1.138 (drh 21-Aug-04): if( p->apCsr==0 ) return; -1.1 (drh 06-Sep-03): for(i=0; inCursor; i++){ -1.316 (drh 29-Aug-07): Cursor *pC = p->apCsr[i]; -1.316 (drh 29-Aug-07): if( pC && (!p->inVtabMethod || !pC->pVtabCursor) ){ -1.316 (drh 29-Aug-07): sqlite3VdbeFreeCursor(p, pC); -1.253 (danielk1 23-Jun-06): p->apCsr[i] = 0; -1.252 (danielk1 23-Jun-06): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Clean up the VM after execution. -1.1 (drh 06-Sep-03): ** -1.1 (drh 06-Sep-03): ** This routine will automatically close any cursors, lists, and/or -1.1 (drh 06-Sep-03): ** sorters that were left open. It also deletes the values of -1.43 (drh 19-May-04): ** variables in the aVar[] array. -1.1 (drh 06-Sep-03): */ -1.1 (drh 06-Sep-03): static void Cleanup(Vdbe *p){ -1.1 (drh 06-Sep-03): int i; -1.10 (drh 31-Jan-04): if( p->aStack ){ -1.146 (drh 24-Sep-04): releaseMemArray(p->aStack, 1 + (p->pTos - p->aStack)); -1.146 (drh 24-Sep-04): p->pTos = &p->aStack[-1]; -1.10 (drh 31-Jan-04): } -1.316 (drh 29-Aug-07): closeAllCursorsExceptActiveVtabs(p); -1.146 (drh 24-Sep-04): releaseMemArray(p->aMem, p->nMem); -1.183 (drh 08-Jul-05): sqlite3VdbeFifoClear(&p->sFifo); -1.146 (drh 24-Sep-04): if( p->contextStack ){ -1.146 (drh 24-Sep-04): for(i=0; icontextStackTop; i++){ -1.183 (drh 08-Jul-05): sqlite3VdbeFifoClear(&p->contextStack[i].sFifo); -1.146 (drh 24-Sep-04): } -1.299 (drh 16-Aug-07): sqlite3_free(p->contextStack); -1.143 (drh 19-Sep-04): } -1.17 (drh 21-Feb-04): p->contextStack = 0; -1.143 (drh 19-Sep-04): p->contextStackDepth = 0; -1.143 (drh 19-Sep-04): p->contextStackTop = 0; -1.299 (drh 16-Aug-07): sqlite3_free(p->zErrMsg); -1.1 (drh 06-Sep-03): p->zErrMsg = 0; -1.293 (drh 20-Jun-07): p->resOnStack = 0; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.64 (danielk1 25-May-04): ** Set the number of result columns that will be returned by this SQL -1.64 (danielk1 25-May-04): ** statement. This is now set at compile time, rather than during -1.64 (danielk1 25-May-04): ** execution of the vdbe program so that sqlite3_column_count() can -1.64 (danielk1 25-May-04): ** be called on an SQL statement before sqlite3_step(). -1.64 (danielk1 25-May-04): */ -1.64 (danielk1 25-May-04): void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ -1.146 (drh 24-Sep-04): Mem *pColName; -1.146 (drh 24-Sep-04): int n; -1.308 (drh 23-Aug-07): -1.236 (danielk1 10-Feb-06): releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); -1.299 (drh 16-Aug-07): sqlite3_free(p->aColName); -1.236 (danielk1 10-Feb-06): n = nResColumn*COLNAME_N; -1.64 (danielk1 25-May-04): p->nResColumn = nResColumn; -1.300 (danielk1 16-Aug-07): p->aColName = pColName = (Mem*)sqlite3DbMallocZero(p->db, sizeof(Mem)*n ); -1.146 (drh 24-Sep-04): if( p->aColName==0 ) return; -1.146 (drh 24-Sep-04): while( n-- > 0 ){ -1.308 (drh 23-Aug-07): pColName->flags = MEM_Null; -1.309 (drh 24-Aug-07): pColName->db = p->db; -1.308 (drh 23-Aug-07): pColName++; -1.146 (drh 24-Sep-04): } -1.66 (danielk1 26-May-04): } -1.66 (danielk1 26-May-04): -1.66 (danielk1 26-May-04): /* -1.66 (danielk1 26-May-04): ** Set the name of the idx'th column to be returned by the SQL statement. -1.66 (danielk1 26-May-04): ** zName must be a pointer to a nul terminated string. -1.66 (danielk1 26-May-04): ** -1.66 (danielk1 26-May-04): ** This call must be made after a call to sqlite3VdbeSetNumCols(). -1.66 (danielk1 26-May-04): ** -1.105 (danielk1 12-Jun-04): ** If N==P3_STATIC it means that zName is a pointer to a constant static -1.105 (danielk1 12-Jun-04): ** string and we can just copy the pointer. If it is P3_DYNAMIC, then -1.299 (drh 16-Aug-07): ** the string is freed using sqlite3_free() when the vdbe is finished with -1.105 (danielk1 12-Jun-04): ** it. Otherwise, N bytes of zName are copied. -1.66 (danielk1 26-May-04): */ -1.236 (danielk1 10-Feb-06): int sqlite3VdbeSetColName(Vdbe *p, int idx, int var, const char *zName, int N){ -1.66 (danielk1 26-May-04): int rc; -1.66 (danielk1 26-May-04): Mem *pColName; -1.236 (danielk1 10-Feb-06): assert( idxnResColumn ); -1.236 (danielk1 10-Feb-06): assert( vardb->mallocFailed ) return SQLITE_NOMEM; -1.146 (drh 24-Sep-04): assert( p->aColName!=0 ); -1.236 (danielk1 10-Feb-06): pColName = &(p->aColName[idx+var*p->nResColumn]); -1.105 (danielk1 12-Jun-04): if( N==P3_DYNAMIC || N==P3_STATIC ){ -1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, SQLITE_STATIC); -1.66 (danielk1 26-May-04): }else{ -1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemSetStr(pColName, zName, N, SQLITE_UTF8,SQLITE_TRANSIENT); -1.66 (danielk1 26-May-04): } -1.66 (danielk1 26-May-04): if( rc==SQLITE_OK && N==P3_DYNAMIC ){ -1.66 (danielk1 26-May-04): pColName->flags = (pColName->flags&(~MEM_Static))|MEM_Dyn; -1.105 (danielk1 12-Jun-04): pColName->xDel = 0; -1.66 (danielk1 26-May-04): } -1.66 (danielk1 26-May-04): return rc; -1.64 (danielk1 25-May-04): } -1.64 (danielk1 25-May-04): -1.91 (danielk1 03-Jun-04): /* -1.91 (danielk1 03-Jun-04): ** A read or write transaction may or may not be active on database handle -1.91 (danielk1 03-Jun-04): ** db. If a transaction is active, commit it. If there is a -1.91 (danielk1 03-Jun-04): ** write-transaction spanning more than one database file, this routine -1.91 (danielk1 03-Jun-04): ** takes care of the master journal trickery. -1.91 (danielk1 03-Jun-04): */ -1.140 (drh 06-Sep-04): static int vdbeCommit(sqlite3 *db){ -1.91 (danielk1 03-Jun-04): int i; -1.91 (danielk1 03-Jun-04): int nTrans = 0; /* Number of databases with an active write-transaction */ -1.91 (danielk1 03-Jun-04): int rc = SQLITE_OK; -1.91 (danielk1 03-Jun-04): int needXcommit = 0; -1.91 (danielk1 03-Jun-04): -1.258 (danielk1 25-Jul-06): /* Before doing anything else, call the xSync() callback for any -1.258 (danielk1 25-Jul-06): ** virtual module tables written in this transaction. This has to -1.258 (danielk1 25-Jul-06): ** be done before determining whether a master journal file is -1.258 (danielk1 25-Jul-06): ** required, as an xSync() callback may add an attached database -1.258 (danielk1 25-Jul-06): ** to the transaction. -1.258 (danielk1 25-Jul-06): */ -1.258 (danielk1 25-Jul-06): rc = sqlite3VtabSync(db, rc); -1.258 (danielk1 25-Jul-06): if( rc!=SQLITE_OK ){ -1.258 (danielk1 25-Jul-06): return rc; -1.258 (danielk1 25-Jul-06): } -1.258 (danielk1 25-Jul-06): -1.258 (danielk1 25-Jul-06): /* This loop determines (a) if the commit hook should be invoked and -1.258 (danielk1 25-Jul-06): ** (b) how many database files have open write transactions, not -1.258 (danielk1 25-Jul-06): ** including the temp database. (b) is important because if more than -1.258 (danielk1 25-Jul-06): ** one database file has an open write transaction, a master journal -1.258 (danielk1 25-Jul-06): ** file is required for an atomic commit. -1.258 (danielk1 25-Jul-06): */ -1.91 (danielk1 03-Jun-04): for(i=0; inDb; i++){ -1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; -1.313 (drh 28-Aug-07): if( sqlite3BtreeIsInTrans(pBt) ){ -1.91 (danielk1 03-Jun-04): needXcommit = 1; -1.91 (danielk1 03-Jun-04): if( i!=1 ) nTrans++; -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* If there are any write-transactions at all, invoke the commit hook */ -1.91 (danielk1 03-Jun-04): if( needXcommit && db->xCommitCallback ){ -1.139 (drh 02-Sep-04): sqlite3SafetyOff(db); -1.139 (drh 02-Sep-04): rc = db->xCommitCallback(db->pCommitArg); -1.139 (drh 02-Sep-04): sqlite3SafetyOn(db); -1.139 (drh 02-Sep-04): if( rc ){ -1.91 (danielk1 03-Jun-04): return SQLITE_CONSTRAINT; -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.128 (danielk1 26-Jun-04): /* The simple case - no more than one database file (not counting the -1.128 (danielk1 26-Jun-04): ** TEMP database) has a transaction active. There is no need for the -1.94 (drh 07-Jun-04): ** master-journal. -1.99 (drh 09-Jun-04): ** -1.128 (danielk1 26-Jun-04): ** If the return value of sqlite3BtreeGetFilename() is a zero length -1.128 (danielk1 26-Jun-04): ** string, it means the main database is :memory:. In that case we do -1.128 (danielk1 26-Jun-04): ** not support atomic multi-file commits, so use the simple case then -1.99 (drh 09-Jun-04): ** too. -1.91 (danielk1 03-Jun-04): */ -1.128 (danielk1 26-Jun-04): if( 0==strlen(sqlite3BtreeGetFilename(db->aDb[0].pBt)) || nTrans<=1 ){ -1.94 (drh 07-Jun-04): for(i=0; rc==SQLITE_OK && inDb; i++){ -1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; -1.91 (danielk1 03-Jun-04): if( pBt ){ -1.277 (drh 30-Mar-07): rc = sqlite3BtreeCommitPhaseOne(pBt, 0); -1.94 (drh 07-Jun-04): } -1.94 (drh 07-Jun-04): } -1.94 (drh 07-Jun-04): -1.277 (drh 30-Mar-07): /* Do the commit only if all databases successfully complete phase 1. -1.277 (drh 30-Mar-07): ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an -1.277 (drh 30-Mar-07): ** IO error while deleting or truncating a journal file. It is unlikely, -1.277 (drh 30-Mar-07): ** but could happen. In this case abandon processing and return the error. -1.274 (danielk1 27-Mar-07): */ -1.274 (danielk1 27-Mar-07): for(i=0; rc==SQLITE_OK && inDb; i++){ -1.274 (danielk1 27-Mar-07): Btree *pBt = db->aDb[i].pBt; -1.274 (danielk1 27-Mar-07): if( pBt ){ -1.277 (drh 30-Mar-07): rc = sqlite3BtreeCommitPhaseTwo(pBt); -1.274 (danielk1 27-Mar-07): } -1.274 (danielk1 27-Mar-07): } -1.94 (drh 07-Jun-04): if( rc==SQLITE_OK ){ -1.250 (danielk1 16-Jun-06): sqlite3VtabCommit(db); -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* The complex case - There is a multi-file write-transaction active. -1.91 (danielk1 03-Jun-04): ** This requires a master journal file to ensure the transaction is -1.91 (danielk1 03-Jun-04): ** committed atomicly. -1.91 (danielk1 03-Jun-04): */ -1.179 (danielk1 27-May-05): #ifndef SQLITE_OMIT_DISKIO -1.91 (danielk1 03-Jun-04): else{ -1.302 (danielk1 17-Aug-07): sqlite3_vfs *pVfs = db->pVfs; -1.188 (drh 27-Aug-05): int needSync = 0; -1.91 (danielk1 03-Jun-04): char *zMaster = 0; /* File-name for the master journal */ -1.91 (danielk1 03-Jun-04): char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt); -1.302 (danielk1 17-Aug-07): sqlite3_file *pMaster = 0; -1.298 (danielk1 15-Aug-07): i64 offset = 0; -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* Select a master journal file name */ -1.91 (danielk1 03-Jun-04): do { -1.98 (drh 09-Jun-04): u32 random; -1.299 (drh 16-Aug-07): sqlite3_free(zMaster); -1.91 (danielk1 03-Jun-04): sqlite3Randomness(sizeof(random), &random); -1.300 (danielk1 16-Aug-07): zMaster = sqlite3MPrintf(db, "%s-mj%08X", zMainFile, random&0x7fffffff); -1.91 (danielk1 03-Jun-04): if( !zMaster ){ -1.91 (danielk1 03-Jun-04): return SQLITE_NOMEM; -1.91 (danielk1 03-Jun-04): } -1.302 (danielk1 17-Aug-07): }while( sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS) ); -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* Open the master journal. */ -1.303 (danielk1 18-Aug-07): rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster, -1.303 (danielk1 18-Aug-07): SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| -1.305 (danielk1 20-Aug-07): SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0 -1.303 (danielk1 18-Aug-07): ); -1.91 (danielk1 03-Jun-04): if( rc!=SQLITE_OK ){ -1.299 (drh 16-Aug-07): sqlite3_free(zMaster); -1.91 (danielk1 03-Jun-04): return rc; -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* Write the name of each database file in the transaction into the new -1.91 (danielk1 03-Jun-04): ** master journal file. If an error occurs at this point close -1.91 (danielk1 03-Jun-04): ** and delete the master journal file. All the individual journal files -1.91 (danielk1 03-Jun-04): ** still have 'null' as the master journal pointer, so they will roll -1.157 (danielk1 13-Jan-05): ** back independently if a failure occurs. -1.91 (danielk1 03-Jun-04): */ -1.300 (danielk1 16-Aug-07): for(i=0; inDb; i++){ -1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; -1.99 (drh 09-Jun-04): if( i==1 ) continue; /* Ignore the TEMP database */ -1.313 (drh 28-Aug-07): if( sqlite3BtreeIsInTrans(pBt) ){ -1.109 (danielk1 14-Jun-04): char const *zFile = sqlite3BtreeGetJournalname(pBt); -1.99 (drh 09-Jun-04): if( zFile[0]==0 ) continue; /* Ignore :memory: databases */ -1.188 (drh 27-Aug-05): if( !needSync && !sqlite3BtreeSyncDisabled(pBt) ){ -1.188 (drh 27-Aug-05): needSync = 1; -1.188 (drh 27-Aug-05): } -1.302 (danielk1 17-Aug-07): rc = sqlite3OsWrite(pMaster, zFile, strlen(zFile)+1, offset); -1.298 (danielk1 15-Aug-07): offset += strlen(zFile)+1; -1.91 (danielk1 03-Jun-04): if( rc!=SQLITE_OK ){ -1.303 (danielk1 18-Aug-07): sqlite3OsCloseFree(pMaster); -1.303 (danielk1 18-Aug-07): sqlite3OsDelete(pVfs, zMaster, 0); -1.299 (drh 16-Aug-07): sqlite3_free(zMaster); -1.91 (danielk1 03-Jun-04): return rc; -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.310 (danielk1 24-Aug-07): /* Sync the master journal file. If the IOCAP_SEQUENTIAL device -1.310 (danielk1 24-Aug-07): ** flag is set this is not required. -1.310 (danielk1 24-Aug-07): */ -1.109 (danielk1 14-Jun-04): zMainFile = sqlite3BtreeGetDirname(db->aDb[0].pBt); -1.304 (danielk1 20-Aug-07): if( (needSync -1.310 (danielk1 24-Aug-07): && (0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL)) -1.304 (danielk1 20-Aug-07): && (rc=sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL))!=SQLITE_OK) ){ -1.303 (danielk1 18-Aug-07): sqlite3OsCloseFree(pMaster); -1.303 (danielk1 18-Aug-07): sqlite3OsDelete(pVfs, zMaster, 0); -1.299 (drh 16-Aug-07): sqlite3_free(zMaster); -1.109 (danielk1 14-Jun-04): return rc; -1.109 (danielk1 14-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* Sync all the db files involved in the transaction. The same call -1.91 (danielk1 03-Jun-04): ** sets the master journal pointer in each individual journal. If -1.91 (danielk1 03-Jun-04): ** an error occurs here, do not delete the master journal file. -1.91 (danielk1 03-Jun-04): ** -1.277 (drh 30-Mar-07): ** If the error occurs during the first call to -1.277 (drh 30-Mar-07): ** sqlite3BtreeCommitPhaseOne(), then there is a chance that the -1.277 (drh 30-Mar-07): ** master journal file will be orphaned. But we cannot delete it, -1.277 (drh 30-Mar-07): ** in case the master journal file name was written into the journal -1.277 (drh 30-Mar-07): ** file before the failure occured. -1.91 (danielk1 03-Jun-04): */ -1.258 (danielk1 25-Jul-06): for(i=0; rc==SQLITE_OK && inDb; i++){ -1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; -1.313 (drh 28-Aug-07): if( pBt ){ -1.277 (drh 30-Mar-07): rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster); -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.303 (danielk1 18-Aug-07): sqlite3OsCloseFree(pMaster); -1.258 (danielk1 25-Jul-06): if( rc!=SQLITE_OK ){ -1.299 (drh 16-Aug-07): sqlite3_free(zMaster); -1.258 (danielk1 25-Jul-06): return rc; -1.258 (danielk1 25-Jul-06): } -1.91 (danielk1 03-Jun-04): -1.110 (danielk1 14-Jun-04): /* Delete the master journal file. This commits the transaction. After -1.110 (danielk1 14-Jun-04): ** doing this the directory is synced again before any individual -1.110 (danielk1 14-Jun-04): ** transaction files are deleted. -1.110 (danielk1 14-Jun-04): */ -1.303 (danielk1 18-Aug-07): rc = sqlite3OsDelete(pVfs, zMaster, 1); -1.299 (drh 16-Aug-07): sqlite3_free(zMaster); -1.278 (drh 30-Mar-07): zMaster = 0; -1.263 (drh 13-Aug-06): if( rc ){ -1.263 (drh 13-Aug-06): return rc; -1.263 (drh 13-Aug-06): } -1.91 (danielk1 03-Jun-04): -1.91 (danielk1 03-Jun-04): /* All files and directories have already been synced, so the following -1.277 (drh 30-Mar-07): ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and -1.277 (drh 30-Mar-07): ** deleting or truncating journals. If something goes wrong while -1.277 (drh 30-Mar-07): ** this is happening we don't really care. The integrity of the -1.277 (drh 30-Mar-07): ** transaction is already guaranteed, but some stray 'cold' journals -1.277 (drh 30-Mar-07): ** may be lying around. Returning an error code won't help matters. -1.91 (danielk1 03-Jun-04): */ -1.274 (danielk1 27-Mar-07): disable_simulated_io_errors(); -1.91 (danielk1 03-Jun-04): for(i=0; inDb; i++){ -1.91 (danielk1 03-Jun-04): Btree *pBt = db->aDb[i].pBt; -1.91 (danielk1 03-Jun-04): if( pBt ){ -1.277 (drh 30-Mar-07): sqlite3BtreeCommitPhaseTwo(pBt); -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): } -1.274 (danielk1 27-Mar-07): enable_simulated_io_errors(); -1.274 (danielk1 27-Mar-07): -1.250 (danielk1 16-Jun-06): sqlite3VtabCommit(db); -1.91 (danielk1 03-Jun-04): } -1.179 (danielk1 27-May-05): #endif -1.112 (danielk1 14-Jun-04): -1.94 (drh 07-Jun-04): return rc; -1.91 (danielk1 03-Jun-04): } -1.91 (danielk1 03-Jun-04): -1.85 (danielk1 31-May-04): /* -1.85 (danielk1 31-May-04): ** This routine checks that the sqlite3.activeVdbeCnt count variable -1.85 (danielk1 31-May-04): ** matches the number of vdbe's in the list sqlite3.pVdbe that are -1.85 (danielk1 31-May-04): ** currently active. An assertion fails if the two counts do not match. -1.139 (drh 02-Sep-04): ** This is an internal self-check only - it is not an essential processing -1.139 (drh 02-Sep-04): ** step. -1.85 (danielk1 31-May-04): ** -1.85 (danielk1 31-May-04): ** This is a no-op if NDEBUG is defined. -1.85 (danielk1 31-May-04): */ -1.85 (danielk1 31-May-04): #ifndef NDEBUG -1.140 (drh 06-Sep-04): static void checkActiveVdbeCnt(sqlite3 *db){ -1.85 (danielk1 31-May-04): Vdbe *p; -1.85 (danielk1 31-May-04): int cnt = 0; -1.85 (danielk1 31-May-04): p = db->pVdbe; -1.85 (danielk1 31-May-04): while( p ){ -1.139 (drh 02-Sep-04): if( p->magic==VDBE_MAGIC_RUN && p->pc>=0 ){ -1.85 (danielk1 31-May-04): cnt++; -1.85 (danielk1 31-May-04): } -1.85 (danielk1 31-May-04): p = p->pNext; -1.85 (danielk1 31-May-04): } -1.85 (danielk1 31-May-04): assert( cnt==db->activeVdbeCnt ); -1.85 (danielk1 31-May-04): } -1.85 (danielk1 31-May-04): #else -1.85 (danielk1 31-May-04): #define checkActiveVdbeCnt(x) -1.85 (danielk1 31-May-04): #endif -1.85 (danielk1 31-May-04): -1.64 (danielk1 25-May-04): /* -1.317 (drh 30-Aug-07): ** For every Btree that in database connection db which -1.317 (drh 30-Aug-07): ** has been modified, "trip" or invalidate each cursor in -1.317 (drh 30-Aug-07): ** that Btree might have been modified so that the cursor -1.317 (drh 30-Aug-07): ** can never be used again. This happens when a rollback -1.317 (drh 30-Aug-07): *** occurs. We have to trip all the other cursors, even -1.317 (drh 30-Aug-07): ** cursor from other VMs in different database connections, -1.317 (drh 30-Aug-07): ** so that none of them try to use the data at which they -1.317 (drh 30-Aug-07): ** were pointing and which now may have been changed due -1.317 (drh 30-Aug-07): ** to the rollback. -1.317 (drh 30-Aug-07): ** -1.317 (drh 30-Aug-07): ** Remember that a rollback can delete tables complete and -1.317 (drh 30-Aug-07): ** reorder rootpages. So it is not sufficient just to save -1.317 (drh 30-Aug-07): ** the state of the cursor. We have to invalidate the cursor -1.317 (drh 30-Aug-07): ** so that it is never used again. -1.317 (drh 30-Aug-07): */ -1.317 (drh 30-Aug-07): void invalidateCursorsOnModifiedBtrees(sqlite3 *db){ -1.317 (drh 30-Aug-07): int i; -1.317 (drh 30-Aug-07): for(i=0; inDb; i++){ -1.317 (drh 30-Aug-07): Btree *p = db->aDb[i].pBt; -1.317 (drh 30-Aug-07): if( p && sqlite3BtreeIsInTrans(p) ){ -1.317 (drh 30-Aug-07): sqlite3BtreeTripAllCursors(p, SQLITE_ABORT); -1.317 (drh 30-Aug-07): } -1.252 (danielk1 23-Jun-06): } -1.252 (danielk1 23-Jun-06): } -1.252 (danielk1 23-Jun-06): -1.252 (danielk1 23-Jun-06): /* -1.139 (drh 02-Sep-04): ** This routine is called the when a VDBE tries to halt. If the VDBE -1.139 (drh 02-Sep-04): ** has made changes and is in autocommit mode, then commit those -1.139 (drh 02-Sep-04): ** changes. If a rollback is needed, then do the rollback. -1.139 (drh 02-Sep-04): ** -1.139 (drh 02-Sep-04): ** This routine is the only way to move the state of a VM from -1.316 (drh 29-Aug-07): ** SQLITE_MAGIC_RUN to SQLITE_MAGIC_HALT. It is harmless to -1.316 (drh 29-Aug-07): ** call this on a VM that is in the SQLITE_MAGIC_HALT state. -1.1 (drh 06-Sep-03): ** -1.139 (drh 02-Sep-04): ** Return an error code. If the commit could not complete because of -1.139 (drh 02-Sep-04): ** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it -1.139 (drh 02-Sep-04): ** means the close did not happen and needs to be repeated. -1.1 (drh 06-Sep-03): */ -1.316 (drh 29-Aug-07): int sqlite3VdbeHalt(Vdbe *p){ -1.140 (drh 06-Sep-04): sqlite3 *db = p->db; -1.1 (drh 06-Sep-03): int i; -1.85 (danielk1 31-May-04): int (*xFunc)(Btree *pBt) = 0; /* Function to call on each btree backend */ -1.228 (danielk1 20-Jan-06): int isSpecialError; /* Set to true if SQLITE_NOMEM or IOERR */ -1.228 (danielk1 20-Jan-06): -1.228 (danielk1 20-Jan-06): /* This function contains the logic that determines if a statement or -1.228 (danielk1 20-Jan-06): ** transaction will be committed or rolled back as a result of the -1.228 (danielk1 20-Jan-06): ** execution of this virtual machine. -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** Special errors: -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** If an SQLITE_NOMEM error has occured in a statement that writes to -1.228 (danielk1 20-Jan-06): ** the database, then either a statement or transaction must be rolled -1.228 (danielk1 20-Jan-06): ** back to ensure the tree-structures are in a consistent state. A -1.228 (danielk1 20-Jan-06): ** statement transaction is rolled back if one is open, otherwise the -1.228 (danielk1 20-Jan-06): ** entire transaction must be rolled back. -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** If an SQLITE_IOERR error has occured in a statement that writes to -1.228 (danielk1 20-Jan-06): ** the database, then the entire transaction must be rolled back. The -1.228 (danielk1 20-Jan-06): ** I/O error may have caused garbage to be written to the journal -1.228 (danielk1 20-Jan-06): ** file. Were the transaction to continue and eventually be rolled -1.228 (danielk1 20-Jan-06): ** back that garbage might end up in the database file. -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** In both of the above cases, the Vdbe.errorAction variable is -1.228 (danielk1 20-Jan-06): ** ignored. If the sqlite3.autoCommit flag is false and a transaction -1.228 (danielk1 20-Jan-06): ** is rolled back, it will be set to true. -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** Other errors: -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** No error: -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): */ -1.1 (drh 06-Sep-03): -1.299 (drh 16-Aug-07): if( p->db->mallocFailed ){ -1.208 (danielk1 06-Dec-05): p->rc = SQLITE_NOMEM; -1.208 (danielk1 06-Dec-05): } -1.316 (drh 29-Aug-07): closeAllCursorsExceptActiveVtabs(p); -1.139 (drh 02-Sep-04): if( p->magic!=VDBE_MAGIC_RUN ){ -1.139 (drh 02-Sep-04): return SQLITE_OK; -1.1 (drh 06-Sep-03): } -1.85 (danielk1 31-May-04): checkActiveVdbeCnt(db); -1.208 (danielk1 06-Dec-05): -1.228 (danielk1 20-Jan-06): /* No commit or rollback needed if the program never started */ -1.228 (danielk1 20-Jan-06): if( p->pc>=0 ){ -1.266 (drh 23-Sep-06): int mrc; /* Primary error code from p->rc */ -1.316 (drh 29-Aug-07): -1.316 (drh 29-Aug-07): /* Lock all btrees used by the statement */ -1.316 (drh 29-Aug-07): sqlite3BtreeMutexArrayEnter(&p->aMutex); -1.316 (drh 29-Aug-07): -1.228 (danielk1 20-Jan-06): /* Check for one of the special errors - SQLITE_NOMEM or SQLITE_IOERR */ -1.266 (drh 23-Sep-06): mrc = p->rc & 0xff; -1.291 (danielk1 13-Jun-07): isSpecialError = ( -1.291 (danielk1 13-Jun-07): (mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR || mrc==SQLITE_INTERRUPT)?1:0); -1.228 (danielk1 20-Jan-06): if( isSpecialError ){ -1.208 (danielk1 06-Dec-05): /* This loop does static analysis of the query to see which of the -1.208 (danielk1 06-Dec-05): ** following three categories it falls into: -1.208 (danielk1 06-Dec-05): ** -1.208 (danielk1 06-Dec-05): ** Read-only -1.228 (danielk1 20-Jan-06): ** Query with statement journal -1.228 (danielk1 20-Jan-06): ** Query without statement journal -1.208 (danielk1 06-Dec-05): ** -1.208 (danielk1 06-Dec-05): ** We could do something more elegant than this static analysis (i.e. -1.208 (danielk1 06-Dec-05): ** store the type of query as part of the compliation phase), but -1.228 (danielk1 20-Jan-06): ** handling malloc() or IO failure is a fairly obscure edge case so -1.228 (danielk1 20-Jan-06): ** this is probably easier. Todo: Might be an opportunity to reduce -1.228 (danielk1 20-Jan-06): ** code size a very small amount though... -1.208 (danielk1 06-Dec-05): */ -1.208 (danielk1 06-Dec-05): int isReadOnly = 1; -1.208 (danielk1 06-Dec-05): int isStatement = 0; -1.208 (danielk1 06-Dec-05): assert(p->aOp || p->nOp==0); -1.208 (danielk1 06-Dec-05): for(i=0; inOp; i++){ -1.208 (danielk1 06-Dec-05): switch( p->aOp[i].opcode ){ -1.208 (danielk1 06-Dec-05): case OP_Transaction: -1.292 (danielk1 15-Jun-07): /* This is a bit strange. If we hit a malloc() or IO error and -1.292 (danielk1 15-Jun-07): ** the statement did not open a statement transaction, we will -1.292 (danielk1 15-Jun-07): ** rollback any active transaction and abort all other active -1.292 (danielk1 15-Jun-07): ** statements. Or, if this is an SQLITE_INTERRUPT error, we -1.292 (danielk1 15-Jun-07): ** will only rollback if the interrupted statement was a write. -1.292 (danielk1 15-Jun-07): ** -1.292 (danielk1 15-Jun-07): ** It could be argued that read-only statements should never -1.292 (danielk1 15-Jun-07): ** rollback anything. But careful analysis is required before -1.292 (danielk1 15-Jun-07): ** making this change -1.292 (danielk1 15-Jun-07): */ -1.292 (danielk1 15-Jun-07): if( p->aOp[i].p2 || mrc!=SQLITE_INTERRUPT ){ -1.292 (danielk1 15-Jun-07): isReadOnly = 0; -1.292 (danielk1 15-Jun-07): } -1.208 (danielk1 06-Dec-05): break; -1.208 (danielk1 06-Dec-05): case OP_Statement: -1.208 (danielk1 06-Dec-05): isStatement = 1; -1.208 (danielk1 06-Dec-05): break; -1.208 (danielk1 06-Dec-05): } -1.208 (danielk1 06-Dec-05): } -1.316 (drh 29-Aug-07): -1.316 (drh 29-Aug-07): -1.228 (danielk1 20-Jan-06): /* If the query was read-only, we need do no rollback at all. Otherwise, -1.228 (danielk1 20-Jan-06): ** proceed with the special handling. -1.228 (danielk1 20-Jan-06): */ -1.228 (danielk1 20-Jan-06): if( !isReadOnly ){ -1.290 (danielk1 13-Jun-07): if( p->rc==SQLITE_IOERR_BLOCKED && isStatement ){ -1.290 (danielk1 13-Jun-07): xFunc = sqlite3BtreeRollbackStmt; -1.290 (danielk1 13-Jun-07): p->rc = SQLITE_BUSY; -1.290 (danielk1 13-Jun-07): } else if( p->rc==SQLITE_NOMEM && isStatement ){ -1.228 (danielk1 20-Jan-06): xFunc = sqlite3BtreeRollbackStmt; -1.228 (danielk1 20-Jan-06): }else{ -1.228 (danielk1 20-Jan-06): /* We are forced to roll back the active transaction. Before doing -1.228 (danielk1 20-Jan-06): ** so, abort any other statements this handle currently has active. -1.228 (danielk1 20-Jan-06): */ -1.317 (drh 30-Aug-07): invalidateCursorsOnModifiedBtrees(db); -1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); -1.228 (danielk1 20-Jan-06): db->autoCommit = 1; -1.228 (danielk1 20-Jan-06): } -1.208 (danielk1 06-Dec-05): } -1.208 (danielk1 06-Dec-05): } -1.228 (danielk1 20-Jan-06): -1.228 (danielk1 20-Jan-06): /* If the auto-commit flag is set and this is the only active vdbe, then -1.228 (danielk1 20-Jan-06): ** we do either a commit or rollback of the current transaction. -1.228 (danielk1 20-Jan-06): ** -1.228 (danielk1 20-Jan-06): ** Note: This block also runs if one of the special errors handled -1.228 (danielk1 20-Jan-06): ** above has occured. -1.228 (danielk1 20-Jan-06): */ -1.228 (danielk1 20-Jan-06): if( db->autoCommit && db->activeVdbeCnt==1 ){ -1.228 (danielk1 20-Jan-06): if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ -1.296 (drh 07-Aug-07): /* The auto-commit flag is true, and the vdbe program was -1.228 (danielk1 20-Jan-06): ** successful or hit an 'OR FAIL' constraint. This means a commit -1.228 (danielk1 20-Jan-06): ** is required. -1.228 (danielk1 20-Jan-06): */ -1.228 (danielk1 20-Jan-06): int rc = vdbeCommit(db); -1.228 (danielk1 20-Jan-06): if( rc==SQLITE_BUSY ){ -1.316 (drh 29-Aug-07): sqlite3BtreeMutexArrayLeave(&p->aMutex); -1.228 (danielk1 20-Jan-06): return SQLITE_BUSY; -1.228 (danielk1 20-Jan-06): }else if( rc!=SQLITE_OK ){ -1.228 (danielk1 20-Jan-06): p->rc = rc; -1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); -1.228 (danielk1 20-Jan-06): }else{ -1.228 (danielk1 20-Jan-06): sqlite3CommitInternalChanges(db); -1.228 (danielk1 20-Jan-06): } -1.228 (danielk1 20-Jan-06): }else{ -1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); -1.228 (danielk1 20-Jan-06): } -1.228 (danielk1 20-Jan-06): }else if( !xFunc ){ -1.228 (danielk1 20-Jan-06): if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){ -1.294 (danielk1 27-Jun-07): if( p->openedStatement ){ -1.294 (danielk1 27-Jun-07): xFunc = sqlite3BtreeCommitStmt; -1.294 (danielk1 27-Jun-07): } -1.228 (danielk1 20-Jan-06): }else if( p->errorAction==OE_Abort ){ -1.228 (danielk1 20-Jan-06): xFunc = sqlite3BtreeRollbackStmt; -1.228 (danielk1 20-Jan-06): }else{ -1.317 (drh 30-Aug-07): invalidateCursorsOnModifiedBtrees(db); -1.229 (danielk1 20-Jan-06): sqlite3RollbackAll(db); -1.228 (danielk1 20-Jan-06): db->autoCommit = 1; -1.228 (danielk1 20-Jan-06): } -1.228 (danielk1 20-Jan-06): } -1.228 (danielk1 20-Jan-06): -1.228 (danielk1 20-Jan-06): /* If xFunc is not NULL, then it is one of sqlite3BtreeRollbackStmt or -1.228 (danielk1 20-Jan-06): ** sqlite3BtreeCommitStmt. Call it once on each backend. If an error occurs -1.228 (danielk1 20-Jan-06): ** and the return code is still SQLITE_OK, set the return code to the new -1.228 (danielk1 20-Jan-06): ** error value. -1.228 (danielk1 20-Jan-06): */ -1.228 (danielk1 20-Jan-06): assert(!xFunc || -1.228 (danielk1 20-Jan-06): xFunc==sqlite3BtreeCommitStmt || -1.228 (danielk1 20-Jan-06): xFunc==sqlite3BtreeRollbackStmt -1.228 (danielk1 20-Jan-06): ); -1.228 (danielk1 20-Jan-06): for(i=0; xFunc && inDb; i++){ -1.228 (danielk1 20-Jan-06): int rc; -1.228 (danielk1 20-Jan-06): Btree *pBt = db->aDb[i].pBt; -1.228 (danielk1 20-Jan-06): if( pBt ){ -1.228 (danielk1 20-Jan-06): rc = xFunc(pBt); -1.231 (danielk1 23-Jan-06): if( rc && (p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT) ){ -1.231 (danielk1 23-Jan-06): p->rc = rc; -1.231 (danielk1 23-Jan-06): sqlite3SetString(&p->zErrMsg, 0); -1.231 (danielk1 23-Jan-06): } -1.228 (danielk1 20-Jan-06): } -1.85 (danielk1 31-May-04): } -1.228 (danielk1 20-Jan-06): -1.228 (danielk1 20-Jan-06): /* If this was an INSERT, UPDATE or DELETE and the statement was committed, -1.228 (danielk1 20-Jan-06): ** set the change counter. -1.228 (danielk1 20-Jan-06): */ -1.228 (danielk1 20-Jan-06): if( p->changeCntOn && p->pc>=0 ){ -1.228 (danielk1 20-Jan-06): if( !xFunc || xFunc==sqlite3BtreeCommitStmt ){ -1.228 (danielk1 20-Jan-06): sqlite3VdbeSetChanges(db, p->nChange); -1.228 (danielk1 20-Jan-06): }else{ -1.228 (danielk1 20-Jan-06): sqlite3VdbeSetChanges(db, 0); -1.228 (danielk1 20-Jan-06): } -1.228 (danielk1 20-Jan-06): p->nChange = 0; -1.87 (danielk1 31-May-04): } -1.228 (danielk1 20-Jan-06): -1.228 (danielk1 20-Jan-06): /* Rollback or commit any schema changes that occurred. */ -1.228 (danielk1 20-Jan-06): if( p->rc!=SQLITE_OK && db->flags&SQLITE_InternChanges ){ -1.228 (danielk1 20-Jan-06): sqlite3ResetInternalSchema(db, 0); -1.228 (danielk1 20-Jan-06): db->flags = (db->flags | SQLITE_InternChanges); -1.121 (danielk1 21-Jun-04): } -1.316 (drh 29-Aug-07): -1.316 (drh 29-Aug-07): /* Release the locks */ -1.316 (drh 29-Aug-07): sqlite3BtreeMutexArrayLeave(&p->aMutex); -1.1 (drh 06-Sep-03): } -1.85 (danielk1 31-May-04): -1.254 (danielk1 24-Jun-06): /* We have successfully halted and closed the VM. Record this fact. */ -1.254 (danielk1 24-Jun-06): if( p->pc>=0 ){ -1.85 (danielk1 31-May-04): db->activeVdbeCnt--; -1.1 (drh 06-Sep-03): } -1.139 (drh 02-Sep-04): p->magic = VDBE_MAGIC_HALT; -1.139 (drh 02-Sep-04): checkActiveVdbeCnt(db); -1.316 (drh 29-Aug-07): if( p->db->mallocFailed ){ -1.316 (drh 29-Aug-07): p->rc = SQLITE_NOMEM; -1.316 (drh 29-Aug-07): } -1.316 (drh 29-Aug-07): checkActiveVdbeCnt(db); -1.139 (drh 02-Sep-04): -1.139 (drh 02-Sep-04): return SQLITE_OK; -1.139 (drh 02-Sep-04): } -1.314 (drh 28-Aug-07): -1.139 (drh 02-Sep-04): -1.139 (drh 02-Sep-04): /* -1.270 (drh 09-Jan-07): ** Each VDBE holds the result of the most recent sqlite3_step() call -1.270 (drh 09-Jan-07): ** in p->rc. This routine sets that result back to SQLITE_OK. -1.270 (drh 09-Jan-07): */ -1.270 (drh 09-Jan-07): void sqlite3VdbeResetStepResult(Vdbe *p){ -1.270 (drh 09-Jan-07): p->rc = SQLITE_OK; -1.270 (drh 09-Jan-07): } -1.270 (drh 09-Jan-07): -1.270 (drh 09-Jan-07): /* -1.139 (drh 02-Sep-04): ** Clean up a VDBE after execution but do not delete the VDBE just yet. -1.139 (drh 02-Sep-04): ** Write any error messages into *pzErrMsg. Return the result code. -1.139 (drh 02-Sep-04): ** -1.139 (drh 02-Sep-04): ** After this routine is run, the VDBE should be ready to be executed -1.139 (drh 02-Sep-04): ** again. -1.139 (drh 02-Sep-04): ** -1.139 (drh 02-Sep-04): ** To look at it another way, this routine resets the state of the -1.139 (drh 02-Sep-04): ** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to -1.139 (drh 02-Sep-04): ** VDBE_MAGIC_INIT. -1.139 (drh 02-Sep-04): */ -1.139 (drh 02-Sep-04): int sqlite3VdbeReset(Vdbe *p){ -1.265 (drh 15-Sep-06): sqlite3 *db; -1.265 (drh 15-Sep-06): db = p->db; -1.85 (danielk1 31-May-04): -1.139 (drh 02-Sep-04): /* If the VM did not run to completion or if it encountered an -1.139 (drh 02-Sep-04): ** error, then it might not have been halted properly. So halt -1.139 (drh 02-Sep-04): ** it now. -1.139 (drh 02-Sep-04): */ -1.265 (drh 15-Sep-06): sqlite3SafetyOn(db); -1.139 (drh 02-Sep-04): sqlite3VdbeHalt(p); -1.265 (drh 15-Sep-06): sqlite3SafetyOff(db); -1.139 (drh 02-Sep-04): -1.162 (drh 24-Jan-05): /* If the VDBE has be run even partially, then transfer the error code -1.162 (drh 24-Jan-05): ** and error message from the VDBE into the main database structure. But -1.162 (drh 24-Jan-05): ** if the VDBE has just been set to run but has not actually executed any -1.162 (drh 24-Jan-05): ** instructions yet, leave the main database error information unchanged. -1.139 (drh 02-Sep-04): */ -1.162 (drh 24-Jan-05): if( p->pc>=0 ){ -1.162 (drh 24-Jan-05): if( p->zErrMsg ){ -1.307 (drh 21-Aug-07): sqlite3ValueSetStr(db->pErr,-1,p->zErrMsg,SQLITE_UTF8,sqlite3_free); -1.229 (danielk1 20-Jan-06): db->errCode = p->rc; -1.162 (drh 24-Jan-05): p->zErrMsg = 0; -1.162 (drh 24-Jan-05): }else if( p->rc ){ -1.265 (drh 15-Sep-06): sqlite3Error(db, p->rc, 0); -1.162 (drh 24-Jan-05): }else{ -1.265 (drh 15-Sep-06): sqlite3Error(db, SQLITE_OK, 0); -1.162 (drh 24-Jan-05): } -1.163 (danielk1 24-Jan-05): }else if( p->rc && p->expired ){ -1.163 (danielk1 24-Jan-05): /* The expired flag was set on the VDBE before the first call -1.163 (danielk1 24-Jan-05): ** to sqlite3_step(). For consistency (since sqlite3_step() was -1.163 (danielk1 24-Jan-05): ** called), set the database error in this case as well. -1.163 (danielk1 24-Jan-05): */ -1.265 (drh 15-Sep-06): sqlite3Error(db, p->rc, 0); -1.139 (drh 02-Sep-04): } -1.139 (drh 02-Sep-04): -1.139 (drh 02-Sep-04): /* Reclaim all memory used by the VDBE -1.139 (drh 02-Sep-04): */ -1.139 (drh 02-Sep-04): Cleanup(p); -1.139 (drh 02-Sep-04): -1.139 (drh 02-Sep-04): /* Save profiling information from this VDBE run. -1.139 (drh 02-Sep-04): */ -1.208 (danielk1 06-Dec-05): assert( p->pTos<&p->aStack[p->pc<0?0:p->pc] || !p->aStack ); -1.1 (drh 06-Sep-03): #ifdef VDBE_PROFILE -1.1 (drh 06-Sep-03): { -1.1 (drh 06-Sep-03): FILE *out = fopen("vdbe_profile.out", "a"); -1.1 (drh 06-Sep-03): if( out ){ -1.1 (drh 06-Sep-03): int i; -1.1 (drh 06-Sep-03): fprintf(out, "---- "); -1.1 (drh 06-Sep-03): for(i=0; inOp; i++){ -1.1 (drh 06-Sep-03): fprintf(out, "%02x", p->aOp[i].opcode); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): fprintf(out, "\n"); -1.1 (drh 06-Sep-03): for(i=0; inOp; i++){ -1.1 (drh 06-Sep-03): fprintf(out, "%6d %10lld %8lld ", -1.1 (drh 06-Sep-03): p->aOp[i].cnt, -1.1 (drh 06-Sep-03): p->aOp[i].cycles, -1.1 (drh 06-Sep-03): p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0 -1.1 (drh 06-Sep-03): ); -1.19 (danielk1 08-May-04): sqlite3VdbePrintOp(out, i, &p->aOp[i]); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): fclose(out); -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): #endif -1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_INIT; -1.133 (drh 30-Jun-04): p->aborted = 0; -1.265 (drh 15-Sep-06): return p->rc & db->errMask; -1.1 (drh 06-Sep-03): } -1.139 (drh 02-Sep-04): -1.1 (drh 06-Sep-03): /* -1.1 (drh 06-Sep-03): ** Clean up and delete a VDBE after execution. Return an integer which is -1.1 (drh 06-Sep-03): ** the result code. Write any error message text into *pzErrMsg. -1.1 (drh 06-Sep-03): */ -1.122 (danielk1 21-Jun-04): int sqlite3VdbeFinalize(Vdbe *p){ -1.129 (danielk1 26-Jun-04): int rc = SQLITE_OK; -1.129 (danielk1 26-Jun-04): if( p->magic==VDBE_MAGIC_RUN || p->magic==VDBE_MAGIC_HALT ){ -1.129 (danielk1 26-Jun-04): rc = sqlite3VdbeReset(p); -1.265 (drh 15-Sep-06): assert( (rc & p->db->errMask)==rc ); -1.129 (danielk1 26-Jun-04): }else if( p->magic!=VDBE_MAGIC_INIT ){ -1.1 (drh 06-Sep-03): return SQLITE_MISUSE; -1.1 (drh 06-Sep-03): } -1.19 (danielk1 08-May-04): sqlite3VdbeDelete(p); -1.1 (drh 06-Sep-03): return rc; -1.42 (danielk1 19-May-04): } -1.1 (drh 06-Sep-03): -1.1 (drh 06-Sep-03): /* -1.120 (drh 19-Jun-04): ** Call the destructor for each auxdata entry in pVdbeFunc for which -1.123 (danielk1 21-Jun-04): ** the corresponding bit in mask is clear. Auxdata entries beyond 31 -1.120 (drh 19-Jun-04): ** are always destroyed. To destroy all auxdata entries, call this -1.123 (danielk1 21-Jun-04): ** routine with mask==0. -1.120 (drh 19-Jun-04): */ -1.120 (drh 19-Jun-04): void sqlite3VdbeDeleteAuxData(VdbeFunc *pVdbeFunc, int mask){ -1.120 (drh 19-Jun-04): int i; -1.120 (drh 19-Jun-04): for(i=0; inAux; i++){ -1.120 (drh 19-Jun-04): struct AuxData *pAux = &pVdbeFunc->apAux[i]; -1.120 (drh 19-Jun-04): if( (i>31 || !(mask&(1<pAux ){ -1.120 (drh 19-Jun-04): if( pAux->xDelete ){ -1.120 (drh 19-Jun-04): pAux->xDelete(pAux->pAux); -1.120 (drh 19-Jun-04): } -1.120 (drh 19-Jun-04): pAux->pAux = 0; -1.120 (drh 19-Jun-04): } -1.120 (drh 19-Jun-04): } -1.120 (drh 19-Jun-04): } -1.120 (drh 19-Jun-04): -1.120 (drh 19-Jun-04): /* -1.1 (drh 06-Sep-03): ** Delete an entire VDBE. -1.1 (drh 06-Sep-03): */ -1.19 (danielk1 08-May-04): void sqlite3VdbeDelete(Vdbe *p){ -1.1 (drh 06-Sep-03): int i; -1.1 (drh 06-Sep-03): if( p==0 ) return; -1.1 (drh 06-Sep-03): Cleanup(p); -1.1 (drh 06-Sep-03): if( p->pPrev ){ -1.1 (drh 06-Sep-03): p->pPrev->pNext = p->pNext; -1.1 (drh 06-Sep-03): }else{ -1.1 (drh 06-Sep-03): assert( p->db->pVdbe==p ); -1.1 (drh 06-Sep-03): p->db->pVdbe = p->pNext; -1.1 (drh 06-Sep-03): } -1.1 (drh 06-Sep-03): if( p->pNext ){ -1.1 (drh 06-Sep-03): p->pNext->pPrev = p->pPrev; -1.1 (drh 06-Sep-03): } -1.146 (drh 24-Sep-04): if( p->aOp ){ -1.146 (drh 24-Sep-04): for(i=0; inOp; i++){ -1.146 (drh 24-Sep-04): Op *pOp = &p->aOp[i]; -1.198 (drh 16-Sep-05): freeP3(pOp->p3type, pOp->p3); -1.92 (danielk1 05-Jun-04): } -1.299 (drh 16-Aug-07): sqlite3_free(p->aOp); -1.2 (drh 06-Sep-03): } -1.146 (drh 24-Sep-04): releaseMemArray(p->aVar, p->nVar); -1.299 (drh 16-Aug-07): sqlite3_free(p->aLabel); -1.299 (drh 16-Aug-07): sqlite3_free(p->aStack); -1.236 (danielk1 10-Feb-06): releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); -1.299 (drh 16-Aug-07): sqlite3_free(p->aColName); -1.299 (drh 16-Aug-07): sqlite3_free(p->zSql); -1.1 (drh 06-Sep-03): p->magic = VDBE_MAGIC_DEAD; -1.299 (drh 16-Aug-07): sqlite3_free(p); -1.1 (drh 06-Sep-03): } -1.7 (drh 07-Jan-04): -1.7 (drh 07-Jan-04): /* -1.7 (drh 07-Jan-04): ** If a MoveTo operation is pending on the given cursor, then do that -1.7 (drh 07-Jan-04): ** MoveTo now. Return an error code. If no MoveTo is pending, this -1.7 (drh 07-Jan-04): ** routine does nothing and returns SQLITE_OK. -1.7 (drh 07-Jan-04): */ -1.19 (danielk1 08-May-04): int sqlite3VdbeCursorMoveto(Cursor *p){ -1.7 (drh 07-Jan-04): if( p->deferredMoveto ){ -1.165 (drh 26-Jan-05): int res, rc; -1.264 (adamd 14-Sep-06): #ifdef SQLITE_TEST -1.24 (danielk1 10-May-04): extern int sqlite3_search_count; -1.264 (adamd 14-Sep-06): #endif -1.181 (drh 12-Jun-05): assert( p->isTable ); -1.280 (drh 04-Apr-07): rc = sqlite3BtreeMoveto(p->pCursor, 0, p->movetoTarget, 0, &res); -1.165 (drh 26-Jan-05): if( rc ) return rc; -1.50 (drh 20-May-04): *p->pIncrKey = 0; -1.181 (drh 12-Jun-05): p->lastRowid = keyToInt(p->movetoTarget); -1.181 (drh 12-Jun-05): p->rowidIsValid = res==0; -1.7 (drh 07-Jan-04): if( res<0 ){ -1.165 (drh 26-Jan-05): rc = sqlite3BtreeNext(p->pCursor, &res); -1.165 (drh 26-Jan-05): if( rc ) return rc; -1.7 (drh 07-Jan-04): } -1.262 (drh 08-Aug-06): #ifdef SQLITE_TEST -1.24 (danielk1 10-May-04): sqlite3_search_count++; -1.262 (drh 08-Aug-06): #endif -1.7 (drh 07-Jan-04): p->deferredMoveto = 0; -1.219 (drh 07-Jan-06): p->cacheStatus = CACHE_STALE; -1.7 (drh 07-Jan-04): } -1.7 (drh 07-Jan-04): return SQLITE_OK; -1.7 (drh 07-Jan-04): } -1.19 (danielk1 08-May-04): -1.20 (drh 08-May-04): /* -1.28 (danielk1 12-May-04): ** The following functions: -1.23 (danielk1 10-May-04): ** -1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialType() -1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialTypeLen() -1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialRead() -1.23 (danielk1 10-May-04): ** sqlite3VdbeSerialLen() -1.28 (danielk1 12-May-04): ** sqlite3VdbeSerialWrite() -1.23 (danielk1 10-May-04): ** -1.23 (danielk1 10-May-04): ** encapsulate the code that serializes values for storage in SQLite -1.28 (danielk1 12-May-04): ** data and index records. Each serialized value consists of a -1.28 (danielk1 12-May-04): ** 'serial-type' and a blob of data. The serial type is an 8-byte unsigned -1.28 (danielk1 12-May-04): ** integer, stored as a varint. -1.23 (danielk1 10-May-04): ** -1.28 (danielk1 12-May-04): ** In an SQLite index record, the serial type is stored directly before -1.28 (danielk1 12-May-04): ** the blob of data that it corresponds to. In a table record, all serial -1.28 (danielk1 12-May-04): ** types are stored at the start of the record, and the blobs of data at -1.28 (danielk1 12-May-04): ** the end. Hence these functions allow the caller to handle the -1.28 (danielk1 12-May-04): ** serial-type and data blob seperately. -1.28 (danielk1 12-May-04): ** -1.28 (danielk1 12-May-04): ** The following table describes the various storage classes for data: -1.28 (danielk1 12-May-04): ** -1.28 (danielk1 12-May-04): ** serial type bytes of data type -1.23 (danielk1 10-May-04): ** -------------- --------------- --------------- -1.84 (drh 30-May-04): ** 0 0 NULL -1.23 (danielk1 10-May-04): ** 1 1 signed integer -1.23 (danielk1 10-May-04): ** 2 2 signed integer -1.84 (drh 30-May-04): ** 3 3 signed integer -1.84 (drh 30-May-04): ** 4 4 signed integer -1.84 (drh 30-May-04): ** 5 6 signed integer -1.84 (drh 30-May-04): ** 6 8 signed integer -1.84 (drh 30-May-04): ** 7 8 IEEE float -1.215 (drh 29-Dec-05): ** 8 0 Integer constant 0 -1.215 (drh 29-Dec-05): ** 9 0 Integer constant 1 -1.215 (drh 29-Dec-05): ** 10,11 reserved for expansion -1.23 (danielk1 10-May-04): ** N>=12 and even (N-12)/2 BLOB -1.23 (danielk1 10-May-04): ** N>=13 and odd (N-13)/2 text -1.23 (danielk1 10-May-04): ** -1.217 (drh 02-Jan-06): ** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions -1.217 (drh 02-Jan-06): ** of SQLite will not understand those serial types. -1.23 (danielk1 10-May-04): */ -1.23 (danielk1 10-May-04): -1.23 (danielk1 10-May-04): /* -1.28 (danielk1 12-May-04): ** Return the serial-type for the value stored in pMem. -1.22 (danielk1 10-May-04): */ -1.215 (drh 29-Dec-05): u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){ -1.28 (danielk1 12-May-04): int flags = pMem->flags; -1.283 (drh 02-May-07): int n; -1.28 (danielk1 12-May-04): -1.28 (danielk1 12-May-04): if( flags&MEM_Null ){ -1.84 (drh 30-May-04): return 0; -1.23 (danielk1 10-May-04): } -1.28 (danielk1 12-May-04): if( flags&MEM_Int ){ -1.158 (drh 20-Jan-05): /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ -1.175 (drh 15-Apr-05): # define MAX_6BYTE ((((i64)0x00001000)<<32)-1) -1.276 (drh 30-Mar-07): i64 i = pMem->u.i; -1.215 (drh 29-Dec-05): u64 u; -1.215 (drh 29-Dec-05): if( file_format>=4 && (i&1)==i ){ -1.215 (drh 29-Dec-05): return 8+i; -1.215 (drh 29-Dec-05): } -1.215 (drh 29-Dec-05): u = i<0 ? -i : i; -1.164 (drh 26-Jan-05): if( u<=127 ) return 1; -1.164 (drh 26-Jan-05): if( u<=32767 ) return 2; -1.164 (drh 26-Jan-05): if( u<=8388607 ) return 3; -1.164 (drh 26-Jan-05): if( u<=2147483647 ) return 4; -1.164 (drh 26-Jan-05): if( u<=MAX_6BYTE ) return 5; -1.84 (drh 30-May-04): return 6; -1.28 (danielk1 12-May-04): } -1.28 (danielk1 12-May-04): if( flags&MEM_Real ){ -1.84 (drh 30-May-04): return 7; -1.23 (danielk1 10-May-04): } -1.283 (drh 02-May-07): assert( flags&(MEM_Str|MEM_Blob) ); -1.283 (drh 02-May-07): n = pMem->n; -1.283 (drh 02-May-07): if( flags & MEM_Zero ){ -1.283 (drh 02-May-07): n += pMem->u.i; -1.23 (danielk1 10-May-04): } -1.283 (drh 02-May-07): assert( n>=0 ); -1.283 (drh 02-May-07): return ((n*2) + 12 + ((flags&MEM_Str)!=0)); -1.22 (danielk1 10-May-04): } -1.22 (danielk1 10-May-04): -1.22 (danielk1 10-May-04): /* -1.28 (danielk1 12-May-04): ** Return the length of the data corresponding to the supplied serial-type. -1.22 (danielk1 10-May-04): */ -1.75 (drh 28-May-04): int sqlite3VdbeSerialTypeLen(u32 serial_type){ -1.84 (drh 30-May-04): if( serial_type>=12 ){ -1.79 (drh 28-May-04): return (serial_type-12)/2; -1.79 (drh 28-May-04): }else{ -1.150 (drh 06-Oct-04): static const u8 aSize[] = { 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0 }; -1.79 (drh 28-May-04): return aSize[serial_type]; -1.79 (drh 28-May-04): } -1.28 (danielk1 12-May-04): } -1.23 (danielk1 10-May-04): -1.28 (danielk1 12-May-04): /* -1.284 (drh 04-May-07): ** If we are on an architecture with mixed-endian floating -1.289 (drh 23-May-07): ** points (ex: ARM7) then swap the lower 4 bytes with the -1.284 (drh 04-May-07): ** upper 4 bytes. Return the result. -1.284 (drh 04-May-07): ** -1.289 (drh 23-May-07): ** For most architectures, this is a no-op. -1.289 (drh 23-May-07): ** -1.289 (drh 23-May-07): ** (later): It is reported to me that the mixed-endian problem -1.289 (drh 23-May-07): ** on ARM7 is an issue with GCC, not with the ARM7 chip. It seems -1.289 (drh 23-May-07): ** that early versions of GCC stored the two words of a 64-bit -1.289 (drh 23-May-07): ** float in the wrong order. And that error has been propagated -1.289 (drh 23-May-07): ** ever since. The blame is not necessarily with GCC, though. -1.289 (drh 23-May-07): ** GCC might have just copying the problem from a prior compiler. -1.289 (drh 23-May-07): ** I am also told that newer versions of GCC that follow a different -1.289 (drh 23-May-07): ** ABI get the byte order right. -1.289 (drh 23-May-07): ** -1.289 (drh 23-May-07): ** Developers using SQLite on an ARM7 should compile and run their -1.289 (drh 23-May-07): ** application using -DSQLITE_DEBUG=1 at least once. With DEBUG -1.289 (drh 23-May-07): ** enabled, some asserts below will ensure that the byte order of -1.289 (drh 23-May-07): ** floating point values is correct. -1.318 (drh 30-Aug-07): ** -1.318 (drh 30-Aug-07): ** (2007-08-30) Frank van Vugt has studied this problem closely -1.318 (drh 30-Aug-07): ** and has send his findings to the SQLite developers. Frank -1.318 (drh 30-Aug-07): ** writes that some Linux kernels offer floating point hardware -1.318 (drh 30-Aug-07): ** emulation that uses only 32-bit mantissas instead of a full -1.318 (drh 30-Aug-07): ** 48-bits as required by the IEEE standard. (This is the -1.318 (drh 30-Aug-07): ** CONFIG_FPE_FASTFPE option.) On such systems, floating point -1.318 (drh 30-Aug-07): ** byte swapping becomes very complicated. To avoid problems, -1.318 (drh 30-Aug-07): ** the necessary byte swapping is carried out using a 64-bit integer -1.318 (drh 30-Aug-07): ** rather than a 64-bit float. Frank assures us that the code here -1.318 (drh 30-Aug-07): ** works for him. We, the developers, have no way to independently -1.318 (drh 30-Aug-07): ** verify this, but Frank seems to know what he is talking about -1.318 (drh 30-Aug-07): ** so we trust him. -1.284 (drh 04-May-07): */ -1.284 (drh 04-May-07): #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -1.318 (drh 30-Aug-07): static u64 floatSwap(u64 in){ -1.284 (drh 04-May-07): union { -1.318 (drh 30-Aug-07): u64 r; -1.284 (drh 04-May-07): u32 i[2]; -1.284 (drh 04-May-07): } u; -1.284 (drh 04-May-07): u32 t; -1.284 (drh 04-May-07): -1.284 (drh 04-May-07): u.r = in; -1.284 (drh 04-May-07): t = u.i[0]; -1.284 (drh 04-May-07): u.i[0] = u.i[1]; -1.284 (drh 04-May-07): u.i[1] = t; -1.284 (drh 04-May-07): return u.r; -1.284 (drh 04-May-07): } -1.284 (drh 04-May-07): # define swapMixedEndianFloat(X) X = floatSwap(X) -1.284 (drh 04-May-07): #else -1.284 (drh 04-May-07): # define swapMixedEndianFloat(X) -1.284 (drh 04-May-07): #endif -1.284 (drh 04-May-07): -1.284 (drh 04-May-07): /* -1.28 (danielk1 12-May-04): ** Write the serialized data blob for the value stored in pMem into -1.28 (danielk1 12-May-04): ** buf. It is assumed that the caller has allocated sufficient space. -1.28 (danielk1 12-May-04): ** Return the number of bytes written. -1.283 (drh 02-May-07): ** -1.283 (drh 02-May-07): ** nBuf is the amount of space left in buf[]. nBuf must always be -1.283 (drh 02-May-07): ** large enough to hold the entire field. Except, if the field is -1.283 (drh 02-May-07): ** a blob with a zero-filled tail, then buf[] might be just the right -1.283 (drh 02-May-07): ** size to hold everything except for the zero-filled tail. If buf[] -1.283 (drh 02-May-07): ** is only big enough to hold the non-zero prefix, then only write that -1.283 (drh 02-May-07): ** prefix into buf[]. But if buf[] is large enough to hold both the -1.283 (drh 02-May-07): ** prefix and the tail then write the prefix and set the tail to all -1.283 (drh 02-May-07): ** zeros. -1.283 (drh 02-May-07): ** -1.283 (drh 02-May-07): ** Return the number of bytes actually written into buf[]. The number -1.283 (drh 02-May-07): ** of bytes in the zero-filled tail is included in the return value only -1.283 (drh 02-May-07): ** if those bytes were zeroed in buf[]. -1.28 (danielk1 12-May-04): */ -1.283 (drh 02-May-07): int sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){ -1.215 (drh 29-Dec-05): u32 serial_type = sqlite3VdbeSerialType(pMem, file_format); -1.28 (danielk1 12-May-04): int len; -1.30 (danielk1 13-May-04): -1.54 (drh 21-May-04): /* Integer and Real */ -1.215 (drh 29-Dec-05): if( serial_type<=7 && serial_type>0 ){ -1.54 (drh 21-May-04): u64 v; -1.54 (drh 21-May-04): int i; -1.84 (drh 30-May-04): if( serial_type==7 ){ -1.272 (drh 26-Mar-07): assert( sizeof(v)==sizeof(pMem->r) ); -1.272 (drh 26-Mar-07): memcpy(&v, &pMem->r, sizeof(v)); -1.318 (drh 30-Aug-07): swapMixedEndianFloat(v); -1.54 (drh 21-May-04): }else{ -1.276 (drh 30-Mar-07): v = pMem->u.i; -1.54 (drh 21-May-04): } -1.54 (drh 21-May-04): len = i = sqlite3VdbeSerialTypeLen(serial_type); -1.283 (drh 02-May-07): assert( len<=nBuf ); -1.54 (drh 21-May-04): while( i-- ){ -1.54 (drh 21-May-04): buf[i] = (v&0xFF); -1.54 (drh 21-May-04): v >>= 8; -1.54 (drh 21-May-04): } -1.54 (drh 21-May-04): return len; -1.28 (danielk1 12-May-04): } -1.215 (drh 29-Dec-05): -1.28 (danielk1 12-May-04): /* String or blob */ -1.215 (drh 29-Dec-05): if( serial_type>=12 ){ -1.283 (drh 02-May-07): assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.i:0) -1.283 (drh 02-May-07): == sqlite3VdbeSerialTypeLen(serial_type) ); -1.283 (drh 02-May-07): assert( pMem->n<=nBuf ); -1.283 (drh 02-May-07): len = pMem->n; -1.215 (drh 29-Dec-05): memcpy(buf, pMem->z, len); -1.283 (drh 02-May-07): if( pMem->flags & MEM_Zero ){ -1.283 (drh 02-May-07): len += pMem->u.i; -1.283 (drh 02-May-07): if( len>nBuf ){ -1.283 (drh 02-May-07): len = nBuf; -1.283 (drh 02-May-07): } -1.283 (drh 02-May-07): memset(&buf[pMem->n], 0, len-pMem->n); -1.283 (drh 02-May-07): } -1.215 (drh 29-Dec-05): return len; -1.215 (drh 29-Dec-05): } -1.215 (drh 29-Dec-05): -1.215 (drh 29-Dec-05): /* NULL or constants 0 or 1 */ -1.215 (drh 29-Dec-05): return 0; -1.22 (danielk1 10-May-04): } -1.22 (danielk1 10-May-04): -1.22 (danielk1 10-May-04): /* -1.28 (danielk1 12-May-04): ** Deserialize the data blob pointed to by buf as serial type serial_type -1.28 (danielk1 12-May-04): ** and store the result in pMem. Return the number of bytes read. -1.28 (danielk1 12-May-04): */ -1.55 (danielk1 22-May-04): int sqlite3VdbeSerialGet( -1.58 (danielk1 23-May-04): const unsigned char *buf, /* Buffer to deserialize from */ -1.75 (drh 28-May-04): u32 serial_type, /* Serial type to deserialize */ -1.75 (drh 28-May-04): Mem *pMem /* Memory cell to write value into */ -1.55 (danielk1 22-May-04): ){ -1.177 (drh 21-May-05): switch( serial_type ){ -1.177 (drh 21-May-05): case 10: /* Reserved for future use */ -1.177 (drh 21-May-05): case 11: /* Reserved for future use */ -1.177 (drh 21-May-05): case 0: { /* NULL */ -1.177 (drh 21-May-05): pMem->flags = MEM_Null; -1.177 (drh 21-May-05): break; -1.177 (drh 21-May-05): } -1.177 (drh 21-May-05): case 1: { /* 1-byte signed integer */ -1.276 (drh 30-Mar-07): pMem->u.i = (signed char)buf[0]; -1.177 (drh 21-May-05): pMem->flags = MEM_Int; -1.177 (drh 21-May-05): return 1; -1.177 (drh 21-May-05): } -1.177 (drh 21-May-05): case 2: { /* 2-byte signed integer */ -1.276 (drh 30-Mar-07): pMem->u.i = (((signed char)buf[0])<<8) | buf[1]; -1.177 (drh 21-May-05): pMem->flags = MEM_Int; -1.177 (drh 21-May-05): return 2; -1.177 (drh 21-May-05): } -1.177 (drh 21-May-05): case 3: { /* 3-byte signed integer */ -1.276 (drh 30-Mar-07): pMem->u.i = (((signed char)buf[0])<<16) | (buf[1]<<8) | buf[2]; -1.177 (drh 21-May-05): pMem->flags = MEM_Int; -1.177 (drh 21-May-05): return 3; -1.177 (drh 21-May-05): } -1.177 (drh 21-May-05): case 4: { /* 4-byte signed integer */ -1.276 (drh 30-Mar-07): pMem->u.i = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; -1.177 (drh 21-May-05): pMem->flags = MEM_Int; -1.177 (drh 21-May-05): return 4; -1.177 (drh 21-May-05): } -1.177 (drh 21-May-05): case 5: { /* 6-byte signed integer */ -1.177 (drh 21-May-05): u64 x = (((signed char)buf[0])<<8) | buf[1]; -1.177 (drh 21-May-05): u32 y = (buf[2]<<24) | (buf[3]<<16) | (buf[4]<<8) | buf[5]; -1.177 (drh 21-May-05): x = (x<<32) | y; -1.276 (drh 30-Mar-07): pMem->u.i = *(i64*)&x; -1.83 (drh 30-May-04): pMem->flags = MEM_Int; -1.177 (drh 21-May-05): return 6; -1.177 (drh 21-May-05): } -1.186 (drh 18-Aug-05): case 6: /* 8-byte signed integer */ -1.177 (drh 21-May-05): case 7: { /* IEEE floating point */ -1.193 (drh 05-Sep-05): u64 x; -1.193 (drh 05-Sep-05): u32 y; -1.232 (drh 23-Jan-06): #if !defined(NDEBUG) && !defined(SQLITE_OMIT_FLOATING_POINT) -1.189 (drh 28-Aug-05): /* Verify that integers and floating point values use the same -1.284 (drh 04-May-07): ** byte order. Or, that if SQLITE_MIXED_ENDIAN_64BIT_FLOAT is -1.284 (drh 04-May-07): ** defined that 64-bit floating point values really are mixed -1.284 (drh 04-May-07): ** endian. -1.190 (drh 28-Aug-05): */ -1.189 (drh 28-Aug-05): static const u64 t1 = ((u64)0x3ff00000)<<32; -1.272 (drh 26-Mar-07): static const double r1 = 1.0; -1.318 (drh 30-Aug-07): u64 t2 = t1; -1.318 (drh 30-Aug-07): swapMixedEndianFloat(t2); -1.318 (drh 30-Aug-07): assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 ); -1.189 (drh 28-Aug-05): #endif -1.190 (drh 28-Aug-05): -1.193 (drh 05-Sep-05): x = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; -1.193 (drh 05-Sep-05): y = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7]; -1.177 (drh 21-May-05): x = (x<<32) | y; -1.177 (drh 21-May-05): if( serial_type==6 ){ -1.276 (drh 30-Mar-07): pMem->u.i = *(i64*)&x; -1.177 (drh 21-May-05): pMem->flags = MEM_Int; -1.177 (drh 21-May-05): }else{ -1.272 (drh 26-Mar-07): assert( sizeof(x)==8 && sizeof(pMem->r)==8 ); -1.318 (drh 30-Aug-07): swapMixedEndianFloat(x); -1.272 (drh 26-Mar-07): memcpy(&pMem->r, &x, sizeof(x)); -1.177 (drh 21-May-05): pMem->flags = MEM_Real; -1.83 (drh 30-May-04): } -1.177 (drh 21-May-05): return 8; -1.177 (drh 21-May-05): } -1.215 (drh 29-Dec-05): case 8: /* Integer 0 */ -1.215 (drh 29-Dec-05): case 9: { /* Integer 1 */ -1.276 (drh 30-Mar-07): pMem->u.i = serial_type-8; -1.215 (drh 29-Dec-05): pMem->flags = MEM_Int; -1.215 (drh 29-Dec-05): return 0; -1.215 (drh 29-Dec-05): } -1.177 (drh 21-May-05): default: { -1.177 (drh 21-May-05): int len = (serial_type-12)/2; -1.177 (drh 21-May-05): pMem->z = (char *)buf; -1.177 (drh 21-May-05): pMem->n = len; -1.177 (drh 21-May-05): pMem->xDel = 0; -1.177 (drh 21-May-05): if( serial_type&0x01 ){ -1.177 (drh 21-May-05): pMem->flags = MEM_Str | MEM_Ephem; -1.83 (drh 30-May-04): }else{ -1.177 (drh 21-May-05): pMem->flags = MEM_Blob | MEM_Ephem; -1.83 (drh 30-May-04): } -1.177 (drh 21-May-05): return len; -1.81 (drh 30-May-04): } -1.23 (danielk1 10-May-04): } -1.177 (drh 21-May-05): return 0; -1.22 (danielk1 10-May-04): } -1.22 (danielk1 10-May-04): -1.22 (danielk1 10-May-04): /* -1.223 (drh 12-Jan-06): ** The header of a record consists of a sequence variable-length integers. -1.223 (drh 12-Jan-06): ** These integers are almost always small and are encoded as a single byte. -1.223 (drh 12-Jan-06): ** The following macro takes advantage this fact to provide a fast decode -1.223 (drh 12-Jan-06): ** of the integers in a record header. It is faster for the common case -1.223 (drh 12-Jan-06): ** where the integer is a single byte. It is a little slower when the -1.223 (drh 12-Jan-06): ** integer is two or more bytes. But overall it is faster. -1.223 (drh 12-Jan-06): ** -1.223 (drh 12-Jan-06): ** The following expressions are equivalent: -1.223 (drh 12-Jan-06): ** -1.223 (drh 12-Jan-06): ** x = sqlite3GetVarint32( A, &B ); -1.223 (drh 12-Jan-06): ** -1.223 (drh 12-Jan-06): ** x = GetVarint( A, B ); -1.223 (drh 12-Jan-06): ** -1.223 (drh 12-Jan-06): */ -1.223 (drh 12-Jan-06): #define GetVarint(A,B) ((B = *(A))<=0x7f ? 1 : sqlite3GetVarint32(A, &B)) -1.223 (drh 12-Jan-06): -1.223 (drh 12-Jan-06): /* -1.90 (drh 02-Jun-04): ** This function compares the two table rows or index records specified by -1.38 (danielk1 18-May-04): ** {nKey1, pKey1} and {nKey2, pKey2}, returning a negative, zero -1.38 (danielk1 18-May-04): ** or positive integer if {nKey1, pKey1} is less than, equal to or -1.90 (drh 02-Jun-04): ** greater than {nKey2, pKey2}. Both Key1 and Key2 must be byte strings -1.90 (drh 02-Jun-04): ** composed by the OP_MakeRecord opcode of the VDBE. -1.38 (danielk1 18-May-04): */ -1.90 (drh 02-Jun-04): int sqlite3VdbeRecordCompare( -1.38 (danielk1 18-May-04): void *userData, -1.38 (danielk1 18-May-04): int nKey1, const void *pKey1, -1.38 (danielk1 18-May-04): int nKey2, const void *pKey2 -1.38 (danielk1 18-May-04): ){ -1.50 (drh 20-May-04): KeyInfo *pKeyInfo = (KeyInfo*)userData; -1.73 (drh 27-May-04): u32 d1, d2; /* Offset into aKey[] of next data element */ -1.73 (drh 27-May-04): u32 idx1, idx2; /* Offset into aKey[] of next header element */ -1.73 (drh 27-May-04): u32 szHdr1, szHdr2; /* Number of bytes in header */ -1.73 (drh 27-May-04): int i = 0; -1.73 (drh 27-May-04): int nField; -1.73 (drh 27-May-04): int rc = 0; -1.38 (danielk1 18-May-04): const unsigned char *aKey1 = (const unsigned char *)pKey1; -1.38 (danielk1 18-May-04): const unsigned char *aKey2 = (const unsigned char *)pKey2; -1.96 (danielk1 09-Jun-04): -1.96 (danielk1 09-Jun-04): Mem mem1; -1.96 (danielk1 09-Jun-04): Mem mem2; -1.96 (danielk1 09-Jun-04): mem1.enc = pKeyInfo->enc; -1.307 (drh 21-Aug-07): mem1.db = pKeyInfo->db; -1.96 (danielk1 09-Jun-04): mem2.enc = pKeyInfo->enc; -1.307 (drh 21-Aug-07): mem2.db = pKeyInfo->db; -1.73 (drh 27-May-04): -1.223 (drh 12-Jan-06): idx1 = GetVarint(aKey1, szHdr1); -1.73 (drh 27-May-04): d1 = szHdr1; -1.223 (drh 12-Jan-06): idx2 = GetVarint(aKey2, szHdr2); -1.73 (drh 27-May-04): d2 = szHdr2; -1.73 (drh 27-May-04): nField = pKeyInfo->nField; -1.76 (drh 28-May-04): while( idx1=nKey1 && sqlite3VdbeSerialTypeLen(serial_type1)>0 ) break; -1.223 (drh 12-Jan-06): idx2 += GetVarint( aKey2+idx2, serial_type2 ); -1.76 (drh 28-May-04): if( d2>=nKey2 && sqlite3VdbeSerialTypeLen(serial_type2)>0 ) break; -1.39 (danielk1 18-May-04): -1.267 (drh 27-Oct-06): /* Extract the values to be compared. -1.39 (danielk1 18-May-04): */ -1.75 (drh 28-May-04): d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); -1.75 (drh 28-May-04): d2 += sqlite3VdbeSerialGet(&aKey2[d2], serial_type2, &mem2); -1.39 (danielk1 18-May-04): -1.267 (drh 27-Oct-06): /* Do the comparison -1.267 (drh 27-Oct-06): */ -1.76 (drh 28-May-04): rc = sqlite3MemCompare(&mem1, &mem2, iaColl[i] : 0); -1.177 (drh 21-May-05): if( mem1.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem1); -1.177 (drh 21-May-05): if( mem2.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem2); -1.39 (danielk1 18-May-04): if( rc!=0 ){ -1.73 (drh 27-May-04): break; -1.39 (danielk1 18-May-04): } -1.73 (drh 27-May-04): i++; -1.73 (drh 27-May-04): } -1.73 (drh 27-May-04): -1.73 (drh 27-May-04): /* One of the keys ran out of fields, but all the fields up to that point -1.73 (drh 27-May-04): ** were equal. If the incrKey flag is true, then the second key is -1.73 (drh 27-May-04): ** treated as larger. -1.73 (drh 27-May-04): */ -1.73 (drh 27-May-04): if( rc==0 ){ -1.73 (drh 27-May-04): if( pKeyInfo->incrKey ){ -1.73 (drh 27-May-04): rc = -1; -1.73 (drh 27-May-04): }else if( d1aSortOrder && inField -1.214 (drh 21-Dec-05): && pKeyInfo->aSortOrder[i] ){ -1.73 (drh 27-May-04): rc = -rc; -1.39 (danielk1 18-May-04): } -1.39 (danielk1 18-May-04): -1.73 (drh 27-May-04): return rc; -1.38 (danielk1 18-May-04): } -1.76 (drh 28-May-04): -1.76 (drh 28-May-04): /* -1.90 (drh 02-Jun-04): ** The argument is an index entry composed using the OP_MakeRecord opcode. -1.90 (drh 02-Jun-04): ** The last entry in this record should be an integer (specifically -1.90 (drh 02-Jun-04): ** an integer rowid). This routine returns the number of bytes in -1.90 (drh 02-Jun-04): ** that integer. -1.76 (drh 28-May-04): */ -1.237 (drh 24-Feb-06): int sqlite3VdbeIdxRowidLen(const u8 *aKey){ -1.76 (drh 28-May-04): u32 szHdr; /* Size of the header */ -1.76 (drh 28-May-04): u32 typeRowid; /* Serial type of the rowid */ -1.76 (drh 28-May-04): -1.76 (drh 28-May-04): sqlite3GetVarint32(aKey, &szHdr); -1.76 (drh 28-May-04): sqlite3GetVarint32(&aKey[szHdr-1], &typeRowid); -1.76 (drh 28-May-04): return sqlite3VdbeSerialTypeLen(typeRowid); -1.76 (drh 28-May-04): } -1.38 (danielk1 18-May-04): -1.30 (danielk1 13-May-04): -1.30 (danielk1 13-May-04): /* -1.90 (drh 02-Jun-04): ** pCur points at an index entry created using the OP_MakeRecord opcode. -1.90 (drh 02-Jun-04): ** Read the rowid (the last field in the record) and store it in *rowid. -1.90 (drh 02-Jun-04): ** Return SQLITE_OK if everything works, or an error code otherwise. -1.30 (danielk1 13-May-04): */ -1.307 (drh 21-Aug-07): int sqlite3VdbeIdxRowid(BtCursor *pCur, i64 *rowid){ -1.279 (drh 01-Apr-07): i64 nCellKey = 0; -1.30 (danielk1 13-May-04): int rc; -1.76 (drh 28-May-04): u32 szHdr; /* Size of the header */ -1.76 (drh 28-May-04): u32 typeRowid; /* Serial type of the rowid */ -1.76 (drh 28-May-04): u32 lenRowid; /* Size of the rowid */ -1.76 (drh 28-May-04): Mem m, v; -1.30 (danielk1 13-May-04): -1.76 (drh 28-May-04): sqlite3BtreeKeySize(pCur, &nCellKey); -1.76 (drh 28-May-04): if( nCellKey<=0 ){ -1.200 (drh 17-Sep-05): return SQLITE_CORRUPT_BKPT; -1.76 (drh 28-May-04): } -1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemFromBtree(pCur, 0, nCellKey, 1, &m); -1.76 (drh 28-May-04): if( rc ){ -1.30 (danielk1 13-May-04): return rc; -1.30 (danielk1 13-May-04): } -1.210 (drh 09-Dec-05): sqlite3GetVarint32((u8*)m.z, &szHdr); -1.210 (drh 09-Dec-05): sqlite3GetVarint32((u8*)&m.z[szHdr-1], &typeRowid); -1.76 (drh 28-May-04): lenRowid = sqlite3VdbeSerialTypeLen(typeRowid); -1.210 (drh 09-Dec-05): sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v); -1.276 (drh 30-Mar-07): *rowid = v.u.i; -1.105 (danielk1 12-Jun-04): sqlite3VdbeMemRelease(&m); -1.30 (danielk1 13-May-04): return SQLITE_OK; -1.30 (danielk1 13-May-04): } -1.30 (danielk1 13-May-04): -1.44 (drh 19-May-04): /* -1.50 (drh 20-May-04): ** Compare the key of the index entry that cursor pC is point to against -1.44 (drh 19-May-04): ** the key string in pKey (of length nKey). Write into *pRes a number -1.44 (drh 19-May-04): ** that is negative, zero, or positive if pC is less than, equal to, -1.44 (drh 19-May-04): ** or greater than pKey. Return SQLITE_OK on success. -1.50 (drh 20-May-04): ** -1.76 (drh 28-May-04): ** pKey is either created without a rowid or is truncated so that it -1.76 (drh 28-May-04): ** omits the rowid at the end. The rowid at the end of the index entry -1.76 (drh 28-May-04): ** is ignored as well. -1.44 (drh 19-May-04): */ -1.30 (danielk1 13-May-04): int sqlite3VdbeIdxKeyCompare( -1.44 (drh 19-May-04): Cursor *pC, /* The cursor to compare against */ -1.44 (drh 19-May-04): int nKey, const u8 *pKey, /* The key to compare */ -1.44 (drh 19-May-04): int *res /* Write the comparison result here */ -1.30 (danielk1 13-May-04): ){ -1.279 (drh 01-Apr-07): i64 nCellKey = 0; -1.30 (danielk1 13-May-04): int rc; -1.31 (danielk1 14-May-04): BtCursor *pCur = pC->pCursor; -1.76 (drh 28-May-04): int lenRowid; -1.76 (drh 28-May-04): Mem m; -1.30 (danielk1 13-May-04): -1.30 (danielk1 13-May-04): sqlite3BtreeKeySize(pCur, &nCellKey); -1.30 (danielk1 13-May-04): if( nCellKey<=0 ){ -1.30 (danielk1 13-May-04): *res = 0; -1.30 (danielk1 13-May-04): return SQLITE_OK; -1.30 (danielk1 13-May-04): } -1.307 (drh 21-Aug-07): rc = sqlite3VdbeMemFromBtree(pC->pCursor, 0, nCellKey, 1, &m); -1.76 (drh 28-May-04): if( rc ){ -1.76 (drh 28-May-04): return rc; -1.30 (danielk1 13-May-04): } -1.237 (drh 24-Feb-06): lenRowid = sqlite3VdbeIdxRowidLen((u8*)m.z); -1.90 (drh 02-Jun-04): *res = sqlite3VdbeRecordCompare(pC->pKeyInfo, m.n-lenRowid, m.z, nKey, pKey); -1.105 (danielk1 12-Jun-04): sqlite3VdbeMemRelease(&m); -1.30 (danielk1 13-May-04): return SQLITE_OK; -1.62 (danielk1 25-May-04): } -1.121 (danielk1 21-Jun-04): -1.121 (danielk1 21-Jun-04): /* -1.121 (danielk1 21-Jun-04): ** This routine sets the value to be returned by subsequent calls to -1.121 (danielk1 21-Jun-04): ** sqlite3_changes() on the database handle 'db'. -1.121 (danielk1 21-Jun-04): */ -1.121 (danielk1 21-Jun-04): void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){ -1.307 (drh 21-Aug-07): assert( sqlite3_mutex_held(db->mutex) ); -1.121 (danielk1 21-Jun-04): db->nChange = nChange; -1.121 (danielk1 21-Jun-04): db->nTotalChange += nChange; -1.121 (danielk1 21-Jun-04): } -1.121 (danielk1 21-Jun-04): -1.121 (danielk1 21-Jun-04): /* -1.121 (danielk1 21-Jun-04): ** Set a flag in the vdbe to update the change counter when it is finalised -1.121 (danielk1 21-Jun-04): ** or reset. -1.121 (danielk1 21-Jun-04): */ -1.152 (drh 05-Nov-04): void sqlite3VdbeCountChanges(Vdbe *v){ -1.152 (drh 05-Nov-04): v->changeCntOn = 1; -1.121 (danielk1 21-Jun-04): } -1.159 (drh 22-Jan-05): -1.159 (drh 22-Jan-05): /* -1.159 (drh 22-Jan-05): ** Mark every prepared statement associated with a database connection -1.159 (drh 22-Jan-05): ** as expired. -1.159 (drh 22-Jan-05): ** -1.159 (drh 22-Jan-05): ** An expired statement means that recompilation of the statement is -1.159 (drh 22-Jan-05): ** recommend. Statements expire when things happen that make their -1.159 (drh 22-Jan-05): ** programs obsolete. Removing user-defined functions or collating -1.159 (drh 22-Jan-05): ** sequences, or changing an authorization function are the types of -1.159 (drh 22-Jan-05): ** things that make prepared statements obsolete. -1.159 (drh 22-Jan-05): */ -1.159 (drh 22-Jan-05): void sqlite3ExpirePreparedStatements(sqlite3 *db){ -1.159 (drh 22-Jan-05): Vdbe *p; -1.159 (drh 22-Jan-05): for(p = db->pVdbe; p; p=p->pNext){ -1.159 (drh 22-Jan-05): p->expired = 1; -1.159 (drh 22-Jan-05): } -1.159 (drh 22-Jan-05): } -1.167 (danielk1 09-Mar-05): -1.167 (danielk1 09-Mar-05): /* -1.167 (danielk1 09-Mar-05): ** Return the database associated with the Vdbe. -1.167 (danielk1 09-Mar-05): */ -1.167 (danielk1 09-Mar-05): sqlite3 *sqlite3VdbeDb(Vdbe *v){ -1.167 (danielk1 09-Mar-05): return v->db; -1.167 (danielk1 09-Mar-05): } diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/expr.c b/libraries/sqlite/unix/sqlite-3.5.1/src/expr.c deleted file mode 100644 index 0a7091a09d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/expr.c +++ /dev/null @@ -1,2617 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains routines used for analyzing expressions and -** for generating VDBE code that evaluates expressions in SQLite. -** -** $Id: expr.c,v 1.313 2007/09/18 15:55:07 drh Exp $ -*/ -#include "sqliteInt.h" -#include - -/* -** Return the 'affinity' of the expression pExpr if any. -** -** If pExpr is a column, a reference to a column via an 'AS' alias, -** or a sub-select with a column as the return value, then the -** affinity of that column is returned. Otherwise, 0x00 is returned, -** indicating no affinity for the expression. -** -** i.e. the WHERE clause expresssions in the following statements all -** have an affinity: -** -** CREATE TABLE t1(a); -** SELECT * FROM t1 WHERE a; -** SELECT a AS b FROM t1 WHERE b; -** SELECT * FROM t1 WHERE (select a from t1); -*/ -char sqlite3ExprAffinity(Expr *pExpr){ - int op = pExpr->op; - if( op==TK_SELECT ){ - return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr); - } -#ifndef SQLITE_OMIT_CAST - if( op==TK_CAST ){ - return sqlite3AffinityType(&pExpr->token); - } -#endif - return pExpr->affinity; -} - -/* -** Set the collating sequence for expression pExpr to be the collating -** sequence named by pToken. Return a pointer to the revised expression. -** The collating sequence is marked as "explicit" using the EP_ExpCollate -** flag. An explicit collating sequence will override implicit -** collating sequences. -*/ -Expr *sqlite3ExprSetColl(Parse *pParse, Expr *pExpr, Token *pName){ - CollSeq *pColl; - if( pExpr==0 ) return 0; - pColl = sqlite3LocateCollSeq(pParse, (char*)pName->z, pName->n); - if( pColl ){ - pExpr->pColl = pColl; - pExpr->flags |= EP_ExpCollate; - } - return pExpr; -} - -/* -** Return the default collation sequence for the expression pExpr. If -** there is no default collation type, return 0. -*/ -CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ - CollSeq *pColl = 0; - if( pExpr ){ - int op; - pColl = pExpr->pColl; - op = pExpr->op; - if( (op==TK_CAST || op==TK_UPLUS) && !pColl ){ - return sqlite3ExprCollSeq(pParse, pExpr->pLeft); - } - } - if( sqlite3CheckCollSeq(pParse, pColl) ){ - pColl = 0; - } - return pColl; -} - -/* -** pExpr is an operand of a comparison operator. aff2 is the -** type affinity of the other operand. This routine returns the -** type affinity that should be used for the comparison operator. -*/ -char sqlite3CompareAffinity(Expr *pExpr, char aff2){ - char aff1 = sqlite3ExprAffinity(pExpr); - if( aff1 && aff2 ){ - /* Both sides of the comparison are columns. If one has numeric - ** affinity, use that. Otherwise use no affinity. - */ - if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ - return SQLITE_AFF_NUMERIC; - }else{ - return SQLITE_AFF_NONE; - } - }else if( !aff1 && !aff2 ){ - /* Neither side of the comparison is a column. Compare the - ** results directly. - */ - return SQLITE_AFF_NONE; - }else{ - /* One side is a column, the other is not. Use the columns affinity. */ - assert( aff1==0 || aff2==0 ); - return (aff1 + aff2); - } -} - -/* -** pExpr is a comparison operator. Return the type affinity that should -** be applied to both operands prior to doing the comparison. -*/ -static char comparisonAffinity(Expr *pExpr){ - char aff; - assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || - pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || - pExpr->op==TK_NE ); - assert( pExpr->pLeft ); - aff = sqlite3ExprAffinity(pExpr->pLeft); - if( pExpr->pRight ){ - aff = sqlite3CompareAffinity(pExpr->pRight, aff); - } - else if( pExpr->pSelect ){ - aff = sqlite3CompareAffinity(pExpr->pSelect->pEList->a[0].pExpr, aff); - } - else if( !aff ){ - aff = SQLITE_AFF_NONE; - } - return aff; -} - -/* -** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. -** idx_affinity is the affinity of an indexed column. Return true -** if the index with affinity idx_affinity may be used to implement -** the comparison in pExpr. -*/ -int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ - char aff = comparisonAffinity(pExpr); - switch( aff ){ - case SQLITE_AFF_NONE: - return 1; - case SQLITE_AFF_TEXT: - return idx_affinity==SQLITE_AFF_TEXT; - default: - return sqlite3IsNumericAffinity(idx_affinity); - } -} - -/* -** Return the P1 value that should be used for a binary comparison -** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2. -** If jumpIfNull is true, then set the low byte of the returned -** P1 value to tell the opcode to jump if either expression -** evaluates to NULL. -*/ -static int binaryCompareP1(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){ - char aff = sqlite3ExprAffinity(pExpr2); - return ((int)sqlite3CompareAffinity(pExpr1, aff))+(jumpIfNull?0x100:0); -} - -/* -** Return a pointer to the collation sequence that should be used by -** a binary comparison operator comparing pLeft and pRight. -** -** If the left hand expression has a collating sequence type, then it is -** used. Otherwise the collation sequence for the right hand expression -** is used, or the default (BINARY) if neither expression has a collating -** type. -** -** Argument pRight (but not pLeft) may be a null pointer. In this case, -** it is not considered. -*/ -CollSeq *sqlite3BinaryCompareCollSeq( - Parse *pParse, - Expr *pLeft, - Expr *pRight -){ - CollSeq *pColl; - assert( pLeft ); - if( pLeft->flags & EP_ExpCollate ){ - assert( pLeft->pColl ); - pColl = pLeft->pColl; - }else if( pRight && pRight->flags & EP_ExpCollate ){ - assert( pRight->pColl ); - pColl = pRight->pColl; - }else{ - pColl = sqlite3ExprCollSeq(pParse, pLeft); - if( !pColl ){ - pColl = sqlite3ExprCollSeq(pParse, pRight); - } - } - return pColl; -} - -/* -** Generate code for a comparison operator. -*/ -static int codeCompare( - Parse *pParse, /* The parsing (and code generating) context */ - Expr *pLeft, /* The left operand */ - Expr *pRight, /* The right operand */ - int opcode, /* The comparison opcode */ - int dest, /* Jump here if true. */ - int jumpIfNull /* If true, jump if either operand is NULL */ -){ - int p1 = binaryCompareP1(pLeft, pRight, jumpIfNull); - CollSeq *p3 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); - return sqlite3VdbeOp3(pParse->pVdbe, opcode, p1, dest, (void*)p3, P3_COLLSEQ); -} - -/* -** Construct a new expression node and return a pointer to it. Memory -** for this node is obtained from sqlite3_malloc(). The calling function -** is responsible for making sure the node eventually gets freed. -*/ -Expr *sqlite3Expr( - sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ - int op, /* Expression opcode */ - Expr *pLeft, /* Left operand */ - Expr *pRight, /* Right operand */ - const Token *pToken /* Argument token */ -){ - Expr *pNew; - pNew = sqlite3DbMallocZero(db, sizeof(Expr)); - if( pNew==0 ){ - /* When malloc fails, delete pLeft and pRight. Expressions passed to - ** this function must always be allocated with sqlite3Expr() for this - ** reason. - */ - sqlite3ExprDelete(pLeft); - sqlite3ExprDelete(pRight); - return 0; - } - pNew->op = op; - pNew->pLeft = pLeft; - pNew->pRight = pRight; - pNew->iAgg = -1; - if( pToken ){ - assert( pToken->dyn==0 ); - pNew->span = pNew->token = *pToken; - }else if( pLeft ){ - if( pRight ){ - sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span); - if( pRight->flags & EP_ExpCollate ){ - pNew->flags |= EP_ExpCollate; - pNew->pColl = pRight->pColl; - } - } - if( pLeft->flags & EP_ExpCollate ){ - pNew->flags |= EP_ExpCollate; - pNew->pColl = pLeft->pColl; - } - } - - sqlite3ExprSetHeight(pNew); - return pNew; -} - -/* -** Works like sqlite3Expr() except that it takes an extra Parse* -** argument and notifies the associated connection object if malloc fails. -*/ -Expr *sqlite3PExpr( - Parse *pParse, /* Parsing context */ - int op, /* Expression opcode */ - Expr *pLeft, /* Left operand */ - Expr *pRight, /* Right operand */ - const Token *pToken /* Argument token */ -){ - return sqlite3Expr(pParse->db, op, pLeft, pRight, pToken); -} - -/* -** When doing a nested parse, you can include terms in an expression -** that look like this: #0 #1 #2 ... These terms refer to elements -** on the stack. "#0" means the top of the stack. -** "#1" means the next down on the stack. And so forth. -** -** This routine is called by the parser to deal with on of those terms. -** It immediately generates code to store the value in a memory location. -** The returns an expression that will code to extract the value from -** that memory location as needed. -*/ -Expr *sqlite3RegisterExpr(Parse *pParse, Token *pToken){ - Vdbe *v = pParse->pVdbe; - Expr *p; - int depth; - if( pParse->nested==0 ){ - sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", pToken); - return sqlite3PExpr(pParse, TK_NULL, 0, 0, 0); - } - if( v==0 ) return 0; - p = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, pToken); - if( p==0 ){ - return 0; /* Malloc failed */ - } - depth = atoi((char*)&pToken->z[1]); - p->iTable = pParse->nMem++; - sqlite3VdbeAddOp(v, OP_Dup, depth, 0); - sqlite3VdbeAddOp(v, OP_MemStore, p->iTable, 1); - return p; -} - -/* -** Join two expressions using an AND operator. If either expression is -** NULL, then just return the other expression. -*/ -Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){ - if( pLeft==0 ){ - return pRight; - }else if( pRight==0 ){ - return pLeft; - }else{ - return sqlite3Expr(db, TK_AND, pLeft, pRight, 0); - } -} - -/* -** Set the Expr.span field of the given expression to span all -** text between the two given tokens. -*/ -void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ - assert( pRight!=0 ); - assert( pLeft!=0 ); - if( pExpr && pRight->z && pLeft->z ){ - assert( pLeft->dyn==0 || pLeft->z[pLeft->n]==0 ); - if( pLeft->dyn==0 && pRight->dyn==0 ){ - pExpr->span.z = pLeft->z; - pExpr->span.n = pRight->n + (pRight->z - pLeft->z); - }else{ - pExpr->span.z = 0; - } - } -} - -/* -** Construct a new expression node for a function with multiple -** arguments. -*/ -Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ - Expr *pNew; - assert( pToken ); - pNew = sqlite3DbMallocZero(pParse->db, sizeof(Expr) ); - if( pNew==0 ){ - sqlite3ExprListDelete(pList); /* Avoid leaking memory when malloc fails */ - return 0; - } - pNew->op = TK_FUNCTION; - pNew->pList = pList; - assert( pToken->dyn==0 ); - pNew->token = *pToken; - pNew->span = pNew->token; - - sqlite3ExprSetHeight(pNew); - return pNew; -} - -/* -** Assign a variable number to an expression that encodes a wildcard -** in the original SQL statement. -** -** Wildcards consisting of a single "?" are assigned the next sequential -** variable number. -** -** Wildcards of the form "?nnn" are assigned the number "nnn". We make -** sure "nnn" is not too be to avoid a denial of service attack when -** the SQL statement comes from an external source. -** -** Wildcards of the form ":aaa" or "$aaa" are assigned the same number -** as the previous instance of the same wildcard. Or if this is the first -** instance of the wildcard, the next sequenial variable number is -** assigned. -*/ -void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ - Token *pToken; - sqlite3 *db = pParse->db; - - if( pExpr==0 ) return; - pToken = &pExpr->token; - assert( pToken->n>=1 ); - assert( pToken->z!=0 ); - assert( pToken->z[0]!=0 ); - if( pToken->n==1 ){ - /* Wildcard of the form "?". Assign the next variable number */ - pExpr->iTable = ++pParse->nVar; - }else if( pToken->z[0]=='?' ){ - /* Wildcard of the form "?nnn". Convert "nnn" to an integer and - ** use it as the variable number */ - int i; - pExpr->iTable = i = atoi((char*)&pToken->z[1]); - if( i<1 || i>SQLITE_MAX_VARIABLE_NUMBER ){ - sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", - SQLITE_MAX_VARIABLE_NUMBER); - } - if( i>pParse->nVar ){ - pParse->nVar = i; - } - }else{ - /* Wildcards of the form ":aaa" or "$aaa". Reuse the same variable - ** number as the prior appearance of the same name, or if the name - ** has never appeared before, reuse the same variable number - */ - int i, n; - n = pToken->n; - for(i=0; inVarExpr; i++){ - Expr *pE; - if( (pE = pParse->apVarExpr[i])!=0 - && pE->token.n==n - && memcmp(pE->token.z, pToken->z, n)==0 ){ - pExpr->iTable = pE->iTable; - break; - } - } - if( i>=pParse->nVarExpr ){ - pExpr->iTable = ++pParse->nVar; - if( pParse->nVarExpr>=pParse->nVarExprAlloc-1 ){ - pParse->nVarExprAlloc += pParse->nVarExprAlloc + 10; - pParse->apVarExpr = - sqlite3DbReallocOrFree( - db, - pParse->apVarExpr, - pParse->nVarExprAlloc*sizeof(pParse->apVarExpr[0]) - ); - } - if( !db->mallocFailed ){ - assert( pParse->apVarExpr!=0 ); - pParse->apVarExpr[pParse->nVarExpr++] = pExpr; - } - } - } - if( !pParse->nErr && pParse->nVar>SQLITE_MAX_VARIABLE_NUMBER ){ - sqlite3ErrorMsg(pParse, "too many SQL variables"); - } -} - -/* -** Recursively delete an expression tree. -*/ -void sqlite3ExprDelete(Expr *p){ - if( p==0 ) return; - if( p->span.dyn ) sqlite3_free((char*)p->span.z); - if( p->token.dyn ) sqlite3_free((char*)p->token.z); - sqlite3ExprDelete(p->pLeft); - sqlite3ExprDelete(p->pRight); - sqlite3ExprListDelete(p->pList); - sqlite3SelectDelete(p->pSelect); - sqlite3_free(p); -} - -/* -** The Expr.token field might be a string literal that is quoted. -** If so, remove the quotation marks. -*/ -void sqlite3DequoteExpr(sqlite3 *db, Expr *p){ - if( ExprHasAnyProperty(p, EP_Dequoted) ){ - return; - } - ExprSetProperty(p, EP_Dequoted); - if( p->token.dyn==0 ){ - sqlite3TokenCopy(db, &p->token, &p->token); - } - sqlite3Dequote((char*)p->token.z); -} - - -/* -** The following group of routines make deep copies of expressions, -** expression lists, ID lists, and select statements. The copies can -** be deleted (by being passed to their respective ...Delete() routines) -** without effecting the originals. -** -** The expression list, ID, and source lists return by sqlite3ExprListDup(), -** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded -** by subsequent calls to sqlite*ListAppend() routines. -** -** Any tables that the SrcList might point to are not duplicated. -*/ -Expr *sqlite3ExprDup(sqlite3 *db, Expr *p){ - Expr *pNew; - if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); - if( pNew==0 ) return 0; - memcpy(pNew, p, sizeof(*pNew)); - if( p->token.z!=0 ){ - pNew->token.z = (u8*)sqlite3DbStrNDup(db, (char*)p->token.z, p->token.n); - pNew->token.dyn = 1; - }else{ - assert( pNew->token.z==0 ); - } - pNew->span.z = 0; - pNew->pLeft = sqlite3ExprDup(db, p->pLeft); - pNew->pRight = sqlite3ExprDup(db, p->pRight); - pNew->pList = sqlite3ExprListDup(db, p->pList); - pNew->pSelect = sqlite3SelectDup(db, p->pSelect); - return pNew; -} -void sqlite3TokenCopy(sqlite3 *db, Token *pTo, Token *pFrom){ - if( pTo->dyn ) sqlite3_free((char*)pTo->z); - if( pFrom->z ){ - pTo->n = pFrom->n; - pTo->z = (u8*)sqlite3DbStrNDup(db, (char*)pFrom->z, pFrom->n); - pTo->dyn = 1; - }else{ - pTo->z = 0; - } -} -ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p){ - ExprList *pNew; - struct ExprList_item *pItem, *pOldItem; - int i; - if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); - if( pNew==0 ) return 0; - pNew->iECursor = 0; - pNew->nExpr = pNew->nAlloc = p->nExpr; - pNew->a = pItem = sqlite3DbMallocRaw(db, p->nExpr*sizeof(p->a[0]) ); - if( pItem==0 ){ - sqlite3_free(pNew); - return 0; - } - pOldItem = p->a; - for(i=0; inExpr; i++, pItem++, pOldItem++){ - Expr *pNewExpr, *pOldExpr; - pItem->pExpr = pNewExpr = sqlite3ExprDup(db, pOldExpr = pOldItem->pExpr); - if( pOldExpr->span.z!=0 && pNewExpr ){ - /* Always make a copy of the span for top-level expressions in the - ** expression list. The logic in SELECT processing that determines - ** the names of columns in the result set needs this information */ - sqlite3TokenCopy(db, &pNewExpr->span, &pOldExpr->span); - } - assert( pNewExpr==0 || pNewExpr->span.z!=0 - || pOldExpr->span.z==0 - || db->mallocFailed ); - pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pItem->sortOrder = pOldItem->sortOrder; - pItem->isAgg = pOldItem->isAgg; - pItem->done = 0; - } - return pNew; -} - -/* -** If cursors, triggers, views and subqueries are all omitted from -** the build, then none of the following routines, except for -** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes -** called with a NULL argument. -*/ -#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ - || !defined(SQLITE_OMIT_SUBQUERY) -SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p){ - SrcList *pNew; - int i; - int nByte; - if( p==0 ) return 0; - nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); - pNew = sqlite3DbMallocRaw(db, nByte ); - if( pNew==0 ) return 0; - pNew->nSrc = pNew->nAlloc = p->nSrc; - for(i=0; inSrc; i++){ - struct SrcList_item *pNewItem = &pNew->a[i]; - struct SrcList_item *pOldItem = &p->a[i]; - Table *pTab; - pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); - pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); - pNewItem->jointype = pOldItem->jointype; - pNewItem->iCursor = pOldItem->iCursor; - pNewItem->isPopulated = pOldItem->isPopulated; - pTab = pNewItem->pTab = pOldItem->pTab; - if( pTab ){ - pTab->nRef++; - } - pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect); - pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn); - pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); - pNewItem->colUsed = pOldItem->colUsed; - } - return pNew; -} -IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ - IdList *pNew; - int i; - if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); - if( pNew==0 ) return 0; - pNew->nId = pNew->nAlloc = p->nId; - pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) ); - if( pNew->a==0 ){ - sqlite3_free(pNew); - return 0; - } - for(i=0; inId; i++){ - struct IdList_item *pNewItem = &pNew->a[i]; - struct IdList_item *pOldItem = &p->a[i]; - pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pNewItem->idx = pOldItem->idx; - } - return pNew; -} -Select *sqlite3SelectDup(sqlite3 *db, Select *p){ - Select *pNew; - if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); - if( pNew==0 ) return 0; - pNew->isDistinct = p->isDistinct; - pNew->pEList = sqlite3ExprListDup(db, p->pEList); - pNew->pSrc = sqlite3SrcListDup(db, p->pSrc); - pNew->pWhere = sqlite3ExprDup(db, p->pWhere); - pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy); - pNew->pHaving = sqlite3ExprDup(db, p->pHaving); - pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy); - pNew->op = p->op; - pNew->pPrior = sqlite3SelectDup(db, p->pPrior); - pNew->pLimit = sqlite3ExprDup(db, p->pLimit); - pNew->pOffset = sqlite3ExprDup(db, p->pOffset); - pNew->iLimit = -1; - pNew->iOffset = -1; - pNew->isResolved = p->isResolved; - pNew->isAgg = p->isAgg; - pNew->usesEphm = 0; - pNew->disallowOrderBy = 0; - pNew->pRightmost = 0; - pNew->addrOpenEphm[0] = -1; - pNew->addrOpenEphm[1] = -1; - pNew->addrOpenEphm[2] = -1; - return pNew; -} -#else -Select *sqlite3SelectDup(sqlite3 *db, Select *p){ - assert( p==0 ); - return 0; -} -#endif - - -/* -** Add a new element to the end of an expression list. If pList is -** initially NULL, then create a new expression list. -*/ -ExprList *sqlite3ExprListAppend( - Parse *pParse, /* Parsing context */ - ExprList *pList, /* List to which to append. Might be NULL */ - Expr *pExpr, /* Expression to be appended */ - Token *pName /* AS keyword for the expression */ -){ - sqlite3 *db = pParse->db; - if( pList==0 ){ - pList = sqlite3DbMallocZero(db, sizeof(ExprList) ); - if( pList==0 ){ - goto no_mem; - } - assert( pList->nAlloc==0 ); - } - if( pList->nAlloc<=pList->nExpr ){ - struct ExprList_item *a; - int n = pList->nAlloc*2 + 4; - a = sqlite3DbRealloc(db, pList->a, n*sizeof(pList->a[0])); - if( a==0 ){ - goto no_mem; - } - pList->a = a; - pList->nAlloc = n; - } - assert( pList->a!=0 ); - if( pExpr || pName ){ - struct ExprList_item *pItem = &pList->a[pList->nExpr++]; - memset(pItem, 0, sizeof(*pItem)); - pItem->zName = sqlite3NameFromToken(db, pName); - pItem->pExpr = pExpr; - } - return pList; - -no_mem: - /* Avoid leaking memory if malloc has failed. */ - sqlite3ExprDelete(pExpr); - sqlite3ExprListDelete(pList); - return 0; -} - -/* -** If the expression list pEList contains more than iLimit elements, -** leave an error message in pParse. -*/ -void sqlite3ExprListCheckLength( - Parse *pParse, - ExprList *pEList, - int iLimit, - const char *zObject -){ - if( pEList && pEList->nExpr>iLimit ){ - sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); - } -} - - -#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 -/* The following three functions, heightOfExpr(), heightOfExprList() -** and heightOfSelect(), are used to determine the maximum height -** of any expression tree referenced by the structure passed as the -** first argument. -** -** If this maximum height is greater than the current value pointed -** to by pnHeight, the second parameter, then set *pnHeight to that -** value. -*/ -static void heightOfExpr(Expr *p, int *pnHeight){ - if( p ){ - if( p->nHeight>*pnHeight ){ - *pnHeight = p->nHeight; - } - } -} -static void heightOfExprList(ExprList *p, int *pnHeight){ - if( p ){ - int i; - for(i=0; inExpr; i++){ - heightOfExpr(p->a[i].pExpr, pnHeight); - } - } -} -static void heightOfSelect(Select *p, int *pnHeight){ - if( p ){ - heightOfExpr(p->pWhere, pnHeight); - heightOfExpr(p->pHaving, pnHeight); - heightOfExpr(p->pLimit, pnHeight); - heightOfExpr(p->pOffset, pnHeight); - heightOfExprList(p->pEList, pnHeight); - heightOfExprList(p->pGroupBy, pnHeight); - heightOfExprList(p->pOrderBy, pnHeight); - heightOfSelect(p->pPrior, pnHeight); - } -} - -/* -** Set the Expr.nHeight variable in the structure passed as an -** argument. An expression with no children, Expr.pList or -** Expr.pSelect member has a height of 1. Any other expression -** has a height equal to the maximum height of any other -** referenced Expr plus one. -*/ -void sqlite3ExprSetHeight(Expr *p){ - int nHeight = 0; - heightOfExpr(p->pLeft, &nHeight); - heightOfExpr(p->pRight, &nHeight); - heightOfExprList(p->pList, &nHeight); - heightOfSelect(p->pSelect, &nHeight); - p->nHeight = nHeight + 1; -} - -/* -** Return the maximum height of any expression tree referenced -** by the select statement passed as an argument. -*/ -int sqlite3SelectExprHeight(Select *p){ - int nHeight = 0; - heightOfSelect(p, &nHeight); - return nHeight; -} -#endif - -/* -** Delete an entire expression list. -*/ -void sqlite3ExprListDelete(ExprList *pList){ - int i; - struct ExprList_item *pItem; - if( pList==0 ) return; - assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) ); - assert( pList->nExpr<=pList->nAlloc ); - for(pItem=pList->a, i=0; inExpr; i++, pItem++){ - sqlite3ExprDelete(pItem->pExpr); - sqlite3_free(pItem->zName); - } - sqlite3_free(pList->a); - sqlite3_free(pList); -} - -/* -** Walk an expression tree. Call xFunc for each node visited. -** -** The return value from xFunc determines whether the tree walk continues. -** 0 means continue walking the tree. 1 means do not walk children -** of the current node but continue with siblings. 2 means abandon -** the tree walk completely. -** -** The return value from this routine is 1 to abandon the tree walk -** and 0 to continue. -** -** NOTICE: This routine does *not* descend into subqueries. -*/ -static int walkExprList(ExprList *, int (*)(void *, Expr*), void *); -static int walkExprTree(Expr *pExpr, int (*xFunc)(void*,Expr*), void *pArg){ - int rc; - if( pExpr==0 ) return 0; - rc = (*xFunc)(pArg, pExpr); - if( rc==0 ){ - if( walkExprTree(pExpr->pLeft, xFunc, pArg) ) return 1; - if( walkExprTree(pExpr->pRight, xFunc, pArg) ) return 1; - if( walkExprList(pExpr->pList, xFunc, pArg) ) return 1; - } - return rc>1; -} - -/* -** Call walkExprTree() for every expression in list p. -*/ -static int walkExprList(ExprList *p, int (*xFunc)(void *, Expr*), void *pArg){ - int i; - struct ExprList_item *pItem; - if( !p ) return 0; - for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){ - if( walkExprTree(pItem->pExpr, xFunc, pArg) ) return 1; - } - return 0; -} - -/* -** Call walkExprTree() for every expression in Select p, not including -** expressions that are part of sub-selects in any FROM clause or the LIMIT -** or OFFSET expressions.. -*/ -static int walkSelectExpr(Select *p, int (*xFunc)(void *, Expr*), void *pArg){ - walkExprList(p->pEList, xFunc, pArg); - walkExprTree(p->pWhere, xFunc, pArg); - walkExprList(p->pGroupBy, xFunc, pArg); - walkExprTree(p->pHaving, xFunc, pArg); - walkExprList(p->pOrderBy, xFunc, pArg); - if( p->pPrior ){ - walkSelectExpr(p->pPrior, xFunc, pArg); - } - return 0; -} - - -/* -** This routine is designed as an xFunc for walkExprTree(). -** -** pArg is really a pointer to an integer. If we can tell by looking -** at pExpr that the expression that contains pExpr is not a constant -** expression, then set *pArg to 0 and return 2 to abandon the tree walk. -** If pExpr does does not disqualify the expression from being a constant -** then do nothing. -** -** After walking the whole tree, if no nodes are found that disqualify -** the expression as constant, then we assume the whole expression -** is constant. See sqlite3ExprIsConstant() for additional information. -*/ -static int exprNodeIsConstant(void *pArg, Expr *pExpr){ - int *pN = (int*)pArg; - - /* If *pArg is 3 then any term of the expression that comes from - ** the ON or USING clauses of a join disqualifies the expression - ** from being considered constant. */ - if( (*pN)==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){ - *pN = 0; - return 2; - } - - switch( pExpr->op ){ - /* Consider functions to be constant if all their arguments are constant - ** and *pArg==2 */ - case TK_FUNCTION: - if( (*pN)==2 ) return 0; - /* Fall through */ - case TK_ID: - case TK_COLUMN: - case TK_DOT: - case TK_AGG_FUNCTION: - case TK_AGG_COLUMN: -#ifndef SQLITE_OMIT_SUBQUERY - case TK_SELECT: - case TK_EXISTS: -#endif - *pN = 0; - return 2; - case TK_IN: - if( pExpr->pSelect ){ - *pN = 0; - return 2; - } - default: - return 0; - } -} - -/* -** Walk an expression tree. Return 1 if the expression is constant -** and 0 if it involves variables or function calls. -** -** For the purposes of this function, a double-quoted string (ex: "abc") -** is considered a variable but a single-quoted string (ex: 'abc') is -** a constant. -*/ -int sqlite3ExprIsConstant(Expr *p){ - int isConst = 1; - walkExprTree(p, exprNodeIsConstant, &isConst); - return isConst; -} - -/* -** Walk an expression tree. Return 1 if the expression is constant -** that does no originate from the ON or USING clauses of a join. -** Return 0 if it involves variables or function calls or terms from -** an ON or USING clause. -*/ -int sqlite3ExprIsConstantNotJoin(Expr *p){ - int isConst = 3; - walkExprTree(p, exprNodeIsConstant, &isConst); - return isConst!=0; -} - -/* -** Walk an expression tree. Return 1 if the expression is constant -** or a function call with constant arguments. Return and 0 if there -** are any variables. -** -** For the purposes of this function, a double-quoted string (ex: "abc") -** is considered a variable but a single-quoted string (ex: 'abc') is -** a constant. -*/ -int sqlite3ExprIsConstantOrFunction(Expr *p){ - int isConst = 2; - walkExprTree(p, exprNodeIsConstant, &isConst); - return isConst!=0; -} - -/* -** If the expression p codes a constant integer that is small enough -** to fit in a 32-bit integer, return 1 and put the value of the integer -** in *pValue. If the expression is not an integer or if it is too big -** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. -*/ -int sqlite3ExprIsInteger(Expr *p, int *pValue){ - switch( p->op ){ - case TK_INTEGER: { - if( sqlite3GetInt32((char*)p->token.z, pValue) ){ - return 1; - } - break; - } - case TK_UPLUS: { - return sqlite3ExprIsInteger(p->pLeft, pValue); - } - case TK_UMINUS: { - int v; - if( sqlite3ExprIsInteger(p->pLeft, &v) ){ - *pValue = -v; - return 1; - } - break; - } - default: break; - } - return 0; -} - -/* -** Return TRUE if the given string is a row-id column name. -*/ -int sqlite3IsRowid(const char *z){ - if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; - if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; - if( sqlite3StrICmp(z, "OID")==0 ) return 1; - return 0; -} - -/* -** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up -** that name in the set of source tables in pSrcList and make the pExpr -** expression node refer back to that source column. The following changes -** are made to pExpr: -** -** pExpr->iDb Set the index in db->aDb[] of the database holding -** the table. -** pExpr->iTable Set to the cursor number for the table obtained -** from pSrcList. -** pExpr->iColumn Set to the column number within the table. -** pExpr->op Set to TK_COLUMN. -** pExpr->pLeft Any expression this points to is deleted -** pExpr->pRight Any expression this points to is deleted. -** -** The pDbToken is the name of the database (the "X"). This value may be -** NULL meaning that name is of the form Y.Z or Z. Any available database -** can be used. The pTableToken is the name of the table (the "Y"). This -** value can be NULL if pDbToken is also NULL. If pTableToken is NULL it -** means that the form of the name is Z and that columns from any table -** can be used. -** -** If the name cannot be resolved unambiguously, leave an error message -** in pParse and return non-zero. Return zero on success. -*/ -static int lookupName( - Parse *pParse, /* The parsing context */ - Token *pDbToken, /* Name of the database containing table, or NULL */ - Token *pTableToken, /* Name of table containing column, or NULL */ - Token *pColumnToken, /* Name of the column. */ - NameContext *pNC, /* The name context used to resolve the name */ - Expr *pExpr /* Make this EXPR node point to the selected column */ -){ - char *zDb = 0; /* Name of the database. The "X" in X.Y.Z */ - char *zTab = 0; /* Name of the table. The "Y" in X.Y.Z or Y.Z */ - char *zCol = 0; /* Name of the column. The "Z" */ - int i, j; /* Loop counters */ - int cnt = 0; /* Number of matching column names */ - int cntTab = 0; /* Number of matching table names */ - sqlite3 *db = pParse->db; /* The database */ - struct SrcList_item *pItem; /* Use for looping over pSrcList items */ - struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ - NameContext *pTopNC = pNC; /* First namecontext in the list */ - Schema *pSchema = 0; /* Schema of the expression */ - - assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */ - zDb = sqlite3NameFromToken(db, pDbToken); - zTab = sqlite3NameFromToken(db, pTableToken); - zCol = sqlite3NameFromToken(db, pColumnToken); - if( db->mallocFailed ){ - goto lookupname_end; - } - - pExpr->iTable = -1; - while( pNC && cnt==0 ){ - ExprList *pEList; - SrcList *pSrcList = pNC->pSrcList; - - if( pSrcList ){ - for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ - Table *pTab; - int iDb; - Column *pCol; - - pTab = pItem->pTab; - assert( pTab!=0 ); - iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - assert( pTab->nCol>0 ); - if( zTab ){ - if( pItem->zAlias ){ - char *zTabName = pItem->zAlias; - if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue; - }else{ - char *zTabName = pTab->zName; - if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue; - if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){ - continue; - } - } - } - if( 0==(cntTab++) ){ - pExpr->iTable = pItem->iCursor; - pSchema = pTab->pSchema; - pMatch = pItem; - } - for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ - if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ - const char *zColl = pTab->aCol[j].zColl; - IdList *pUsing; - cnt++; - pExpr->iTable = pItem->iCursor; - pMatch = pItem; - pSchema = pTab->pSchema; - /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ - pExpr->iColumn = j==pTab->iPKey ? -1 : j; - pExpr->affinity = pTab->aCol[j].affinity; - if( (pExpr->flags & EP_ExpCollate)==0 ){ - pExpr->pColl = sqlite3FindCollSeq(db, ENC(db), zColl,-1, 0); - } - if( inSrc-1 ){ - if( pItem[1].jointype & JT_NATURAL ){ - /* If this match occurred in the left table of a natural join, - ** then skip the right table to avoid a duplicate match */ - pItem++; - i++; - }else if( (pUsing = pItem[1].pUsing)!=0 ){ - /* If this match occurs on a column that is in the USING clause - ** of a join, skip the search of the right table of the join - ** to avoid a duplicate match there. */ - int k; - for(k=0; knId; k++){ - if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ){ - pItem++; - i++; - break; - } - } - } - } - break; - } - } - } - } - -#ifndef SQLITE_OMIT_TRIGGER - /* If we have not already resolved the name, then maybe - ** it is a new.* or old.* trigger argument reference - */ - if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){ - TriggerStack *pTriggerStack = pParse->trigStack; - Table *pTab = 0; - if( pTriggerStack->newIdx != -1 && sqlite3StrICmp("new", zTab) == 0 ){ - pExpr->iTable = pTriggerStack->newIdx; - assert( pTriggerStack->pTab ); - pTab = pTriggerStack->pTab; - }else if( pTriggerStack->oldIdx != -1 && sqlite3StrICmp("old", zTab)==0 ){ - pExpr->iTable = pTriggerStack->oldIdx; - assert( pTriggerStack->pTab ); - pTab = pTriggerStack->pTab; - } - - if( pTab ){ - int iCol; - Column *pCol = pTab->aCol; - - pSchema = pTab->pSchema; - cntTab++; - for(iCol=0; iCol < pTab->nCol; iCol++, pCol++) { - if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ - const char *zColl = pTab->aCol[iCol].zColl; - cnt++; - pExpr->iColumn = iCol==pTab->iPKey ? -1 : iCol; - pExpr->affinity = pTab->aCol[iCol].affinity; - if( (pExpr->flags & EP_ExpCollate)==0 ){ - pExpr->pColl = sqlite3FindCollSeq(db, ENC(db), zColl,-1, 0); - } - pExpr->pTab = pTab; - break; - } - } - } - } -#endif /* !defined(SQLITE_OMIT_TRIGGER) */ - - /* - ** Perhaps the name is a reference to the ROWID - */ - if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){ - cnt = 1; - pExpr->iColumn = -1; - pExpr->affinity = SQLITE_AFF_INTEGER; - } - - /* - ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z - ** might refer to an result-set alias. This happens, for example, when - ** we are resolving names in the WHERE clause of the following command: - ** - ** SELECT a+b AS x FROM table WHERE x<10; - ** - ** In cases like this, replace pExpr with a copy of the expression that - ** forms the result set entry ("a+b" in the example) and return immediately. - ** Note that the expression in the result set should have already been - ** resolved by the time the WHERE clause is resolved. - */ - if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){ - for(j=0; jnExpr; j++){ - char *zAs = pEList->a[j].zName; - if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ - Expr *pDup, *pOrig; - assert( pExpr->pLeft==0 && pExpr->pRight==0 ); - assert( pExpr->pList==0 ); - assert( pExpr->pSelect==0 ); - pOrig = pEList->a[j].pExpr; - if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){ - sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); - sqlite3_free(zCol); - return 2; - } - pDup = sqlite3ExprDup(db, pOrig); - if( pExpr->flags & EP_ExpCollate ){ - pDup->pColl = pExpr->pColl; - pDup->flags |= EP_ExpCollate; - } - if( pExpr->span.dyn ) sqlite3_free((char*)pExpr->span.z); - if( pExpr->token.dyn ) sqlite3_free((char*)pExpr->token.z); - memcpy(pExpr, pDup, sizeof(*pExpr)); - sqlite3_free(pDup); - cnt = 1; - pMatch = 0; - assert( zTab==0 && zDb==0 ); - goto lookupname_end_2; - } - } - } - - /* Advance to the next name context. The loop will exit when either - ** we have a match (cnt>0) or when we run out of name contexts. - */ - if( cnt==0 ){ - pNC = pNC->pNext; - } - } - - /* - ** If X and Y are NULL (in other words if only the column name Z is - ** supplied) and the value of Z is enclosed in double-quotes, then - ** Z is a string literal if it doesn't match any column names. In that - ** case, we need to return right away and not make any changes to - ** pExpr. - ** - ** Because no reference was made to outer contexts, the pNC->nRef - ** fields are not changed in any context. - */ - if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){ - sqlite3_free(zCol); - return 0; - } - - /* - ** cnt==0 means there was not match. cnt>1 means there were two or - ** more matches. Either way, we have an error. - */ - if( cnt!=1 ){ - char *z = 0; - char *zErr; - zErr = cnt==0 ? "no such column: %s" : "ambiguous column name: %s"; - if( zDb ){ - sqlite3SetString(&z, zDb, ".", zTab, ".", zCol, (char*)0); - }else if( zTab ){ - sqlite3SetString(&z, zTab, ".", zCol, (char*)0); - }else{ - z = sqlite3StrDup(zCol); - } - if( z ){ - sqlite3ErrorMsg(pParse, zErr, z); - sqlite3_free(z); - pTopNC->nErr++; - }else{ - db->mallocFailed = 1; - } - } - - /* If a column from a table in pSrcList is referenced, then record - ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes - ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the - ** column number is greater than the number of bits in the bitmask - ** then set the high-order bit of the bitmask. - */ - if( pExpr->iColumn>=0 && pMatch!=0 ){ - int n = pExpr->iColumn; - if( n>=sizeof(Bitmask)*8 ){ - n = sizeof(Bitmask)*8-1; - } - assert( pMatch->iCursor==pExpr->iTable ); - pMatch->colUsed |= ((Bitmask)1)<pLeft); - pExpr->pLeft = 0; - sqlite3ExprDelete(pExpr->pRight); - pExpr->pRight = 0; - pExpr->op = TK_COLUMN; -lookupname_end_2: - sqlite3_free(zCol); - if( cnt==1 ){ - assert( pNC!=0 ); - sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); - if( pMatch && !pMatch->pSelect ){ - pExpr->pTab = pMatch->pTab; - } - /* Increment the nRef value on all name contexts from TopNC up to - ** the point where the name matched. */ - for(;;){ - assert( pTopNC!=0 ); - pTopNC->nRef++; - if( pTopNC==pNC ) break; - pTopNC = pTopNC->pNext; - } - return 0; - } else { - return 1; - } -} - -/* -** This routine is designed as an xFunc for walkExprTree(). -** -** Resolve symbolic names into TK_COLUMN operators for the current -** node in the expression tree. Return 0 to continue the search down -** the tree or 2 to abort the tree walk. -** -** This routine also does error checking and name resolution for -** function names. The operator for aggregate functions is changed -** to TK_AGG_FUNCTION. -*/ -static int nameResolverStep(void *pArg, Expr *pExpr){ - NameContext *pNC = (NameContext*)pArg; - Parse *pParse; - - if( pExpr==0 ) return 1; - assert( pNC!=0 ); - pParse = pNC->pParse; - - if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return 1; - ExprSetProperty(pExpr, EP_Resolved); -#ifndef NDEBUG - if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ - SrcList *pSrcList = pNC->pSrcList; - int i; - for(i=0; ipSrcList->nSrc; i++){ - assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursornTab); - } - } -#endif - switch( pExpr->op ){ - /* Double-quoted strings (ex: "abc") are used as identifiers if - ** possible. Otherwise they remain as strings. Single-quoted - ** strings (ex: 'abc') are always string literals. - */ - case TK_STRING: { - if( pExpr->token.z[0]=='\'' ) break; - /* Fall thru into the TK_ID case if this is a double-quoted string */ - } - /* A lone identifier is the name of a column. - */ - case TK_ID: { - lookupName(pParse, 0, 0, &pExpr->token, pNC, pExpr); - return 1; - } - - /* A table name and column name: ID.ID - ** Or a database, table and column: ID.ID.ID - */ - case TK_DOT: { - Token *pColumn; - Token *pTable; - Token *pDb; - Expr *pRight; - - /* if( pSrcList==0 ) break; */ - pRight = pExpr->pRight; - if( pRight->op==TK_ID ){ - pDb = 0; - pTable = &pExpr->pLeft->token; - pColumn = &pRight->token; - }else{ - assert( pRight->op==TK_DOT ); - pDb = &pExpr->pLeft->token; - pTable = &pRight->pLeft->token; - pColumn = &pRight->pRight->token; - } - lookupName(pParse, pDb, pTable, pColumn, pNC, pExpr); - return 1; - } - - /* Resolve function names - */ - case TK_CONST_FUNC: - case TK_FUNCTION: { - ExprList *pList = pExpr->pList; /* The argument list */ - int n = pList ? pList->nExpr : 0; /* Number of arguments */ - int no_such_func = 0; /* True if no such function exists */ - int wrong_num_args = 0; /* True if wrong number of arguments */ - int is_agg = 0; /* True if is an aggregate function */ - int i; - int auth; /* Authorization to use the function */ - int nId; /* Number of characters in function name */ - const char *zId; /* The function name. */ - FuncDef *pDef; /* Information about the function */ - int enc = ENC(pParse->db); /* The database encoding */ - - zId = (char*)pExpr->token.z; - nId = pExpr->token.n; - pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); - if( pDef==0 ){ - pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, enc, 0); - if( pDef==0 ){ - no_such_func = 1; - }else{ - wrong_num_args = 1; - } - }else{ - is_agg = pDef->xFunc==0; - } -#ifndef SQLITE_OMIT_AUTHORIZATION - if( pDef ){ - auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); - if( auth!=SQLITE_OK ){ - if( auth==SQLITE_DENY ){ - sqlite3ErrorMsg(pParse, "not authorized to use function: %s", - pDef->zName); - pNC->nErr++; - } - pExpr->op = TK_NULL; - return 1; - } - } -#endif - if( is_agg && !pNC->allowAgg ){ - sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); - pNC->nErr++; - is_agg = 0; - }else if( no_such_func ){ - sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); - pNC->nErr++; - }else if( wrong_num_args ){ - sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", - nId, zId); - pNC->nErr++; - } - if( is_agg ){ - pExpr->op = TK_AGG_FUNCTION; - pNC->hasAgg = 1; - } - if( is_agg ) pNC->allowAgg = 0; - for(i=0; pNC->nErr==0 && ia[i].pExpr, nameResolverStep, pNC); - } - if( is_agg ) pNC->allowAgg = 1; - /* FIX ME: Compute pExpr->affinity based on the expected return - ** type of the function - */ - return is_agg; - } -#ifndef SQLITE_OMIT_SUBQUERY - case TK_SELECT: - case TK_EXISTS: -#endif - case TK_IN: { - if( pExpr->pSelect ){ - int nRef = pNC->nRef; -#ifndef SQLITE_OMIT_CHECK - if( pNC->isCheck ){ - sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints"); - } -#endif - sqlite3SelectResolve(pParse, pExpr->pSelect, pNC); - assert( pNC->nRef>=nRef ); - if( nRef!=pNC->nRef ){ - ExprSetProperty(pExpr, EP_VarSelect); - } - } - break; - } -#ifndef SQLITE_OMIT_CHECK - case TK_VARIABLE: { - if( pNC->isCheck ){ - sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints"); - } - break; - } -#endif - } - return 0; -} - -/* -** This routine walks an expression tree and resolves references to -** table columns. Nodes of the form ID.ID or ID resolve into an -** index to the table in the table list and a column offset. The -** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable -** value is changed to the index of the referenced table in pTabList -** plus the "base" value. The base value will ultimately become the -** VDBE cursor number for a cursor that is pointing into the referenced -** table. The Expr.iColumn value is changed to the index of the column -** of the referenced table. The Expr.iColumn value for the special -** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an -** alias for ROWID. -** -** Also resolve function names and check the functions for proper -** usage. Make sure all function names are recognized and all functions -** have the correct number of arguments. Leave an error message -** in pParse->zErrMsg if anything is amiss. Return the number of errors. -** -** If the expression contains aggregate functions then set the EP_Agg -** property on the expression. -*/ -int sqlite3ExprResolveNames( - NameContext *pNC, /* Namespace to resolve expressions in. */ - Expr *pExpr /* The expression to be analyzed. */ -){ - int savedHasAgg; - if( pExpr==0 ) return 0; -#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 - if( (pExpr->nHeight+pNC->pParse->nHeight)>SQLITE_MAX_EXPR_DEPTH ){ - sqlite3ErrorMsg(pNC->pParse, - "Expression tree is too large (maximum depth %d)", - SQLITE_MAX_EXPR_DEPTH - ); - return 1; - } - pNC->pParse->nHeight += pExpr->nHeight; -#endif - savedHasAgg = pNC->hasAgg; - pNC->hasAgg = 0; - walkExprTree(pExpr, nameResolverStep, pNC); -#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 - pNC->pParse->nHeight -= pExpr->nHeight; -#endif - if( pNC->nErr>0 ){ - ExprSetProperty(pExpr, EP_Error); - } - if( pNC->hasAgg ){ - ExprSetProperty(pExpr, EP_Agg); - }else if( savedHasAgg ){ - pNC->hasAgg = 1; - } - return ExprHasProperty(pExpr, EP_Error); -} - -/* -** A pointer instance of this structure is used to pass information -** through walkExprTree into codeSubqueryStep(). -*/ -typedef struct QueryCoder QueryCoder; -struct QueryCoder { - Parse *pParse; /* The parsing context */ - NameContext *pNC; /* Namespace of first enclosing query */ -}; - - -/* -** Generate code for scalar subqueries used as an expression -** and IN operators. Examples: -** -** (SELECT a FROM b) -- subquery -** EXISTS (SELECT a FROM b) -- EXISTS subquery -** x IN (4,5,11) -- IN operator with list on right-hand side -** x IN (SELECT a FROM b) -- IN operator with subquery on the right -** -** The pExpr parameter describes the expression that contains the IN -** operator or subquery. -*/ -#ifndef SQLITE_OMIT_SUBQUERY -void sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ - int testAddr = 0; /* One-time test address */ - Vdbe *v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - - - /* This code must be run in its entirety every time it is encountered - ** if any of the following is true: - ** - ** * The right-hand side is a correlated subquery - ** * The right-hand side is an expression list containing variables - ** * We are inside a trigger - ** - ** If all of the above are false, then we can run this code just once - ** save the results, and reuse the same result on subsequent invocations. - */ - if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->trigStack ){ - int mem = pParse->nMem++; - sqlite3VdbeAddOp(v, OP_MemLoad, mem, 0); - testAddr = sqlite3VdbeAddOp(v, OP_If, 0, 0); - assert( testAddr>0 || pParse->db->mallocFailed ); - sqlite3VdbeAddOp(v, OP_MemInt, 1, mem); - } - - switch( pExpr->op ){ - case TK_IN: { - char affinity; - KeyInfo keyInfo; - int addr; /* Address of OP_OpenEphemeral instruction */ - - affinity = sqlite3ExprAffinity(pExpr->pLeft); - - /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' - ** expression it is handled the same way. A virtual table is - ** filled with single-field index keys representing the results - ** from the SELECT or the . - ** - ** If the 'x' expression is a column value, or the SELECT... - ** statement returns a column value, then the affinity of that - ** column is used to build the index keys. If both 'x' and the - ** SELECT... statement are columns, then numeric affinity is used - ** if either column has NUMERIC or INTEGER affinity. If neither - ** 'x' nor the SELECT... statement are columns, then numeric affinity - ** is used. - */ - pExpr->iTable = pParse->nTab++; - addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, pExpr->iTable, 0); - memset(&keyInfo, 0, sizeof(keyInfo)); - keyInfo.nField = 1; - sqlite3VdbeAddOp(v, OP_SetNumColumns, pExpr->iTable, 1); - - if( pExpr->pSelect ){ - /* Case 1: expr IN (SELECT ...) - ** - ** Generate code to write the results of the select into the temporary - ** table allocated and opened above. - */ - int iParm = pExpr->iTable + (((int)affinity)<<16); - ExprList *pEList; - assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable ); - if( sqlite3Select(pParse, pExpr->pSelect, SRT_Set, iParm, 0, 0, 0, 0) ){ - return; - } - pEList = pExpr->pSelect->pEList; - if( pEList && pEList->nExpr>0 ){ - keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, - pEList->a[0].pExpr); - } - }else if( pExpr->pList ){ - /* Case 2: expr IN (exprlist) - ** - ** For each expression, build an index key from the evaluation and - ** store it in the temporary table. If is a column, then use - ** that columns affinity when building index keys. If is not - ** a column, use numeric affinity. - */ - int i; - ExprList *pList = pExpr->pList; - struct ExprList_item *pItem; - - if( !affinity ){ - affinity = SQLITE_AFF_NONE; - } - keyInfo.aColl[0] = pExpr->pLeft->pColl; - - /* Loop through each expression in . */ - for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ - Expr *pE2 = pItem->pExpr; - - /* If the expression is not constant then we will need to - ** disable the test that was generated above that makes sure - ** this code only executes once. Because for a non-constant - ** expression we need to rerun this code each time. - */ - if( testAddr>0 && !sqlite3ExprIsConstant(pE2) ){ - sqlite3VdbeChangeToNoop(v, testAddr-1, 3); - testAddr = 0; - } - - /* Evaluate the expression and insert it into the temp table */ - sqlite3ExprCode(pParse, pE2); - sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &affinity, 1); - sqlite3VdbeAddOp(v, OP_IdxInsert, pExpr->iTable, 0); - } - } - sqlite3VdbeChangeP3(v, addr, (void *)&keyInfo, P3_KEYINFO); - break; - } - - case TK_EXISTS: - case TK_SELECT: { - /* This has to be a scalar SELECT. Generate code to put the - ** value of this select in a memory cell and record the number - ** of the memory cell in iColumn. - */ - static const Token one = { (u8*)"1", 0, 1 }; - Select *pSel; - int iMem; - int sop; - - pExpr->iColumn = iMem = pParse->nMem++; - pSel = pExpr->pSelect; - if( pExpr->op==TK_SELECT ){ - sop = SRT_Mem; - sqlite3VdbeAddOp(v, OP_MemNull, iMem, 0); - VdbeComment((v, "# Init subquery result")); - }else{ - sop = SRT_Exists; - sqlite3VdbeAddOp(v, OP_MemInt, 0, iMem); - VdbeComment((v, "# Init EXISTS result")); - } - sqlite3ExprDelete(pSel->pLimit); - pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &one); - if( sqlite3Select(pParse, pSel, sop, iMem, 0, 0, 0, 0) ){ - return; - } - break; - } - } - - if( testAddr ){ - sqlite3VdbeJumpHere(v, testAddr); - } - - return; -} -#endif /* SQLITE_OMIT_SUBQUERY */ - -/* -** Generate an instruction that will put the integer describe by -** text z[0..n-1] on the stack. -*/ -static void codeInteger(Vdbe *v, const char *z, int n){ - assert( z || v==0 || sqlite3VdbeDb(v)->mallocFailed ); - if( z ){ - int i; - if( sqlite3GetInt32(z, &i) ){ - sqlite3VdbeAddOp(v, OP_Integer, i, 0); - }else if( sqlite3FitsIn64Bits(z) ){ - sqlite3VdbeOp3(v, OP_Int64, 0, 0, z, n); - }else{ - sqlite3VdbeOp3(v, OP_Real, 0, 0, z, n); - } - } -} - - -/* -** Generate code that will extract the iColumn-th column from -** table pTab and push that column value on the stack. There -** is an open cursor to pTab in iTable. If iColumn<0 then -** code is generated that extracts the rowid. -*/ -void sqlite3ExprCodeGetColumn(Vdbe *v, Table *pTab, int iColumn, int iTable){ - if( iColumn<0 ){ - int op = (pTab && IsVirtual(pTab)) ? OP_VRowid : OP_Rowid; - sqlite3VdbeAddOp(v, op, iTable, 0); - }else if( pTab==0 ){ - sqlite3VdbeAddOp(v, OP_Column, iTable, iColumn); - }else{ - int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; - sqlite3VdbeAddOp(v, op, iTable, iColumn); - sqlite3ColumnDefault(v, pTab, iColumn); -#ifndef SQLITE_OMIT_FLOATING_POINT - if( pTab->aCol[iColumn].affinity==SQLITE_AFF_REAL ){ - sqlite3VdbeAddOp(v, OP_RealAffinity, 0, 0); - } -#endif - } -} - -/* -** Generate code into the current Vdbe to evaluate the given -** expression and leave the result on the top of stack. -** -** This code depends on the fact that certain token values (ex: TK_EQ) -** are the same as opcode values (ex: OP_Eq) that implement the corresponding -** operation. Special comments in vdbe.c and the mkopcodeh.awk script in -** the make process cause these values to align. Assert()s in the code -** below verify that the numbers are aligned correctly. -*/ -void sqlite3ExprCode(Parse *pParse, Expr *pExpr){ - Vdbe *v = pParse->pVdbe; - int op; - int stackChng = 1; /* Amount of change to stack depth */ - - if( v==0 ) return; - if( pExpr==0 ){ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - return; - } - op = pExpr->op; - switch( op ){ - case TK_AGG_COLUMN: { - AggInfo *pAggInfo = pExpr->pAggInfo; - struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; - if( !pAggInfo->directMode ){ - sqlite3VdbeAddOp(v, OP_MemLoad, pCol->iMem, 0); - break; - }else if( pAggInfo->useSortingIdx ){ - sqlite3VdbeAddOp(v, OP_Column, pAggInfo->sortingIdx, - pCol->iSorterColumn); - break; - } - /* Otherwise, fall thru into the TK_COLUMN case */ - } - case TK_COLUMN: { - if( pExpr->iTable<0 ){ - /* This only happens when coding check constraints */ - assert( pParse->ckOffset>0 ); - sqlite3VdbeAddOp(v, OP_Dup, pParse->ckOffset-pExpr->iColumn-1, 1); - }else{ - sqlite3ExprCodeGetColumn(v, pExpr->pTab, pExpr->iColumn, pExpr->iTable); - } - break; - } - case TK_INTEGER: { - codeInteger(v, (char*)pExpr->token.z, pExpr->token.n); - break; - } - case TK_FLOAT: - case TK_STRING: { - assert( TK_FLOAT==OP_Real ); - assert( TK_STRING==OP_String8 ); - sqlite3DequoteExpr(pParse->db, pExpr); - sqlite3VdbeOp3(v, op, 0, 0, (char*)pExpr->token.z, pExpr->token.n); - break; - } - case TK_NULL: { - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - break; - } -#ifndef SQLITE_OMIT_BLOB_LITERAL - case TK_BLOB: { - int n; - const char *z; - assert( TK_BLOB==OP_HexBlob ); - n = pExpr->token.n - 3; - z = (char*)pExpr->token.z + 2; - assert( n>=0 ); - if( n==0 ){ - z = ""; - } - sqlite3VdbeOp3(v, op, 0, 0, z, n); - break; - } -#endif - case TK_VARIABLE: { - sqlite3VdbeAddOp(v, OP_Variable, pExpr->iTable, 0); - if( pExpr->token.n>1 ){ - sqlite3VdbeChangeP3(v, -1, (char*)pExpr->token.z, pExpr->token.n); - } - break; - } - case TK_REGISTER: { - sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iTable, 0); - break; - } -#ifndef SQLITE_OMIT_CAST - case TK_CAST: { - /* Expressions of the form: CAST(pLeft AS token) */ - int aff, to_op; - sqlite3ExprCode(pParse, pExpr->pLeft); - aff = sqlite3AffinityType(&pExpr->token); - to_op = aff - SQLITE_AFF_TEXT + OP_ToText; - assert( to_op==OP_ToText || aff!=SQLITE_AFF_TEXT ); - assert( to_op==OP_ToBlob || aff!=SQLITE_AFF_NONE ); - assert( to_op==OP_ToNumeric || aff!=SQLITE_AFF_NUMERIC ); - assert( to_op==OP_ToInt || aff!=SQLITE_AFF_INTEGER ); - assert( to_op==OP_ToReal || aff!=SQLITE_AFF_REAL ); - sqlite3VdbeAddOp(v, to_op, 0, 0); - stackChng = 0; - break; - } -#endif /* SQLITE_OMIT_CAST */ - case TK_LT: - case TK_LE: - case TK_GT: - case TK_GE: - case TK_NE: - case TK_EQ: { - assert( TK_LT==OP_Lt ); - assert( TK_LE==OP_Le ); - assert( TK_GT==OP_Gt ); - assert( TK_GE==OP_Ge ); - assert( TK_EQ==OP_Eq ); - assert( TK_NE==OP_Ne ); - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3ExprCode(pParse, pExpr->pRight); - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 0, 0); - stackChng = -1; - break; - } - case TK_AND: - case TK_OR: - case TK_PLUS: - case TK_STAR: - case TK_MINUS: - case TK_REM: - case TK_BITAND: - case TK_BITOR: - case TK_SLASH: - case TK_LSHIFT: - case TK_RSHIFT: - case TK_CONCAT: { - assert( TK_AND==OP_And ); - assert( TK_OR==OP_Or ); - assert( TK_PLUS==OP_Add ); - assert( TK_MINUS==OP_Subtract ); - assert( TK_REM==OP_Remainder ); - assert( TK_BITAND==OP_BitAnd ); - assert( TK_BITOR==OP_BitOr ); - assert( TK_SLASH==OP_Divide ); - assert( TK_LSHIFT==OP_ShiftLeft ); - assert( TK_RSHIFT==OP_ShiftRight ); - assert( TK_CONCAT==OP_Concat ); - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3ExprCode(pParse, pExpr->pRight); - sqlite3VdbeAddOp(v, op, 0, 0); - stackChng = -1; - break; - } - case TK_UMINUS: { - Expr *pLeft = pExpr->pLeft; - assert( pLeft ); - if( pLeft->op==TK_FLOAT || pLeft->op==TK_INTEGER ){ - Token *p = &pLeft->token; - char *z = sqlite3MPrintf(pParse->db, "-%.*s", p->n, p->z); - if( pLeft->op==TK_FLOAT ){ - sqlite3VdbeOp3(v, OP_Real, 0, 0, z, p->n+1); - }else{ - codeInteger(v, z, p->n+1); - } - sqlite3_free(z); - break; - } - /* Fall through into TK_NOT */ - } - case TK_BITNOT: - case TK_NOT: { - assert( TK_BITNOT==OP_BitNot ); - assert( TK_NOT==OP_Not ); - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3VdbeAddOp(v, op, 0, 0); - stackChng = 0; - break; - } - case TK_ISNULL: - case TK_NOTNULL: { - int dest; - assert( TK_ISNULL==OP_IsNull ); - assert( TK_NOTNULL==OP_NotNull ); - sqlite3VdbeAddOp(v, OP_Integer, 1, 0); - sqlite3ExprCode(pParse, pExpr->pLeft); - dest = sqlite3VdbeCurrentAddr(v) + 2; - sqlite3VdbeAddOp(v, op, 1, dest); - sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); - stackChng = 0; - break; - } - case TK_AGG_FUNCTION: { - AggInfo *pInfo = pExpr->pAggInfo; - if( pInfo==0 ){ - sqlite3ErrorMsg(pParse, "misuse of aggregate: %T", - &pExpr->span); - }else{ - sqlite3VdbeAddOp(v, OP_MemLoad, pInfo->aFunc[pExpr->iAgg].iMem, 0); - } - break; - } - case TK_CONST_FUNC: - case TK_FUNCTION: { - ExprList *pList = pExpr->pList; - int nExpr = pList ? pList->nExpr : 0; - FuncDef *pDef; - int nId; - const char *zId; - int constMask = 0; - int i; - sqlite3 *db = pParse->db; - u8 enc = ENC(db); - CollSeq *pColl = 0; - - zId = (char*)pExpr->token.z; - nId = pExpr->token.n; - pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, enc, 0); - assert( pDef!=0 ); - nExpr = sqlite3ExprCodeExprList(pParse, pList); -#ifndef SQLITE_OMIT_VIRTUALTABLE - /* Possibly overload the function if the first argument is - ** a virtual table column. - ** - ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the - ** second argument, not the first, as the argument to test to - ** see if it is a column in a virtual table. This is done because - ** the left operand of infix functions (the operand we want to - ** control overloading) ends up as the second argument to the - ** function. The expression "A glob B" is equivalent to - ** "glob(B,A). We want to use the A in "A glob B" to test - ** for function overloading. But we use the B term in "glob(B,A)". - */ - if( nExpr>=2 && (pExpr->flags & EP_InfixFunc) ){ - pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[1].pExpr); - }else if( nExpr>0 ){ - pDef = sqlite3VtabOverloadFunction(db, pDef, nExpr, pList->a[0].pExpr); - } -#endif - for(i=0; ia[i].pExpr) ){ - constMask |= (1<needCollSeq && !pColl ){ - pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr); - } - } - if( pDef->needCollSeq ){ - if( !pColl ) pColl = pParse->db->pDfltColl; - sqlite3VdbeOp3(v, OP_CollSeq, 0, 0, (char *)pColl, P3_COLLSEQ); - } - sqlite3VdbeOp3(v, OP_Function, constMask, nExpr, (char*)pDef, P3_FUNCDEF); - stackChng = 1-nExpr; - break; - } -#ifndef SQLITE_OMIT_SUBQUERY - case TK_EXISTS: - case TK_SELECT: { - if( pExpr->iColumn==0 ){ - sqlite3CodeSubselect(pParse, pExpr); - } - sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); - VdbeComment((v, "# load subquery result")); - break; - } - case TK_IN: { - int addr; - char affinity; - int ckOffset = pParse->ckOffset; - sqlite3CodeSubselect(pParse, pExpr); - - /* Figure out the affinity to use to create a key from the results - ** of the expression. affinityStr stores a static string suitable for - ** P3 of OP_MakeRecord. - */ - affinity = comparisonAffinity(pExpr); - - sqlite3VdbeAddOp(v, OP_Integer, 1, 0); - pParse->ckOffset = (ckOffset ? (ckOffset+1) : 0); - - /* Code the from " IN (...)". The temporary table - ** pExpr->iTable contains the values that make up the (...) set. - */ - sqlite3ExprCode(pParse, pExpr->pLeft); - addr = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+4); /* addr + 0 */ - sqlite3VdbeAddOp(v, OP_Pop, 2, 0); - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, addr+7); - sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &affinity, 1); /* addr + 4 */ - sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, addr+7); - sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); /* addr + 6 */ - - break; - } -#endif - case TK_BETWEEN: { - Expr *pLeft = pExpr->pLeft; - struct ExprList_item *pLItem = pExpr->pList->a; - Expr *pRight = pLItem->pExpr; - sqlite3ExprCode(pParse, pLeft); - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - sqlite3ExprCode(pParse, pRight); - codeCompare(pParse, pLeft, pRight, OP_Ge, 0, 0); - sqlite3VdbeAddOp(v, OP_Pull, 1, 0); - pLItem++; - pRight = pLItem->pExpr; - sqlite3ExprCode(pParse, pRight); - codeCompare(pParse, pLeft, pRight, OP_Le, 0, 0); - sqlite3VdbeAddOp(v, OP_And, 0, 0); - break; - } - case TK_UPLUS: { - sqlite3ExprCode(pParse, pExpr->pLeft); - stackChng = 0; - break; - } - case TK_CASE: { - int expr_end_label; - int jumpInst; - int nExpr; - int i; - ExprList *pEList; - struct ExprList_item *aListelem; - - assert(pExpr->pList); - assert((pExpr->pList->nExpr % 2) == 0); - assert(pExpr->pList->nExpr > 0); - pEList = pExpr->pList; - aListelem = pEList->a; - nExpr = pEList->nExpr; - expr_end_label = sqlite3VdbeMakeLabel(v); - if( pExpr->pLeft ){ - sqlite3ExprCode(pParse, pExpr->pLeft); - } - for(i=0; ipLeft ){ - sqlite3VdbeAddOp(v, OP_Dup, 1, 1); - jumpInst = codeCompare(pParse, pExpr->pLeft, aListelem[i].pExpr, - OP_Ne, 0, 1); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - }else{ - jumpInst = sqlite3VdbeAddOp(v, OP_IfNot, 1, 0); - } - sqlite3ExprCode(pParse, aListelem[i+1].pExpr); - sqlite3VdbeAddOp(v, OP_Goto, 0, expr_end_label); - sqlite3VdbeJumpHere(v, jumpInst); - } - if( pExpr->pLeft ){ - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - } - if( pExpr->pRight ){ - sqlite3ExprCode(pParse, pExpr->pRight); - }else{ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - } - sqlite3VdbeResolveLabel(v, expr_end_label); - break; - } -#ifndef SQLITE_OMIT_TRIGGER - case TK_RAISE: { - if( !pParse->trigStack ){ - sqlite3ErrorMsg(pParse, - "RAISE() may only be used within a trigger-program"); - return; - } - if( pExpr->iColumn!=OE_Ignore ){ - assert( pExpr->iColumn==OE_Rollback || - pExpr->iColumn == OE_Abort || - pExpr->iColumn == OE_Fail ); - sqlite3DequoteExpr(pParse->db, pExpr); - sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn, - (char*)pExpr->token.z, pExpr->token.n); - } else { - assert( pExpr->iColumn == OE_Ignore ); - sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump); - VdbeComment((v, "# raise(IGNORE)")); - } - stackChng = 0; - break; - } -#endif - } - - if( pParse->ckOffset ){ - pParse->ckOffset += stackChng; - assert( pParse->ckOffset ); - } -} - -#ifndef SQLITE_OMIT_TRIGGER -/* -** Generate code that evalutes the given expression and leaves the result -** on the stack. See also sqlite3ExprCode(). -** -** This routine might also cache the result and modify the pExpr tree -** so that it will make use of the cached result on subsequent evaluations -** rather than evaluate the whole expression again. Trivial expressions are -** not cached. If the expression is cached, its result is stored in a -** memory location. -*/ -void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr){ - Vdbe *v = pParse->pVdbe; - int iMem; - int addr1, addr2; - if( v==0 ) return; - addr1 = sqlite3VdbeCurrentAddr(v); - sqlite3ExprCode(pParse, pExpr); - addr2 = sqlite3VdbeCurrentAddr(v); - if( addr2>addr1+1 || sqlite3VdbeGetOp(v, addr1)->opcode==OP_Function ){ - iMem = pExpr->iTable = pParse->nMem++; - sqlite3VdbeAddOp(v, OP_MemStore, iMem, 0); - pExpr->op = TK_REGISTER; - } -} -#endif - -/* -** Generate code that pushes the value of every element of the given -** expression list onto the stack. -** -** Return the number of elements pushed onto the stack. -*/ -int sqlite3ExprCodeExprList( - Parse *pParse, /* Parsing context */ - ExprList *pList /* The expression list to be coded */ -){ - struct ExprList_item *pItem; - int i, n; - if( pList==0 ) return 0; - n = pList->nExpr; - for(pItem=pList->a, i=n; i>0; i--, pItem++){ - sqlite3ExprCode(pParse, pItem->pExpr); - } - return n; -} - -/* -** Generate code for a boolean expression such that a jump is made -** to the label "dest" if the expression is true but execution -** continues straight thru if the expression is false. -** -** If the expression evaluates to NULL (neither true nor false), then -** take the jump if the jumpIfNull flag is true. -** -** This code depends on the fact that certain token values (ex: TK_EQ) -** are the same as opcode values (ex: OP_Eq) that implement the corresponding -** operation. Special comments in vdbe.c and the mkopcodeh.awk script in -** the make process cause these values to align. Assert()s in the code -** below verify that the numbers are aligned correctly. -*/ -void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ - Vdbe *v = pParse->pVdbe; - int op = 0; - int ckOffset = pParse->ckOffset; - if( v==0 || pExpr==0 ) return; - op = pExpr->op; - switch( op ){ - case TK_AND: { - int d2 = sqlite3VdbeMakeLabel(v); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); - break; - } - case TK_OR: { - sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); - sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); - break; - } - case TK_NOT: { - sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); - break; - } - case TK_LT: - case TK_LE: - case TK_GT: - case TK_GE: - case TK_NE: - case TK_EQ: { - assert( TK_LT==OP_Lt ); - assert( TK_LE==OP_Le ); - assert( TK_GT==OP_Gt ); - assert( TK_GE==OP_Ge ); - assert( TK_EQ==OP_Eq ); - assert( TK_NE==OP_Ne ); - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3ExprCode(pParse, pExpr->pRight); - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, dest, jumpIfNull); - break; - } - case TK_ISNULL: - case TK_NOTNULL: { - assert( TK_ISNULL==OP_IsNull ); - assert( TK_NOTNULL==OP_NotNull ); - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3VdbeAddOp(v, op, 1, dest); - break; - } - case TK_BETWEEN: { - /* The expression "x BETWEEN y AND z" is implemented as: - ** - ** 1 IF (x < y) GOTO 3 - ** 2 IF (x <= z) GOTO - ** 3 ... - */ - int addr; - Expr *pLeft = pExpr->pLeft; - Expr *pRight = pExpr->pList->a[0].pExpr; - sqlite3ExprCode(pParse, pLeft); - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - sqlite3ExprCode(pParse, pRight); - addr = codeCompare(pParse, pLeft, pRight, OP_Lt, 0, !jumpIfNull); - - pRight = pExpr->pList->a[1].pExpr; - sqlite3ExprCode(pParse, pRight); - codeCompare(pParse, pLeft, pRight, OP_Le, dest, jumpIfNull); - - sqlite3VdbeAddOp(v, OP_Integer, 0, 0); - sqlite3VdbeJumpHere(v, addr); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - break; - } - default: { - sqlite3ExprCode(pParse, pExpr); - sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest); - break; - } - } - pParse->ckOffset = ckOffset; -} - -/* -** Generate code for a boolean expression such that a jump is made -** to the label "dest" if the expression is false but execution -** continues straight thru if the expression is true. -** -** If the expression evaluates to NULL (neither true nor false) then -** jump if jumpIfNull is true or fall through if jumpIfNull is false. -*/ -void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ - Vdbe *v = pParse->pVdbe; - int op = 0; - int ckOffset = pParse->ckOffset; - if( v==0 || pExpr==0 ) return; - - /* The value of pExpr->op and op are related as follows: - ** - ** pExpr->op op - ** --------- ---------- - ** TK_ISNULL OP_NotNull - ** TK_NOTNULL OP_IsNull - ** TK_NE OP_Eq - ** TK_EQ OP_Ne - ** TK_GT OP_Le - ** TK_LE OP_Gt - ** TK_GE OP_Lt - ** TK_LT OP_Ge - ** - ** For other values of pExpr->op, op is undefined and unused. - ** The value of TK_ and OP_ constants are arranged such that we - ** can compute the mapping above using the following expression. - ** Assert()s verify that the computation is correct. - */ - op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1); - - /* Verify correct alignment of TK_ and OP_ constants - */ - assert( pExpr->op!=TK_ISNULL || op==OP_NotNull ); - assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull ); - assert( pExpr->op!=TK_NE || op==OP_Eq ); - assert( pExpr->op!=TK_EQ || op==OP_Ne ); - assert( pExpr->op!=TK_LT || op==OP_Ge ); - assert( pExpr->op!=TK_LE || op==OP_Gt ); - assert( pExpr->op!=TK_GT || op==OP_Le ); - assert( pExpr->op!=TK_GE || op==OP_Lt ); - - switch( pExpr->op ){ - case TK_AND: { - sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - break; - } - case TK_OR: { - int d2 = sqlite3VdbeMakeLabel(v); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); - sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - sqlite3VdbeResolveLabel(v, d2); - break; - } - case TK_NOT: { - sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); - break; - } - case TK_LT: - case TK_LE: - case TK_GT: - case TK_GE: - case TK_NE: - case TK_EQ: { - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3ExprCode(pParse, pExpr->pRight); - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, dest, jumpIfNull); - break; - } - case TK_ISNULL: - case TK_NOTNULL: { - sqlite3ExprCode(pParse, pExpr->pLeft); - sqlite3VdbeAddOp(v, op, 1, dest); - break; - } - case TK_BETWEEN: { - /* The expression is "x BETWEEN y AND z". It is implemented as: - ** - ** 1 IF (x >= y) GOTO 3 - ** 2 GOTO - ** 3 IF (x > z) GOTO - */ - int addr; - Expr *pLeft = pExpr->pLeft; - Expr *pRight = pExpr->pList->a[0].pExpr; - sqlite3ExprCode(pParse, pLeft); - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - sqlite3ExprCode(pParse, pRight); - addr = sqlite3VdbeCurrentAddr(v); - codeCompare(pParse, pLeft, pRight, OP_Ge, addr+3, !jumpIfNull); - - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, dest); - pRight = pExpr->pList->a[1].pExpr; - sqlite3ExprCode(pParse, pRight); - codeCompare(pParse, pLeft, pRight, OP_Gt, dest, jumpIfNull); - break; - } - default: { - sqlite3ExprCode(pParse, pExpr); - sqlite3VdbeAddOp(v, OP_IfNot, jumpIfNull, dest); - break; - } - } - pParse->ckOffset = ckOffset; -} - -/* -** Do a deep comparison of two expression trees. Return TRUE (non-zero) -** if they are identical and return FALSE if they differ in any way. -** -** Sometimes this routine will return FALSE even if the two expressions -** really are equivalent. If we cannot prove that the expressions are -** identical, we return FALSE just to be safe. So if this routine -** returns false, then you do not really know for certain if the two -** expressions are the same. But if you get a TRUE return, then you -** can be sure the expressions are the same. In the places where -** this routine is used, it does not hurt to get an extra FALSE - that -** just might result in some slightly slower code. But returning -** an incorrect TRUE could lead to a malfunction. -*/ -int sqlite3ExprCompare(Expr *pA, Expr *pB){ - int i; - if( pA==0||pB==0 ){ - return pB==pA; - } - if( pA->op!=pB->op ) return 0; - if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 0; - if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0; - if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0; - if( pA->pList ){ - if( pB->pList==0 ) return 0; - if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; - for(i=0; ipList->nExpr; i++){ - if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ - return 0; - } - } - }else if( pB->pList ){ - return 0; - } - if( pA->pSelect || pB->pSelect ) return 0; - if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0; - if( pA->op!=TK_COLUMN && pA->token.z ){ - if( pB->token.z==0 ) return 0; - if( pB->token.n!=pA->token.n ) return 0; - if( sqlite3StrNICmp((char*)pA->token.z,(char*)pB->token.z,pB->token.n)!=0 ){ - return 0; - } - } - return 1; -} - - -/* -** Add a new element to the pAggInfo->aCol[] array. Return the index of -** the new element. Return a negative number if malloc fails. -*/ -static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ - int i; - pInfo->aCol = sqlite3ArrayAllocate( - db, - pInfo->aCol, - sizeof(pInfo->aCol[0]), - 3, - &pInfo->nColumn, - &pInfo->nColumnAlloc, - &i - ); - return i; -} - -/* -** Add a new element to the pAggInfo->aFunc[] array. Return the index of -** the new element. Return a negative number if malloc fails. -*/ -static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ - int i; - pInfo->aFunc = sqlite3ArrayAllocate( - db, - pInfo->aFunc, - sizeof(pInfo->aFunc[0]), - 3, - &pInfo->nFunc, - &pInfo->nFuncAlloc, - &i - ); - return i; -} - -/* -** This is an xFunc for walkExprTree() used to implement -** sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates -** for additional information. -** -** This routine analyzes the aggregate function at pExpr. -*/ -static int analyzeAggregate(void *pArg, Expr *pExpr){ - int i; - NameContext *pNC = (NameContext *)pArg; - Parse *pParse = pNC->pParse; - SrcList *pSrcList = pNC->pSrcList; - AggInfo *pAggInfo = pNC->pAggInfo; - - switch( pExpr->op ){ - case TK_AGG_COLUMN: - case TK_COLUMN: { - /* Check to see if the column is in one of the tables in the FROM - ** clause of the aggregate query */ - if( pSrcList ){ - struct SrcList_item *pItem = pSrcList->a; - for(i=0; inSrc; i++, pItem++){ - struct AggInfo_col *pCol; - if( pExpr->iTable==pItem->iCursor ){ - /* If we reach this point, it means that pExpr refers to a table - ** that is in the FROM clause of the aggregate query. - ** - ** Make an entry for the column in pAggInfo->aCol[] if there - ** is not an entry there already. - */ - int k; - pCol = pAggInfo->aCol; - for(k=0; knColumn; k++, pCol++){ - if( pCol->iTable==pExpr->iTable && - pCol->iColumn==pExpr->iColumn ){ - break; - } - } - if( (k>=pAggInfo->nColumn) - && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 - ){ - pCol = &pAggInfo->aCol[k]; - pCol->pTab = pExpr->pTab; - pCol->iTable = pExpr->iTable; - pCol->iColumn = pExpr->iColumn; - pCol->iMem = pParse->nMem++; - pCol->iSorterColumn = -1; - pCol->pExpr = pExpr; - if( pAggInfo->pGroupBy ){ - int j, n; - ExprList *pGB = pAggInfo->pGroupBy; - struct ExprList_item *pTerm = pGB->a; - n = pGB->nExpr; - for(j=0; jpExpr; - if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && - pE->iColumn==pExpr->iColumn ){ - pCol->iSorterColumn = j; - break; - } - } - } - if( pCol->iSorterColumn<0 ){ - pCol->iSorterColumn = pAggInfo->nSortingColumn++; - } - } - /* There is now an entry for pExpr in pAggInfo->aCol[] (either - ** because it was there before or because we just created it). - ** Convert the pExpr to be a TK_AGG_COLUMN referring to that - ** pAggInfo->aCol[] entry. - */ - pExpr->pAggInfo = pAggInfo; - pExpr->op = TK_AGG_COLUMN; - pExpr->iAgg = k; - break; - } /* endif pExpr->iTable==pItem->iCursor */ - } /* end loop over pSrcList */ - } - return 1; - } - case TK_AGG_FUNCTION: { - /* The pNC->nDepth==0 test causes aggregate functions in subqueries - ** to be ignored */ - if( pNC->nDepth==0 ){ - /* Check to see if pExpr is a duplicate of another aggregate - ** function that is already in the pAggInfo structure - */ - struct AggInfo_func *pItem = pAggInfo->aFunc; - for(i=0; inFunc; i++, pItem++){ - if( sqlite3ExprCompare(pItem->pExpr, pExpr) ){ - break; - } - } - if( i>=pAggInfo->nFunc ){ - /* pExpr is original. Make a new entry in pAggInfo->aFunc[] - */ - u8 enc = ENC(pParse->db); - i = addAggInfoFunc(pParse->db, pAggInfo); - if( i>=0 ){ - pItem = &pAggInfo->aFunc[i]; - pItem->pExpr = pExpr; - pItem->iMem = pParse->nMem++; - pItem->pFunc = sqlite3FindFunction(pParse->db, - (char*)pExpr->token.z, pExpr->token.n, - pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0); - if( pExpr->flags & EP_Distinct ){ - pItem->iDistinct = pParse->nTab++; - }else{ - pItem->iDistinct = -1; - } - } - } - /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry - */ - pExpr->iAgg = i; - pExpr->pAggInfo = pAggInfo; - return 1; - } - } - } - - /* Recursively walk subqueries looking for TK_COLUMN nodes that need - ** to be changed to TK_AGG_COLUMN. But increment nDepth so that - ** TK_AGG_FUNCTION nodes in subqueries will be unchanged. - */ - if( pExpr->pSelect ){ - pNC->nDepth++; - walkSelectExpr(pExpr->pSelect, analyzeAggregate, pNC); - pNC->nDepth--; - } - return 0; -} - -/* -** Analyze the given expression looking for aggregate functions and -** for variables that need to be added to the pParse->aAgg[] array. -** Make additional entries to the pParse->aAgg[] array as necessary. -** -** This routine should only be called after the expression has been -** analyzed by sqlite3ExprResolveNames(). -** -** If errors are seen, leave an error message in zErrMsg and return -** the number of errors. -*/ -int sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ - int nErr = pNC->pParse->nErr; - walkExprTree(pExpr, analyzeAggregate, pNC); - return pNC->pParse->nErr - nErr; -} - -/* -** Call sqlite3ExprAnalyzeAggregates() for every expression in an -** expression list. Return the number of errors. -** -** If an error is found, the analysis is cut short. -*/ -int sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ - struct ExprList_item *pItem; - int i; - int nErr = 0; - if( pList ){ - for(pItem=pList->a, i=0; nErr==0 && inExpr; i++, pItem++){ - nErr += sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); - } - } - return nErr; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/func.c b/libraries/sqlite/unix/sqlite-3.5.1/src/func.c deleted file mode 100644 index 1760626ff2..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/func.c +++ /dev/null @@ -1,1509 +0,0 @@ -/* -** 2002 February 23 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement various SQL -** functions of SQLite. -** -** There is only one exported symbol in this file - the function -** sqliteRegisterBuildinFunctions() found at the bottom of the file. -** All other code has file scope. -** -** $Id: func.c,v 1.174 2007/09/03 11:04:22 danielk1977 Exp $ -*/ -#include "sqliteInt.h" -#include -#include -#include -#include "vdbeInt.h" - - -/* -** Return the collating function associated with a function. -*/ -static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ - return context->pColl; -} - -/* -** Implementation of the non-aggregate min() and max() functions -*/ -static void minmaxFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int i; - int mask; /* 0 for min() or 0xffffffff for max() */ - int iBest; - CollSeq *pColl; - - if( argc==0 ) return; - mask = sqlite3_user_data(context)==0 ? 0 : -1; - pColl = sqlite3GetFuncCollSeq(context); - assert( pColl ); - assert( mask==-1 || mask==0 ); - iBest = 0; - if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - for(i=1; i=0 ){ - iBest = i; - } - } - sqlite3_result_value(context, argv[iBest]); -} - -/* -** Return the type of the argument. -*/ -static void typeofFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const char *z = 0; - switch( sqlite3_value_type(argv[0]) ){ - case SQLITE_NULL: z = "null"; break; - case SQLITE_INTEGER: z = "integer"; break; - case SQLITE_TEXT: z = "text"; break; - case SQLITE_FLOAT: z = "real"; break; - case SQLITE_BLOB: z = "blob"; break; - } - sqlite3_result_text(context, z, -1, SQLITE_STATIC); -} - - -/* -** Implementation of the length() function -*/ -static void lengthFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int len; - - assert( argc==1 ); - switch( sqlite3_value_type(argv[0]) ){ - case SQLITE_BLOB: - case SQLITE_INTEGER: - case SQLITE_FLOAT: { - sqlite3_result_int(context, sqlite3_value_bytes(argv[0])); - break; - } - case SQLITE_TEXT: { - const unsigned char *z = sqlite3_value_text(argv[0]); - if( z==0 ) return; - len = 0; - while( *z ){ - len++; - SQLITE_SKIP_UTF8(z); - } - sqlite3_result_int(context, len); - break; - } - default: { - sqlite3_result_null(context); - break; - } - } -} - -/* -** Implementation of the abs() function -*/ -static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - assert( argc==1 ); - switch( sqlite3_value_type(argv[0]) ){ - case SQLITE_INTEGER: { - i64 iVal = sqlite3_value_int64(argv[0]); - if( iVal<0 ){ - if( (iVal<<1)==0 ){ - sqlite3_result_error(context, "integer overflow", -1); - return; - } - iVal = -iVal; - } - sqlite3_result_int64(context, iVal); - break; - } - case SQLITE_NULL: { - sqlite3_result_null(context); - break; - } - default: { - double rVal = sqlite3_value_double(argv[0]); - if( rVal<0 ) rVal = -rVal; - sqlite3_result_double(context, rVal); - break; - } - } -} - -/* -** Implementation of the substr() function. -** -** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. -** p1 is 1-indexed. So substr(x,1,1) returns the first character -** of x. If x is text, then we actually count UTF-8 characters. -** If x is a blob, then we count bytes. -** -** If p1 is negative, then we begin abs(p1) from the end of x[]. -*/ -static void substrFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const unsigned char *z; - const unsigned char *z2; - int len; - int p0type; - i64 p1, p2; - - assert( argc==3 ); - p0type = sqlite3_value_type(argv[0]); - if( p0type==SQLITE_BLOB ){ - len = sqlite3_value_bytes(argv[0]); - z = sqlite3_value_blob(argv[0]); - if( z==0 ) return; - assert( len==sqlite3_value_bytes(argv[0]) ); - }else{ - z = sqlite3_value_text(argv[0]); - if( z==0 ) return; - len = 0; - for(z2=z; *z2; len++){ - SQLITE_SKIP_UTF8(z2); - } - } - p1 = sqlite3_value_int(argv[1]); - p2 = sqlite3_value_int(argv[2]); - if( p1<0 ){ - p1 += len; - if( p1<0 ){ - p2 += p1; - p1 = 0; - } - }else if( p1>0 ){ - p1--; - } - if( p1+p2>len ){ - p2 = len-p1; - } - if( p0type!=SQLITE_BLOB ){ - while( *z && p1 ){ - SQLITE_SKIP_UTF8(z); - p1--; - } - for(z2=z; *z2 && p2; p2--){ - SQLITE_SKIP_UTF8(z2); - } - sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT); - }else{ - if( p2<0 ) p2 = 0; - sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT); - } -} - -/* -** Implementation of the round() function -*/ -static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - int n = 0; - double r; - char zBuf[500]; /* larger than the %f representation of the largest double */ - assert( argc==1 || argc==2 ); - if( argc==2 ){ - if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return; - n = sqlite3_value_int(argv[1]); - if( n>30 ) n = 30; - if( n<0 ) n = 0; - } - if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - r = sqlite3_value_double(argv[0]); - sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r); - sqlite3AtoF(zBuf, &r); - sqlite3_result_double(context, r); -} - -/* -** Allocate nByte bytes of space using sqlite3_malloc(). If the -** allocation fails, call sqlite3_result_error_nomem() to notify -** the database handle that malloc() has failed. -*/ -static void *contextMalloc(sqlite3_context *context, int nByte){ - char *z = sqlite3_malloc(nByte); - if( !z && nByte>0 ){ - sqlite3_result_error_nomem(context); - } - return z; -} - -/* -** Implementation of the upper() and lower() SQL functions. -*/ -static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - char *z1; - const char *z2; - int i, n; - if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return; - z2 = (char*)sqlite3_value_text(argv[0]); - n = sqlite3_value_bytes(argv[0]); - /* Verify that the call to _bytes() does not invalidate the _text() pointer */ - assert( z2==(char*)sqlite3_value_text(argv[0]) ); - if( z2 ){ - z1 = contextMalloc(context, n+1); - if( z1 ){ - memcpy(z1, z2, n+1); - for(i=0; z1[i]; i++){ - z1[i] = toupper(z1[i]); - } - sqlite3_result_text(context, z1, -1, sqlite3_free); - } - } -} -static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - char *z1; - const char *z2; - int i, n; - if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return; - z2 = (char*)sqlite3_value_text(argv[0]); - n = sqlite3_value_bytes(argv[0]); - /* Verify that the call to _bytes() does not invalidate the _text() pointer */ - assert( z2==(char*)sqlite3_value_text(argv[0]) ); - if( z2 ){ - z1 = contextMalloc(context, n+1); - if( z1 ){ - memcpy(z1, z2, n+1); - for(i=0; z1[i]; i++){ - z1[i] = tolower(z1[i]); - } - sqlite3_result_text(context, z1, -1, sqlite3_free); - } - } -} - -/* -** Implementation of the IFNULL(), NVL(), and COALESCE() functions. -** All three do the same thing. They return the first non-NULL -** argument. -*/ -static void ifnullFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int i; - for(i=0; iSQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - return; - } - p = contextMalloc(context, n); - if( p ){ - sqlite3Randomness(n, p); - sqlite3_result_blob(context, (char*)p, n, sqlite3_free); - } -} - -/* -** Implementation of the last_insert_rowid() SQL function. The return -** value is the same as the sqlite3_last_insert_rowid() API function. -*/ -static void last_insert_rowid( - sqlite3_context *context, - int arg, - sqlite3_value **argv -){ - sqlite3 *db = sqlite3_user_data(context); - sqlite3_result_int64(context, sqlite3_last_insert_rowid(db)); -} - -/* -** Implementation of the changes() SQL function. The return value is the -** same as the sqlite3_changes() API function. -*/ -static void changes( - sqlite3_context *context, - int arg, - sqlite3_value **argv -){ - sqlite3 *db = sqlite3_user_data(context); - sqlite3_result_int(context, sqlite3_changes(db)); -} - -/* -** Implementation of the total_changes() SQL function. The return value is -** the same as the sqlite3_total_changes() API function. -*/ -static void total_changes( - sqlite3_context *context, - int arg, - sqlite3_value **argv -){ - sqlite3 *db = sqlite3_user_data(context); - sqlite3_result_int(context, sqlite3_total_changes(db)); -} - -/* -** A structure defining how to do GLOB-style comparisons. -*/ -struct compareInfo { - u8 matchAll; - u8 matchOne; - u8 matchSet; - u8 noCase; -}; - -static const struct compareInfo globInfo = { '*', '?', '[', 0 }; -/* The correct SQL-92 behavior is for the LIKE operator to ignore -** case. Thus 'a' LIKE 'A' would be true. */ -static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 }; -/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator -** is case sensitive causing 'a' LIKE 'A' to be false */ -static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; - -/* -** Compare two UTF-8 strings for equality where the first string can -** potentially be a "glob" expression. Return true (1) if they -** are the same and false (0) if they are different. -** -** Globbing rules: -** -** '*' Matches any sequence of zero or more characters. -** -** '?' Matches exactly one character. -** -** [...] Matches one character from the enclosed list of -** characters. -** -** [^...] Matches one character not in the enclosed list. -** -** With the [...] and [^...] matching, a ']' character can be included -** in the list by making it the first character after '[' or '^'. A -** range of characters can be specified using '-'. Example: -** "[a-z]" matches any single lower-case letter. To match a '-', make -** it the last character in the list. -** -** This routine is usually quick, but can be N**2 in the worst case. -** -** Hints: to match '*' or '?', put them in "[]". Like this: -** -** abc[*]xyz Matches "abc*xyz" only -*/ -static int patternCompare( - const u8 *zPattern, /* The glob pattern */ - const u8 *zString, /* The string to compare against the glob */ - const struct compareInfo *pInfo, /* Information about how to do the compare */ - const int esc /* The escape character */ -){ - int c, c2; - int invert; - int seen; - u8 matchOne = pInfo->matchOne; - u8 matchAll = pInfo->matchAll; - u8 matchSet = pInfo->matchSet; - u8 noCase = pInfo->noCase; - int prevEscape = 0; /* True if the previous character was 'escape' */ - - while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){ - if( !prevEscape && c==matchAll ){ - while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll - || c == matchOne ){ - if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){ - return 0; - } - } - if( c==0 ){ - return 1; - }else if( c==esc ){ - c = sqlite3Utf8Read(zPattern, 0, &zPattern); - if( c==0 ){ - return 0; - } - }else if( c==matchSet ){ - assert( esc==0 ); /* This is GLOB, not LIKE */ - assert( matchSet<0x80 ); /* '[' is a single-byte character */ - while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){ - SQLITE_SKIP_UTF8(zString); - } - return *zString!=0; - } - while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){ - if( noCase ){ - c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2; - c = c<0x80 ? sqlite3UpperToLower[c] : c; - while( c2 != 0 && c2 != c ){ - c2 = sqlite3Utf8Read(zString, 0, &zString); - if( c2<0x80 ) c2 = sqlite3UpperToLower[c2]; - } - }else{ - while( c2 != 0 && c2 != c ){ - c2 = sqlite3Utf8Read(zString, 0, &zString); - } - } - if( c2==0 ) return 0; - if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; - } - return 0; - }else if( !prevEscape && c==matchOne ){ - if( sqlite3Utf8Read(zString, 0, &zString)==0 ){ - return 0; - } - }else if( c==matchSet ){ - int prior_c = 0; - assert( esc==0 ); /* This only occurs for GLOB, not LIKE */ - seen = 0; - invert = 0; - c = sqlite3Utf8Read(zString, 0, &zString); - if( c==0 ) return 0; - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); - if( c2=='^' ){ - invert = 1; - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); - } - if( c2==']' ){ - if( c==']' ) seen = 1; - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); - } - while( c2 && c2!=']' ){ - if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); - if( c>=prior_c && c<=c2 ) seen = 1; - prior_c = 0; - }else{ - if( c==c2 ){ - seen = 1; - } - prior_c = c2; - } - c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); - } - if( c2==0 || (seen ^ invert)==0 ){ - return 0; - } - }else if( esc==c && !prevEscape ){ - prevEscape = 1; - }else{ - c2 = sqlite3Utf8Read(zString, 0, &zString); - if( noCase ){ - c = c<0x80 ? sqlite3UpperToLower[c] : c; - c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2; - } - if( c!=c2 ){ - return 0; - } - prevEscape = 0; - } - } - return *zString==0; -} - -/* -** Count the number of times that the LIKE operator (or GLOB which is -** just a variation of LIKE) gets called. This is used for testing -** only. -*/ -#ifdef SQLITE_TEST -int sqlite3_like_count = 0; -#endif - - -/* -** Implementation of the like() SQL function. This function implements -** the build-in LIKE operator. The first argument to the function is the -** pattern and the second argument is the string. So, the SQL statements: -** -** A LIKE B -** -** is implemented as like(B,A). -** -** This same function (with a different compareInfo structure) computes -** the GLOB operator. -*/ -static void likeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const unsigned char *zA, *zB; - int escape = 0; - - zB = sqlite3_value_text(argv[0]); - zA = sqlite3_value_text(argv[1]); - - /* Limit the length of the LIKE or GLOB pattern to avoid problems - ** of deep recursion and N*N behavior in patternCompare(). - */ - if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){ - sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); - return; - } - assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */ - - if( argc==3 ){ - /* The escape character string must consist of a single UTF-8 character. - ** Otherwise, return an error. - */ - const unsigned char *zEsc = sqlite3_value_text(argv[2]); - if( zEsc==0 ) return; - if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ - sqlite3_result_error(context, - "ESCAPE expression must be a single character", -1); - return; - } - escape = sqlite3Utf8Read(zEsc, 0, &zEsc); - } - if( zA && zB ){ - struct compareInfo *pInfo = sqlite3_user_data(context); -#ifdef SQLITE_TEST - sqlite3_like_count++; -#endif - - sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)); - } -} - -/* -** Implementation of the NULLIF(x,y) function. The result is the first -** argument if the arguments are different. The result is NULL if the -** arguments are equal to each other. -*/ -static void nullifFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - CollSeq *pColl = sqlite3GetFuncCollSeq(context); - if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){ - sqlite3_result_value(context, argv[0]); - } -} - -/* -** Implementation of the VERSION(*) function. The result is the version -** of the SQLite library that is running. -*/ -static void versionFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC); -} - -/* Array for converting from half-bytes (nybbles) into ASCII hex -** digits. */ -static const char hexdigits[] = { - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' -}; - -/* -** EXPERIMENTAL - This is not an official function. The interface may -** change. This function may disappear. Do not write code that depends -** on this function. -** -** Implementation of the QUOTE() function. This function takes a single -** argument. If the argument is numeric, the return value is the same as -** the argument. If the argument is NULL, the return value is the string -** "NULL". Otherwise, the argument is enclosed in single quotes with -** single-quote escapes. -*/ -static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - if( argc<1 ) return; - switch( sqlite3_value_type(argv[0]) ){ - case SQLITE_NULL: { - sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC); - break; - } - case SQLITE_INTEGER: - case SQLITE_FLOAT: { - sqlite3_result_value(context, argv[0]); - break; - } - case SQLITE_BLOB: { - char *zText = 0; - char const *zBlob = sqlite3_value_blob(argv[0]); - int nBlob = sqlite3_value_bytes(argv[0]); - assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ - - if( 2*nBlob+4>SQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - return; - } - zText = (char *)contextMalloc(context, (2*nBlob)+4); - if( zText ){ - int i; - for(i=0; i>4)&0x0F]; - zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F]; - } - zText[(nBlob*2)+2] = '\''; - zText[(nBlob*2)+3] = '\0'; - zText[0] = 'X'; - zText[1] = '\''; - sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); - sqlite3_free(zText); - } - break; - } - case SQLITE_TEXT: { - int i,j; - u64 n; - const unsigned char *zArg = sqlite3_value_text(argv[0]); - char *z; - - if( zArg==0 ) return; - for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; } - if( i+n+3>SQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - return; - } - z = contextMalloc(context, i+n+3); - if( z ){ - z[0] = '\''; - for(i=0, j=1; zArg[i]; i++){ - z[j++] = zArg[i]; - if( zArg[i]=='\'' ){ - z[j++] = '\''; - } - } - z[j++] = '\''; - z[j] = 0; - sqlite3_result_text(context, z, j, sqlite3_free); - } - } - } -} - -/* -** The hex() function. Interpret the argument as a blob. Return -** a hexadecimal rendering as text. -*/ -static void hexFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - int i, n; - const unsigned char *pBlob; - char *zHex, *z; - assert( argc==1 ); - pBlob = sqlite3_value_blob(argv[0]); - n = sqlite3_value_bytes(argv[0]); - if( n*2+1>SQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - return; - } - assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ - z = zHex = contextMalloc(context, n*2 + 1); - if( zHex ){ - for(i=0; i>4)&0xf]; - *(z++) = hexdigits[c&0xf]; - } - *z = 0; - sqlite3_result_text(context, zHex, n*2, sqlite3_free); - } -} - -/* -** The zeroblob(N) function returns a zero-filled blob of size N bytes. -*/ -static void zeroblobFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - i64 n; - assert( argc==1 ); - n = sqlite3_value_int64(argv[0]); - if( n>SQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - }else{ - sqlite3_result_zeroblob(context, n); - } -} - -/* -** The replace() function. Three arguments are all strings: call -** them A, B, and C. The result is also a string which is derived -** from A by replacing every occurance of B with C. The match -** must be exact. Collating sequences are not used. -*/ -static void replaceFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const unsigned char *zStr; /* The input string A */ - const unsigned char *zPattern; /* The pattern string B */ - const unsigned char *zRep; /* The replacement string C */ - unsigned char *zOut; /* The output */ - int nStr; /* Size of zStr */ - int nPattern; /* Size of zPattern */ - int nRep; /* Size of zRep */ - i64 nOut; /* Maximum size of zOut */ - int loopLimit; /* Last zStr[] that might match zPattern[] */ - int i, j; /* Loop counters */ - - assert( argc==3 ); - zStr = sqlite3_value_text(argv[0]); - if( zStr==0 ) return; - nStr = sqlite3_value_bytes(argv[0]); - assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ - zPattern = sqlite3_value_text(argv[1]); - if( zPattern==0 || zPattern[0]==0 ) return; - nPattern = sqlite3_value_bytes(argv[1]); - assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */ - zRep = sqlite3_value_text(argv[2]); - if( zRep==0 ) return; - nRep = sqlite3_value_bytes(argv[2]); - assert( zRep==sqlite3_value_text(argv[2]) ); - nOut = nStr + 1; - assert( nOut=SQLITE_MAX_LENGTH ){ - sqlite3_result_error_toobig(context); - sqlite3_free(zOut); - return; - } - zOld = zOut; - zOut = sqlite3_realloc(zOut, (int)nOut); - if( zOut==0 ){ - sqlite3_result_error_nomem(context); - sqlite3_free(zOld); - return; - } - memcpy(&zOut[j], zRep, nRep); - j += nRep; - i += nPattern-1; - } - } - assert( j+nStr-i+1==nOut ); - memcpy(&zOut[j], &zStr[i], nStr-i); - j += nStr - i; - assert( j<=nOut ); - zOut[j] = 0; - sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); -} - -/* -** Implementation of the TRIM(), LTRIM(), and RTRIM() functions. -** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both. -*/ -static void trimFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const unsigned char *zIn; /* Input string */ - const unsigned char *zCharSet; /* Set of characters to trim */ - int nIn; /* Number of bytes in input */ - int flags; /* 1: trimleft 2: trimright 3: trim */ - int i; /* Loop counter */ - unsigned char *aLen; /* Length of each character in zCharSet */ - const unsigned char **azChar; /* Individual characters in zCharSet */ - int nChar; /* Number of characters in zCharSet */ - - if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ - return; - } - zIn = sqlite3_value_text(argv[0]); - if( zIn==0 ) return; - nIn = sqlite3_value_bytes(argv[0]); - assert( zIn==sqlite3_value_text(argv[0]) ); - if( argc==1 ){ - static const unsigned char lenOne[] = { 1 }; - static const unsigned char *azOne[] = { (u8*)" " }; - nChar = 1; - aLen = (u8*)lenOne; - azChar = azOne; - zCharSet = 0; - }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ - return; - }else{ - const unsigned char *z; - for(z=zCharSet, nChar=0; *z; nChar++){ - SQLITE_SKIP_UTF8(z); - } - if( nChar>0 ){ - azChar = contextMalloc(context, nChar*(sizeof(char*)+1)); - if( azChar==0 ){ - return; - } - aLen = (unsigned char*)&azChar[nChar]; - for(z=zCharSet, nChar=0; *z; nChar++){ - azChar[nChar] = z; - SQLITE_SKIP_UTF8(z); - aLen[nChar] = z - azChar[nChar]; - } - } - } - if( nChar>0 ){ - flags = (int)sqlite3_user_data(context); - if( flags & 1 ){ - while( nIn>0 ){ - int len; - for(i=0; i=nChar ) break; - zIn += len; - nIn -= len; - } - } - if( flags & 2 ){ - while( nIn>0 ){ - int len; - for(i=0; i=nChar ) break; - nIn -= len; - } - } - if( zCharSet ){ - sqlite3_free(azChar); - } - } - sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); -} - -#ifdef SQLITE_SOUNDEX -/* -** Compute the soundex encoding of a word. -*/ -static void soundexFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - char zResult[8]; - const u8 *zIn; - int i, j; - static const unsigned char iCode[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, - 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, - 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, - }; - assert( argc==1 ); - zIn = (u8*)sqlite3_value_text(argv[0]); - if( zIn==0 ) zIn = (u8*)""; - for(i=0; zIn[i] && !isalpha(zIn[i]); i++){} - if( zIn[i] ){ - u8 prevcode = iCode[zIn[i]&0x7f]; - zResult[0] = toupper(zIn[i]); - for(j=1; j<4 && zIn[i]; i++){ - int code = iCode[zIn[i]&0x7f]; - if( code>0 ){ - if( code!=prevcode ){ - prevcode = code; - zResult[j++] = code + '0'; - } - }else{ - prevcode = 0; - } - } - while( j<4 ){ - zResult[j++] = '0'; - } - zResult[j] = 0; - sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); - }else{ - sqlite3_result_text(context, "?000", 4, SQLITE_STATIC); - } -} -#endif - -#ifndef SQLITE_OMIT_LOAD_EXTENSION -/* -** A function that loads a shared-library extension then returns NULL. -*/ -static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ - const char *zFile = (const char *)sqlite3_value_text(argv[0]); - const char *zProc; - sqlite3 *db = sqlite3_user_data(context); - char *zErrMsg = 0; - - if( argc==2 ){ - zProc = (const char *)sqlite3_value_text(argv[1]); - }else{ - zProc = 0; - } - if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ - sqlite3_result_error(context, zErrMsg, -1); - sqlite3_free(zErrMsg); - } -} -#endif - -#ifdef SQLITE_TEST -/* -** This function generates a string of random characters. Used for -** generating test data. -*/ -static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){ - static const unsigned char zSrc[] = - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789" - ".-!,:*^+=_|?/<> "; - int iMin, iMax, n, r, i; - unsigned char zBuf[1000]; - - /* It used to be possible to call randstr() with any number of arguments, - ** but now it is registered with SQLite as requiring exactly 2. - */ - assert(argc==2); - - iMin = sqlite3_value_int(argv[0]); - if( iMin<0 ) iMin = 0; - if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1; - iMax = sqlite3_value_int(argv[1]); - if( iMax=sizeof(zBuf) ) iMax = sizeof(zBuf)-1; - n = iMin; - if( iMax>iMin ){ - sqlite3Randomness(sizeof(r), &r); - r &= 0x7fffffff; - n += r%(iMax + 1 - iMin); - } - assert( ncnt++; - if( type==SQLITE_INTEGER ){ - i64 v = sqlite3_value_int64(argv[0]); - p->rSum += v; - if( (p->approx|p->overflow)==0 ){ - i64 iNewSum = p->iSum + v; - int s1 = p->iSum >> (sizeof(i64)*8-1); - int s2 = v >> (sizeof(i64)*8-1); - int s3 = iNewSum >> (sizeof(i64)*8-1); - p->overflow = (s1&s2&~s3) | (~s1&~s2&s3); - p->iSum = iNewSum; - } - }else{ - p->rSum += sqlite3_value_double(argv[0]); - p->approx = 1; - } - } -} -static void sumFinalize(sqlite3_context *context){ - SumCtx *p; - p = sqlite3_aggregate_context(context, 0); - if( p && p->cnt>0 ){ - if( p->overflow ){ - sqlite3_result_error(context,"integer overflow",-1); - }else if( p->approx ){ - sqlite3_result_double(context, p->rSum); - }else{ - sqlite3_result_int64(context, p->iSum); - } - } -} -static void avgFinalize(sqlite3_context *context){ - SumCtx *p; - p = sqlite3_aggregate_context(context, 0); - if( p && p->cnt>0 ){ - sqlite3_result_double(context, p->rSum/(double)p->cnt); - } -} -static void totalFinalize(sqlite3_context *context){ - SumCtx *p; - p = sqlite3_aggregate_context(context, 0); - sqlite3_result_double(context, p ? p->rSum : 0.0); -} - -/* -** The following structure keeps track of state information for the -** count() aggregate function. -*/ -typedef struct CountCtx CountCtx; -struct CountCtx { - i64 n; -}; - -/* -** Routines to implement the count() aggregate function. -*/ -static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ - CountCtx *p; - p = sqlite3_aggregate_context(context, sizeof(*p)); - if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ - p->n++; - } -} -static void countFinalize(sqlite3_context *context){ - CountCtx *p; - p = sqlite3_aggregate_context(context, 0); - sqlite3_result_int64(context, p ? p->n : 0); -} - -/* -** Routines to implement min() and max() aggregate functions. -*/ -static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){ - Mem *pArg = (Mem *)argv[0]; - Mem *pBest; - - if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest)); - if( !pBest ) return; - - if( pBest->flags ){ - int max; - int cmp; - CollSeq *pColl = sqlite3GetFuncCollSeq(context); - /* This step function is used for both the min() and max() aggregates, - ** the only difference between the two being that the sense of the - ** comparison is inverted. For the max() aggregate, the - ** sqlite3_user_data() function returns (void *)-1. For min() it - ** returns (void *)db, where db is the sqlite3* database pointer. - ** Therefore the next statement sets variable 'max' to 1 for the max() - ** aggregate, or 0 for min(). - */ - max = sqlite3_user_data(context)!=0; - cmp = sqlite3MemCompare(pBest, pArg, pColl); - if( (max && cmp<0) || (!max && cmp>0) ){ - sqlite3VdbeMemCopy(pBest, pArg); - } - }else{ - sqlite3VdbeMemCopy(pBest, pArg); - } -} -static void minMaxFinalize(sqlite3_context *context){ - sqlite3_value *pRes; - pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); - if( pRes ){ - if( pRes->flags ){ - sqlite3_result_value(context, pRes); - } - sqlite3VdbeMemRelease(pRes); - } -} - - -/* -** This function registered all of the above C functions as SQL -** functions. This should be the only routine in this file with -** external linkage. -*/ -void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ - static const struct { - char *zName; - signed char nArg; - u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */ - u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */ - u8 needCollSeq; - void (*xFunc)(sqlite3_context*,int,sqlite3_value **); - } aFuncs[] = { - { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc }, - { "min", 0, 0, SQLITE_UTF8, 1, 0 }, - { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc }, - { "max", 0, 1, SQLITE_UTF8, 1, 0 }, - { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc }, - { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc }, - { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc }, - { "abs", 1, 0, SQLITE_UTF8, 0, absFunc }, - { "round", 1, 0, SQLITE_UTF8, 0, roundFunc }, - { "round", 2, 0, SQLITE_UTF8, 0, roundFunc }, - { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc }, - { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc }, - { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc }, - { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 }, - { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 }, - { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc }, - { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc }, - { "random", -1, 0, SQLITE_UTF8, 0, randomFunc }, - { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob }, - { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc }, - { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc}, - { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc }, - { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid }, - { "changes", 0, 0xff, SQLITE_UTF8, 0, changes }, - { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes }, - { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc }, - { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc }, - { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc }, - { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc }, - { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc }, - { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc }, - { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc }, - { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc }, -#ifdef SQLITE_SOUNDEX - { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc}, -#endif -#ifndef SQLITE_OMIT_LOAD_EXTENSION - { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt }, - { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt }, -#endif -#ifdef SQLITE_TEST - { "randstr", 2, 0, SQLITE_UTF8, 0, randStr }, - { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor}, - { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count}, - { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata}, - { "test_error", 1, 0, SQLITE_UTF8, 0, test_error}, -#endif - }; - static const struct { - char *zName; - signed char nArg; - u8 argType; - u8 needCollSeq; - void (*xStep)(sqlite3_context*,int,sqlite3_value**); - void (*xFinalize)(sqlite3_context*); - } aAggs[] = { - { "min", 1, 0, 1, minmaxStep, minMaxFinalize }, - { "max", 1, 1, 1, minmaxStep, minMaxFinalize }, - { "sum", 1, 0, 0, sumStep, sumFinalize }, - { "total", 1, 0, 0, sumStep, totalFinalize }, - { "avg", 1, 0, 0, sumStep, avgFinalize }, - { "count", 0, 0, 0, countStep, countFinalize }, - { "count", 1, 0, 0, countStep, countFinalize }, - }; - int i; - - for(i=0; ineedCollSeq = 1; - } - } - } -#ifndef SQLITE_OMIT_ALTERTABLE - sqlite3AlterFunctions(db); -#endif -#ifndef SQLITE_OMIT_PARSER - sqlite3AttachFunctions(db); -#endif - for(i=0; ineedCollSeq = 1; - } - } - } - sqlite3RegisterDateTimeFunctions(db); - if( !db->mallocFailed ){ - int rc = sqlite3_overload_function(db, "MATCH", 2); - assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); - if( rc==SQLITE_NOMEM ){ - db->mallocFailed = 1; - } - } -#ifdef SQLITE_SSE - (void)sqlite3SseFunctions(db); -#endif -#ifdef SQLITE_CASE_SENSITIVE_LIKE - sqlite3RegisterLikeFunctions(db, 1); -#else - sqlite3RegisterLikeFunctions(db, 0); -#endif -} - -/* -** Set the LIKEOPT flag on the 2-argument function with the given name. -*/ -static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){ - FuncDef *pDef; - pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0); - if( pDef ){ - pDef->flags = flagVal; - } -} - -/* -** Register the built-in LIKE and GLOB functions. The caseSensitive -** parameter determines whether or not the LIKE operator is case -** sensitive. GLOB is always case sensitive. -*/ -void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ - struct compareInfo *pInfo; - if( caseSensitive ){ - pInfo = (struct compareInfo*)&likeInfoAlt; - }else{ - pInfo = (struct compareInfo*)&likeInfoNorm; - } - sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0); - sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0); - sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8, - (struct compareInfo*)&globInfo, likeFunc, 0,0); - setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE); - setLikeOptFlag(db, "like", - caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE); -} - -/* -** pExpr points to an expression which implements a function. If -** it is appropriate to apply the LIKE optimization to that function -** then set aWc[0] through aWc[2] to the wildcard characters and -** return TRUE. If the function is not a LIKE-style function then -** return FALSE. -*/ -int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ - FuncDef *pDef; - if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){ - return 0; - } - if( pExpr->pList->nExpr!=2 ){ - return 0; - } - pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2, - SQLITE_UTF8, 0); - if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){ - return 0; - } - - /* The memcpy() statement assumes that the wildcard characters are - ** the first three statements in the compareInfo structure. The - ** asserts() that follow verify that assumption - */ - memcpy(aWc, pDef->pUserData, 3); - assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); - assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); - assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); - *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0; - return 1; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/hash.c b/libraries/sqlite/unix/sqlite-3.5.1/src/hash.c deleted file mode 100644 index a88d16b06b..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/hash.c +++ /dev/null @@ -1,418 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the implementation of generic hash-tables -** used in SQLite. -** -** $Id: hash.c,v 1.24 2007/09/04 14:31:47 danielk1977 Exp $ -*/ -#include "sqliteInt.h" -#include - -/* Turn bulk memory into a hash table object by initializing the -** fields of the Hash structure. -** -** "pNew" is a pointer to the hash table that is to be initialized. -** keyClass is one of the constants SQLITE_HASH_INT, SQLITE_HASH_POINTER, -** SQLITE_HASH_BINARY, or SQLITE_HASH_STRING. The value of keyClass -** determines what kind of key the hash table will use. "copyKey" is -** true if the hash table should make its own private copy of keys and -** false if it should just use the supplied pointer. CopyKey only makes -** sense for SQLITE_HASH_STRING and SQLITE_HASH_BINARY and is ignored -** for other key classes. -*/ -void sqlite3HashInit(Hash *pNew, int keyClass, int copyKey){ - assert( pNew!=0 ); - assert( keyClass>=SQLITE_HASH_STRING && keyClass<=SQLITE_HASH_BINARY ); - pNew->keyClass = keyClass; -#if 0 - if( keyClass==SQLITE_HASH_POINTER || keyClass==SQLITE_HASH_INT ) copyKey = 0; -#endif - pNew->copyKey = copyKey; - pNew->first = 0; - pNew->count = 0; - pNew->htsize = 0; - pNew->ht = 0; -} - -/* Remove all entries from a hash table. Reclaim all memory. -** Call this routine to delete a hash table or to reset a hash table -** to the empty state. -*/ -void sqlite3HashClear(Hash *pH){ - HashElem *elem; /* For looping over all elements of the table */ - - assert( pH!=0 ); - elem = pH->first; - pH->first = 0; - if( pH->ht ) sqlite3_free(pH->ht); - pH->ht = 0; - pH->htsize = 0; - while( elem ){ - HashElem *next_elem = elem->next; - if( pH->copyKey && elem->pKey ){ - sqlite3_free(elem->pKey); - } - sqlite3_free(elem); - elem = next_elem; - } - pH->count = 0; -} - -#if 0 /* NOT USED */ -/* -** Hash and comparison functions when the mode is SQLITE_HASH_INT -*/ -static int intHash(const void *pKey, int nKey){ - return nKey ^ (nKey<<8) ^ (nKey>>8); -} -static int intCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - return n2 - n1; -} -#endif - -#if 0 /* NOT USED */ -/* -** Hash and comparison functions when the mode is SQLITE_HASH_POINTER -*/ -static int ptrHash(const void *pKey, int nKey){ - uptr x = Addr(pKey); - return x ^ (x<<8) ^ (x>>8); -} -static int ptrCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( pKey1==pKey2 ) return 0; - if( pKey1 0 ){ - h = (h<<3) ^ h ^ sqlite3UpperToLower[(unsigned char)*z++]; - nKey--; - } - return h & 0x7fffffff; -} -static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return sqlite3StrNICmp((const char*)pKey1,(const char*)pKey2,n1); -} - -/* -** Hash and comparison functions when the mode is SQLITE_HASH_BINARY -*/ -static int binHash(const void *pKey, int nKey){ - int h = 0; - const char *z = (const char *)pKey; - while( nKey-- > 0 ){ - h = (h<<3) ^ h ^ *(z++); - } - return h & 0x7fffffff; -} -static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2){ - if( n1!=n2 ) return 1; - return memcmp(pKey1,pKey2,n1); -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** The C syntax in this function definition may be unfamilar to some -** programmers, so we provide the following additional explanation: -** -** The name of the function is "hashFunction". The function takes a -** single parameter "keyClass". The return value of hashFunction() -** is a pointer to another function. Specifically, the return value -** of hashFunction() is a pointer to a function that takes two parameters -** with types "const void*" and "int" and returns an "int". -*/ -static int (*hashFunction(int keyClass))(const void*,int){ -#if 0 /* HASH_INT and HASH_POINTER are never used */ - switch( keyClass ){ - case SQLITE_HASH_INT: return &intHash; - case SQLITE_HASH_POINTER: return &ptrHash; - case SQLITE_HASH_STRING: return &strHash; - case SQLITE_HASH_BINARY: return &binHash;; - default: break; - } - return 0; -#else - if( keyClass==SQLITE_HASH_STRING ){ - return &strHash; - }else{ - assert( keyClass==SQLITE_HASH_BINARY ); - return &binHash; - } -#endif -} - -/* -** Return a pointer to the appropriate hash function given the key class. -** -** For help in interpreted the obscure C code in the function definition, -** see the header comment on the previous function. -*/ -static int (*compareFunction(int keyClass))(const void*,int,const void*,int){ -#if 0 /* HASH_INT and HASH_POINTER are never used */ - switch( keyClass ){ - case SQLITE_HASH_INT: return &intCompare; - case SQLITE_HASH_POINTER: return &ptrCompare; - case SQLITE_HASH_STRING: return &strCompare; - case SQLITE_HASH_BINARY: return &binCompare; - default: break; - } - return 0; -#else - if( keyClass==SQLITE_HASH_STRING ){ - return &strCompare; - }else{ - assert( keyClass==SQLITE_HASH_BINARY ); - return &binCompare; - } -#endif -} - -/* Link an element into the hash table -*/ -static void insertElement( - Hash *pH, /* The complete hash table */ - struct _ht *pEntry, /* The entry into which pNew is inserted */ - HashElem *pNew /* The element to be inserted */ -){ - HashElem *pHead; /* First element already in pEntry */ - pHead = pEntry->chain; - if( pHead ){ - pNew->next = pHead; - pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } - pHead->prev = pNew; - }else{ - pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } - pNew->prev = 0; - pH->first = pNew; - } - pEntry->count++; - pEntry->chain = pNew; -} - - -/* Resize the hash table so that it cantains "new_size" buckets. -** "new_size" must be a power of 2. The hash table might fail -** to resize if sqlite3_malloc() fails. -*/ -static void rehash(Hash *pH, int new_size){ - struct _ht *new_ht; /* The new hash table */ - HashElem *elem, *next_elem; /* For looping over existing elements */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( (new_size & (new_size-1))==0 ); - - /* There is a call to sqlite3_malloc() inside rehash(). If there is - ** already an allocation at pH->ht, then if this malloc() fails it - ** is benign (since failing to resize a hash table is a performance - ** hit only, not a fatal error). - */ - sqlite3MallocBenignFailure(pH->htsize>0); - - new_ht = (struct _ht *)sqlite3MallocZero( new_size*sizeof(struct _ht) ); - if( new_ht==0 ) return; - if( pH->ht ) sqlite3_free(pH->ht); - pH->ht = new_ht; - pH->htsize = new_size; - xHash = hashFunction(pH->keyClass); - for(elem=pH->first, pH->first=0; elem; elem = next_elem){ - int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1); - next_elem = elem->next; - insertElement(pH, &new_ht[h], elem); - } -} - -/* This function (for internal use only) locates an element in an -** hash table that matches the given key. The hash for this key has -** already been computed and is passed as the 4th parameter. -*/ -static HashElem *findElementGivenHash( - const Hash *pH, /* The pH to be searched */ - const void *pKey, /* The key we are searching for */ - int nKey, - int h /* The hash for this key. */ -){ - HashElem *elem; /* Used to loop thru the element list */ - int count; /* Number of elements left to test */ - int (*xCompare)(const void*,int,const void*,int); /* comparison function */ - - if( pH->ht ){ - struct _ht *pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - xCompare = compareFunction(pH->keyClass); - while( count-- && elem ){ - if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){ - return elem; - } - elem = elem->next; - } - } - return 0; -} - -/* Remove a single entry from the hash table given a pointer to that -** element and a hash on the element's key. -*/ -static void removeElementGivenHash( - Hash *pH, /* The pH containing "elem" */ - HashElem* elem, /* The element to be removed from the pH */ - int h /* Hash value for the element */ -){ - struct _ht *pEntry; - if( elem->prev ){ - elem->prev->next = elem->next; - }else{ - pH->first = elem->next; - } - if( elem->next ){ - elem->next->prev = elem->prev; - } - pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ - pEntry->chain = elem->next; - } - pEntry->count--; - if( pEntry->count<=0 ){ - pEntry->chain = 0; - } - if( pH->copyKey ){ - sqlite3_free(elem->pKey); - } - sqlite3_free( elem ); - pH->count--; - if( pH->count<=0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); - sqlite3HashClear(pH); - } -} - -/* Attempt to locate an element of the hash table pH with a key -** that matches pKey,nKey. Return a pointer to the corresponding -** HashElem structure for this element if it is found, or NULL -** otherwise. -*/ -HashElem *sqlite3HashFindElem(const Hash *pH, const void *pKey, int nKey){ - int h; /* A hash on key */ - HashElem *elem; /* The element that matches key */ - int (*xHash)(const void*,int); /* The hash function */ - - if( pH==0 || pH->ht==0 ) return 0; - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - h = (*xHash)(pKey,nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - elem = findElementGivenHash(pH,pKey,nKey, h & (pH->htsize-1)); - return elem; -} - -/* Attempt to locate an element of the hash table pH with a key -** that matches pKey,nKey. Return the data for this element if it is -** found, or NULL if there is no match. -*/ -void *sqlite3HashFind(const Hash *pH, const void *pKey, int nKey){ - HashElem *elem; /* The element that matches key */ - elem = sqlite3HashFindElem(pH, pKey, nKey); - return elem ? elem->data : 0; -} - -/* Insert an element into the hash table pH. The key is pKey,nKey -** and the data is "data". -** -** If no element exists with a matching key, then a new -** element is created. A copy of the key is made if the copyKey -** flag is set. NULL is returned. -** -** If another element already exists with the same key, then the -** new data replaces the old data and the old data is returned. -** The key is not copied in this instance. If a malloc fails, then -** the new data is returned and the hash table is unchanged. -** -** If the "data" parameter to this function is NULL, then the -** element corresponding to "key" is removed from the hash table. -*/ -void *sqlite3HashInsert(Hash *pH, const void *pKey, int nKey, void *data){ - int hraw; /* Raw hash value of the key */ - int h; /* the hash of the key modulo hash table size */ - HashElem *elem; /* Used to loop thru the element list */ - HashElem *new_elem; /* New element added to the pH */ - int (*xHash)(const void*,int); /* The hash function */ - - assert( pH!=0 ); - xHash = hashFunction(pH->keyClass); - assert( xHash!=0 ); - hraw = (*xHash)(pKey, nKey); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - elem = findElementGivenHash(pH,pKey,nKey,h); - if( elem ){ - void *old_data = elem->data; - if( data==0 ){ - removeElementGivenHash(pH,elem,h); - }else{ - elem->data = data; - if( !pH->copyKey ){ - elem->pKey = (void *)pKey; - } - assert(nKey==elem->nKey); - } - return old_data; - } - if( data==0 ) return 0; - new_elem = (HashElem*)sqlite3_malloc( sizeof(HashElem) ); - if( new_elem==0 ) return data; - if( pH->copyKey && pKey!=0 ){ - new_elem->pKey = sqlite3_malloc( nKey ); - if( new_elem->pKey==0 ){ - sqlite3_free(new_elem); - return data; - } - memcpy((void*)new_elem->pKey, pKey, nKey); - }else{ - new_elem->pKey = (void*)pKey; - } - new_elem->nKey = nKey; - pH->count++; - if( pH->htsize==0 ){ - rehash(pH,8); - if( pH->htsize==0 ){ - pH->count = 0; - if( pH->copyKey ){ - sqlite3_free(new_elem->pKey); - } - sqlite3_free(new_elem); - return data; - } - } - if( pH->count > pH->htsize ){ - rehash(pH,pH->htsize*2); - } - assert( pH->htsize>0 ); - assert( (pH->htsize & (pH->htsize-1))==0 ); - h = hraw & (pH->htsize-1); - insertElement(pH, &pH->ht[h], new_elem); - new_elem->data = data; - return 0; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/hash.h b/libraries/sqlite/unix/sqlite-3.5.1/src/hash.h deleted file mode 100644 index e3274e9e44..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/hash.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implemenation -** used in SQLite. -** -** $Id: hash.h,v 1.11 2007/09/04 14:31:47 danielk1977 Exp $ -*/ -#ifndef _SQLITE_HASH_H_ -#define _SQLITE_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct Hash Hash; -typedef struct HashElem HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, many of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -*/ -struct Hash { - char keyClass; /* SQLITE_HASH_INT, _POINTER, _STRING, _BINARY */ - char copyKey; /* True if copy of key made on insert */ - int count; /* Number of entries in this table */ - int htsize; /* Number of buckets in the hash table */ - HashElem *first; /* The first element of the array */ - struct _ht { /* the hash table */ - int count; /* Number of entries with this hash */ - HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct HashElem { - HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - void *pKey; int nKey; /* Key associated with this element */ -}; - -/* -** There are 4 different modes of operation for a hash table: -** -** SQLITE_HASH_INT nKey is used as the key and pKey is ignored. -** -** SQLITE_HASH_POINTER pKey is used as the key and nKey is ignored. -** -** SQLITE_HASH_STRING pKey points to a string that is nKey bytes long -** (including the null-terminator, if any). Case -** is ignored in comparisons. -** -** SQLITE_HASH_BINARY pKey points to binary data nKey bytes long. -** memcmp() is used to compare keys. -** -** A copy of the key is made for SQLITE_HASH_STRING and SQLITE_HASH_BINARY -** if the copyKey parameter to HashInit is 1. -*/ -/* #define SQLITE_HASH_INT 1 // NOT USED */ -/* #define SQLITE_HASH_POINTER 2 // NOT USED */ -#define SQLITE_HASH_STRING 3 -#define SQLITE_HASH_BINARY 4 - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -void sqlite3HashInit(Hash*, int keytype, int copyKey); -void *sqlite3HashInsert(Hash*, const void *pKey, int nKey, void *pData); -void *sqlite3HashFind(const Hash*, const void *pKey, int nKey); -HashElem *sqlite3HashFindElem(const Hash*, const void *pKey, int nKey); -void sqlite3HashClear(Hash*); - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** Hash h; -** HashElem *p; -** ... -** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ -** SomeStructure *pData = sqliteHashData(p); -** // do something with pData -** } -*/ -#define sqliteHashFirst(H) ((H)->first) -#define sqliteHashNext(E) ((E)->next) -#define sqliteHashData(E) ((E)->data) -#define sqliteHashKey(E) ((E)->pKey) -#define sqliteHashKeysize(E) ((E)->nKey) - -/* -** Number of entries in a hash table -*/ -#define sqliteHashCount(H) ((H)->count) - -#endif /* _SQLITE_HASH_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/insert.c b/libraries/sqlite/unix/sqlite-3.5.1/src/insert.c deleted file mode 100644 index 9d68c9539a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/insert.c +++ /dev/null @@ -1,1605 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains C code routines that are called by the parser -** to handle INSERT statements in SQLite. -** -** $Id: insert.c,v 1.192 2007/09/03 17:30:07 danielk1977 Exp $ -*/ -#include "sqliteInt.h" - -/* -** Set P3 of the most recently inserted opcode to a column affinity -** string for index pIdx. A column affinity string has one character -** for each column in the table, according to the affinity of the column: -** -** Character Column affinity -** ------------------------------ -** 'a' TEXT -** 'b' NONE -** 'c' NUMERIC -** 'd' INTEGER -** 'e' REAL -*/ -void sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ - if( !pIdx->zColAff ){ - /* The first time a column affinity string for a particular index is - ** required, it is allocated and populated here. It is then stored as - ** a member of the Index structure for subsequent use. - ** - ** The column affinity string will eventually be deleted by - ** sqliteDeleteIndex() when the Index structure itself is cleaned - ** up. - */ - int n; - Table *pTab = pIdx->pTable; - sqlite3 *db = sqlite3VdbeDb(v); - pIdx->zColAff = (char *)sqlite3DbMallocZero(db, pIdx->nColumn+1); - if( !pIdx->zColAff ){ - return; - } - for(n=0; nnColumn; n++){ - pIdx->zColAff[n] = pTab->aCol[pIdx->aiColumn[n]].affinity; - } - pIdx->zColAff[pIdx->nColumn] = '\0'; - } - - sqlite3VdbeChangeP3(v, -1, pIdx->zColAff, 0); -} - -/* -** Set P3 of the most recently inserted opcode to a column affinity -** string for table pTab. A column affinity string has one character -** for each column indexed by the index, according to the affinity of the -** column: -** -** Character Column affinity -** ------------------------------ -** 'a' TEXT -** 'b' NONE -** 'c' NUMERIC -** 'd' INTEGER -** 'e' REAL -*/ -void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){ - /* The first time a column affinity string for a particular table - ** is required, it is allocated and populated here. It is then - ** stored as a member of the Table structure for subsequent use. - ** - ** The column affinity string will eventually be deleted by - ** sqlite3DeleteTable() when the Table structure itself is cleaned up. - */ - if( !pTab->zColAff ){ - char *zColAff; - int i; - sqlite3 *db = sqlite3VdbeDb(v); - - zColAff = (char *)sqlite3DbMallocZero(db, pTab->nCol+1); - if( !zColAff ){ - return; - } - - for(i=0; inCol; i++){ - zColAff[i] = pTab->aCol[i].affinity; - } - zColAff[pTab->nCol] = '\0'; - - pTab->zColAff = zColAff; - } - - sqlite3VdbeChangeP3(v, -1, pTab->zColAff, 0); -} - -/* -** Return non-zero if SELECT statement p opens the table with rootpage -** iTab in database iDb. This is used to see if a statement of the form -** "INSERT INTO SELECT ..." can run without using temporary -** table for the results of the SELECT. -** -** No checking is done for sub-selects that are part of expressions. -*/ -static int selectReadsTable(Select *p, Schema *pSchema, int iTab){ - int i; - struct SrcList_item *pItem; - if( p->pSrc==0 ) return 0; - for(i=0, pItem=p->pSrc->a; ipSrc->nSrc; i++, pItem++){ - if( pItem->pSelect ){ - if( selectReadsTable(pItem->pSelect, pSchema, iTab) ) return 1; - }else{ - if( pItem->pTab->pSchema==pSchema && pItem->pTab->tnum==iTab ) return 1; - } - } - return 0; -} - -#ifndef SQLITE_OMIT_AUTOINCREMENT -/* -** Write out code to initialize the autoincrement logic. This code -** looks up the current autoincrement value in the sqlite_sequence -** table and stores that value in a memory cell. Code generated by -** autoIncStep() will keep that memory cell holding the largest -** rowid value. Code generated by autoIncEnd() will write the new -** largest value of the counter back into the sqlite_sequence table. -** -** This routine returns the index of the mem[] cell that contains -** the maximum rowid counter. -** -** Two memory cells are allocated. The next memory cell after the -** one returned holds the rowid in sqlite_sequence where we will -** write back the revised maximum rowid. -*/ -static int autoIncBegin( - Parse *pParse, /* Parsing context */ - int iDb, /* Index of the database holding pTab */ - Table *pTab /* The table we are writing to */ -){ - int memId = 0; - if( pTab->autoInc ){ - Vdbe *v = pParse->pVdbe; - Db *pDb = &pParse->db->aDb[iDb]; - int iCur = pParse->nTab; - int addr; - assert( v ); - addr = sqlite3VdbeCurrentAddr(v); - memId = pParse->nMem+1; - pParse->nMem += 2; - sqlite3OpenTable(pParse, iCur, iDb, pDb->pSchema->pSeqTab, OP_OpenRead); - sqlite3VdbeAddOp(v, OP_Rewind, iCur, addr+13); - sqlite3VdbeAddOp(v, OP_Column, iCur, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->zName, 0); - sqlite3VdbeAddOp(v, OP_Ne, 0x100, addr+12); - sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0); - sqlite3VdbeAddOp(v, OP_MemStore, memId-1, 1); - sqlite3VdbeAddOp(v, OP_Column, iCur, 1); - sqlite3VdbeAddOp(v, OP_MemStore, memId, 1); - sqlite3VdbeAddOp(v, OP_Goto, 0, addr+13); - sqlite3VdbeAddOp(v, OP_Next, iCur, addr+4); - sqlite3VdbeAddOp(v, OP_Close, iCur, 0); - } - return memId; -} - -/* -** Update the maximum rowid for an autoincrement calculation. -** -** This routine should be called when the top of the stack holds a -** new rowid that is about to be inserted. If that new rowid is -** larger than the maximum rowid in the memId memory cell, then the -** memory cell is updated. The stack is unchanged. -*/ -static void autoIncStep(Parse *pParse, int memId){ - if( memId>0 ){ - sqlite3VdbeAddOp(pParse->pVdbe, OP_MemMax, memId, 0); - } -} - -/* -** After doing one or more inserts, the maximum rowid is stored -** in mem[memId]. Generate code to write this value back into the -** the sqlite_sequence table. -*/ -static void autoIncEnd( - Parse *pParse, /* The parsing context */ - int iDb, /* Index of the database holding pTab */ - Table *pTab, /* Table we are inserting into */ - int memId /* Memory cell holding the maximum rowid */ -){ - if( pTab->autoInc ){ - int iCur = pParse->nTab; - Vdbe *v = pParse->pVdbe; - Db *pDb = &pParse->db->aDb[iDb]; - int addr; - assert( v ); - addr = sqlite3VdbeCurrentAddr(v); - sqlite3OpenTable(pParse, iCur, iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); - sqlite3VdbeAddOp(v, OP_MemLoad, memId-1, 0); - sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+7); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_NewRowid, iCur, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->zName, 0); - sqlite3VdbeAddOp(v, OP_MemLoad, memId, 0); - sqlite3VdbeAddOp(v, OP_MakeRecord, 2, 0); - sqlite3VdbeAddOp(v, OP_Insert, iCur, OPFLAG_APPEND); - sqlite3VdbeAddOp(v, OP_Close, iCur, 0); - } -} -#else -/* -** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines -** above are all no-ops -*/ -# define autoIncBegin(A,B,C) (0) -# define autoIncStep(A,B) -# define autoIncEnd(A,B,C,D) -#endif /* SQLITE_OMIT_AUTOINCREMENT */ - - -/* Forward declaration */ -static int xferOptimization( - Parse *pParse, /* Parser context */ - Table *pDest, /* The table we are inserting into */ - Select *pSelect, /* A SELECT statement to use as the data source */ - int onError, /* How to handle constraint errors */ - int iDbDest /* The database of pDest */ -); - -/* -** This routine is call to handle SQL of the following forms: -** -** insert into TABLE (IDLIST) values(EXPRLIST) -** insert into TABLE (IDLIST) select -** -** The IDLIST following the table name is always optional. If omitted, -** then a list of all columns for the table is substituted. The IDLIST -** appears in the pColumn parameter. pColumn is NULL if IDLIST is omitted. -** -** The pList parameter holds EXPRLIST in the first form of the INSERT -** statement above, and pSelect is NULL. For the second form, pList is -** NULL and pSelect is a pointer to the select statement used to generate -** data for the insert. -** -** The code generated follows one of four templates. For a simple -** select with data coming from a VALUES clause, the code executes -** once straight down through. The template looks like this: -** -** open write cursor to
    and its indices -** puts VALUES clause expressions onto the stack -** write the resulting record into
    -** cleanup -** -** The three remaining templates assume the statement is of the form -** -** INSERT INTO
    SELECT ... -** -** If the SELECT clause is of the restricted form "SELECT * FROM " - -** in other words if the SELECT pulls all columns from a single table -** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and -** if and are distinct tables but have identical -** schemas, including all the same indices, then a special optimization -** is invoked that copies raw records from over to . -** See the xferOptimization() function for the implementation of this -** template. This is the second template. -** -** open a write cursor to
    -** open read cursor on -** transfer all records in over to
    -** close cursors -** foreach index on
    -** open a write cursor on the
    index -** open a read cursor on the corresponding index -** transfer all records from the read to the write cursors -** close cursors -** end foreach -** -** The third template is for when the second template does not apply -** and the SELECT clause does not read from
    at any time. -** The generated code follows this template: -** -** goto B -** A: setup for the SELECT -** loop over the rows in the SELECT -** gosub C -** end loop -** cleanup after the SELECT -** goto D -** B: open write cursor to
    and its indices -** goto A -** C: insert the select result into
    -** return -** D: cleanup -** -** The fourth template is used if the insert statement takes its -** values from a SELECT but the data is being inserted into a table -** that is also read as part of the SELECT. In the third form, -** we have to use a intermediate table to store the results of -** the select. The template is like this: -** -** goto B -** A: setup for the SELECT -** loop over the tables in the SELECT -** gosub C -** end loop -** cleanup after the SELECT -** goto D -** C: insert the select result into the intermediate table -** return -** B: open a cursor to an intermediate table -** goto A -** D: open write cursor to
    and its indices -** loop over the intermediate table -** transfer values form intermediate table into
    -** end the loop -** cleanup -*/ -void sqlite3Insert( - Parse *pParse, /* Parser context */ - SrcList *pTabList, /* Name of table into which we are inserting */ - ExprList *pList, /* List of values to be inserted */ - Select *pSelect, /* A SELECT statement to use as the data source */ - IdList *pColumn, /* Column names corresponding to IDLIST. */ - int onError /* How to handle constraint errors */ -){ - Table *pTab; /* The table to insert into */ - char *zTab; /* Name of the table into which we are inserting */ - const char *zDb; /* Name of the database holding this table */ - int i, j, idx; /* Loop counters */ - Vdbe *v; /* Generate code into this virtual machine */ - Index *pIdx; /* For looping over indices of the table */ - int nColumn; /* Number of columns in the data */ - int base = 0; /* VDBE Cursor number for pTab */ - int iCont=0,iBreak=0; /* Beginning and end of the loop over srcTab */ - sqlite3 *db; /* The main database structure */ - int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ - int endOfLoop; /* Label for the end of the insertion loop */ - int useTempTable = 0; /* Store SELECT results in intermediate table */ - int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ - int iSelectLoop = 0; /* Address of code that implements the SELECT */ - int iCleanup = 0; /* Address of the cleanup code */ - int iInsertBlock = 0; /* Address of the subroutine used to insert data */ - int iCntMem = 0; /* Memory cell used for the row counter */ - int newIdx = -1; /* Cursor for the NEW table */ - Db *pDb; /* The database containing table being inserted into */ - int counterMem = 0; /* Memory cell holding AUTOINCREMENT counter */ - int appendFlag = 0; /* True if the insert is likely to be an append */ - int iDb; - - int nHidden = 0; - -#ifndef SQLITE_OMIT_TRIGGER - int isView; /* True if attempting to insert into a view */ - int triggers_exist = 0; /* True if there are FOR EACH ROW triggers */ -#endif - - db = pParse->db; - if( pParse->nErr || db->mallocFailed ){ - goto insert_cleanup; - } - - /* Locate the table into which we will be inserting new information. - */ - assert( pTabList->nSrc==1 ); - zTab = pTabList->a[0].zName; - if( zTab==0 ) goto insert_cleanup; - pTab = sqlite3SrcListLookup(pParse, pTabList); - if( pTab==0 ){ - goto insert_cleanup; - } - iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - assert( iDbnDb ); - pDb = &db->aDb[iDb]; - zDb = pDb->zName; - if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){ - goto insert_cleanup; - } - - /* Figure out if we have any triggers and if the table being - ** inserted into is a view - */ -#ifndef SQLITE_OMIT_TRIGGER - triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0); - isView = pTab->pSelect!=0; -#else -# define triggers_exist 0 -# define isView 0 -#endif -#ifdef SQLITE_OMIT_VIEW -# undef isView -# define isView 0 -#endif - - /* Ensure that: - * (a) the table is not read-only, - * (b) that if it is a view then ON INSERT triggers exist - */ - if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){ - goto insert_cleanup; - } - assert( pTab!=0 ); - - /* If pTab is really a view, make sure it has been initialized. - ** ViewGetColumnNames() is a no-op if pTab is not a view (or virtual - ** module table). - */ - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ - goto insert_cleanup; - } - - /* Allocate a VDBE - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto insert_cleanup; - if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); - sqlite3BeginWriteOperation(pParse, pSelect || triggers_exist, iDb); - - /* if there are row triggers, allocate a temp table for new.* references. */ - if( triggers_exist ){ - newIdx = pParse->nTab++; - } - -#ifndef SQLITE_OMIT_XFER_OPT - /* If the statement is of the form - ** - ** INSERT INTO SELECT * FROM ; - ** - ** Then special optimizations can be applied that make the transfer - ** very fast and which reduce fragmentation of indices. - */ - if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ - assert( !triggers_exist ); - assert( pList==0 ); - goto insert_cleanup; - } -#endif /* SQLITE_OMIT_XFER_OPT */ - - /* If this is an AUTOINCREMENT table, look up the sequence number in the - ** sqlite_sequence table and store it in memory cell counterMem. Also - ** remember the rowid of the sqlite_sequence table entry in memory cell - ** counterRowid. - */ - counterMem = autoIncBegin(pParse, iDb, pTab); - - /* Figure out how many columns of data are supplied. If the data - ** is coming from a SELECT statement, then this step also generates - ** all the code to implement the SELECT statement and invoke a subroutine - ** to process each row of the result. (Template 2.) If the SELECT - ** statement uses the the table that is being inserted into, then the - ** subroutine is also coded here. That subroutine stores the SELECT - ** results in a temporary table. (Template 3.) - */ - if( pSelect ){ - /* Data is coming from a SELECT. Generate code to implement that SELECT - */ - int rc, iInitCode; - iInitCode = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); - iSelectLoop = sqlite3VdbeCurrentAddr(v); - iInsertBlock = sqlite3VdbeMakeLabel(v); - - /* Resolve the expressions in the SELECT statement and execute it. */ - rc = sqlite3Select(pParse, pSelect, SRT_Subroutine, iInsertBlock,0,0,0,0); - if( rc || pParse->nErr || db->mallocFailed ){ - goto insert_cleanup; - } - - iCleanup = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp(v, OP_Goto, 0, iCleanup); - assert( pSelect->pEList ); - nColumn = pSelect->pEList->nExpr; - - /* Set useTempTable to TRUE if the result of the SELECT statement - ** should be written into a temporary table. Set to FALSE if each - ** row of the SELECT can be written directly into the result table. - ** - ** A temp table must be used if the table being updated is also one - ** of the tables being read by the SELECT statement. Also use a - ** temp table in the case of row triggers. - */ - if( triggers_exist || selectReadsTable(pSelect,pTab->pSchema,pTab->tnum) ){ - useTempTable = 1; - } - - if( useTempTable ){ - /* Generate the subroutine that SELECT calls to process each row of - ** the result. Store the result in a temporary table - */ - srcTab = pParse->nTab++; - sqlite3VdbeResolveLabel(v, iInsertBlock); - sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); - sqlite3VdbeAddOp(v, OP_NewRowid, srcTab, 0); - sqlite3VdbeAddOp(v, OP_Pull, 1, 0); - sqlite3VdbeAddOp(v, OP_Insert, srcTab, OPFLAG_APPEND); - sqlite3VdbeAddOp(v, OP_Return, 0, 0); - - /* The following code runs first because the GOTO at the very top - ** of the program jumps to it. Create the temporary table, then jump - ** back up and execute the SELECT code above. - */ - sqlite3VdbeJumpHere(v, iInitCode); - sqlite3VdbeAddOp(v, OP_OpenEphemeral, srcTab, 0); - sqlite3VdbeAddOp(v, OP_SetNumColumns, srcTab, nColumn); - sqlite3VdbeAddOp(v, OP_Goto, 0, iSelectLoop); - sqlite3VdbeResolveLabel(v, iCleanup); - }else{ - sqlite3VdbeJumpHere(v, iInitCode); - } - }else{ - /* This is the case if the data for the INSERT is coming from a VALUES - ** clause - */ - NameContext sNC; - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - srcTab = -1; - useTempTable = 0; - nColumn = pList ? pList->nExpr : 0; - for(i=0; ia[i].pExpr) ){ - goto insert_cleanup; - } - } - } - - /* Make sure the number of columns in the source data matches the number - ** of columns to be inserted into the table. - */ - if( IsVirtual(pTab) ){ - for(i=0; inCol; i++){ - nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); - } - } - if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ - sqlite3ErrorMsg(pParse, - "table %S has %d columns but %d values were supplied", - pTabList, 0, pTab->nCol, nColumn); - goto insert_cleanup; - } - if( pColumn!=0 && nColumn!=pColumn->nId ){ - sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); - goto insert_cleanup; - } - - /* If the INSERT statement included an IDLIST term, then make sure - ** all elements of the IDLIST really are columns of the table and - ** remember the column indices. - ** - ** If the table has an INTEGER PRIMARY KEY column and that column - ** is named in the IDLIST, then record in the keyColumn variable - ** the index into IDLIST of the primary key column. keyColumn is - ** the index of the primary key as it appears in IDLIST, not as - ** is appears in the original table. (The index of the primary - ** key in the original table is pTab->iPKey.) - */ - if( pColumn ){ - for(i=0; inId; i++){ - pColumn->a[i].idx = -1; - } - for(i=0; inId; i++){ - for(j=0; jnCol; j++){ - if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ - pColumn->a[i].idx = j; - if( j==pTab->iPKey ){ - keyColumn = i; - } - break; - } - } - if( j>=pTab->nCol ){ - if( sqlite3IsRowid(pColumn->a[i].zName) ){ - keyColumn = i; - }else{ - sqlite3ErrorMsg(pParse, "table %S has no column named %s", - pTabList, 0, pColumn->a[i].zName); - pParse->nErr++; - goto insert_cleanup; - } - } - } - } - - /* If there is no IDLIST term but the table has an integer primary - ** key, the set the keyColumn variable to the primary key column index - ** in the original table definition. - */ - if( pColumn==0 && nColumn>0 ){ - keyColumn = pTab->iPKey; - } - - /* Open the temp table for FOR EACH ROW triggers - */ - if( triggers_exist ){ - sqlite3VdbeAddOp(v, OP_OpenPseudo, newIdx, 0); - sqlite3VdbeAddOp(v, OP_SetNumColumns, newIdx, pTab->nCol); - } - - /* Initialize the count of rows to be inserted - */ - if( db->flags & SQLITE_CountRows ){ - iCntMem = pParse->nMem++; - sqlite3VdbeAddOp(v, OP_MemInt, 0, iCntMem); - } - - /* Open tables and indices if there are no row triggers */ - if( !triggers_exist ){ - base = pParse->nTab; - sqlite3OpenTableAndIndices(pParse, pTab, base, OP_OpenWrite); - } - - /* If the data source is a temporary table, then we have to create - ** a loop because there might be multiple rows of data. If the data - ** source is a subroutine call from the SELECT statement, then we need - ** to launch the SELECT statement processing. - */ - if( useTempTable ){ - iBreak = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp(v, OP_Rewind, srcTab, iBreak); - iCont = sqlite3VdbeCurrentAddr(v); - }else if( pSelect ){ - sqlite3VdbeAddOp(v, OP_Goto, 0, iSelectLoop); - sqlite3VdbeResolveLabel(v, iInsertBlock); - } - - /* Run the BEFORE and INSTEAD OF triggers, if there are any - */ - endOfLoop = sqlite3VdbeMakeLabel(v); - if( triggers_exist & TRIGGER_BEFORE ){ - - /* build the NEW.* reference row. Note that if there is an INTEGER - ** PRIMARY KEY into which a NULL is being inserted, that NULL will be - ** translated into a unique ID for the row. But on a BEFORE trigger, - ** we do not know what the unique ID will be (because the insert has - ** not happened yet) so we substitute a rowid of -1 - */ - if( keyColumn<0 ){ - sqlite3VdbeAddOp(v, OP_Integer, -1, 0); - }else if( useTempTable ){ - sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn); - }else{ - assert( pSelect==0 ); /* Otherwise useTempTable is true */ - sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr); - sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_Integer, -1, 0); - sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); - } - - /* Cannot have triggers on a virtual table. If it were possible, - ** this block would have to account for hidden column. - */ - assert(!IsVirtual(pTab)); - - /* Create the new column data - */ - for(i=0; inCol; i++){ - if( pColumn==0 ){ - j = i; - }else{ - for(j=0; jnId; j++){ - if( pColumn->a[j].idx==i ) break; - } - } - if( pColumn && j>=pColumn->nId ){ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); - }else if( useTempTable ){ - sqlite3VdbeAddOp(v, OP_Column, srcTab, j); - }else{ - assert( pSelect==0 ); /* Otherwise useTempTable is true */ - sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr); - } - } - sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); - - /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, - ** do not attempt any conversions before assembling the record. - ** If this is a real table, attempt conversions as required by the - ** table column affinities. - */ - if( !isView ){ - sqlite3TableAffinityStr(v, pTab); - } - sqlite3VdbeAddOp(v, OP_Insert, newIdx, 0); - - /* Fire BEFORE or INSTEAD OF triggers */ - if( sqlite3CodeRowTrigger(pParse, TK_INSERT, 0, TRIGGER_BEFORE, pTab, - newIdx, -1, onError, endOfLoop) ){ - goto insert_cleanup; - } - } - - /* If any triggers exists, the opening of tables and indices is deferred - ** until now. - */ - if( triggers_exist && !isView ){ - base = pParse->nTab; - sqlite3OpenTableAndIndices(pParse, pTab, base, OP_OpenWrite); - } - - /* Push the record number for the new entry onto the stack. The - ** record number is a randomly generate integer created by NewRowid - ** except when the table has an INTEGER PRIMARY KEY column, in which - ** case the record number is the same as that column. - */ - if( !isView ){ - if( IsVirtual(pTab) ){ - /* The row that the VUpdate opcode will delete: none */ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - } - if( keyColumn>=0 ){ - if( useTempTable ){ - sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn); - }else if( pSelect ){ - sqlite3VdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1); - }else{ - VdbeOp *pOp; - sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr); - pOp = sqlite3VdbeGetOp(v, sqlite3VdbeCurrentAddr(v) - 1); - if( pOp && pOp->opcode==OP_Null ){ - appendFlag = 1; - pOp->opcode = OP_NewRowid; - pOp->p1 = base; - pOp->p2 = counterMem; - } - } - /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid - ** to generate a unique primary key value. - */ - if( !appendFlag ){ - sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_NewRowid, base, counterMem); - sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); - } - }else if( IsVirtual(pTab) ){ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - }else{ - sqlite3VdbeAddOp(v, OP_NewRowid, base, counterMem); - appendFlag = 1; - } - autoIncStep(pParse, counterMem); - - /* Push onto the stack, data for all columns of the new entry, beginning - ** with the first column. - */ - nHidden = 0; - for(i=0; inCol; i++){ - if( i==pTab->iPKey ){ - /* The value of the INTEGER PRIMARY KEY column is always a NULL. - ** Whenever this column is read, the record number will be substituted - ** in its place. So will fill this column with a NULL to avoid - ** taking up data space with information that will never be used. */ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - continue; - } - if( pColumn==0 ){ - if( IsHiddenColumn(&pTab->aCol[i]) ){ - assert( IsVirtual(pTab) ); - j = -1; - nHidden++; - }else{ - j = i - nHidden; - } - }else{ - for(j=0; jnId; j++){ - if( pColumn->a[j].idx==i ) break; - } - } - if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); - }else if( useTempTable ){ - sqlite3VdbeAddOp(v, OP_Column, srcTab, j); - }else if( pSelect ){ - sqlite3VdbeAddOp(v, OP_Dup, i+nColumn-j+IsVirtual(pTab), 1); - }else{ - sqlite3ExprCode(pParse, pList->a[j].pExpr); - } - } - - /* Generate code to check constraints and generate index keys and - ** do the insertion. - */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - pParse->pVirtualLock = pTab; - sqlite3VdbeOp3(v, OP_VUpdate, 1, pTab->nCol+2, - (const char*)pTab->pVtab, P3_VTAB); - }else -#endif - { - sqlite3GenerateConstraintChecks(pParse, pTab, base, 0, keyColumn>=0, - 0, onError, endOfLoop); - sqlite3CompleteInsertion(pParse, pTab, base, 0,0,0, - (triggers_exist & TRIGGER_AFTER)!=0 ? newIdx : -1, - appendFlag); - } - } - - /* Update the count of rows that are inserted - */ - if( (db->flags & SQLITE_CountRows)!=0 ){ - sqlite3VdbeAddOp(v, OP_MemIncr, 1, iCntMem); - } - - if( triggers_exist ){ - /* Close all tables opened */ - if( !isView ){ - sqlite3VdbeAddOp(v, OP_Close, base, 0); - for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ - sqlite3VdbeAddOp(v, OP_Close, idx+base, 0); - } - } - - /* Code AFTER triggers */ - if( sqlite3CodeRowTrigger(pParse, TK_INSERT, 0, TRIGGER_AFTER, pTab, - newIdx, -1, onError, endOfLoop) ){ - goto insert_cleanup; - } - } - - /* The bottom of the loop, if the data source is a SELECT statement - */ - sqlite3VdbeResolveLabel(v, endOfLoop); - if( useTempTable ){ - sqlite3VdbeAddOp(v, OP_Next, srcTab, iCont); - sqlite3VdbeResolveLabel(v, iBreak); - sqlite3VdbeAddOp(v, OP_Close, srcTab, 0); - }else if( pSelect ){ - sqlite3VdbeAddOp(v, OP_Pop, nColumn, 0); - sqlite3VdbeAddOp(v, OP_Return, 0, 0); - sqlite3VdbeResolveLabel(v, iCleanup); - } - - if( !triggers_exist && !IsVirtual(pTab) ){ - /* Close all tables opened */ - sqlite3VdbeAddOp(v, OP_Close, base, 0); - for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ - sqlite3VdbeAddOp(v, OP_Close, idx+base, 0); - } - } - - /* Update the sqlite_sequence table by storing the content of the - ** counter value in memory counterMem back into the sqlite_sequence - ** table. - */ - autoIncEnd(pParse, iDb, pTab, counterMem); - - /* - ** Return the number of rows inserted. If this routine is - ** generating code because of a call to sqlite3NestedParse(), do not - ** invoke the callback function. - */ - if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){ - sqlite3VdbeAddOp(v, OP_MemLoad, iCntMem, 0); - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", P3_STATIC); - } - -insert_cleanup: - sqlite3SrcListDelete(pTabList); - sqlite3ExprListDelete(pList); - sqlite3SelectDelete(pSelect); - sqlite3IdListDelete(pColumn); -} - -/* -** Generate code to do a constraint check prior to an INSERT or an UPDATE. -** -** When this routine is called, the stack contains (from bottom to top) -** the following values: -** -** 1. The rowid of the row to be updated before the update. This -** value is omitted unless we are doing an UPDATE that involves a -** change to the record number. -** -** 2. The rowid of the row after the update. -** -** 3. The data in the first column of the entry after the update. -** -** i. Data from middle columns... -** -** N. The data in the last column of the entry after the update. -** -** The old rowid shown as entry (1) above is omitted unless both isUpdate -** and rowidChng are 1. isUpdate is true for UPDATEs and false for -** INSERTs and rowidChng is true if the record number is being changed. -** -** The code generated by this routine pushes additional entries onto -** the stack which are the keys for new index entries for the new record. -** The order of index keys is the same as the order of the indices on -** the pTable->pIndex list. A key is only created for index i if -** aIdxUsed!=0 and aIdxUsed[i]!=0. -** -** This routine also generates code to check constraints. NOT NULL, -** CHECK, and UNIQUE constraints are all checked. If a constraint fails, -** then the appropriate action is performed. There are five possible -** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. -** -** Constraint type Action What Happens -** --------------- ---------- ---------------------------------------- -** any ROLLBACK The current transaction is rolled back and -** sqlite3_exec() returns immediately with a -** return code of SQLITE_CONSTRAINT. -** -** any ABORT Back out changes from the current command -** only (do not do a complete rollback) then -** cause sqlite3_exec() to return immediately -** with SQLITE_CONSTRAINT. -** -** any FAIL Sqlite_exec() returns immediately with a -** return code of SQLITE_CONSTRAINT. The -** transaction is not rolled back and any -** prior changes are retained. -** -** any IGNORE The record number and data is popped from -** the stack and there is an immediate jump -** to label ignoreDest. -** -** NOT NULL REPLACE The NULL value is replace by the default -** value for that column. If the default value -** is NULL, the action is the same as ABORT. -** -** UNIQUE REPLACE The other row that conflicts with the row -** being inserted is removed. -** -** CHECK REPLACE Illegal. The results in an exception. -** -** Which action to take is determined by the overrideError parameter. -** Or if overrideError==OE_Default, then the pParse->onError parameter -** is used. Or if pParse->onError==OE_Default then the onError value -** for the constraint is used. -** -** The calling routine must open a read/write cursor for pTab with -** cursor number "base". All indices of pTab must also have open -** read/write cursors with cursor number base+i for the i-th cursor. -** Except, if there is no possibility of a REPLACE action then -** cursors do not need to be open for indices where aIdxUsed[i]==0. -** -** If the isUpdate flag is true, it means that the "base" cursor is -** initially pointing to an entry that is being updated. The isUpdate -** flag causes extra code to be generated so that the "base" cursor -** is still pointing at the same entry after the routine returns. -** Without the isUpdate flag, the "base" cursor might be moved. -*/ -void sqlite3GenerateConstraintChecks( - Parse *pParse, /* The parser context */ - Table *pTab, /* the table into which we are inserting */ - int base, /* Index of a read/write cursor pointing at pTab */ - char *aIdxUsed, /* Which indices are used. NULL means all are used */ - int rowidChng, /* True if the record number will change */ - int isUpdate, /* True for UPDATE, False for INSERT */ - int overrideError, /* Override onError to this if not OE_Default */ - int ignoreDest /* Jump to this label on an OE_Ignore resolution */ -){ - int i; - Vdbe *v; - int nCol; - int onError; - int addr; - int extra; - int iCur; - Index *pIdx; - int seenReplace = 0; - int jumpInst1=0, jumpInst2; - int hasTwoRowids = (isUpdate && rowidChng); - - v = sqlite3GetVdbe(pParse); - assert( v!=0 ); - assert( pTab->pSelect==0 ); /* This table is not a VIEW */ - nCol = pTab->nCol; - - /* Test all NOT NULL constraints. - */ - for(i=0; iiPKey ){ - continue; - } - onError = pTab->aCol[i].notNull; - if( onError==OE_None ) continue; - if( overrideError!=OE_Default ){ - onError = overrideError; - }else if( onError==OE_Default ){ - onError = OE_Abort; - } - if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ - onError = OE_Abort; - } - sqlite3VdbeAddOp(v, OP_Dup, nCol-1-i, 1); - addr = sqlite3VdbeAddOp(v, OP_NotNull, 1, 0); - assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail - || onError==OE_Ignore || onError==OE_Replace ); - switch( onError ){ - case OE_Rollback: - case OE_Abort: - case OE_Fail: { - char *zMsg = 0; - sqlite3VdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError); - sqlite3SetString(&zMsg, pTab->zName, ".", pTab->aCol[i].zName, - " may not be NULL", (char*)0); - sqlite3VdbeChangeP3(v, -1, zMsg, P3_DYNAMIC); - break; - } - case OE_Ignore: { - sqlite3VdbeAddOp(v, OP_Pop, nCol+1+hasTwoRowids, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); - break; - } - case OE_Replace: { - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt); - sqlite3VdbeAddOp(v, OP_Push, nCol-i, 0); - break; - } - } - sqlite3VdbeJumpHere(v, addr); - } - - /* Test all CHECK constraints - */ -#ifndef SQLITE_OMIT_CHECK - if( pTab->pCheck && (pParse->db->flags & SQLITE_IgnoreChecks)==0 ){ - int allOk = sqlite3VdbeMakeLabel(v); - assert( pParse->ckOffset==0 ); - pParse->ckOffset = nCol; - sqlite3ExprIfTrue(pParse, pTab->pCheck, allOk, 1); - assert( pParse->ckOffset==nCol ); - pParse->ckOffset = 0; - onError = overrideError!=OE_Default ? overrideError : OE_Abort; - if( onError==OE_Ignore ){ - sqlite3VdbeAddOp(v, OP_Pop, nCol+1+hasTwoRowids, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); - }else{ - sqlite3VdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError); - } - sqlite3VdbeResolveLabel(v, allOk); - } -#endif /* !defined(SQLITE_OMIT_CHECK) */ - - /* If we have an INTEGER PRIMARY KEY, make sure the primary key - ** of the new record does not previously exist. Except, if this - ** is an UPDATE and the primary key is not changing, that is OK. - */ - if( rowidChng ){ - onError = pTab->keyConf; - if( overrideError!=OE_Default ){ - onError = overrideError; - }else if( onError==OE_Default ){ - onError = OE_Abort; - } - - if( isUpdate ){ - sqlite3VdbeAddOp(v, OP_Dup, nCol+1, 1); - sqlite3VdbeAddOp(v, OP_Dup, nCol+1, 1); - jumpInst1 = sqlite3VdbeAddOp(v, OP_Eq, 0, 0); - } - sqlite3VdbeAddOp(v, OP_Dup, nCol, 1); - jumpInst2 = sqlite3VdbeAddOp(v, OP_NotExists, base, 0); - switch( onError ){ - default: { - onError = OE_Abort; - /* Fall thru into the next case */ - } - case OE_Rollback: - case OE_Abort: - case OE_Fail: { - sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, - "PRIMARY KEY must be unique", P3_STATIC); - break; - } - case OE_Replace: { - sqlite3GenerateRowIndexDelete(v, pTab, base, 0); - if( isUpdate ){ - sqlite3VdbeAddOp(v, OP_Dup, nCol+hasTwoRowids, 1); - sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); - } - seenReplace = 1; - break; - } - case OE_Ignore: { - assert( seenReplace==0 ); - sqlite3VdbeAddOp(v, OP_Pop, nCol+1+hasTwoRowids, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); - break; - } - } - sqlite3VdbeJumpHere(v, jumpInst2); - if( isUpdate ){ - sqlite3VdbeJumpHere(v, jumpInst1); - sqlite3VdbeAddOp(v, OP_Dup, nCol+1, 1); - sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); - } - } - - /* Test all UNIQUE constraints by creating entries for each UNIQUE - ** index and making sure that duplicate entries do not already exist. - ** Add the new records to the indices as we go. - */ - extra = -1; - for(iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){ - if( aIdxUsed && aIdxUsed[iCur]==0 ) continue; /* Skip unused indices */ - extra++; - - /* Create a key for accessing the index entry */ - sqlite3VdbeAddOp(v, OP_Dup, nCol+extra, 1); - for(i=0; inColumn; i++){ - int idx = pIdx->aiColumn[i]; - if( idx==pTab->iPKey ){ - sqlite3VdbeAddOp(v, OP_Dup, i+extra+nCol+1, 1); - }else{ - sqlite3VdbeAddOp(v, OP_Dup, i+extra+nCol-idx, 1); - } - } - jumpInst1 = sqlite3VdbeAddOp(v, OP_MakeIdxRec, pIdx->nColumn, 0); - sqlite3IndexAffinityStr(v, pIdx); - - /* Find out what action to take in case there is an indexing conflict */ - onError = pIdx->onError; - if( onError==OE_None ) continue; /* pIdx is not a UNIQUE index */ - if( overrideError!=OE_Default ){ - onError = overrideError; - }else if( onError==OE_Default ){ - onError = OE_Abort; - } - if( seenReplace ){ - if( onError==OE_Ignore ) onError = OE_Replace; - else if( onError==OE_Fail ) onError = OE_Abort; - } - - - /* Check to see if the new index entry will be unique */ - sqlite3VdbeAddOp(v, OP_Dup, extra+nCol+1+hasTwoRowids, 1); - jumpInst2 = sqlite3VdbeAddOp(v, OP_IsUnique, base+iCur+1, 0); - - /* Generate code that executes if the new index entry is not unique */ - assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail - || onError==OE_Ignore || onError==OE_Replace ); - switch( onError ){ - case OE_Rollback: - case OE_Abort: - case OE_Fail: { - int j, n1, n2; - char zErrMsg[200]; - sqlite3_snprintf(sizeof(zErrMsg), zErrMsg, - pIdx->nColumn>1 ? "columns " : "column "); - n1 = strlen(zErrMsg); - for(j=0; jnColumn && n1aCol[pIdx->aiColumn[j]].zName; - n2 = strlen(zCol); - if( j>0 ){ - sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], ", "); - n1 += 2; - } - if( n1+n2>sizeof(zErrMsg)-30 ){ - sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], "..."); - n1 += 3; - break; - }else{ - sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], "%s", zCol); - n1 += n2; - } - } - sqlite3_snprintf(sizeof(zErrMsg)-n1, &zErrMsg[n1], - pIdx->nColumn>1 ? " are not unique" : " is not unique"); - sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, zErrMsg, 0); - break; - } - case OE_Ignore: { - assert( seenReplace==0 ); - sqlite3VdbeAddOp(v, OP_Pop, nCol+extra+3+hasTwoRowids, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, ignoreDest); - break; - } - case OE_Replace: { - sqlite3GenerateRowDelete(pParse->db, v, pTab, base, 0); - if( isUpdate ){ - sqlite3VdbeAddOp(v, OP_Dup, nCol+extra+1+hasTwoRowids, 1); - sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); - } - seenReplace = 1; - break; - } - } -#if NULL_DISTINCT_FOR_UNIQUE - sqlite3VdbeJumpHere(v, jumpInst1); -#endif - sqlite3VdbeJumpHere(v, jumpInst2); - } -} - -/* -** This routine generates code to finish the INSERT or UPDATE operation -** that was started by a prior call to sqlite3GenerateConstraintChecks. -** The stack must contain keys for all active indices followed by data -** and the rowid for the new entry. This routine creates the new -** entries in all indices and in the main table. -** -** The arguments to this routine should be the same as the first six -** arguments to sqlite3GenerateConstraintChecks. -*/ -void sqlite3CompleteInsertion( - Parse *pParse, /* The parser context */ - Table *pTab, /* the table into which we are inserting */ - int base, /* Index of a read/write cursor pointing at pTab */ - char *aIdxUsed, /* Which indices are used. NULL means all are used */ - int rowidChng, /* True if the record number will change */ - int isUpdate, /* True for UPDATE, False for INSERT */ - int newIdx, /* Index of NEW table for triggers. -1 if none */ - int appendBias /* True if this is likely to be an append */ -){ - int i; - Vdbe *v; - int nIdx; - Index *pIdx; - int pik_flags; - - v = sqlite3GetVdbe(pParse); - assert( v!=0 ); - assert( pTab->pSelect==0 ); /* This table is not a VIEW */ - for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){} - for(i=nIdx-1; i>=0; i--){ - if( aIdxUsed && aIdxUsed[i]==0 ) continue; - sqlite3VdbeAddOp(v, OP_IdxInsert, base+i+1, 0); - } - sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0); - sqlite3TableAffinityStr(v, pTab); -#ifndef SQLITE_OMIT_TRIGGER - if( newIdx>=0 ){ - sqlite3VdbeAddOp(v, OP_Dup, 1, 0); - sqlite3VdbeAddOp(v, OP_Dup, 1, 0); - sqlite3VdbeAddOp(v, OP_Insert, newIdx, 0); - } -#endif - if( pParse->nested ){ - pik_flags = 0; - }else{ - pik_flags = OPFLAG_NCHANGE; - pik_flags |= (isUpdate?OPFLAG_ISUPDATE:OPFLAG_LASTROWID); - } - if( appendBias ){ - pik_flags |= OPFLAG_APPEND; - } - sqlite3VdbeAddOp(v, OP_Insert, base, pik_flags); - if( !pParse->nested ){ - sqlite3VdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - } - - if( isUpdate && rowidChng ){ - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - } -} - -/* -** Generate code that will open cursors for a table and for all -** indices of that table. The "base" parameter is the cursor number used -** for the table. Indices are opened on subsequent cursors. -*/ -void sqlite3OpenTableAndIndices( - Parse *pParse, /* Parsing context */ - Table *pTab, /* Table to be opened */ - int base, /* Cursor number assigned to the table */ - int op /* OP_OpenRead or OP_OpenWrite */ -){ - int i; - int iDb; - Index *pIdx; - Vdbe *v; - - if( IsVirtual(pTab) ) return; - iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - v = sqlite3GetVdbe(pParse); - assert( v!=0 ); - sqlite3OpenTable(pParse, base, iDb, pTab, op); - for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ - KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); - assert( pIdx->pSchema==pTab->pSchema ); - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - VdbeComment((v, "# %s", pIdx->zName)); - sqlite3VdbeOp3(v, op, i+base, pIdx->tnum, (char*)pKey, P3_KEYINFO_HANDOFF); - } - if( pParse->nTab<=base+i ){ - pParse->nTab = base+i; - } -} - - -#ifdef SQLITE_TEST -/* -** The following global variable is incremented whenever the -** transfer optimization is used. This is used for testing -** purposes only - to make sure the transfer optimization really -** is happening when it is suppose to. -*/ -int sqlite3_xferopt_count; -#endif /* SQLITE_TEST */ - - -#ifndef SQLITE_OMIT_XFER_OPT -/* -** Check to collation names to see if they are compatible. -*/ -static int xferCompatibleCollation(const char *z1, const char *z2){ - if( z1==0 ){ - return z2==0; - } - if( z2==0 ){ - return 0; - } - return sqlite3StrICmp(z1, z2)==0; -} - - -/* -** Check to see if index pSrc is compatible as a source of data -** for index pDest in an insert transfer optimization. The rules -** for a compatible index: -** -** * The index is over the same set of columns -** * The same DESC and ASC markings occurs on all columns -** * The same onError processing (OE_Abort, OE_Ignore, etc) -** * The same collating sequence on each column -*/ -static int xferCompatibleIndex(Index *pDest, Index *pSrc){ - int i; - assert( pDest && pSrc ); - assert( pDest->pTable!=pSrc->pTable ); - if( pDest->nColumn!=pSrc->nColumn ){ - return 0; /* Different number of columns */ - } - if( pDest->onError!=pSrc->onError ){ - return 0; /* Different conflict resolution strategies */ - } - for(i=0; inColumn; i++){ - if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ - return 0; /* Different columns indexed */ - } - if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ - return 0; /* Different sort orders */ - } - if( pSrc->azColl[i]!=pDest->azColl[i] ){ - return 0; /* Different sort orders */ - } - } - - /* If no test above fails then the indices must be compatible */ - return 1; -} - -/* -** Attempt the transfer optimization on INSERTs of the form -** -** INSERT INTO tab1 SELECT * FROM tab2; -** -** This optimization is only attempted if -** -** (1) tab1 and tab2 have identical schemas including all the -** same indices and constraints -** -** (2) tab1 and tab2 are different tables -** -** (3) There must be no triggers on tab1 -** -** (4) The result set of the SELECT statement is "*" -** -** (5) The SELECT statement has no WHERE, HAVING, ORDER BY, GROUP BY, -** or LIMIT clause. -** -** (6) The SELECT statement is a simple (not a compound) select that -** contains only tab2 in its FROM clause -** -** This method for implementing the INSERT transfers raw records from -** tab2 over to tab1. The columns are not decoded. Raw records from -** the indices of tab2 are transfered to tab1 as well. In so doing, -** the resulting tab1 has much less fragmentation. -** -** This routine returns TRUE if the optimization is attempted. If any -** of the conditions above fail so that the optimization should not -** be attempted, then this routine returns FALSE. -*/ -static int xferOptimization( - Parse *pParse, /* Parser context */ - Table *pDest, /* The table we are inserting into */ - Select *pSelect, /* A SELECT statement to use as the data source */ - int onError, /* How to handle constraint errors */ - int iDbDest /* The database of pDest */ -){ - ExprList *pEList; /* The result set of the SELECT */ - Table *pSrc; /* The table in the FROM clause of SELECT */ - Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ - struct SrcList_item *pItem; /* An element of pSelect->pSrc */ - int i; /* Loop counter */ - int iDbSrc; /* The database of pSrc */ - int iSrc, iDest; /* Cursors from source and destination */ - int addr1, addr2; /* Loop addresses */ - int emptyDestTest; /* Address of test for empty pDest */ - int emptySrcTest; /* Address of test for empty pSrc */ - Vdbe *v; /* The VDBE we are building */ - KeyInfo *pKey; /* Key information for an index */ - int counterMem; /* Memory register used by AUTOINC */ - int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ - - if( pSelect==0 ){ - return 0; /* Must be of the form INSERT INTO ... SELECT ... */ - } - if( pDest->pTrigger ){ - return 0; /* tab1 must not have triggers */ - } -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( pDest->isVirtual ){ - return 0; /* tab1 must not be a virtual table */ - } -#endif - if( onError==OE_Default ){ - onError = OE_Abort; - } - if( onError!=OE_Abort && onError!=OE_Rollback ){ - return 0; /* Cannot do OR REPLACE or OR IGNORE or OR FAIL */ - } - assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ - if( pSelect->pSrc->nSrc!=1 ){ - return 0; /* FROM clause must have exactly one term */ - } - if( pSelect->pSrc->a[0].pSelect ){ - return 0; /* FROM clause cannot contain a subquery */ - } - if( pSelect->pWhere ){ - return 0; /* SELECT may not have a WHERE clause */ - } - if( pSelect->pOrderBy ){ - return 0; /* SELECT may not have an ORDER BY clause */ - } - /* Do not need to test for a HAVING clause. If HAVING is present but - ** there is no ORDER BY, we will get an error. */ - if( pSelect->pGroupBy ){ - return 0; /* SELECT may not have a GROUP BY clause */ - } - if( pSelect->pLimit ){ - return 0; /* SELECT may not have a LIMIT clause */ - } - assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */ - if( pSelect->pPrior ){ - return 0; /* SELECT may not be a compound query */ - } - if( pSelect->isDistinct ){ - return 0; /* SELECT may not be DISTINCT */ - } - pEList = pSelect->pEList; - assert( pEList!=0 ); - if( pEList->nExpr!=1 ){ - return 0; /* The result set must have exactly one column */ - } - assert( pEList->a[0].pExpr ); - if( pEList->a[0].pExpr->op!=TK_ALL ){ - return 0; /* The result set must be the special operator "*" */ - } - - /* At this point we have established that the statement is of the - ** correct syntactic form to participate in this optimization. Now - ** we have to check the semantics. - */ - pItem = pSelect->pSrc->a; - pSrc = sqlite3LocateTable(pParse, pItem->zName, pItem->zDatabase); - if( pSrc==0 ){ - return 0; /* FROM clause does not contain a real table */ - } - if( pSrc==pDest ){ - return 0; /* tab1 and tab2 may not be the same table */ - } -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( pSrc->isVirtual ){ - return 0; /* tab2 must not be a virtual table */ - } -#endif - if( pSrc->pSelect ){ - return 0; /* tab2 may not be a view */ - } - if( pDest->nCol!=pSrc->nCol ){ - return 0; /* Number of columns must be the same in tab1 and tab2 */ - } - if( pDest->iPKey!=pSrc->iPKey ){ - return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ - } - for(i=0; inCol; i++){ - if( pDest->aCol[i].affinity!=pSrc->aCol[i].affinity ){ - return 0; /* Affinity must be the same on all columns */ - } - if( !xferCompatibleCollation(pDest->aCol[i].zColl, pSrc->aCol[i].zColl) ){ - return 0; /* Collating sequence must be the same on all columns */ - } - if( pDest->aCol[i].notNull && !pSrc->aCol[i].notNull ){ - return 0; /* tab2 must be NOT NULL if tab1 is */ - } - } - for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ - if( pDestIdx->onError!=OE_None ){ - destHasUniqueIdx = 1; - } - for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ - if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; - } - if( pSrcIdx==0 ){ - return 0; /* pDestIdx has no corresponding index in pSrc */ - } - } -#ifndef SQLITE_OMIT_CHECK - if( pDest->pCheck && !sqlite3ExprCompare(pSrc->pCheck, pDest->pCheck) ){ - return 0; /* Tables have different CHECK constraints. Ticket #2252 */ - } -#endif - - /* If we get this far, it means either: - ** - ** * We can always do the transfer if the table contains an - ** an integer primary key - ** - ** * We can conditionally do the transfer if the destination - ** table is empty. - */ -#ifdef SQLITE_TEST - sqlite3_xferopt_count++; -#endif - iDbSrc = sqlite3SchemaToIndex(pParse->db, pSrc->pSchema); - v = sqlite3GetVdbe(pParse); - sqlite3CodeVerifySchema(pParse, iDbSrc); - iSrc = pParse->nTab++; - iDest = pParse->nTab++; - counterMem = autoIncBegin(pParse, iDbDest, pDest); - sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); - if( (pDest->iPKey<0 && pDest->pIndex!=0) || destHasUniqueIdx ){ - /* If tables do not have an INTEGER PRIMARY KEY and there - ** are indices to be copied and the destination is not empty, - ** we have to disallow the transfer optimization because the - ** the rowids might change which will mess up indexing. - ** - ** Or if the destination has a UNIQUE index and is not empty, - ** we also disallow the transfer optimization because we cannot - ** insure that all entries in the union of DEST and SRC will be - ** unique. - */ - addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iDest, 0); - emptyDestTest = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); - sqlite3VdbeJumpHere(v, addr1); - }else{ - emptyDestTest = 0; - } - sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); - emptySrcTest = sqlite3VdbeAddOp(v, OP_Rewind, iSrc, 0); - if( pDest->iPKey>=0 ){ - addr1 = sqlite3VdbeAddOp(v, OP_Rowid, iSrc, 0); - sqlite3VdbeAddOp(v, OP_Dup, 0, 0); - addr2 = sqlite3VdbeAddOp(v, OP_NotExists, iDest, 0); - sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, - "PRIMARY KEY must be unique", P3_STATIC); - sqlite3VdbeJumpHere(v, addr2); - autoIncStep(pParse, counterMem); - }else if( pDest->pIndex==0 ){ - addr1 = sqlite3VdbeAddOp(v, OP_NewRowid, iDest, 0); - }else{ - addr1 = sqlite3VdbeAddOp(v, OP_Rowid, iSrc, 0); - assert( pDest->autoInc==0 ); - } - sqlite3VdbeAddOp(v, OP_RowData, iSrc, 0); - sqlite3VdbeOp3(v, OP_Insert, iDest, - OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND, - pDest->zName, 0); - sqlite3VdbeAddOp(v, OP_Next, iSrc, addr1); - autoIncEnd(pParse, iDbDest, pDest, counterMem); - for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ - for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ - if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; - } - assert( pSrcIdx ); - sqlite3VdbeAddOp(v, OP_Close, iSrc, 0); - sqlite3VdbeAddOp(v, OP_Close, iDest, 0); - sqlite3VdbeAddOp(v, OP_Integer, iDbSrc, 0); - pKey = sqlite3IndexKeyinfo(pParse, pSrcIdx); - VdbeComment((v, "# %s", pSrcIdx->zName)); - sqlite3VdbeOp3(v, OP_OpenRead, iSrc, pSrcIdx->tnum, - (char*)pKey, P3_KEYINFO_HANDOFF); - sqlite3VdbeAddOp(v, OP_Integer, iDbDest, 0); - pKey = sqlite3IndexKeyinfo(pParse, pDestIdx); - VdbeComment((v, "# %s", pDestIdx->zName)); - sqlite3VdbeOp3(v, OP_OpenWrite, iDest, pDestIdx->tnum, - (char*)pKey, P3_KEYINFO_HANDOFF); - addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iSrc, 0); - sqlite3VdbeAddOp(v, OP_RowKey, iSrc, 0); - sqlite3VdbeAddOp(v, OP_IdxInsert, iDest, 1); - sqlite3VdbeAddOp(v, OP_Next, iSrc, addr1+1); - sqlite3VdbeJumpHere(v, addr1); - } - sqlite3VdbeJumpHere(v, emptySrcTest); - sqlite3VdbeAddOp(v, OP_Close, iSrc, 0); - sqlite3VdbeAddOp(v, OP_Close, iDest, 0); - if( emptyDestTest ){ - sqlite3VdbeAddOp(v, OP_Halt, SQLITE_OK, 0); - sqlite3VdbeJumpHere(v, emptyDestTest); - sqlite3VdbeAddOp(v, OP_Close, iDest, 0); - return 0; - }else{ - return 1; - } -} -#endif /* SQLITE_OMIT_XFER_OPT */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/journal.c b/libraries/sqlite/unix/sqlite-3.5.1/src/journal.c deleted file mode 100644 index 7cbe5bc9ff..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/journal.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -** 2007 August 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** @(#) $Id: journal.c,v 1.7 2007/09/06 13:49:37 drh Exp $ -*/ - -#ifdef SQLITE_ENABLE_ATOMIC_WRITE - -/* -** This file implements a special kind of sqlite3_file object used -** by SQLite to create journal files if the atomic-write optimization -** is enabled. -** -** The distinctive characteristic of this sqlite3_file is that the -** actual on disk file is created lazily. When the file is created, -** the caller specifies a buffer size for an in-memory buffer to -** be used to service read() and write() requests. The actual file -** on disk is not created or populated until either: -** -** 1) The in-memory representation grows too large for the allocated -** buffer, or -** 2) The xSync() method is called. -*/ - -#include "sqliteInt.h" - - -/* -** A JournalFile object is a subclass of sqlite3_file used by -** as an open file handle for journal files. -*/ -struct JournalFile { - sqlite3_io_methods *pMethod; /* I/O methods on journal files */ - int nBuf; /* Size of zBuf[] in bytes */ - char *zBuf; /* Space to buffer journal writes */ - int iSize; /* Amount of zBuf[] currently used */ - int flags; /* xOpen flags */ - sqlite3_vfs *pVfs; /* The "real" underlying VFS */ - sqlite3_file *pReal; /* The "real" underlying file descriptor */ - const char *zJournal; /* Name of the journal file */ -}; -typedef struct JournalFile JournalFile; - -/* -** If it does not already exists, create and populate the on-disk file -** for JournalFile p. -*/ -static int createFile(JournalFile *p){ - int rc = SQLITE_OK; - if( !p->pReal ){ - sqlite3_file *pReal = (sqlite3_file *)&p[1]; - rc = sqlite3OsOpen(p->pVfs, p->zJournal, pReal, p->flags, 0); - if( rc==SQLITE_OK ){ - p->pReal = pReal; - if( p->iSize>0 ){ - assert(p->iSize<=p->nBuf); - rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0); - } - } - } - return rc; -} - -/* -** Close the file. -*/ -static int jrnlClose(sqlite3_file *pJfd){ - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - sqlite3OsClose(p->pReal); - } - sqlite3_free(p->zBuf); - return SQLITE_OK; -} - -/* -** Read data from the file. -*/ -static int jrnlRead( - sqlite3_file *pJfd, /* The journal file from which to read */ - void *zBuf, /* Put the results here */ - int iAmt, /* Number of bytes to read */ - sqlite_int64 iOfst /* Begin reading at this offset */ -){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst); - }else{ - assert( iAmt+iOfst<=p->iSize ); - memcpy(zBuf, &p->zBuf[iOfst], iAmt); - } - return rc; -} - -/* -** Write data to the file. -*/ -static int jrnlWrite( - sqlite3_file *pJfd, /* The journal file into which to write */ - const void *zBuf, /* Take data to be written from here */ - int iAmt, /* Number of bytes to write */ - sqlite_int64 iOfst /* Begin writing at this offset into the file */ -){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( !p->pReal && (iOfst+iAmt)>p->nBuf ){ - rc = createFile(p); - } - if( rc==SQLITE_OK ){ - if( p->pReal ){ - rc = sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst); - }else{ - memcpy(&p->zBuf[iOfst], zBuf, iAmt); - if( p->iSize<(iOfst+iAmt) ){ - p->iSize = (iOfst+iAmt); - } - } - } - return rc; -} - -/* -** Truncate the file. -*/ -static int jrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsTruncate(p->pReal, size); - }else if( sizeiSize ){ - p->iSize = size; - } - return rc; -} - -/* -** Sync the file. -*/ -static int jrnlSync(sqlite3_file *pJfd, int flags){ - int rc; - JournalFile *p = (JournalFile *)pJfd; - rc = createFile(p); - if( rc==SQLITE_OK ){ - rc = sqlite3OsSync(p->pReal, flags); - } - return rc; -} - -/* -** Query the size of the file in bytes. -*/ -static int jrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsFileSize(p->pReal, pSize); - }else{ - *pSize = (sqlite_int64) p->iSize; - } - return rc; -} - -/* -** Table of methods for JournalFile sqlite3_file object. -*/ -static struct sqlite3_io_methods JournalFileMethods = { - 1, /* iVersion */ - jrnlClose, /* xClose */ - jrnlRead, /* xRead */ - jrnlWrite, /* xWrite */ - jrnlTruncate, /* xTruncate */ - jrnlSync, /* xSync */ - jrnlFileSize, /* xFileSize */ - 0, /* xLock */ - 0, /* xUnlock */ - 0, /* xCheckReservedLock */ - 0, /* xFileControl */ - 0, /* xSectorSize */ - 0 /* xDeviceCharacteristics */ -}; - -/* -** Open a journal file. -*/ -int sqlite3JournalOpen( - sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ - const char *zName, /* Name of the journal file */ - sqlite3_file *pJfd, /* Preallocated, blank file handle */ - int flags, /* Opening flags */ - int nBuf /* Bytes buffered before opening the file */ -){ - JournalFile *p = (JournalFile *)pJfd; - memset(p, 0, sqlite3JournalSize(pVfs)); - if( nBuf>0 ){ - p->zBuf = sqlite3MallocZero(nBuf); - if( !p->zBuf ){ - return SQLITE_NOMEM; - } - }else{ - return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); - } - p->pMethod = &JournalFileMethods; - p->nBuf = nBuf; - p->flags = flags; - p->zJournal = zName; - p->pVfs = pVfs; - return SQLITE_OK; -} - -/* -** If the argument p points to a JournalFile structure, and the underlying -** file has not yet been created, create it now. -*/ -int sqlite3JournalCreate(sqlite3_file *p){ - if( p->pMethods!=&JournalFileMethods ){ - return SQLITE_OK; - } - return createFile((JournalFile *)p); -} - -/* -** Return the number of bytes required to store a JournalFile that uses vfs -** pVfs to create the underlying on-disk files. -*/ -int sqlite3JournalSize(sqlite3_vfs *pVfs){ - return (pVfs->szOsFile+sizeof(JournalFile)); -} -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c b/libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c deleted file mode 100644 index c004b89e1d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/legacy.c +++ /dev/null @@ -1,134 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Main file for the SQLite library. The routines in this file -** implement the programmer interface to the library. Routines in -** other files are for internal use by SQLite and should not be -** accessed by users of the library. -** -** $Id: legacy.c,v 1.22 2007/08/29 12:31:26 danielk1977 Exp $ -*/ - -#include "sqliteInt.h" -#include - -/* -** Execute SQL code. Return one of the SQLITE_ success/failure -** codes. Also write an error message into memory obtained from -** malloc() and make *pzErrMsg point to that message. -** -** If the SQL is a query, then for each row in the query result -** the xCallback() function is called. pArg becomes the first -** argument to xCallback(). If xCallback=NULL then no callback -** is invoked, even for queries. -*/ -int sqlite3_exec( - sqlite3 *db, /* The database on which the SQL executes */ - const char *zSql, /* The SQL to be executed */ - sqlite3_callback xCallback, /* Invoke this callback routine */ - void *pArg, /* First argument to xCallback() */ - char **pzErrMsg /* Write error messages here */ -){ - int rc = SQLITE_OK; - const char *zLeftover; - sqlite3_stmt *pStmt = 0; - char **azCols = 0; - - int nRetry = 0; - int nCallback; - - if( zSql==0 ) return SQLITE_OK; - - sqlite3_mutex_enter(db->mutex); - while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){ - int nCol; - char **azVals = 0; - - pStmt = 0; - rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover); - assert( rc==SQLITE_OK || pStmt==0 ); - if( rc!=SQLITE_OK ){ - continue; - } - if( !pStmt ){ - /* this happens for a comment or white-space */ - zSql = zLeftover; - continue; - } - - nCallback = 0; - - nCol = sqlite3_column_count(pStmt); - azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char *) + 1); - if( azCols==0 ){ - goto exec_out; - } - - while( 1 ){ - int i; - rc = sqlite3_step(pStmt); - - /* Invoke the callback function if required */ - if( xCallback && (SQLITE_ROW==rc || - (SQLITE_DONE==rc && !nCallback && db->flags&SQLITE_NullCallback)) ){ - if( 0==nCallback ){ - for(i=0; ierrMask)==rc ); - sqlite3_mutex_leave(db->mutex); - return rc; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c b/libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c deleted file mode 100644 index dc6056299b..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/loadext.c +++ /dev/null @@ -1,516 +0,0 @@ -/* -** 2006 June 7 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code used to dynamically load extensions into -** the SQLite library. -*/ -#ifndef SQLITE_OMIT_LOAD_EXTENSION - -#define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ -#include "sqlite3ext.h" -#include "sqliteInt.h" -#include -#include - -/* -** Some API routines are omitted when various features are -** excluded from a build of SQLite. Substitute a NULL pointer -** for any missing APIs. -*/ -#ifndef SQLITE_ENABLE_COLUMN_METADATA -# define sqlite3_column_database_name 0 -# define sqlite3_column_database_name16 0 -# define sqlite3_column_table_name 0 -# define sqlite3_column_table_name16 0 -# define sqlite3_column_origin_name 0 -# define sqlite3_column_origin_name16 0 -# define sqlite3_table_column_metadata 0 -#endif - -#ifdef SQLITE_OMIT_AUTHORIZATION -# define sqlite3_set_authorizer 0 -#endif - -#ifdef SQLITE_OMIT_UTF16 -# define sqlite3_bind_text16 0 -# define sqlite3_collation_needed16 0 -# define sqlite3_column_decltype16 0 -# define sqlite3_column_name16 0 -# define sqlite3_column_text16 0 -# define sqlite3_complete16 0 -# define sqlite3_create_collation16 0 -# define sqlite3_create_function16 0 -# define sqlite3_errmsg16 0 -# define sqlite3_open16 0 -# define sqlite3_prepare16 0 -# define sqlite3_prepare16_v2 0 -# define sqlite3_result_error16 0 -# define sqlite3_result_text16 0 -# define sqlite3_result_text16be 0 -# define sqlite3_result_text16le 0 -# define sqlite3_value_text16 0 -# define sqlite3_value_text16be 0 -# define sqlite3_value_text16le 0 -# define sqlite3_column_database_name16 0 -# define sqlite3_column_table_name16 0 -# define sqlite3_column_origin_name16 0 -#endif - -#ifdef SQLITE_OMIT_COMPLETE -# define sqlite3_complete 0 -# define sqlite3_complete16 0 -#endif - -#ifdef SQLITE_OMIT_PROGRESS_CALLBACK -# define sqlite3_progress_handler 0 -#endif - -#ifdef SQLITE_OMIT_VIRTUALTABLE -# define sqlite3_create_module 0 -# define sqlite3_create_module_v2 0 -# define sqlite3_declare_vtab 0 -#endif - -#ifdef SQLITE_OMIT_SHARED_CACHE -# define sqlite3_enable_shared_cache 0 -#endif - -#ifdef SQLITE_OMIT_TRACE -# define sqlite3_profile 0 -# define sqlite3_trace 0 -#endif - -#ifdef SQLITE_OMIT_GET_TABLE -# define sqlite3_free_table 0 -# define sqlite3_get_table 0 -#endif - -#ifdef SQLITE_OMIT_INCRBLOB -#define sqlite3_bind_zeroblob 0 -#define sqlite3_blob_bytes 0 -#define sqlite3_blob_close 0 -#define sqlite3_blob_open 0 -#define sqlite3_blob_read 0 -#define sqlite3_blob_write 0 -#endif - -/* -** The following structure contains pointers to all SQLite API routines. -** A pointer to this structure is passed into extensions when they are -** loaded so that the extension can make calls back into the SQLite -** library. -** -** When adding new APIs, add them to the bottom of this structure -** in order to preserve backwards compatibility. -** -** Extensions that use newer APIs should first call the -** sqlite3_libversion_number() to make sure that the API they -** intend to use is supported by the library. Extensions should -** also check to make sure that the pointer to the function is -** not NULL before calling it. -*/ -const sqlite3_api_routines sqlite3_apis = { - sqlite3_aggregate_context, - sqlite3_aggregate_count, - sqlite3_bind_blob, - sqlite3_bind_double, - sqlite3_bind_int, - sqlite3_bind_int64, - sqlite3_bind_null, - sqlite3_bind_parameter_count, - sqlite3_bind_parameter_index, - sqlite3_bind_parameter_name, - sqlite3_bind_text, - sqlite3_bind_text16, - sqlite3_bind_value, - sqlite3_busy_handler, - sqlite3_busy_timeout, - sqlite3_changes, - sqlite3_close, - sqlite3_collation_needed, - sqlite3_collation_needed16, - sqlite3_column_blob, - sqlite3_column_bytes, - sqlite3_column_bytes16, - sqlite3_column_count, - sqlite3_column_database_name, - sqlite3_column_database_name16, - sqlite3_column_decltype, - sqlite3_column_decltype16, - sqlite3_column_double, - sqlite3_column_int, - sqlite3_column_int64, - sqlite3_column_name, - sqlite3_column_name16, - sqlite3_column_origin_name, - sqlite3_column_origin_name16, - sqlite3_column_table_name, - sqlite3_column_table_name16, - sqlite3_column_text, - sqlite3_column_text16, - sqlite3_column_type, - sqlite3_column_value, - sqlite3_commit_hook, - sqlite3_complete, - sqlite3_complete16, - sqlite3_create_collation, - sqlite3_create_collation16, - sqlite3_create_function, - sqlite3_create_function16, - sqlite3_create_module, - sqlite3_data_count, - sqlite3_db_handle, - sqlite3_declare_vtab, - sqlite3_enable_shared_cache, - sqlite3_errcode, - sqlite3_errmsg, - sqlite3_errmsg16, - sqlite3_exec, - sqlite3_expired, - sqlite3_finalize, - sqlite3_free, - sqlite3_free_table, - sqlite3_get_autocommit, - sqlite3_get_auxdata, - sqlite3_get_table, - 0, /* Was sqlite3_global_recover(), but that function is deprecated */ - sqlite3_interrupt, - sqlite3_last_insert_rowid, - sqlite3_libversion, - sqlite3_libversion_number, - sqlite3_malloc, - sqlite3_mprintf, - sqlite3_open, - sqlite3_open16, - sqlite3_prepare, - sqlite3_prepare16, - sqlite3_profile, - sqlite3_progress_handler, - sqlite3_realloc, - sqlite3_reset, - sqlite3_result_blob, - sqlite3_result_double, - sqlite3_result_error, - sqlite3_result_error16, - sqlite3_result_int, - sqlite3_result_int64, - sqlite3_result_null, - sqlite3_result_text, - sqlite3_result_text16, - sqlite3_result_text16be, - sqlite3_result_text16le, - sqlite3_result_value, - sqlite3_rollback_hook, - sqlite3_set_authorizer, - sqlite3_set_auxdata, - sqlite3_snprintf, - sqlite3_step, - sqlite3_table_column_metadata, - sqlite3_thread_cleanup, - sqlite3_total_changes, - sqlite3_trace, - sqlite3_transfer_bindings, - sqlite3_update_hook, - sqlite3_user_data, - sqlite3_value_blob, - sqlite3_value_bytes, - sqlite3_value_bytes16, - sqlite3_value_double, - sqlite3_value_int, - sqlite3_value_int64, - sqlite3_value_numeric_type, - sqlite3_value_text, - sqlite3_value_text16, - sqlite3_value_text16be, - sqlite3_value_text16le, - sqlite3_value_type, - sqlite3_vmprintf, - /* - ** The original API set ends here. All extensions can call any - ** of the APIs above provided that the pointer is not NULL. But - ** before calling APIs that follow, extension should check the - ** sqlite3_libversion_number() to make sure they are dealing with - ** a library that is new enough to support that API. - ************************************************************************* - */ - sqlite3_overload_function, - - /* - ** Added after 3.3.13 - */ - sqlite3_prepare_v2, - sqlite3_prepare16_v2, - sqlite3_clear_bindings, - - /* - ** Added for 3.4.1 - */ - sqlite3_create_module_v2, - - /* - ** Added for 3.5.0 - */ - sqlite3_bind_zeroblob, - sqlite3_blob_bytes, - sqlite3_blob_close, - sqlite3_blob_open, - sqlite3_blob_read, - sqlite3_blob_write, - sqlite3_create_collation_v2, - sqlite3_file_control, - sqlite3_memory_highwater, - sqlite3_memory_used, -#ifdef SQLITE_MUTEX_NOOP - 0, - 0, - 0, - 0, - 0, -#else - sqlite3_mutex_alloc, - sqlite3_mutex_enter, - sqlite3_mutex_free, - sqlite3_mutex_leave, - sqlite3_mutex_try, -#endif - sqlite3_open_v2, - sqlite3_release_memory, - sqlite3_result_error_nomem, - sqlite3_result_error_toobig, - sqlite3_sleep, - sqlite3_soft_heap_limit, - sqlite3_vfs_find, - sqlite3_vfs_register, - sqlite3_vfs_unregister, -}; - -/* -** Attempt to load an SQLite extension library contained in the file -** zFile. The entry point is zProc. zProc may be 0 in which case a -** default entry point name (sqlite3_extension_init) is used. Use -** of the default name is recommended. -** -** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. -** -** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with -** error message text. The calling function should free this memory -** by calling sqlite3_free(). -*/ -static int sqlite3LoadExtension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -){ - sqlite3_vfs *pVfs = db->pVfs; - void *handle; - int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); - char *zErrmsg = 0; - void **aHandle; - - /* Ticket #1863. To avoid a creating security problems for older - ** applications that relink against newer versions of SQLite, the - ** ability to run load_extension is turned off by default. One - ** must call sqlite3_enable_load_extension() to turn on extension - ** loading. Otherwise you get the following error. - */ - if( (db->flags & SQLITE_LoadExtension)==0 ){ - if( pzErrMsg ){ - *pzErrMsg = sqlite3_mprintf("not authorized"); - } - return SQLITE_ERROR; - } - - if( zProc==0 ){ - zProc = "sqlite3_extension_init"; - } - - handle = sqlite3OsDlOpen(pVfs, zFile); - if( handle==0 ){ - if( pzErrMsg ){ - char zErr[256]; - zErr[sizeof(zErr)-1] = '\0'; - sqlite3_snprintf(sizeof(zErr)-1, zErr, - "unable to open shared library [%s]", zFile); - sqlite3OsDlError(pVfs, sizeof(zErr)-1, zErr); - *pzErrMsg = sqlite3DbStrDup(db, zErr); - } - return SQLITE_ERROR; - } - xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) - sqlite3OsDlSym(pVfs, handle, zProc); - if( xInit==0 ){ - if( pzErrMsg ){ - char zErr[256]; - zErr[sizeof(zErr)-1] = '\0'; - sqlite3_snprintf(sizeof(zErr)-1, zErr, - "no entry point [%s] in shared library [%s]", zProc,zFile); - sqlite3OsDlError(pVfs, sizeof(zErr)-1, zErr); - *pzErrMsg = sqlite3DbStrDup(db, zErr); - sqlite3OsDlClose(pVfs, handle); - } - return SQLITE_ERROR; - }else if( xInit(db, &zErrmsg, &sqlite3_apis) ){ - if( pzErrMsg ){ - *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); - } - sqlite3_free(zErrmsg); - sqlite3OsDlClose(pVfs, handle); - return SQLITE_ERROR; - } - - /* Append the new shared library handle to the db->aExtension array. */ - db->nExtension++; - aHandle = sqlite3DbMallocZero(db, sizeof(handle)*db->nExtension); - if( aHandle==0 ){ - return SQLITE_NOMEM; - } - if( db->nExtension>0 ){ - memcpy(aHandle, db->aExtension, sizeof(handle)*(db->nExtension-1)); - } - sqlite3_free(db->aExtension); - db->aExtension = aHandle; - - db->aExtension[db->nExtension-1] = handle; - return SQLITE_OK; -} -int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -){ - int rc; - sqlite3_mutex_enter(db->mutex); - rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -/* -** Call this routine when the database connection is closing in order -** to clean up loaded extensions -*/ -void sqlite3CloseExtensions(sqlite3 *db){ - int i; - assert( sqlite3_mutex_held(db->mutex) ); - for(i=0; inExtension; i++){ - sqlite3OsDlClose(db->pVfs, db->aExtension[i]); - } - sqlite3_free(db->aExtension); -} - -/* -** Enable or disable extension loading. Extension loading is disabled by -** default so as not to open security holes in older applications. -*/ -int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ - sqlite3_mutex_enter(db->mutex); - if( onoff ){ - db->flags |= SQLITE_LoadExtension; - }else{ - db->flags &= ~SQLITE_LoadExtension; - } - sqlite3_mutex_leave(db->mutex); - return SQLITE_OK; -} - -/* -** The following object holds the list of automatically loaded -** extensions. -** -** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER -** mutex must be held while accessing this list. -*/ -static struct { - int nExt; /* Number of entries in aExt[] */ - void **aExt; /* Pointers to the extension init functions */ -} autoext = { 0, 0 }; - - -/* -** Register a statically linked extension that is automatically -** loaded by every new database connection. -*/ -int sqlite3_auto_extension(void *xInit){ - int i; - int rc = SQLITE_OK; - sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - sqlite3_mutex_enter(mutex); - for(i=0; i=autoext.nExt ){ - xInit = 0; - go = 0; - }else{ - xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) - autoext.aExt[i]; - } - sqlite3_mutex_leave(mutex); - if( xInit && xInit(db, &zErrmsg, &sqlite3_apis) ){ - sqlite3Error(db, SQLITE_ERROR, - "automatic extension loading failed: %s", zErrmsg); - go = 0; - rc = SQLITE_ERROR; - sqlite3_free(zErrmsg); - } - } - return rc; -} - -#endif /* SQLITE_OMIT_LOAD_EXTENSION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/main.c b/libraries/sqlite/unix/sqlite-3.5.1/src/main.c deleted file mode 100644 index f61fe80b25..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/main.c +++ /dev/null @@ -1,1485 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Main file for the SQLite library. The routines in this file -** implement the programmer interface to the library. Routines in -** other files are for internal use by SQLite and should not be -** accessed by users of the library. -** -** $Id: main.c,v 1.406 2007/10/03 21:10:58 drh Exp $ -*/ -#include "sqliteInt.h" -#include - -/* -** The version of the library -*/ -const char sqlite3_version[] = SQLITE_VERSION; -const char *sqlite3_libversion(void){ return sqlite3_version; } -int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } -int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } - -/* -** If the following function pointer is not NULL and if -** SQLITE_ENABLE_IOTRACE is enabled, then messages describing -** I/O active are written using this function. These messages -** are intended for debugging activity only. -*/ -void (*sqlite3_io_trace)(const char*, ...) = 0; - -/* -** If the following global variable points to a string which is the -** name of a directory, then that directory will be used to store -** temporary files. -** -** See also the "PRAGMA temp_store_directory" SQL command. -*/ -char *sqlite3_temp_directory = 0; - - -/* -** This is the default collating function named "BINARY" which is always -** available. -*/ -static int binCollFunc( - void *NotUsed, - int nKey1, const void *pKey1, - int nKey2, const void *pKey2 -){ - int rc, n; - n = nKey1lastRowid; -} - -/* -** Return the number of changes in the most recent call to sqlite3_exec(). -*/ -int sqlite3_changes(sqlite3 *db){ - return db->nChange; -} - -/* -** Return the number of changes since the database handle was opened. -*/ -int sqlite3_total_changes(sqlite3 *db){ - return db->nTotalChange; -} - -/* -** Close an existing SQLite database -*/ -int sqlite3_close(sqlite3 *db){ - HashElem *i; - int j; - - if( !db ){ - return SQLITE_OK; - } - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - -#ifdef SQLITE_SSE - { - extern void sqlite3SseCleanup(sqlite3*); - sqlite3SseCleanup(db); - } -#endif - - sqlite3ResetInternalSchema(db, 0); - - /* If a transaction is open, the ResetInternalSchema() call above - ** will not have called the xDisconnect() method on any virtual - ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback() - ** call will do so. We need to do this before the check for active - ** SQL statements below, as the v-table implementation may be storing - ** some prepared statements internally. - */ - sqlite3VtabRollback(db); - - /* If there are any outstanding VMs, return SQLITE_BUSY. */ - if( db->pVdbe ){ - sqlite3Error(db, SQLITE_BUSY, - "Unable to close due to unfinalised statements"); - sqlite3_mutex_leave(db->mutex); - return SQLITE_BUSY; - } - assert( !sqlite3SafetyCheck(db) ); - - /* FIX ME: db->magic may be set to SQLITE_MAGIC_CLOSED if the database - ** cannot be opened for some reason. So this routine needs to run in - ** that case. But maybe there should be an extra magic value for the - ** "failed to open" state. - ** - ** TODO: Coverage tests do not test the case where this condition is - ** true. It's hard to see how to cause it without messing with threads. - */ - if( db->magic!=SQLITE_MAGIC_CLOSED && sqlite3SafetyOn(db) ){ - /* printf("DID NOT CLOSE\n"); fflush(stdout); */ - sqlite3_mutex_leave(db->mutex); - return SQLITE_ERROR; - } - - for(j=0; jnDb; j++){ - struct Db *pDb = &db->aDb[j]; - if( pDb->pBt ){ - sqlite3BtreeClose(pDb->pBt); - pDb->pBt = 0; - if( j!=1 ){ - pDb->pSchema = 0; - } - } - } - sqlite3ResetInternalSchema(db, 0); - assert( db->nDb<=2 ); - assert( db->aDb==db->aDbStatic ); - for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ - FuncDef *pFunc, *pNext; - for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){ - pNext = pFunc->pNext; - sqlite3_free(pFunc); - } - } - - for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ - CollSeq *pColl = (CollSeq *)sqliteHashData(i); - /* Invoke any destructors registered for collation sequence user data. */ - for(j=0; j<3; j++){ - if( pColl[j].xDel ){ - pColl[j].xDel(pColl[j].pUser); - } - } - sqlite3_free(pColl); - } - sqlite3HashClear(&db->aCollSeq); -#ifndef SQLITE_OMIT_VIRTUALTABLE - for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ - Module *pMod = (Module *)sqliteHashData(i); - if( pMod->xDestroy ){ - pMod->xDestroy(pMod->pAux); - } - sqlite3_free(pMod); - } - sqlite3HashClear(&db->aModule); -#endif - - sqlite3HashClear(&db->aFunc); - sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */ - if( db->pErr ){ - sqlite3ValueFree(db->pErr); - } - sqlite3CloseExtensions(db); - - db->magic = SQLITE_MAGIC_ERROR; - - /* The temp-database schema is allocated differently from the other schema - ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()). - ** So it needs to be freed here. Todo: Why not roll the temp schema into - ** the same sqliteMalloc() as the one that allocates the database - ** structure? - */ - sqlite3_free(db->aDb[1].pSchema); - sqlite3_mutex_leave(db->mutex); - sqlite3_mutex_free(db->mutex); - sqlite3_free(db); - return SQLITE_OK; -} - -/* -** Rollback all database files. -*/ -void sqlite3RollbackAll(sqlite3 *db){ - int i; - int inTrans = 0; - assert( sqlite3_mutex_held(db->mutex) ); - sqlite3MallocEnterBenignBlock(1); /* Enter benign region */ - for(i=0; inDb; i++){ - if( db->aDb[i].pBt ){ - if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){ - inTrans = 1; - } - sqlite3BtreeRollback(db->aDb[i].pBt); - db->aDb[i].inTrans = 0; - } - } - sqlite3VtabRollback(db); - sqlite3MallocLeaveBenignBlock(); /* Leave benign region */ - - if( db->flags&SQLITE_InternChanges ){ - sqlite3ExpirePreparedStatements(db); - sqlite3ResetInternalSchema(db, 0); - } - - /* If one has been configured, invoke the rollback-hook callback */ - if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ - db->xRollbackCallback(db->pRollbackArg); - } -} - -/* -** Return a static string that describes the kind of error specified in the -** argument. -*/ -const char *sqlite3ErrStr(int rc){ - const char *z; - switch( rc & 0xff ){ - case SQLITE_ROW: - case SQLITE_DONE: - case SQLITE_OK: z = "not an error"; break; - case SQLITE_ERROR: z = "SQL logic error or missing database"; break; - case SQLITE_PERM: z = "access permission denied"; break; - case SQLITE_ABORT: z = "callback requested query abort"; break; - case SQLITE_BUSY: z = "database is locked"; break; - case SQLITE_LOCKED: z = "database table is locked"; break; - case SQLITE_NOMEM: z = "out of memory"; break; - case SQLITE_READONLY: z = "attempt to write a readonly database"; break; - case SQLITE_INTERRUPT: z = "interrupted"; break; - case SQLITE_IOERR: z = "disk I/O error"; break; - case SQLITE_CORRUPT: z = "database disk image is malformed"; break; - case SQLITE_FULL: z = "database or disk is full"; break; - case SQLITE_CANTOPEN: z = "unable to open database file"; break; - case SQLITE_EMPTY: z = "table contains no data"; break; - case SQLITE_SCHEMA: z = "database schema has changed"; break; - case SQLITE_TOOBIG: z = "String or BLOB exceeded size limit"; break; - case SQLITE_CONSTRAINT: z = "constraint failed"; break; - case SQLITE_MISMATCH: z = "datatype mismatch"; break; - case SQLITE_MISUSE: z = "library routine called out of sequence";break; - case SQLITE_NOLFS: z = "kernel lacks large file support"; break; - case SQLITE_AUTH: z = "authorization denied"; break; - case SQLITE_FORMAT: z = "auxiliary database format error"; break; - case SQLITE_RANGE: z = "bind or column index out of range"; break; - case SQLITE_NOTADB: z = "file is encrypted or is not a database";break; - default: z = "unknown error"; break; - } - return z; -} - -/* -** This routine implements a busy callback that sleeps and tries -** again until a timeout value is reached. The timeout value is -** an integer number of milliseconds passed in as the first -** argument. -*/ -static int sqliteDefaultBusyCallback( - void *ptr, /* Database connection */ - int count /* Number of times table has been busy */ -){ -#if OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP) - static const u8 delays[] = - { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; - static const u8 totals[] = - { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 }; -# define NDELAY (sizeof(delays)/sizeof(delays[0])) - sqlite3 *db = (sqlite3 *)ptr; - int timeout = db->busyTimeout; - int delay, prior; - - assert( count>=0 ); - if( count < NDELAY ){ - delay = delays[count]; - prior = totals[count]; - }else{ - delay = delays[NDELAY-1]; - prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); - } - if( prior + delay > timeout ){ - delay = timeout - prior; - if( delay<=0 ) return 0; - } - sqlite3OsSleep(db->pVfs, delay*1000); - return 1; -#else - sqlite3 *db = (sqlite3 *)ptr; - int timeout = ((sqlite3 *)ptr)->busyTimeout; - if( (count+1)*1000 > timeout ){ - return 0; - } - sqlite3OsSleep(db->pVfs, 1000000); - return 1; -#endif -} - -/* -** Invoke the given busy handler. -** -** This routine is called when an operation failed with a lock. -** If this routine returns non-zero, the lock is retried. If it -** returns 0, the operation aborts with an SQLITE_BUSY error. -*/ -int sqlite3InvokeBusyHandler(BusyHandler *p){ - int rc; - if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0; - rc = p->xFunc(p->pArg, p->nBusy); - if( rc==0 ){ - p->nBusy = -1; - }else{ - p->nBusy++; - } - return rc; -} - -/* -** This routine sets the busy callback for an Sqlite database to the -** given callback function with the given argument. -*/ -int sqlite3_busy_handler( - sqlite3 *db, - int (*xBusy)(void*,int), - void *pArg -){ - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - db->busyHandler.xFunc = xBusy; - db->busyHandler.pArg = pArg; - db->busyHandler.nBusy = 0; - sqlite3_mutex_leave(db->mutex); - return SQLITE_OK; -} - -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK -/* -** This routine sets the progress callback for an Sqlite database to the -** given callback function with the given argument. The progress callback will -** be invoked every nOps opcodes. -*/ -void sqlite3_progress_handler( - sqlite3 *db, - int nOps, - int (*xProgress)(void*), - void *pArg -){ - if( !sqlite3SafetyCheck(db) ){ - sqlite3_mutex_enter(db->mutex); - if( nOps>0 ){ - db->xProgress = xProgress; - db->nProgressOps = nOps; - db->pProgressArg = pArg; - }else{ - db->xProgress = 0; - db->nProgressOps = 0; - db->pProgressArg = 0; - } - sqlite3_mutex_leave(db->mutex); - } -} -#endif - - -/* -** This routine installs a default busy handler that waits for the -** specified number of milliseconds before returning 0. -*/ -int sqlite3_busy_timeout(sqlite3 *db, int ms){ - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - if( ms>0 ){ - db->busyTimeout = ms; - sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db); - }else{ - sqlite3_busy_handler(db, 0, 0); - } - return SQLITE_OK; -} - -/* -** Cause any pending operation to stop at its earliest opportunity. -*/ -void sqlite3_interrupt(sqlite3 *db){ - if( db && (db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_BUSY) ){ - db->u1.isInterrupted = 1; - } -} - - -/* -** This function is exactly the same as sqlite3_create_function(), except -** that it is designed to be called by internal code. The difference is -** that if a malloc() fails in sqlite3_create_function(), an error code -** is returned and the mallocFailed flag cleared. -*/ -int sqlite3CreateFunc( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int enc, - void *pUserData, - void (*xFunc)(sqlite3_context*,int,sqlite3_value **), - void (*xStep)(sqlite3_context*,int,sqlite3_value **), - void (*xFinal)(sqlite3_context*) -){ - FuncDef *p; - int nName; - - assert( sqlite3_mutex_held(db->mutex) ); - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - if( zFunctionName==0 || - (xFunc && (xFinal || xStep)) || - (!xFunc && (xFinal && !xStep)) || - (!xFunc && (!xFinal && xStep)) || - (nArg<-1 || nArg>127) || - (255<(nName = strlen(zFunctionName))) ){ - sqlite3Error(db, SQLITE_ERROR, "bad parameters"); - return SQLITE_ERROR; - } - -#ifndef SQLITE_OMIT_UTF16 - /* If SQLITE_UTF16 is specified as the encoding type, transform this - ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the - ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. - ** - ** If SQLITE_ANY is specified, add three versions of the function - ** to the hash table. - */ - if( enc==SQLITE_UTF16 ){ - enc = SQLITE_UTF16NATIVE; - }else if( enc==SQLITE_ANY ){ - int rc; - rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8, - pUserData, xFunc, xStep, xFinal); - if( rc==SQLITE_OK ){ - rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE, - pUserData, xFunc, xStep, xFinal); - } - if( rc!=SQLITE_OK ){ - return rc; - } - enc = SQLITE_UTF16BE; - } -#else - enc = SQLITE_UTF8; -#endif - - /* Check if an existing function is being overridden or deleted. If so, - ** and there are active VMs, then return SQLITE_BUSY. If a function - ** is being overridden/deleted but there are no active VMs, allow the - ** operation to continue but invalidate all precompiled statements. - */ - p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 0); - if( p && p->iPrefEnc==enc && p->nArg==nArg ){ - if( db->activeVdbeCnt ){ - sqlite3Error(db, SQLITE_BUSY, - "Unable to delete/modify user-function due to active statements"); - assert( !db->mallocFailed ); - return SQLITE_BUSY; - }else{ - sqlite3ExpirePreparedStatements(db); - } - } - - p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1); - assert(p || db->mallocFailed); - if( !p ){ - return SQLITE_NOMEM; - } - p->flags = 0; - p->xFunc = xFunc; - p->xStep = xStep; - p->xFinalize = xFinal; - p->pUserData = pUserData; - p->nArg = nArg; - return SQLITE_OK; -} - -/* -** Create new user functions. -*/ -int sqlite3_create_function( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int enc, - void *p, - void (*xFunc)(sqlite3_context*,int,sqlite3_value **), - void (*xStep)(sqlite3_context*,int,sqlite3_value **), - void (*xFinal)(sqlite3_context*) -){ - int rc; - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal); - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -#ifndef SQLITE_OMIT_UTF16 -int sqlite3_create_function16( - sqlite3 *db, - const void *zFunctionName, - int nArg, - int eTextRep, - void *p, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -){ - int rc; - char *zFunc8; - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1); - rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal); - sqlite3_free(zFunc8); - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} -#endif - - -/* -** Declare that a function has been overloaded by a virtual table. -** -** If the function already exists as a regular global function, then -** this routine is a no-op. If the function does not exist, then create -** a new one that always throws a run-time error. -** -** When virtual tables intend to provide an overloaded function, they -** should call this routine to make sure the global function exists. -** A global function must exist in order for name resolution to work -** properly. -*/ -int sqlite3_overload_function( - sqlite3 *db, - const char *zName, - int nArg -){ - int nName = strlen(zName); - int rc; - sqlite3_mutex_enter(db->mutex); - if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){ - sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8, - 0, sqlite3InvalidFunction, 0, 0); - } - rc = sqlite3ApiExit(db, SQLITE_OK); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -#ifndef SQLITE_OMIT_TRACE -/* -** Register a trace function. The pArg from the previously registered trace -** is returned. -** -** A NULL trace function means that no tracing is executes. A non-NULL -** trace is a pointer to a function that is invoked at the start of each -** SQL statement. -*/ -void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){ - void *pOld; - sqlite3_mutex_enter(db->mutex); - pOld = db->pTraceArg; - db->xTrace = xTrace; - db->pTraceArg = pArg; - sqlite3_mutex_leave(db->mutex); - return pOld; -} -/* -** Register a profile function. The pArg from the previously registered -** profile function is returned. -** -** A NULL profile function means that no profiling is executes. A non-NULL -** profile is a pointer to a function that is invoked at the conclusion of -** each SQL statement that is run. -*/ -void *sqlite3_profile( - sqlite3 *db, - void (*xProfile)(void*,const char*,sqlite_uint64), - void *pArg -){ - void *pOld; - sqlite3_mutex_enter(db->mutex); - pOld = db->pProfileArg; - db->xProfile = xProfile; - db->pProfileArg = pArg; - sqlite3_mutex_leave(db->mutex); - return pOld; -} -#endif /* SQLITE_OMIT_TRACE */ - -/*** EXPERIMENTAL *** -** -** Register a function to be invoked when a transaction comments. -** If the invoked function returns non-zero, then the commit becomes a -** rollback. -*/ -void *sqlite3_commit_hook( - sqlite3 *db, /* Attach the hook to this database */ - int (*xCallback)(void*), /* Function to invoke on each commit */ - void *pArg /* Argument to the function */ -){ - void *pOld; - sqlite3_mutex_enter(db->mutex); - pOld = db->pCommitArg; - db->xCommitCallback = xCallback; - db->pCommitArg = pArg; - sqlite3_mutex_leave(db->mutex); - return pOld; -} - -/* -** Register a callback to be invoked each time a row is updated, -** inserted or deleted using this database connection. -*/ -void *sqlite3_update_hook( - sqlite3 *db, /* Attach the hook to this database */ - void (*xCallback)(void*,int,char const *,char const *,sqlite_int64), - void *pArg /* Argument to the function */ -){ - void *pRet; - sqlite3_mutex_enter(db->mutex); - pRet = db->pUpdateArg; - db->xUpdateCallback = xCallback; - db->pUpdateArg = pArg; - sqlite3_mutex_leave(db->mutex); - return pRet; -} - -/* -** Register a callback to be invoked each time a transaction is rolled -** back by this database connection. -*/ -void *sqlite3_rollback_hook( - sqlite3 *db, /* Attach the hook to this database */ - void (*xCallback)(void*), /* Callback function */ - void *pArg /* Argument to the function */ -){ - void *pRet; - sqlite3_mutex_enter(db->mutex); - pRet = db->pRollbackArg; - db->xRollbackCallback = xCallback; - db->pRollbackArg = pArg; - sqlite3_mutex_leave(db->mutex); - return pRet; -} - -/* -** This routine is called to create a connection to a database BTree -** driver. If zFilename is the name of a file, then that file is -** opened and used. If zFilename is the magic name ":memory:" then -** the database is stored in memory (and is thus forgotten as soon as -** the connection is closed.) If zFilename is NULL then the database -** is a "virtual" database for transient use only and is deleted as -** soon as the connection is closed. -** -** A virtual database can be either a disk file (that is automatically -** deleted when the file is closed) or it an be held entirely in memory, -** depending on the values of the TEMP_STORE compile-time macro and the -** db->temp_store variable, according to the following chart: -** -** TEMP_STORE db->temp_store Location of temporary database -** ---------- -------------- ------------------------------ -** 0 any file -** 1 1 file -** 1 2 memory -** 1 0 file -** 2 1 file -** 2 2 memory -** 2 0 memory -** 3 any memory -*/ -int sqlite3BtreeFactory( - const sqlite3 *db, /* Main database when opening aux otherwise 0 */ - const char *zFilename, /* Name of the file containing the BTree database */ - int omitJournal, /* if TRUE then do not journal this file */ - int nCache, /* How many pages in the page cache */ - int vfsFlags, /* Flags passed through to vfsOpen */ - Btree **ppBtree /* Pointer to new Btree object written here */ -){ - int btFlags = 0; - int rc; - - assert( sqlite3_mutex_held(db->mutex) ); - assert( ppBtree != 0); - if( omitJournal ){ - btFlags |= BTREE_OMIT_JOURNAL; - } - if( db->flags & SQLITE_NoReadlock ){ - btFlags |= BTREE_NO_READLOCK; - } - if( zFilename==0 ){ -#if TEMP_STORE==0 - /* Do nothing */ -#endif -#ifndef SQLITE_OMIT_MEMORYDB -#if TEMP_STORE==1 - if( db->temp_store==2 ) zFilename = ":memory:"; -#endif -#if TEMP_STORE==2 - if( db->temp_store!=1 ) zFilename = ":memory:"; -#endif -#if TEMP_STORE==3 - zFilename = ":memory:"; -#endif -#endif /* SQLITE_OMIT_MEMORYDB */ - } - - if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){ - vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB; - } - rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btFlags, vfsFlags); - if( rc==SQLITE_OK ){ - sqlite3BtreeSetBusyHandler(*ppBtree, (void*)&db->busyHandler); - sqlite3BtreeSetCacheSize(*ppBtree, nCache); - } - return rc; -} - -/* -** Return UTF-8 encoded English language explanation of the most recent -** error. -*/ -const char *sqlite3_errmsg(sqlite3 *db){ - const char *z; - if( !db ){ - return sqlite3ErrStr(SQLITE_NOMEM); - } - if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){ - return sqlite3ErrStr(SQLITE_MISUSE); - } - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - z = (char*)sqlite3_value_text(db->pErr); - if( z==0 ){ - z = sqlite3ErrStr(db->errCode); - } - sqlite3_mutex_leave(db->mutex); - return z; -} - -#ifndef SQLITE_OMIT_UTF16 -/* -** Return UTF-16 encoded English language explanation of the most recent -** error. -*/ -const void *sqlite3_errmsg16(sqlite3 *db){ - /* Because all the characters in the string are in the unicode - ** range 0x00-0xFF, if we pad the big-endian string with a - ** zero byte, we can obtain the little-endian string with - ** &big_endian[1]. - */ - static const char outOfMemBe[] = { - 0, 'o', 0, 'u', 0, 't', 0, ' ', - 0, 'o', 0, 'f', 0, ' ', - 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0 - }; - static const char misuseBe [] = { - 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ', - 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ', - 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ', - 0, 'o', 0, 'u', 0, 't', 0, ' ', - 0, 'o', 0, 'f', 0, ' ', - 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0 - }; - - const void *z; - if( !db ){ - return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); - } - if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){ - return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); - } - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - z = sqlite3_value_text16(db->pErr); - if( z==0 ){ - sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode), - SQLITE_UTF8, SQLITE_STATIC); - z = sqlite3_value_text16(db->pErr); - } - sqlite3ApiExit(0, 0); - sqlite3_mutex_leave(db->mutex); - return z; -} -#endif /* SQLITE_OMIT_UTF16 */ - -/* -** Return the most recent error code generated by an SQLite routine. If NULL is -** passed to this function, we assume a malloc() failed during sqlite3_open(). -*/ -int sqlite3_errcode(sqlite3 *db){ - if( !db || db->mallocFailed ){ - return SQLITE_NOMEM; - } - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - return db->errCode & db->errMask; -} - -/* -** Create a new collating function for database "db". The name is zName -** and the encoding is enc. -*/ -static int createCollation( - sqlite3* db, - const char *zName, - int enc, - void* pCtx, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDel)(void*) -){ - CollSeq *pColl; - int enc2; - - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - assert( sqlite3_mutex_held(db->mutex) ); - - /* If SQLITE_UTF16 is specified as the encoding type, transform this - ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the - ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally. - */ - enc2 = enc & ~SQLITE_UTF16_ALIGNED; - if( enc2==SQLITE_UTF16 ){ - enc2 = SQLITE_UTF16NATIVE; - } - - if( (enc2&~3)!=0 ){ - sqlite3Error(db, SQLITE_ERROR, "unknown encoding"); - return SQLITE_ERROR; - } - - /* Check if this call is removing or replacing an existing collation - ** sequence. If so, and there are active VMs, return busy. If there - ** are no active VMs, invalidate any pre-compiled statements. - */ - pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0); - if( pColl && pColl->xCmp ){ - if( db->activeVdbeCnt ){ - sqlite3Error(db, SQLITE_BUSY, - "Unable to delete/modify collation sequence due to active statements"); - return SQLITE_BUSY; - } - sqlite3ExpirePreparedStatements(db); - - /* If collation sequence pColl was created directly by a call to - ** sqlite3_create_collation, and not generated by synthCollSeq(), - ** then any copies made by synthCollSeq() need to be invalidated. - ** Also, collation destructor - CollSeq.xDel() - function may need - ** to be called. - */ - if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ - CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, strlen(zName)); - int j; - for(j=0; j<3; j++){ - CollSeq *p = &aColl[j]; - if( p->enc==pColl->enc ){ - if( p->xDel ){ - p->xDel(p->pUser); - } - p->xCmp = 0; - } - } - } - } - - pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1); - if( pColl ){ - pColl->xCmp = xCompare; - pColl->pUser = pCtx; - pColl->xDel = xDel; - pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED); - } - sqlite3Error(db, SQLITE_OK, 0); - return SQLITE_OK; -} - - -/* -** This routine does the work of opening a database on behalf of -** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" -** is UTF-8 encoded. -*/ -static int openDatabase( - const char *zFilename, /* Database filename UTF-8 encoded */ - sqlite3 **ppDb, /* OUT: Returned database handle */ - unsigned flags, /* Operational flags */ - const char *zVfs /* Name of the VFS to use */ -){ - sqlite3 *db; - int rc; - CollSeq *pColl; - - /* Allocate the sqlite data structure */ - db = sqlite3MallocZero( sizeof(sqlite3) ); - if( db==0 ) goto opendb_out; - db->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); - if( db->mutex==0 ){ - sqlite3_free(db); - db = 0; - goto opendb_out; - } - sqlite3_mutex_enter(db->mutex); - db->errMask = 0xff; - db->priorNewRowid = 0; - db->nDb = 2; - db->magic = SQLITE_MAGIC_BUSY; - db->aDb = db->aDbStatic; - db->autoCommit = 1; - db->flags |= SQLITE_ShortColNames -#if SQLITE_DEFAULT_FILE_FORMAT<4 - | SQLITE_LegacyFileFmt -#endif -#ifdef SQLITE_ENABLE_LOAD_EXTENSION - | SQLITE_LoadExtension -#endif - ; - sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0); - sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0); -#ifndef SQLITE_OMIT_VIRTUALTABLE - sqlite3HashInit(&db->aModule, SQLITE_HASH_STRING, 0); -#endif - - db->pVfs = sqlite3_vfs_find(zVfs); - if( !db->pVfs ){ - rc = SQLITE_ERROR; - db->magic = SQLITE_MAGIC_CLOSED; - sqlite3Error(db, rc, "no such vfs: %s", (zVfs?zVfs:"(null)")); - goto opendb_out; - } - - /* Add the default collation sequence BINARY. BINARY works for both UTF-8 - ** and UTF-16, so add a version for each to avoid any unnecessary - ** conversions. The only error that can occur here is a malloc() failure. - */ - if( createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0) || - createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0) || - createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0) || - (db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0))==0 - ){ - assert( db->mallocFailed ); - db->magic = SQLITE_MAGIC_CLOSED; - goto opendb_out; - } - - /* Also add a UTF-8 case-insensitive collation sequence. */ - createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); - - /* Set flags on the built-in collating sequences */ - db->pDfltColl->type = SQLITE_COLL_BINARY; - pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0); - if( pColl ){ - pColl->type = SQLITE_COLL_NOCASE; - } - - /* Open the backend database driver */ - db->openFlags = flags; - rc = sqlite3BtreeFactory(db, zFilename, 0, SQLITE_DEFAULT_CACHE_SIZE, - flags | SQLITE_OPEN_MAIN_DB, - &db->aDb[0].pBt); - if( rc!=SQLITE_OK ){ - sqlite3Error(db, rc, 0); - db->magic = SQLITE_MAGIC_CLOSED; - goto opendb_out; - } - db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); - db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); - - - /* The default safety_level for the main database is 'full'; for the temp - ** database it is 'NONE'. This matches the pager layer defaults. - */ - db->aDb[0].zName = "main"; - db->aDb[0].safety_level = 3; -#ifndef SQLITE_OMIT_TEMPDB - db->aDb[1].zName = "temp"; - db->aDb[1].safety_level = 1; -#endif - - db->magic = SQLITE_MAGIC_OPEN; - if( db->mallocFailed ){ - goto opendb_out; - } - - /* Register all built-in functions, but do not attempt to read the - ** database schema yet. This is delayed until the first time the database - ** is accessed. - */ - sqlite3Error(db, SQLITE_OK, 0); - sqlite3RegisterBuiltinFunctions(db); - - /* Load automatic extensions - extensions that have been registered - ** using the sqlite3_automatic_extension() API. - */ - (void)sqlite3AutoLoadExtensions(db); - if( sqlite3_errcode(db)!=SQLITE_OK ){ - goto opendb_out; - } - -#ifdef SQLITE_ENABLE_FTS1 - if( !db->mallocFailed ){ - extern int sqlite3Fts1Init(sqlite3*); - rc = sqlite3Fts1Init(db); - } -#endif - -#ifdef SQLITE_ENABLE_FTS2 - if( !db->mallocFailed && rc==SQLITE_OK ){ - extern int sqlite3Fts2Init(sqlite3*); - rc = sqlite3Fts2Init(db); - } -#endif - -#ifdef SQLITE_ENABLE_FTS3 - if( !db->mallocFailed && rc==SQLITE_OK ){ - extern int sqlite3Fts3Init(sqlite3*); - rc = sqlite3Fts3Init(db); - } -#endif - -#ifdef SQLITE_ENABLE_ICU - if( !db->mallocFailed && rc==SQLITE_OK ){ - extern int sqlite3IcuInit(sqlite3*); - rc = sqlite3IcuInit(db); - } -#endif - sqlite3Error(db, rc, 0); - - /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking - ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking - ** mode. Doing nothing at all also makes NORMAL the default. - */ -#ifdef SQLITE_DEFAULT_LOCKING_MODE - db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; - sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), - SQLITE_DEFAULT_LOCKING_MODE); -#endif - -opendb_out: - if( db && db->mutex ){ - sqlite3_mutex_leave(db->mutex); - } - if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){ - sqlite3_close(db); - db = 0; - } - *ppDb = db; - return sqlite3ApiExit(0, rc); -} - -/* -** Open a new database handle. -*/ -int sqlite3_open( - const char *zFilename, - sqlite3 **ppDb -){ - return openDatabase(zFilename, ppDb, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); -} -int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -){ - return openDatabase(filename, ppDb, flags, zVfs); -} - -#ifndef SQLITE_OMIT_UTF16 -/* -** Open a new database handle. -*/ -int sqlite3_open16( - const void *zFilename, - sqlite3 **ppDb -){ - char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */ - sqlite3_value *pVal; - int rc = SQLITE_NOMEM; - - assert( zFilename ); - assert( ppDb ); - *ppDb = 0; - pVal = sqlite3ValueNew(0); - sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC); - zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8); - if( zFilename8 ){ - rc = openDatabase(zFilename8, ppDb, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0); - if( rc==SQLITE_OK && *ppDb ){ - rc = sqlite3_exec(*ppDb, "PRAGMA encoding = 'UTF-16'", 0, 0, 0); - if( rc!=SQLITE_OK ){ - sqlite3_close(*ppDb); - *ppDb = 0; - } - } - } - sqlite3ValueFree(pVal); - - return sqlite3ApiExit(0, rc); -} -#endif /* SQLITE_OMIT_UTF16 */ - -/* -** Register a new collation sequence with the database handle db. -*/ -int sqlite3_create_collation( - sqlite3* db, - const char *zName, - int enc, - void* pCtx, - int(*xCompare)(void*,int,const void*,int,const void*) -){ - int rc; - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - rc = createCollation(db, zName, enc, pCtx, xCompare, 0); - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -/* -** Register a new collation sequence with the database handle db. -*/ -int sqlite3_create_collation_v2( - sqlite3* db, - const char *zName, - int enc, - void* pCtx, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDel)(void*) -){ - int rc; - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - rc = createCollation(db, zName, enc, pCtx, xCompare, xDel); - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -#ifndef SQLITE_OMIT_UTF16 -/* -** Register a new collation sequence with the database handle db. -*/ -int sqlite3_create_collation16( - sqlite3* db, - const char *zName, - int enc, - void* pCtx, - int(*xCompare)(void*,int,const void*,int,const void*) -){ - int rc = SQLITE_OK; - char *zName8; - sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); - zName8 = sqlite3Utf16to8(db, zName, -1); - if( zName8 ){ - rc = createCollation(db, zName8, enc, pCtx, xCompare, 0); - sqlite3_free(zName8); - } - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} -#endif /* SQLITE_OMIT_UTF16 */ - -/* -** Register a collation sequence factory callback with the database handle -** db. Replace any previously installed collation sequence factory. -*/ -int sqlite3_collation_needed( - sqlite3 *db, - void *pCollNeededArg, - void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*) -){ - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - db->xCollNeeded = xCollNeeded; - db->xCollNeeded16 = 0; - db->pCollNeededArg = pCollNeededArg; - sqlite3_mutex_leave(db->mutex); - return SQLITE_OK; -} - -#ifndef SQLITE_OMIT_UTF16 -/* -** Register a collation sequence factory callback with the database handle -** db. Replace any previously installed collation sequence factory. -*/ -int sqlite3_collation_needed16( - sqlite3 *db, - void *pCollNeededArg, - void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*) -){ - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - db->xCollNeeded = 0; - db->xCollNeeded16 = xCollNeeded16; - db->pCollNeededArg = pCollNeededArg; - sqlite3_mutex_leave(db->mutex); - return SQLITE_OK; -} -#endif /* SQLITE_OMIT_UTF16 */ - -#ifndef SQLITE_OMIT_GLOBALRECOVER -/* -** This function is now an anachronism. It used to be used to recover from a -** malloc() failure, but SQLite now does this automatically. -*/ -int sqlite3_global_recover(){ - return SQLITE_OK; -} -#endif - -/* -** Test to see whether or not the database connection is in autocommit -** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on -** by default. Autocommit is disabled by a BEGIN statement and reenabled -** by the next COMMIT or ROLLBACK. -** -******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ****** -*/ -int sqlite3_get_autocommit(sqlite3 *db){ - return db->autoCommit; -} - -#ifdef SQLITE_DEBUG -/* -** The following routine is subtituted for constant SQLITE_CORRUPT in -** debugging builds. This provides a way to set a breakpoint for when -** corruption is first detected. -*/ -int sqlite3Corrupt(void){ - return SQLITE_CORRUPT; -} -#endif - -/* -** This is a convenience routine that makes sure that all thread-specific -** data for this thread has been deallocated. -** -** SQLite no longer uses thread-specific data so this routine is now a -** no-op. It is retained for historical compatibility. -*/ -void sqlite3_thread_cleanup(void){ -} - -/* -** Return meta information about a specific column of a database table. -** See comment in sqlite3.h (sqlite.h.in) for details. -*/ -#ifdef SQLITE_ENABLE_COLUMN_METADATA -int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if colums is auto-increment */ -){ - int rc; - char *zErrMsg = 0; - Table *pTab = 0; - Column *pCol = 0; - int iCol; - - char const *zDataType = 0; - char const *zCollSeq = 0; - int notnull = 0; - int primarykey = 0; - int autoinc = 0; - - /* Ensure the database schema has been loaded */ - if( sqlite3SafetyOn(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - rc = sqlite3Init(db, &zErrMsg); - if( SQLITE_OK!=rc ){ - goto error_out; - } - - /* Locate the table in question */ - pTab = sqlite3FindTable(db, zTableName, zDbName); - if( !pTab || pTab->pSelect ){ - pTab = 0; - goto error_out; - } - - /* Find the column for which info is requested */ - if( sqlite3IsRowid(zColumnName) ){ - iCol = pTab->iPKey; - if( iCol>=0 ){ - pCol = &pTab->aCol[iCol]; - } - }else{ - for(iCol=0; iColnCol; iCol++){ - pCol = &pTab->aCol[iCol]; - if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){ - break; - } - } - if( iCol==pTab->nCol ){ - pTab = 0; - goto error_out; - } - } - - /* The following block stores the meta information that will be returned - ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey - ** and autoinc. At this point there are two possibilities: - ** - ** 1. The specified column name was rowid", "oid" or "_rowid_" - ** and there is no explicitly declared IPK column. - ** - ** 2. The table is not a view and the column name identified an - ** explicitly declared column. Copy meta information from *pCol. - */ - if( pCol ){ - zDataType = pCol->zType; - zCollSeq = pCol->zColl; - notnull = (pCol->notNull?1:0); - primarykey = (pCol->isPrimKey?1:0); - autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0); - }else{ - zDataType = "INTEGER"; - primarykey = 1; - } - if( !zCollSeq ){ - zCollSeq = "BINARY"; - } - -error_out: - if( sqlite3SafetyOff(db) ){ - rc = SQLITE_MISUSE; - } - - /* Whether the function call succeeded or failed, set the output parameters - ** to whatever their local counterparts contain. If an error did occur, - ** this has the effect of zeroing all output parameters. - */ - if( pzDataType ) *pzDataType = zDataType; - if( pzCollSeq ) *pzCollSeq = zCollSeq; - if( pNotNull ) *pNotNull = notnull; - if( pPrimaryKey ) *pPrimaryKey = primarykey; - if( pAutoinc ) *pAutoinc = autoinc; - - if( SQLITE_OK==rc && !pTab ){ - sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".", - zColumnName, 0); - rc = SQLITE_ERROR; - } - sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg); - sqlite3_free(zErrMsg); - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} -#endif - -/* -** Sleep for a little while. Return the amount of time slept. -*/ -int sqlite3_sleep(int ms){ - sqlite3_vfs *pVfs; - int rc; - pVfs = sqlite3_vfs_find(0); - - /* This function works in milliseconds, but the underlying OsSleep() - ** API uses microseconds. Hence the 1000's. - */ - rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); - return rc; -} - -/* -** Enable or disable the extended result codes. -*/ -int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ - sqlite3_mutex_enter(db->mutex); - db->errMask = onoff ? 0xffffffff : 0xff; - sqlite3_mutex_leave(db->mutex); - return SQLITE_OK; -} - -/* -** Invoke the xFileControl method on a particular database. -*/ -int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ - int rc = SQLITE_ERROR; - int iDb; - sqlite3_mutex_enter(db->mutex); - if( zDbName==0 ){ - iDb = 0; - }else{ - for(iDb=0; iDbnDb; iDb++){ - if( strcmp(db->aDb[iDb].zName, zDbName)==0 ) break; - } - } - if( iDbnDb ){ - Btree *pBtree = db->aDb[iDb].pBt; - if( pBtree ){ - Pager *pPager; - sqlite3BtreeEnter(pBtree); - pPager = sqlite3BtreePager(pBtree); - if( pPager ){ - sqlite3_file *fd = sqlite3PagerFile(pPager); - if( fd ){ - rc = sqlite3OsFileControl(fd, op, pArg); - } - } - sqlite3BtreeLeave(pBtree); - } - } - sqlite3_mutex_leave(db->mutex); - return rc; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c b/libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c deleted file mode 100644 index bc321ab9ae..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/malloc.c +++ /dev/null @@ -1,240 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Memory allocation functions used throughout sqlite. -** -** -** $Id: malloc.c,v 1.13 2007/08/29 14:06:23 danielk1977 Exp $ -*/ -#include "sqliteInt.h" -#include -#include - -/* -** This routine runs when the memory allocator sees that the -** total memory allocation is about to exceed the soft heap -** limit. -*/ -static void softHeapLimitEnforcer( - void *NotUsed, - sqlite3_int64 inUse, - int allocSize -){ - sqlite3_release_memory(allocSize); -} - -/* -** Set the soft heap-size limit for the current thread. Passing a -** zero or negative value indicates no limit. -*/ -void sqlite3_soft_heap_limit(int n){ - sqlite3_uint64 iLimit; - int overage; - if( n<0 ){ - iLimit = 0; - }else{ - iLimit = n; - } - if( iLimit>0 ){ - sqlite3_memory_alarm(softHeapLimitEnforcer, 0, iLimit); - }else{ - sqlite3_memory_alarm(0, 0, 0); - } - overage = sqlite3_memory_used() - n; - if( overage>0 ){ - sqlite3_release_memory(overage); - } -} - -/* -** Release memory held by SQLite instances created by the current thread. -*/ -int sqlite3_release_memory(int n){ -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - return sqlite3PagerReleaseMemory(n); -#else - return SQLITE_OK; -#endif -} - - -/* -** Allocate and zero memory. -*/ -void *sqlite3MallocZero(unsigned n){ - void *p = sqlite3_malloc(n); - if( p ){ - memset(p, 0, n); - } - return p; -} - -/* -** Allocate and zero memory. If the allocation fails, make -** the mallocFailed flag in the connection pointer. -*/ -void *sqlite3DbMallocZero(sqlite3 *db, unsigned n){ - void *p = sqlite3DbMallocRaw(db, n); - if( p ){ - memset(p, 0, n); - } - return p; -} - -/* -** Allocate and zero memory. If the allocation fails, make -** the mallocFailed flag in the connection pointer. -*/ -void *sqlite3DbMallocRaw(sqlite3 *db, unsigned n){ - void *p = 0; - if( !db || db->mallocFailed==0 ){ - p = sqlite3_malloc(n); - if( !p && db ){ - db->mallocFailed = 1; - } - } - return p; -} - -/* -** Resize the block of memory pointed to by p to n bytes. If the -** resize fails, set the mallocFailed flag inthe connection object. -*/ -void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){ - void *pNew = 0; - if( db->mallocFailed==0 ){ - pNew = sqlite3_realloc(p, n); - if( !pNew ){ - db->mallocFailed = 1; - } - } - return pNew; -} - -/* -** Attempt to reallocate p. If the reallocation fails, then free p -** and set the mallocFailed flag in the database connection. -*/ -void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){ - void *pNew; - pNew = sqlite3DbRealloc(db, p, n); - if( !pNew ){ - sqlite3_free(p); - } - return pNew; -} - -/* -** Make a copy of a string in memory obtained from sqliteMalloc(). These -** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This -** is because when memory debugging is turned on, these two functions are -** called via macros that record the current file and line number in the -** ThreadData structure. -*/ -char *sqlite3StrDup(const char *z){ - char *zNew; - int n; - if( z==0 ) return 0; - n = strlen(z)+1; - zNew = sqlite3_malloc(n); - if( zNew ) memcpy(zNew, z, n); - return zNew; -} -char *sqlite3StrNDup(const char *z, int n){ - char *zNew; - if( z==0 ) return 0; - zNew = sqlite3_malloc(n+1); - if( zNew ){ - memcpy(zNew, z, n); - zNew[n] = 0; - } - return zNew; -} - -char *sqlite3DbStrDup(sqlite3 *db, const char *z){ - char *zNew = sqlite3StrDup(z); - if( z && !zNew ){ - db->mallocFailed = 1; - } - return zNew; -} -char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){ - char *zNew = sqlite3StrNDup(z, n); - if( z && !zNew ){ - db->mallocFailed = 1; - } - return zNew; -} - -/* -** Create a string from the 2nd and subsequent arguments (up to the -** first NULL argument), store the string in memory obtained from -** sqliteMalloc() and make the pointer indicated by the 1st argument -** point to that string. The 1st argument must either be NULL or -** point to memory obtained from sqliteMalloc(). -*/ -void sqlite3SetString(char **pz, ...){ - va_list ap; - int nByte; - const char *z; - char *zResult; - - assert( pz!=0 ); - nByte = 1; - va_start(ap, pz); - while( (z = va_arg(ap, const char*))!=0 ){ - nByte += strlen(z); - } - va_end(ap); - sqlite3_free(*pz); - *pz = zResult = sqlite3_malloc(nByte); - if( zResult==0 ){ - return; - } - *zResult = 0; - va_start(ap, pz); - while( (z = va_arg(ap, const char*))!=0 ){ - int n = strlen(z); - memcpy(zResult, z, n); - zResult += n; - } - zResult[0] = 0; - va_end(ap); -} - - -/* -** This function must be called before exiting any API function (i.e. -** returning control to the user) that has called sqlite3_malloc or -** sqlite3_realloc. -** -** The returned value is normally a copy of the second argument to this -** function. However, if a malloc() failure has occured since the previous -** invocation SQLITE_NOMEM is returned instead. -** -** If the first argument, db, is not NULL and a malloc() error has occured, -** then the connection error-code (the value returned by sqlite3_errcode()) -** is set to SQLITE_NOMEM. -*/ -int sqlite3ApiExit(sqlite3* db, int rc){ - /* If the db handle is not NULL, then we must hold the connection handle - ** mutex here. Otherwise the read (and possible write) of db->mallocFailed - ** is unsafe, as is the call to sqlite3Error(). - */ - assert( !db || sqlite3_mutex_held(db->mutex) ); - if( db && db->mallocFailed ){ - sqlite3Error(db, SQLITE_NOMEM, 0); - db->mallocFailed = 0; - rc = SQLITE_NOMEM; - } - return rc & (db ? db->errMask : 0xff); -} - diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c deleted file mode 100644 index 1e9fcfa145..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mem1.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** 2007 August 14 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement a memory -** allocation subsystem for use by SQLite. -** -** $Id: mem1.c,v 1.10 2007/09/02 17:50:35 drh Exp $ -*/ - -/* -** This version of the memory allocator is the default. It is -** used when no other memory allocator is specified using compile-time -** macros. -*/ -#if !defined(SQLITE_MEMDEBUG) && !defined(SQLITE_OMIT_MEMORY_ALLOCATION) - -/* -** We will eventually construct multiple memory allocation subsystems -** suitable for use in various contexts: -** -** * Normal multi-threaded builds -** * Normal single-threaded builds -** * Debugging builds -** -** This initial version is suitable for use in normal multi-threaded -** builds. We envision that alternative versions will be stored in -** separate source files. #ifdefs will be used to select the code from -** one of the various memN.c source files for use in any given build. -*/ -#include "sqliteInt.h" - -/* -** All of the static variables used by this module are collected -** into a single structure named "mem". This is to keep the -** static variables organized and to reduce namespace pollution -** when this module is combined with other in the amalgamation. -*/ -static struct { - /* - ** The alarm callback and its arguments. The mem.mutex lock will - ** be held while the callback is running. Recursive calls into - ** the memory subsystem are allowed, but no new callbacks will be - ** issued. The alarmBusy variable is set to prevent recursive - ** callbacks. - */ - sqlite3_int64 alarmThreshold; - void (*alarmCallback)(void*, sqlite3_int64,int); - void *alarmArg; - int alarmBusy; - - /* - ** Mutex to control access to the memory allocation subsystem. - */ - sqlite3_mutex *mutex; - - /* - ** Current allocation and high-water mark. - */ - sqlite3_int64 nowUsed; - sqlite3_int64 mxUsed; - - -} mem; - -/* -** Enter the mutex mem.mutex. Allocate it if it is not already allocated. -*/ -static void enterMem(void){ - if( mem.mutex==0 ){ - mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); - } - sqlite3_mutex_enter(mem.mutex); -} - -/* -** Return the amount of memory currently checked out. -*/ -sqlite3_int64 sqlite3_memory_used(void){ - sqlite3_int64 n; - enterMem(); - n = mem.nowUsed; - sqlite3_mutex_leave(mem.mutex); - return n; -} - -/* -** Return the maximum amount of memory that has ever been -** checked out since either the beginning of this process -** or since the most recent reset. -*/ -sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ - sqlite3_int64 n; - enterMem(); - n = mem.mxUsed; - if( resetFlag ){ - mem.mxUsed = mem.nowUsed; - } - sqlite3_mutex_leave(mem.mutex); - return n; -} - -/* -** Change the alarm callback -*/ -int sqlite3_memory_alarm( - void(*xCallback)(void *pArg, sqlite3_int64 used,int N), - void *pArg, - sqlite3_int64 iThreshold -){ - enterMem(); - mem.alarmCallback = xCallback; - mem.alarmArg = pArg; - mem.alarmThreshold = iThreshold; - sqlite3_mutex_leave(mem.mutex); - return SQLITE_OK; -} - -/* -** Trigger the alarm -*/ -static void sqlite3MemsysAlarm(int nByte){ - void (*xCallback)(void*,sqlite3_int64,int); - sqlite3_int64 nowUsed; - void *pArg; - if( mem.alarmCallback==0 || mem.alarmBusy ) return; - mem.alarmBusy = 1; - xCallback = mem.alarmCallback; - nowUsed = mem.nowUsed; - pArg = mem.alarmArg; - sqlite3_mutex_leave(mem.mutex); - xCallback(pArg, nowUsed, nByte); - sqlite3_mutex_enter(mem.mutex); - mem.alarmBusy = 0; -} - -/* -** Allocate nBytes of memory -*/ -void *sqlite3_malloc(int nBytes){ - sqlite3_int64 *p = 0; - if( nBytes>0 ){ - enterMem(); - if( mem.alarmCallback!=0 && mem.nowUsed+nBytes>=mem.alarmThreshold ){ - sqlite3MemsysAlarm(nBytes); - } - p = malloc(nBytes+8); - if( p==0 ){ - sqlite3MemsysAlarm(nBytes); - p = malloc(nBytes+8); - } - if( p ){ - p[0] = nBytes; - p++; - mem.nowUsed += nBytes; - if( mem.nowUsed>mem.mxUsed ){ - mem.mxUsed = mem.nowUsed; - } - } - sqlite3_mutex_leave(mem.mutex); - } - return (void*)p; -} - -/* -** Free memory. -*/ -void sqlite3_free(void *pPrior){ - sqlite3_int64 *p; - int nByte; - if( pPrior==0 ){ - return; - } - assert( mem.mutex!=0 ); - p = pPrior; - p--; - nByte = (int)*p; - sqlite3_mutex_enter(mem.mutex); - mem.nowUsed -= nByte; - free(p); - sqlite3_mutex_leave(mem.mutex); -} - -/* -** Change the size of an existing memory allocation -*/ -void *sqlite3_realloc(void *pPrior, int nBytes){ - int nOld; - sqlite3_int64 *p; - if( pPrior==0 ){ - return sqlite3_malloc(nBytes); - } - if( nBytes<=0 ){ - sqlite3_free(pPrior); - return 0; - } - p = pPrior; - p--; - nOld = (int)p[0]; - assert( mem.mutex!=0 ); - sqlite3_mutex_enter(mem.mutex); - if( mem.nowUsed+nBytes-nOld>=mem.alarmThreshold ){ - sqlite3MemsysAlarm(nBytes-nOld); - } - p = realloc(p, nBytes+8); - if( p==0 ){ - sqlite3MemsysAlarm(nBytes); - p = realloc(p, nBytes+8); - } - if( p ){ - p[0] = nBytes; - p++; - mem.nowUsed += nBytes-nOld; - if( mem.nowUsed>mem.mxUsed ){ - mem.mxUsed = mem.nowUsed; - } - } - sqlite3_mutex_leave(mem.mutex); - return (void*)p; -} - -#endif /* !SQLITE_MEMDEBUG && !SQLITE_OMIT_MEMORY_ALLOCATION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c deleted file mode 100644 index 7c509fff49..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mem2.c +++ /dev/null @@ -1,546 +0,0 @@ -/* -** 2007 August 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement a memory -** allocation subsystem for use by SQLite. -** -** $Id: mem2.c,v 1.14 2007/10/03 08:46:45 danielk1977 Exp $ -*/ - -/* -** This version of the memory allocator is used only if the -** SQLITE_MEMDEBUG macro is defined and SQLITE_OMIT_MEMORY_ALLOCATION -** is not defined. -*/ -#if defined(SQLITE_MEMDEBUG) && !defined(SQLITE_OMIT_MEMORY_ALLOCATION) - -/* -** We will eventually construct multiple memory allocation subsystems -** suitable for use in various contexts: -** -** * Normal multi-threaded builds -** * Normal single-threaded builds -** * Debugging builds -** -** This version is suitable for use in debugging builds. -** -** Features: -** -** * Every allocate has guards at both ends. -** * New allocations are initialized with randomness -** * Allocations are overwritten with randomness when freed -** * Optional logs of malloc activity generated -** * Summary of outstanding allocations with backtraces to the -** point of allocation. -** * The ability to simulate memory allocation failure -*/ -#include "sqliteInt.h" -#include - -/* -** The backtrace functionality is only available with GLIBC -*/ -#ifdef __GLIBC__ - extern int backtrace(void**,int); - extern void backtrace_symbols_fd(void*const*,int,int); -#else -# define backtrace(A,B) 0 -# define backtrace_symbols_fd(A,B,C) -#endif - -/* -** Each memory allocation looks like this: -** -** ------------------------------------------------------------------------ -** | Title | backtrace pointers | MemBlockHdr | allocation | EndGuard | -** ------------------------------------------------------------------------ -** -** The application code sees only a pointer to the allocation. We have -** to back up from the allocation pointer to find the MemBlockHdr. The -** MemBlockHdr tells us the size of the allocation and the number of -** backtrace pointers. There is also a guard word at the end of the -** MemBlockHdr. -*/ -struct MemBlockHdr { - struct MemBlockHdr *pNext, *pPrev; /* Linked list of all unfreed memory */ - int iSize; /* Size of this allocation */ - char nBacktrace; /* Number of backtraces on this alloc */ - char nBacktraceSlots; /* Available backtrace slots */ - short nTitle; /* Bytes of title; includes '\0' */ - int iForeGuard; /* Guard word for sanity */ -}; - -/* -** Guard words -*/ -#define FOREGUARD 0x80F5E153 -#define REARGUARD 0xE4676B53 - -/* -** All of the static variables used by this module are collected -** into a single structure named "mem". This is to keep the -** static variables organized and to reduce namespace pollution -** when this module is combined with other in the amalgamation. -*/ -static struct { - /* - ** The alarm callback and its arguments. The mem.mutex lock will - ** be held while the callback is running. Recursive calls into - ** the memory subsystem are allowed, but no new callbacks will be - ** issued. The alarmBusy variable is set to prevent recursive - ** callbacks. - */ - sqlite3_int64 alarmThreshold; - void (*alarmCallback)(void*, sqlite3_int64, int); - void *alarmArg; - int alarmBusy; - - /* - ** Mutex to control access to the memory allocation subsystem. - */ - sqlite3_mutex *mutex; - - /* - ** Current allocation and high-water mark. - */ - sqlite3_int64 nowUsed; - sqlite3_int64 mxUsed; - - /* - ** Head and tail of a linked list of all outstanding allocations - */ - struct MemBlockHdr *pFirst; - struct MemBlockHdr *pLast; - - /* - ** The number of levels of backtrace to save in new allocations. - */ - int nBacktrace; - - /* - ** Title text to insert in front of each block - */ - int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ - char zTitle[100]; /* The title text */ - - /* - ** These values are used to simulate malloc failures. When - ** iFail is 1, simulate a malloc failures and reset the value - ** to iReset. - */ - int iFail; /* Decrement and fail malloc when this is 1 */ - int iReset; /* When malloc fails set iiFail to this value */ - int iFailCnt; /* Number of failures */ - int iBenignFailCnt; /* Number of benign failures */ - int iNextIsBenign; /* True if the next call to malloc may fail benignly */ - int iIsBenign; /* All malloc calls may fail benignly */ - - /* - ** sqlite3MallocDisallow() increments the following counter. - ** sqlite3MallocAllow() decrements it. - */ - int disallow; /* Do not allow memory allocation */ - - -} mem; - - -/* -** Enter the mutex mem.mutex. Allocate it if it is not already allocated. -*/ -static void enterMem(void){ - if( mem.mutex==0 ){ - mem.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); - } - sqlite3_mutex_enter(mem.mutex); -} - -/* -** Return the amount of memory currently checked out. -*/ -sqlite3_int64 sqlite3_memory_used(void){ - sqlite3_int64 n; - enterMem(); - n = mem.nowUsed; - sqlite3_mutex_leave(mem.mutex); - return n; -} - -/* -** Return the maximum amount of memory that has ever been -** checked out since either the beginning of this process -** or since the most recent reset. -*/ -sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ - sqlite3_int64 n; - enterMem(); - n = mem.mxUsed; - if( resetFlag ){ - mem.mxUsed = mem.nowUsed; - } - sqlite3_mutex_leave(mem.mutex); - return n; -} - -/* -** Change the alarm callback -*/ -int sqlite3_memory_alarm( - void(*xCallback)(void *pArg, sqlite3_int64 used, int N), - void *pArg, - sqlite3_int64 iThreshold -){ - enterMem(); - mem.alarmCallback = xCallback; - mem.alarmArg = pArg; - mem.alarmThreshold = iThreshold; - sqlite3_mutex_leave(mem.mutex); - return SQLITE_OK; -} - -/* -** Trigger the alarm -*/ -static void sqlite3MemsysAlarm(int nByte){ - void (*xCallback)(void*,sqlite3_int64,int); - sqlite3_int64 nowUsed; - void *pArg; - if( mem.alarmCallback==0 || mem.alarmBusy ) return; - mem.alarmBusy = 1; - xCallback = mem.alarmCallback; - nowUsed = mem.nowUsed; - pArg = mem.alarmArg; - sqlite3_mutex_leave(mem.mutex); - xCallback(pArg, nowUsed, nByte); - sqlite3_mutex_enter(mem.mutex); - mem.alarmBusy = 0; -} - -/* -** Given an allocation, find the MemBlockHdr for that allocation. -** -** This routine checks the guards at either end of the allocation and -** if they are incorrect it asserts. -*/ -static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){ - struct MemBlockHdr *p; - int *pInt; - - p = (struct MemBlockHdr*)pAllocation; - p--; - assert( p->iForeGuard==FOREGUARD ); - assert( (p->iSize & 3)==0 ); - pInt = (int*)pAllocation; - assert( pInt[p->iSize/sizeof(int)]==REARGUARD ); - return p; -} - -/* -** This routine is called once the first time a simulated memory -** failure occurs. The sole purpose of this routine is to provide -** a convenient place to set a debugger breakpoint when debugging -** errors related to malloc() failures. -*/ -static void sqlite3MemsysFailed(void){ - mem.iFailCnt = 0; - mem.iBenignFailCnt = 0; -} - -/* -** Allocate nByte bytes of memory. -*/ -void *sqlite3_malloc(int nByte){ - struct MemBlockHdr *pHdr; - void **pBt; - char *z; - int *pInt; - void *p = 0; - int totalSize; - - if( nByte>0 ){ - enterMem(); - assert( mem.disallow==0 ); - if( mem.alarmCallback!=0 && mem.nowUsed+nByte>=mem.alarmThreshold ){ - sqlite3MemsysAlarm(nByte); - } - nByte = (nByte+3)&~3; - totalSize = nByte + sizeof(*pHdr) + sizeof(int) + - mem.nBacktrace*sizeof(void*) + mem.nTitle; - if( mem.iFail>0 ){ - if( mem.iFail==1 ){ - p = 0; - mem.iFail = mem.iReset; - if( mem.iFailCnt==0 ){ - sqlite3MemsysFailed(); /* A place to set a breakpoint */ - } - mem.iFailCnt++; - if( mem.iNextIsBenign || mem.iIsBenign ){ - mem.iBenignFailCnt++; - } - }else{ - p = malloc(totalSize); - mem.iFail--; - } - }else{ - p = malloc(totalSize); - if( p==0 ){ - sqlite3MemsysAlarm(nByte); - p = malloc(totalSize); - } - } - if( p ){ - z = p; - pBt = (void**)&z[mem.nTitle]; - pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace]; - pHdr->pNext = 0; - pHdr->pPrev = mem.pLast; - if( mem.pLast ){ - mem.pLast->pNext = pHdr; - }else{ - mem.pFirst = pHdr; - } - mem.pLast = pHdr; - pHdr->iForeGuard = FOREGUARD; - pHdr->nBacktraceSlots = mem.nBacktrace; - pHdr->nTitle = mem.nTitle; - if( mem.nBacktrace ){ - void *aAddr[40]; - pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1; - memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*)); - }else{ - pHdr->nBacktrace = 0; - } - if( mem.nTitle ){ - memcpy(z, mem.zTitle, mem.nTitle); - } - pHdr->iSize = nByte; - pInt = (int*)&pHdr[1]; - pInt[nByte/sizeof(int)] = REARGUARD; - memset(pInt, 0x65, nByte); - mem.nowUsed += nByte; - if( mem.nowUsed>mem.mxUsed ){ - mem.mxUsed = mem.nowUsed; - } - p = (void*)pInt; - } - sqlite3_mutex_leave(mem.mutex); - } - mem.iNextIsBenign = 0; - return p; -} - -/* -** Free memory. -*/ -void sqlite3_free(void *pPrior){ - struct MemBlockHdr *pHdr; - void **pBt; - char *z; - if( pPrior==0 ){ - return; - } - assert( mem.mutex!=0 ); - pHdr = sqlite3MemsysGetHeader(pPrior); - pBt = (void**)pHdr; - pBt -= pHdr->nBacktraceSlots; - sqlite3_mutex_enter(mem.mutex); - mem.nowUsed -= pHdr->iSize; - if( pHdr->pPrev ){ - assert( pHdr->pPrev->pNext==pHdr ); - pHdr->pPrev->pNext = pHdr->pNext; - }else{ - assert( mem.pFirst==pHdr ); - mem.pFirst = pHdr->pNext; - } - if( pHdr->pNext ){ - assert( pHdr->pNext->pPrev==pHdr ); - pHdr->pNext->pPrev = pHdr->pPrev; - }else{ - assert( mem.pLast==pHdr ); - mem.pLast = pHdr->pPrev; - } - z = (char*)pBt; - z -= pHdr->nTitle; - memset(z, 0x2b, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) + - pHdr->iSize + sizeof(int) + pHdr->nTitle); - free(z); - sqlite3_mutex_leave(mem.mutex); -} - -/* -** Change the size of an existing memory allocation. -** -** For this debugging implementation, we *always* make a copy of the -** allocation into a new place in memory. In this way, if the -** higher level code is using pointer to the old allocation, it is -** much more likely to break and we are much more liking to find -** the error. -*/ -void *sqlite3_realloc(void *pPrior, int nByte){ - struct MemBlockHdr *pOldHdr; - void *pNew; - if( pPrior==0 ){ - return sqlite3_malloc(nByte); - } - if( nByte<=0 ){ - sqlite3_free(pPrior); - return 0; - } - assert( mem.disallow==0 ); - pOldHdr = sqlite3MemsysGetHeader(pPrior); - pNew = sqlite3_malloc(nByte); - if( pNew ){ - memcpy(pNew, pPrior, nByteiSize ? nByte : pOldHdr->iSize); - if( nByte>pOldHdr->iSize ){ - memset(&((char*)pNew)[pOldHdr->iSize], 0x2b, nByte - pOldHdr->iSize); - } - sqlite3_free(pPrior); - } - return pNew; -} - -/* -** Set the number of backtrace levels kept for each allocation. -** A value of zero turns of backtracing. The number is always rounded -** up to a multiple of 2. -*/ -void sqlite3_memdebug_backtrace(int depth){ - if( depth<0 ){ depth = 0; } - if( depth>20 ){ depth = 20; } - depth = (depth+1)&0xfe; - mem.nBacktrace = depth; -} - -/* -** Set the title string for subsequent allocations. -*/ -void sqlite3_memdebug_settitle(const char *zTitle){ - int n = strlen(zTitle) + 1; - enterMem(); - if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1; - memcpy(mem.zTitle, zTitle, n); - mem.zTitle[n] = 0; - mem.nTitle = (n+3)&~3; - sqlite3_mutex_leave(mem.mutex); -} - -/* -** Open the file indicated and write a log of all unfreed memory -** allocations into that log. -*/ -void sqlite3_memdebug_dump(const char *zFilename){ - FILE *out; - struct MemBlockHdr *pHdr; - void **pBt; - out = fopen(zFilename, "w"); - if( out==0 ){ - fprintf(stderr, "** Unable to output memory debug output log: %s **\n", - zFilename); - return; - } - for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){ - char *z = (char*)pHdr; - z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle; - fprintf(out, "**** %d bytes at %p from %s ****\n", - pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???"); - if( pHdr->nBacktrace ){ - fflush(out); - pBt = (void**)pHdr; - pBt -= pHdr->nBacktraceSlots; - backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out)); - fprintf(out, "\n"); - } - } - fclose(out); -} - -/* -** This routine is used to simulate malloc failures. -** -** After calling this routine, there will be iFail successful -** memory allocations and then a failure. If iRepeat is 1 -** all subsequent memory allocations will fail. If iRepeat is -** 0, only a single allocation will fail. If iRepeat is negative -** then the previous setting for iRepeat is unchanged. -** -** Each call to this routine overrides the previous. To disable -** the simulated allocation failure mechanism, set iFail to -1. -** -** This routine returns the number of simulated failures that have -** occurred since the previous call. -*/ -int sqlite3_memdebug_fail(int iFail, int iRepeat, int *piBenign){ - int n = mem.iFailCnt; - if( piBenign ){ - *piBenign = mem.iBenignFailCnt; - } - mem.iFail = iFail+1; - if( iRepeat>=0 ){ - mem.iReset = iRepeat; - } - mem.iFailCnt = 0; - mem.iBenignFailCnt = 0; - return n; -} - -int sqlite3_memdebug_pending(){ - return (mem.iFail-1); -} - -/* -** The following three functions are used to indicate to the test -** infrastructure which malloc() calls may fail benignly without -** affecting functionality. This can happen when resizing hash tables -** (failing to resize a hash-table is a performance hit, but not an -** error) or sometimes during a rollback operation. -** -** If the argument is true, sqlite3MallocBenignFailure() indicates that the -** next call to allocate memory may fail benignly. -** -** If sqlite3MallocEnterBenignBlock() is called with a non-zero argument, -** then all memory allocations requested before the next call to -** sqlite3MallocLeaveBenignBlock() may fail benignly. -*/ -void sqlite3MallocBenignFailure(int isBenign){ - if( isBenign ){ - mem.iNextIsBenign = 1; - } -} -void sqlite3MallocEnterBenignBlock(int isBenign){ - if( isBenign ){ - mem.iIsBenign = 1; - } -} -void sqlite3MallocLeaveBenignBlock(){ - mem.iIsBenign = 0; -} - -/* -** The following two routines are used to assert that no memory -** allocations occur between one call and the next. The use of -** these routines does not change the computed results in any way. -** These routines are like asserts. -*/ -void sqlite3MallocDisallow(void){ - assert( mem.mutex!=0 ); - sqlite3_mutex_enter(mem.mutex); - mem.disallow++; - sqlite3_mutex_leave(mem.mutex); -} -void sqlite3MallocAllow(void){ - assert( mem.mutex ); - sqlite3_mutex_enter(mem.mutex); - assert( mem.disallow>0 ); - mem.disallow--; - sqlite3_mutex_leave(mem.mutex); -} - -#endif /* SQLITE_MEMDEBUG && !SQLITE_OMIT_MEMORY_ALLOCATION */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c deleted file mode 100644 index 5815ff2169..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.c +++ /dev/null @@ -1,126 +0,0 @@ -/* -** 2007 August 14 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement mutexes. -** -** The implementation in this file does not provide any mutual -** exclusion and is thus suitable for use only in applications -** that use SQLite in a single thread. But this implementation -** does do a lot of error checking on mutexes to make sure they -** are called correctly and at appropriate times. Hence, this -** implementation is suitable for testing. -** debugging purposes -** -** $Id: mutex.c,v 1.16 2007/09/10 16:13:00 danielk1977 Exp $ -*/ -#include "sqliteInt.h" - -#ifdef SQLITE_MUTEX_NOOP_DEBUG -/* -** In this implementation, mutexes do not provide any mutual exclusion. -** But the error checking is provided. This implementation is useful -** for test purposes. -*/ - -/* -** The mutex object -*/ -struct sqlite3_mutex { - int id; /* The mutex type */ - int cnt; /* Number of entries without a matching leave */ -}; - -/* -** The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. If it returns NULL -** that means that a mutex could not be allocated. -*/ -sqlite3_mutex *sqlite3_mutex_alloc(int id){ - static sqlite3_mutex aStatic[5]; - sqlite3_mutex *pNew = 0; - switch( id ){ - case SQLITE_MUTEX_FAST: - case SQLITE_MUTEX_RECURSIVE: { - pNew = sqlite3_malloc(sizeof(*pNew)); - if( pNew ){ - pNew->id = id; - pNew->cnt = 0; - } - break; - } - default: { - assert( id-2 >= 0 ); - assert( id-2 < sizeof(aStatic)/sizeof(aStatic[0]) ); - pNew = &aStatic[id-2]; - pNew->id = id; - break; - } - } - return pNew; -} - -/* -** This routine deallocates a previously allocated mutex. -*/ -void sqlite3_mutex_free(sqlite3_mutex *p){ - assert( p ); - assert( p->cnt==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); - sqlite3_free(p); -} - -/* -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can -** be entered multiple times by the same thread. In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. If the same thread tries to enter any other kind of mutex -** more than once, the behavior is undefined. -*/ -void sqlite3_mutex_enter(sqlite3_mutex *p){ - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - p->cnt++; -} -int sqlite3_mutex_try(sqlite3_mutex *p){ - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - p->cnt++; - return SQLITE_OK; -} - -/* -** The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. The behavior -** is undefined if the mutex is not currently entered or -** is not currently allocated. SQLite will never do either. -*/ -void sqlite3_mutex_leave(sqlite3_mutex *p){ - assert( p ); - assert( sqlite3_mutex_held(p) ); - p->cnt--; - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); -} - -/* -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are -** intended for use inside assert() statements. -*/ -int sqlite3_mutex_held(sqlite3_mutex *p){ - return p==0 || p->cnt>0; -} -int sqlite3_mutex_notheld(sqlite3_mutex *p){ - return p==0 || p->cnt==0; -} -#endif /* SQLITE_MUTEX_NOOP_DEBUG */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h deleted file mode 100644 index e7ec9d204f..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -** 2007 August 28 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file contains the common header for all mutex implementations. -** The sqliteInt.h header #includes this file so that it is available -** to all source files. We break it out in an effort to keep the code -** better organized. -** -** NOTE: source files should *not* #include this header file directly. -** Source files should #include the sqliteInt.h file and let that file -** include this one indirectly. -** -** $Id: mutex.h,v 1.2 2007/08/30 14:10:30 drh Exp $ -*/ - - -#ifdef SQLITE_MUTEX_APPDEF -/* -** If SQLITE_MUTEX_APPDEF is defined, then this whole module is -** omitted and equivalent functionality must be provided by the -** application that links against the SQLite library. -*/ -#else -/* -** Figure out what version of the code to use. The choices are -** -** SQLITE_MUTEX_NOOP For single-threaded applications that -** do not desire error checking. -** -** SQLITE_MUTEX_NOOP_DEBUG For single-threaded applications with -** error checking to help verify that mutexes -** are being used correctly even though they -** are not needed. Used when SQLITE_DEBUG is -** defined on single-threaded builds. -** -** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. -** -** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. -** -** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2. -*/ -#define SQLITE_MUTEX_NOOP 1 /* The default */ -#if defined(SQLITE_DEBUG) && !SQLITE_THREADSAFE -# undef SQLITE_MUTEX_NOOP -# define SQLITE_MUTEX_NOOP_DEBUG -#endif -#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_UNIX -# undef SQLITE_MUTEX_NOOP -# define SQLITE_MUTEX_PTHREADS -#endif -#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_WIN -# undef SQLITE_MUTEX_NOOP -# define SQLITE_MUTEX_W32 -#endif -#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_OS2 -# undef SQLITE_MUTEX_NOOP -# define SQLITE_MUTEX_OS2 -#endif - -#ifdef SQLITE_MUTEX_NOOP -/* -** If this is a no-op implementation, implement everything as macros. -*/ -#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) -#define sqlite3_mutex_free(X) -#define sqlite3_mutex_enter(X) -#define sqlite3_mutex_try(X) SQLITE_OK -#define sqlite3_mutex_leave(X) -#define sqlite3_mutex_held(X) 1 -#define sqlite3_mutex_notheld(X) 1 -#endif - -#endif /* SQLITE_MUTEX_APPDEF */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c deleted file mode 100644 index e0258c7563..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_os2.c +++ /dev/null @@ -1,236 +0,0 @@ -/* -** 2007 August 28 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement mutexes for OS/2 -** -** $Id: mutex_os2.c,v 1.3 2007/10/02 19:56:04 pweilbacher Exp $ -*/ -#include "sqliteInt.h" - -/* -** The code in this file is only used if SQLITE_MUTEX_OS2 is defined. -** See the mutex.h file for details. -*/ -#ifdef SQLITE_MUTEX_OS2 - -/********************** OS/2 Mutex Implementation ********************** -** -** This implementation of mutexes is built using the OS/2 API. -*/ - -/* -** The mutex object -** Each recursive mutex is an instance of the following structure. -*/ -struct sqlite3_mutex { - PSZ mutexName; /* Mutex name controlling the lock */ - HMTX mutex; /* Mutex controlling the lock */ - int id; /* Mutex type */ - int nRef; /* Number of references */ - TID owner; /* Thread holding this mutex */ -}; - -/* -** The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. If it returns NULL -** that means that a mutex could not be allocated. -** SQLite will unwind its stack and return an error. The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
      -**
    • SQLITE_MUTEX_FAST 0 -**
    • SQLITE_MUTEX_RECURSIVE 1 -**
    • SQLITE_MUTEX_STATIC_MASTER 2 -**
    • SQLITE_MUTEX_STATIC_MEM 3 -**
    • SQLITE_MUTEX_STATIC_PRNG 4 -**
    -** -** The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. But SQLite will only request a recursive mutex in -** cases where it really needs one. If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. Three static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -*/ -sqlite3_mutex *sqlite3_mutex_alloc(int iType){ - PSZ mutex_name = "\\SEM32\\SQLITE\\MUTEX"; - int mutex_name_len = strlen(mutex_name) + 1; /* name length + null byte */ - sqlite3_mutex *p; - - switch( iType ){ - case SQLITE_MUTEX_FAST: - case SQLITE_MUTEX_RECURSIVE: { - p = sqlite3MallocZero( sizeof(*p) ); - if( p ){ - p->mutexName = (PSZ)malloc(mutex_name_len); - sqlite3_snprintf(mutex_name_len, p->mutexName, "%s", mutex_name); - p->id = iType; - DosCreateMutexSem(p->mutexName, &p->mutex, 0, FALSE); - DosOpenMutexSem(p->mutexName, &p->mutex); - } - break; - } - default: { - static sqlite3_mutex staticMutexes[5]; - static int isInit = 0; - while( !isInit ) { - static long lock = 0; - DosEnterCritSec(); - lock++; - if( lock == 1 ) { - DosExitCritSec(); - int i; - for(i = 0; i < sizeof(staticMutexes)/sizeof(staticMutexes[0]); i++) { - staticMutexes[i].mutexName = (PSZ)malloc(mutex_name_len + 1); - sqlite3_snprintf(mutex_name_len + 1, /* one more for the number */ - staticMutexes[i].mutexName, "%s%1d", mutex_name, i); - DosCreateMutexSem(staticMutexes[i].mutexName, - &staticMutexes[i].mutex, 0, FALSE); - DosOpenMutexSem(staticMutexes[i].mutexName, - &staticMutexes[i].mutex); - } - isInit = 1; - } else { - DosExitCritSec(); - DosSleep(1); - } - } - assert( iType-2 >= 0 ); - assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) ); - p = &staticMutexes[iType-2]; - p->id = iType; - break; - } - } - return p; -} - - -/* -** This routine deallocates a previously allocated mutex. -** SQLite is careful to deallocate every mutex that it allocates. -*/ -void sqlite3_mutex_free(sqlite3_mutex *p){ - assert( p ); - assert( p->nRef==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); - DosCloseMutexSem(p->mutex); - free(p->mutexName); - sqlite3_free(p); -} - -/* -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can -** be entered multiple times by the same thread. In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. If the same thread tries to enter any other kind of mutex -** more than once, the behavior is undefined. -*/ -void sqlite3_mutex_enter(sqlite3_mutex *p){ - TID tid; - PID holder1; - ULONG holder2; - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - DosRequestMutexSem(p->mutex, SEM_INDEFINITE_WAIT); - DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); - p->owner = tid; - p->nRef++; -} -int sqlite3_mutex_try(sqlite3_mutex *p){ - int rc; - TID tid; - PID holder1; - ULONG holder2; - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - if( DosRequestMutexSem(p->mutex, SEM_IMMEDIATE_RETURN) == NO_ERROR) { - DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); - p->owner = tid; - p->nRef++; - rc = SQLITE_OK; - } else { - rc = SQLITE_BUSY; - } - - return rc; -} - -/* -** The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. The behavior -** is undefined if the mutex is not currently entered or -** is not currently allocated. SQLite will never do either. -*/ -void sqlite3_mutex_leave(sqlite3_mutex *p){ - TID tid; - PID holder1; - ULONG holder2; - assert( p->nRef>0 ); - DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2); - assert( p->owner==tid ); - p->nRef--; - assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); - DosReleaseMutexSem(p->mutex); -} - -/* -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are -** intended for use inside assert() statements. -*/ -int sqlite3_mutex_held(sqlite3_mutex *p){ - TID tid; - PID pid; - ULONG ulCount; - PTIB ptib; - if( p!=0 ) { - DosQueryMutexSem(p->mutex, &pid, &tid, &ulCount); - } else { - DosGetInfoBlocks(&ptib, NULL); - tid = ptib->tib_ptib2->tib2_ultid; - } - return p==0 || (p->nRef!=0 && p->owner==tid); -} -int sqlite3_mutex_notheld(sqlite3_mutex *p){ - TID tid; - PID pid; - ULONG ulCount; - PTIB ptib; - if( p!= 0 ) { - DosQueryMutexSem(p->mutex, &pid, &tid, &ulCount); - } else { - DosGetInfoBlocks(&ptib, NULL); - tid = ptib->tib_ptib2->tib2_ultid; - } - return p==0 || p->nRef==0 || p->owner!=tid; -} -#endif /* SQLITE_MUTEX_OS2 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c deleted file mode 100644 index ff088fb531..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_unix.c +++ /dev/null @@ -1,223 +0,0 @@ -/* -** 2007 August 28 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement mutexes for pthreads -** -** $Id: mutex_unix.c,v 1.2 2007/08/28 22:24:35 drh Exp $ -*/ -#include "sqliteInt.h" - -/* -** The code in this file is only used if we are compiling threadsafe -** under unix with pthreads. -** -** Note that this implementation requires a version of pthreads that -** supports recursive mutexes. -*/ -#ifdef SQLITE_MUTEX_PTHREADS - -#include - -/* -** Each recursive mutex is an instance of the following structure. -*/ -struct sqlite3_mutex { - pthread_mutex_t mutex; /* Mutex controlling the lock */ - int id; /* Mutex type */ - int nRef; /* Number of entrances */ - pthread_t owner; /* Thread that is within this mutex */ -#ifdef SQLITE_DEBUG - int trace; /* True to trace changes */ -#endif -}; - -/* -** The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. If it returns NULL -** that means that a mutex could not be allocated. SQLite -** will unwind its stack and return an error. The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
      -**
    • SQLITE_MUTEX_FAST -**
    • SQLITE_MUTEX_RECURSIVE -**
    • SQLITE_MUTEX_STATIC_MASTER -**
    • SQLITE_MUTEX_STATIC_MEM -**
    • SQLITE_MUTEX_STATIC_MEM2 -**
    • SQLITE_MUTEX_STATIC_PRNG -**
    • SQLITE_MUTEX_STATIC_LRU -**
    -** -** The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. But SQLite will only request a recursive mutex in -** cases where it really needs one. If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. Three static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -*/ -sqlite3_mutex *sqlite3_mutex_alloc(int iType){ - static sqlite3_mutex staticMutexes[] = { - { PTHREAD_MUTEX_INITIALIZER, }, - { PTHREAD_MUTEX_INITIALIZER, }, - { PTHREAD_MUTEX_INITIALIZER, }, - { PTHREAD_MUTEX_INITIALIZER, }, - { PTHREAD_MUTEX_INITIALIZER, }, - }; - sqlite3_mutex *p; - switch( iType ){ - case SQLITE_MUTEX_RECURSIVE: { - p = sqlite3MallocZero( sizeof(*p) ); - if( p ){ - pthread_mutexattr_t recursiveAttr; - pthread_mutexattr_init(&recursiveAttr); - pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&p->mutex, &recursiveAttr); - pthread_mutexattr_destroy(&recursiveAttr); - p->id = iType; - } - break; - } - case SQLITE_MUTEX_FAST: { - p = sqlite3MallocZero( sizeof(*p) ); - if( p ){ - p->id = iType; - pthread_mutex_init(&p->mutex, 0); - } - break; - } - default: { - assert( iType-2 >= 0 ); - assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) ); - p = &staticMutexes[iType-2]; - p->id = iType; - break; - } - } - return p; -} - - -/* -** This routine deallocates a previously -** allocated mutex. SQLite is careful to deallocate every -** mutex that it allocates. -*/ -void sqlite3_mutex_free(sqlite3_mutex *p){ - assert( p ); - assert( p->nRef==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); - pthread_mutex_destroy(&p->mutex); - sqlite3_free(p); -} - -/* -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can -** be entered multiple times by the same thread. In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. If the same thread tries to enter any other kind of mutex -** more than once, the behavior is undefined. -*/ -void sqlite3_mutex_enter(sqlite3_mutex *p){ - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - pthread_mutex_lock(&p->mutex); - p->owner = pthread_self(); - p->nRef++; -#ifdef SQLITE_DEBUG - if( p->trace ){ - printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); - } -#endif -} -int sqlite3_mutex_try(sqlite3_mutex *p){ - int rc; - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - if( pthread_mutex_trylock(&p->mutex)==0 ){ - p->owner = pthread_self(); - p->nRef++; - rc = SQLITE_OK; -#ifdef SQLITE_DEBUG - if( p->trace ){ - printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); - } -#endif - }else{ - rc = SQLITE_BUSY; - } - return rc; -} - -/* -** The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. The behavior -** is undefined if the mutex is not currently entered or -** is not currently allocated. SQLite will never do either. -*/ -void sqlite3_mutex_leave(sqlite3_mutex *p){ - assert( p ); - assert( sqlite3_mutex_held(p) ); - p->nRef--; - assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); -#ifdef SQLITE_DEBUG - if( p->trace ){ - printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); - } -#endif - pthread_mutex_unlock(&p->mutex); -} - -/* -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are -** intended for use only inside assert() statements. On some platforms, -** there might be race conditions that can cause these routines to -** deliver incorrect results. In particular, if pthread_equal() is -** not an atomic operation, then these routines might delivery -** incorrect results. On most platforms, pthread_equal() is a -** comparison of two integers and is therefore atomic. But we are -** told that HPUX is not such a platform. If so, then these routines -** will not always work correctly on HPUX. -** -** On those platforms where pthread_equal() is not atomic, SQLite -** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to -** make sure no assert() statements are evaluated and hence these -** routines are never called. -*/ -#ifndef NDEBUG -int sqlite3_mutex_held(sqlite3_mutex *p){ - return p==0 || (p->nRef!=0 && pthread_equal(p->owner, pthread_self())); -} -int sqlite3_mutex_notheld(sqlite3_mutex *p){ - return p==0 || p->nRef==0 || pthread_equal(p->owner, pthread_self())==0; -} -#endif -#endif /* SQLITE_MUTEX_PTHREAD */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c b/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c deleted file mode 100644 index ee5a4088dd..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/mutex_w32.c +++ /dev/null @@ -1,208 +0,0 @@ -/* -** 2007 August 14 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the C functions that implement mutexes for win32 -** -** $Id: mutex_w32.c,v 1.4 2007/09/05 14:30:42 drh Exp $ -*/ -#include "sqliteInt.h" - -/* -** The code in this file is only used if we are compiling multithreaded -** on a win32 system. -*/ -#ifdef SQLITE_MUTEX_W32 - -/* -** Each recursive mutex is an instance of the following structure. -*/ -struct sqlite3_mutex { - CRITICAL_SECTION mutex; /* Mutex controlling the lock */ - int id; /* Mutex type */ - int nRef; /* Number of enterances */ - DWORD owner; /* Thread holding this mutex */ -}; - -/* -** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, -** or WinCE. Return false (zero) for Win95, Win98, or WinME. -** -** Here is an interesting observation: Win95, Win98, and WinME lack -** the LockFileEx() API. But we can still statically link against that -** API as long as we don't call it win running Win95/98/ME. A call to -** this routine is used to determine if the host is Win95/98/ME or -** WinNT/2K/XP so that we will know whether or not we can safely call -** the LockFileEx() API. -*/ -#if OS_WINCE -# define mutexIsNT() (1) -#else - static int mutexIsNT(void){ - static int osType = 0; - if( osType==0 ){ - OSVERSIONINFO sInfo; - sInfo.dwOSVersionInfoSize = sizeof(sInfo); - GetVersionEx(&sInfo); - osType = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; - } - return osType==2; - } -#endif /* OS_WINCE */ - - -/* -** The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. If it returns NULL -** that means that a mutex could not be allocated. SQLite -** will unwind its stack and return an error. The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
      -**
    • SQLITE_MUTEX_FAST 0 -**
    • SQLITE_MUTEX_RECURSIVE 1 -**
    • SQLITE_MUTEX_STATIC_MASTER 2 -**
    • SQLITE_MUTEX_STATIC_MEM 3 -**
    • SQLITE_MUTEX_STATIC_PRNG 4 -**
    -** -** The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. But SQLite will only request a recursive mutex in -** cases where it really needs one. If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. Three static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -*/ -sqlite3_mutex *sqlite3_mutex_alloc(int iType){ - sqlite3_mutex *p; - - switch( iType ){ - case SQLITE_MUTEX_FAST: - case SQLITE_MUTEX_RECURSIVE: { - p = sqlite3MallocZero( sizeof(*p) ); - if( p ){ - p->id = iType; - InitializeCriticalSection(&p->mutex); - } - break; - } - default: { - static sqlite3_mutex staticMutexes[5]; - static int isInit = 0; - while( !isInit ){ - static long lock = 0; - if( InterlockedIncrement(&lock)==1 ){ - int i; - for(i=0; i= 0 ); - assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) ); - p = &staticMutexes[iType-2]; - p->id = iType; - break; - } - } - return p; -} - - -/* -** This routine deallocates a previously -** allocated mutex. SQLite is careful to deallocate every -** mutex that it allocates. -*/ -void sqlite3_mutex_free(sqlite3_mutex *p){ - assert( p ); - assert( p->nRef==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); - DeleteCriticalSection(&p->mutex); - sqlite3_free(p); -} - -/* -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can -** be entered multiple times by the same thread. In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. If the same thread tries to enter any other kind of mutex -** more than once, the behavior is undefined. -*/ -void sqlite3_mutex_enter(sqlite3_mutex *p){ - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - EnterCriticalSection(&p->mutex); - p->owner = GetCurrentThreadId(); - p->nRef++; -} -int sqlite3_mutex_try(sqlite3_mutex *p){ - int rc; - assert( p ); - assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) ); - if( mutexIsNT() && TryEnterCriticalSection(&p->mutex) ){ - p->owner = GetCurrentThreadId(); - p->nRef++; - rc = SQLITE_OK; - }else{ - rc = SQLITE_BUSY; - } - return rc; -} - -/* -** The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. The behavior -** is undefined if the mutex is not currently entered or -** is not currently allocated. SQLite will never do either. -*/ -void sqlite3_mutex_leave(sqlite3_mutex *p){ - assert( p->nRef>0 ); - assert( p->owner==GetCurrentThreadId() ); - p->nRef--; - assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); - LeaveCriticalSection(&p->mutex); -} - -/* -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are -** intended for use only inside assert() statements. -*/ -int sqlite3_mutex_held(sqlite3_mutex *p){ - return p==0 || (p->nRef!=0 && p->owner==GetCurrentThreadId()); -} -int sqlite3_mutex_notheld(sqlite3_mutex *p){ - return p==0 || p->nRef==0 || p->owner!=GetCurrentThreadId(); -} -#endif /* SQLITE_MUTEX_W32 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os.c deleted file mode 100644 index 3b6ca7bcaf..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/os.c +++ /dev/null @@ -1,282 +0,0 @@ - /* -** 2005 November 29 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains OS interface code that is common to all -** architectures. -*/ -#define _SQLITE_OS_C_ 1 -#include "sqliteInt.h" -#undef _SQLITE_OS_C_ - -/* -** The default SQLite sqlite3_vfs implementations do not allocate -** memory (actually, os_unix.c allocates a small amount of memory -** from within OsOpen()), but some third-party implementations may. -** So we test the effects of a malloc() failing and the sqlite3OsXXX() -** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. -** -** The following functions are instrumented for malloc() failure -** testing: -** -** sqlite3OsOpen() -** sqlite3OsRead() -** sqlite3OsWrite() -** sqlite3OsSync() -** sqlite3OsLock() -** -*/ -#ifdef SQLITE_TEST - #define DO_OS_MALLOC_TEST if (1) { \ - void *pTstAlloc = sqlite3_malloc(10); \ - if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \ - sqlite3_free(pTstAlloc); \ - } -#else - #define DO_OS_MALLOC_TEST -#endif - -/* -** The following routines are convenience wrappers around methods -** of the sqlite3_file object. This is mostly just syntactic sugar. All -** of this would be completely automatic if SQLite were coded using -** C++ instead of plain old C. -*/ -int sqlite3OsClose(sqlite3_file *pId){ - int rc = SQLITE_OK; - if( pId->pMethods ){ - rc = pId->pMethods->xClose(pId); - pId->pMethods = 0; - } - return rc; -} -int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ - DO_OS_MALLOC_TEST; - return id->pMethods->xRead(id, pBuf, amt, offset); -} -int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ - DO_OS_MALLOC_TEST; - return id->pMethods->xWrite(id, pBuf, amt, offset); -} -int sqlite3OsTruncate(sqlite3_file *id, i64 size){ - return id->pMethods->xTruncate(id, size); -} -int sqlite3OsSync(sqlite3_file *id, int flags){ - DO_OS_MALLOC_TEST; - return id->pMethods->xSync(id, flags); -} -int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ - return id->pMethods->xFileSize(id, pSize); -} -int sqlite3OsLock(sqlite3_file *id, int lockType){ - DO_OS_MALLOC_TEST; - return id->pMethods->xLock(id, lockType); -} -int sqlite3OsUnlock(sqlite3_file *id, int lockType){ - return id->pMethods->xUnlock(id, lockType); -} -int sqlite3OsCheckReservedLock(sqlite3_file *id){ - return id->pMethods->xCheckReservedLock(id); -} -int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ - return id->pMethods->xFileControl(id,op,pArg); -} - -#ifdef SQLITE_TEST - /* The following two variables are used to override the values returned - ** by the xSectorSize() and xDeviceCharacteristics() vfs methods for - ** testing purposes. They are usually set by a test command implemented - ** in test6.c. - */ - int sqlite3_test_sector_size = 0; - int sqlite3_test_device_characteristics = 0; - int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ - int dc = id->pMethods->xDeviceCharacteristics(id); - return dc | sqlite3_test_device_characteristics; - } - int sqlite3OsSectorSize(sqlite3_file *id){ - if( sqlite3_test_sector_size==0 ){ - int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; - return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); - } - return sqlite3_test_sector_size; - } -#else - int sqlite3OsSectorSize(sqlite3_file *id){ - int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; - return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); - } - int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ - return id->pMethods->xDeviceCharacteristics(id); - } -#endif - -/* -** The next group of routines are convenience wrappers around the -** VFS methods. -*/ -int sqlite3OsOpen( - sqlite3_vfs *pVfs, - const char *zPath, - sqlite3_file *pFile, - int flags, - int *pFlagsOut -){ - DO_OS_MALLOC_TEST; - return pVfs->xOpen(pVfs, zPath, pFile, flags, pFlagsOut); -} -int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ - return pVfs->xDelete(pVfs, zPath, dirSync); -} -int sqlite3OsAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){ - return pVfs->xAccess(pVfs, zPath, flags); -} -int sqlite3OsGetTempname(sqlite3_vfs *pVfs, int nBufOut, char *zBufOut){ - return pVfs->xGetTempname(pVfs, nBufOut, zBufOut); -} -int sqlite3OsFullPathname( - sqlite3_vfs *pVfs, - const char *zPath, - int nPathOut, - char *zPathOut -){ - return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); -} -void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ - return pVfs->xDlOpen(pVfs, zPath); -} -void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ - pVfs->xDlError(pVfs, nByte, zBufOut); -} -void *sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ - return pVfs->xDlSym(pVfs, pHandle, zSymbol); -} -void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ - pVfs->xDlClose(pVfs, pHandle); -} -int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ - return pVfs->xRandomness(pVfs, nByte, zBufOut); -} -int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ - return pVfs->xSleep(pVfs, nMicro); -} -int sqlite3OsCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ - return pVfs->xCurrentTime(pVfs, pTimeOut); -} - -int sqlite3OsOpenMalloc( - sqlite3_vfs *pVfs, - const char *zFile, - sqlite3_file **ppFile, - int flags, - int *pOutFlags -){ - int rc = SQLITE_NOMEM; - sqlite3_file *pFile; - pFile = (sqlite3_file *)sqlite3_malloc(pVfs->szOsFile); - if( pFile ){ - rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); - if( rc!=SQLITE_OK ){ - sqlite3_free(pFile); - }else{ - *ppFile = pFile; - } - } - return rc; -} -int sqlite3OsCloseFree(sqlite3_file *pFile){ - int rc = SQLITE_OK; - if( pFile ){ - rc = sqlite3OsClose(pFile); - sqlite3_free(pFile); - } - return rc; -} - -/* -** The list of all registered VFS implementations. This list is -** initialized to the single VFS returned by sqlite3OsDefaultVfs() -** upon the first call to sqlite3_vfs_find(). -*/ -static sqlite3_vfs *vfsList = 0; - -/* -** Locate a VFS by name. If no name is given, simply return the -** first VFS on the list. -*/ -sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ - sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - sqlite3_vfs *pVfs; - static int isInit = 0; - sqlite3_mutex_enter(mutex); - if( !isInit ){ - vfsList = sqlite3OsDefaultVfs(); - isInit = 1; - } - for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ - if( zVfs==0 ) break; - if( strcmp(zVfs, pVfs->zName)==0 ) break; - } - sqlite3_mutex_leave(mutex); - return pVfs; -} - -/* -** Unlink a VFS from the linked list -*/ -static void vfsUnlink(sqlite3_vfs *pVfs){ - assert( sqlite3_mutex_held(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)) ); - if( vfsList==pVfs ){ - vfsList = pVfs->pNext; - }else{ - sqlite3_vfs *p = vfsList; - while( p->pNext && p->pNext!=pVfs ){ - p = p->pNext; - } - if( p->pNext==pVfs ){ - p->pNext = pVfs->pNext; - } - } -} - -/* -** Register a VFS with the system. It is harmless to register the same -** VFS multiple times. The new VFS becomes the default if makeDflt is -** true. -*/ -int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ - sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - sqlite3_vfs_find(0); /* Make sure we are initialized */ - sqlite3_mutex_enter(mutex); - vfsUnlink(pVfs); - if( makeDflt || vfsList==0 ){ - pVfs->pNext = vfsList; - vfsList = pVfs; - }else{ - pVfs->pNext = vfsList->pNext; - vfsList->pNext = pVfs; - } - assert(vfsList); - sqlite3_mutex_leave(mutex); - return SQLITE_OK; -} - -/* -** Unregister a VFS so that it is no longer accessible. -*/ -int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ - sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); - sqlite3_mutex_enter(mutex); - vfsUnlink(pVfs); - assert(vfsList); - sqlite3_mutex_leave(mutex); - return SQLITE_OK; -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os.h b/libraries/sqlite/unix/sqlite-3.5.1/src/os.h deleted file mode 100644 index 554952df00..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/os.h +++ /dev/null @@ -1,284 +0,0 @@ -/* -** 2001 September 16 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file (together with is companion C source-code file -** "os.c") attempt to abstract the underlying operating system so that -** the SQLite library will work on both POSIX and windows systems. -** -** This header file is #include-ed by sqliteInt.h and thus ends up -** being included by every source file. -*/ -#ifndef _SQLITE_OS_H_ -#define _SQLITE_OS_H_ - -/* -** Figure out if we are dealing with Unix, Windows, or some other -** operating system. After the following block of preprocess macros, -** all of OS_UNIX, OS_WIN, OS_OS2, and OS_OTHER will defined to either -** 1 or 0. One of the four will be 1. The other three will be 0. -*/ -#if defined(OS_OTHER) -# if OS_OTHER==1 -# undef OS_UNIX -# define OS_UNIX 0 -# undef OS_WIN -# define OS_WIN 0 -# undef OS_OS2 -# define OS_OS2 0 -# else -# undef OS_OTHER -# endif -#endif -#if !defined(OS_UNIX) && !defined(OS_OTHER) -# define OS_OTHER 0 -# ifndef OS_WIN -# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) -# define OS_WIN 1 -# define OS_UNIX 0 -# define OS_OS2 0 -# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__) -# define OS_WIN 0 -# define OS_UNIX 0 -# define OS_OS2 1 -# else -# define OS_WIN 0 -# define OS_UNIX 1 -# define OS_OS2 0 -# endif -# else -# define OS_UNIX 0 -# define OS_OS2 0 -# endif -#else -# ifndef OS_WIN -# define OS_WIN 0 -# endif -#endif - - - -/* -** Define the maximum size of a temporary filename -*/ -#if OS_WIN -# include -# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) -#elif OS_OS2 -# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY) -# include /* has to be included before os2.h for linking to work */ -# endif -# define INCL_DOSDATETIME -# define INCL_DOSFILEMGR -# define INCL_DOSERRORS -# define INCL_DOSMISC -# define INCL_DOSPROCESS -# define INCL_DOSMODULEMGR -# include -# define SQLITE_TEMPNAME_SIZE (CCHMAXPATHCOMP) -#else -# define SQLITE_TEMPNAME_SIZE 200 -#endif - -/* If the SET_FULLSYNC macro is not defined above, then make it -** a no-op -*/ -#ifndef SET_FULLSYNC -# define SET_FULLSYNC(x,y) -#endif - -/* -** The default size of a disk sector -*/ -#ifndef SQLITE_DEFAULT_SECTOR_SIZE -# define SQLITE_DEFAULT_SECTOR_SIZE 512 -#endif - -/* -** Temporary files are named starting with this prefix followed by 16 random -** alphanumeric characters, and no file extension. They are stored in the -** OS's standard temporary file directory, and are deleted prior to exit. -** If sqlite is being embedded in another program, you may wish to change the -** prefix to reflect your program's name, so that if your program exits -** prematurely, old temporary files can be easily identified. This can be done -** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. -** -** 2006-10-31: The default prefix used to be "sqlite_". But then -** Mcafee started using SQLite in their anti-virus product and it -** started putting files with the "sqlite" name in the c:/temp folder. -** This annoyed many windows users. Those users would then do a -** Google search for "sqlite", find the telephone numbers of the -** developers and call to wake them up at night and complain. -** For this reason, the default name prefix is changed to be "sqlite" -** spelled backwards. So the temp files are still identified, but -** anybody smart enough to figure out the code is also likely smart -** enough to know that calling the developer will not help get rid -** of the file. -*/ -#ifndef SQLITE_TEMP_FILE_PREFIX -# define SQLITE_TEMP_FILE_PREFIX "etilqs_" -#endif - -/* -** If using an alternative OS interface, then we must have an "os_other.h" -** header file available for that interface. Presumably the "os_other.h" -** header file contains #defines similar to those above. -*/ -#if OS_OTHER -# include "os_other.h" -#endif - - -/* -** The following values may be passed as the second argument to -** sqlite3OsLock(). The various locks exhibit the following semantics: -** -** SHARED: Any number of processes may hold a SHARED lock simultaneously. -** RESERVED: A single process may hold a RESERVED lock on a file at -** any time. Other processes may hold and obtain new SHARED locks. -** PENDING: A single process may hold a PENDING lock on a file at -** any one time. Existing SHARED locks may persist, but no new -** SHARED locks may be obtained by other processes. -** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. -** -** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a -** process that requests an EXCLUSIVE lock may actually obtain a PENDING -** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to -** sqlite3OsLock(). -*/ -#define NO_LOCK 0 -#define SHARED_LOCK 1 -#define RESERVED_LOCK 2 -#define PENDING_LOCK 3 -#define EXCLUSIVE_LOCK 4 - -/* -** File Locking Notes: (Mostly about windows but also some info for Unix) -** -** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because -** those functions are not available. So we use only LockFile() and -** UnlockFile(). -** -** LockFile() prevents not just writing but also reading by other processes. -** A SHARED_LOCK is obtained by locking a single randomly-chosen -** byte out of a specific range of bytes. The lock byte is obtained at -** random so two separate readers can probably access the file at the -** same time, unless they are unlucky and choose the same lock byte. -** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. -** There can only be one writer. A RESERVED_LOCK is obtained by locking -** a single byte of the file that is designated as the reserved lock byte. -** A PENDING_LOCK is obtained by locking a designated byte different from -** the RESERVED_LOCK byte. -** -** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, -** which means we can use reader/writer locks. When reader/writer locks -** are used, the lock is placed on the same range of bytes that is used -** for probabilistic locking in Win95/98/ME. Hence, the locking scheme -** will support two or more Win95 readers or two or more WinNT readers. -** But a single Win95 reader will lock out all WinNT readers and a single -** WinNT reader will lock out all other Win95 readers. -** -** The following #defines specify the range of bytes used for locking. -** SHARED_SIZE is the number of bytes available in the pool from which -** a random byte is selected for a shared lock. The pool of bytes for -** shared locks begins at SHARED_FIRST. -** -** These #defines are available in sqlite_aux.h so that adaptors for -** connecting SQLite to other operating systems can use the same byte -** ranges for locking. In particular, the same locking strategy and -** byte ranges are used for Unix. This leaves open the possiblity of having -** clients on win95, winNT, and unix all talking to the same shared file -** and all locking correctly. To do so would require that samba (or whatever -** tool is being used for file sharing) implements locks correctly between -** windows and unix. I'm guessing that isn't likely to happen, but by -** using the same locking range we are at least open to the possibility. -** -** Locking in windows is manditory. For this reason, we cannot store -** actual data in the bytes used for locking. The pager never allocates -** the pages involved in locking therefore. SHARED_SIZE is selected so -** that all locks will fit on a single page even at the minimum page size. -** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE -** is set high so that we don't have to allocate an unused page except -** for very large databases. But one should test the page skipping logic -** by setting PENDING_BYTE low and running the entire regression suite. -** -** Changing the value of PENDING_BYTE results in a subtly incompatible -** file format. Depending on how it is changed, you might not notice -** the incompatibility right away, even running a full regression test. -** The default location of PENDING_BYTE is the first byte past the -** 1GB boundary. -** -*/ -#ifndef SQLITE_TEST -#define PENDING_BYTE 0x40000000 /* First byte past the 1GB boundary */ -#else -extern unsigned int sqlite3_pending_byte; -#define PENDING_BYTE sqlite3_pending_byte -#endif - -#define RESERVED_BYTE (PENDING_BYTE+1) -#define SHARED_FIRST (PENDING_BYTE+2) -#define SHARED_SIZE 510 - -/* -** Functions for accessing sqlite3_file methods -*/ -int sqlite3OsClose(sqlite3_file*); -int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); -int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); -int sqlite3OsTruncate(sqlite3_file*, i64 size); -int sqlite3OsSync(sqlite3_file*, int); -int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); -int sqlite3OsLock(sqlite3_file*, int); -int sqlite3OsUnlock(sqlite3_file*, int); -int sqlite3OsCheckReservedLock(sqlite3_file *id); -int sqlite3OsFileControl(sqlite3_file*,int,void*); -int sqlite3OsSectorSize(sqlite3_file *id); -int sqlite3OsDeviceCharacteristics(sqlite3_file *id); - -/* -** Functions for accessing sqlite3_vfs methods -*/ -int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); -int sqlite3OsDelete(sqlite3_vfs *, const char *, int); -int sqlite3OsAccess(sqlite3_vfs *, const char *, int); -int sqlite3OsGetTempname(sqlite3_vfs *, int, char *); -int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); -void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); -void sqlite3OsDlError(sqlite3_vfs *, int, char *); -void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *); -void sqlite3OsDlClose(sqlite3_vfs *, void *); -int sqlite3OsRandomness(sqlite3_vfs *, int, char *); -int sqlite3OsSleep(sqlite3_vfs *, int); -int sqlite3OsCurrentTime(sqlite3_vfs *, double*); - -/* -** Convenience functions for opening and closing files using -** sqlite3_malloc() to obtain space for the file-handle structure. -*/ -int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); -int sqlite3OsCloseFree(sqlite3_file *); - -/* -** Each OS-specific backend defines an instance of the following -** structure for returning a pointer to its sqlite3_vfs. If OS_OTHER -** is defined (meaning that the application-defined OS interface layer -** is used) then there is no default VFS. The application must -** register one or more VFS structures using sqlite3_vfs_register() -** before attempting to use SQLite. -*/ -#if OS_UNIX || OS_WIN || OS_OS2 -sqlite3_vfs *sqlite3OsDefaultVfs(void); -#else -# define sqlite3OsDefaultVfs(X) 0 -#endif - -#endif /* _SQLITE_OS_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h b/libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h deleted file mode 100644 index 8de4be9718..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/os_common.h +++ /dev/null @@ -1,127 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains macros and a little bit of code that is common to -** all of the platform-specific files (os_*.c) and is #included into those -** files. -** -** This file should be #included by the os_*.c files only. It is not a -** general purpose header file. -*/ - -/* -** At least two bugs have slipped in because we changed the MEMORY_DEBUG -** macro to SQLITE_DEBUG and some older makefiles have not yet made the -** switch. The following code should catch this problem at compile-time. -*/ -#ifdef MEMORY_DEBUG -# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." -#endif - - -/* - * When testing, this global variable stores the location of the - * pending-byte in the database file. - */ -#ifdef SQLITE_TEST -unsigned int sqlite3_pending_byte = 0x40000000; -#endif - -#ifdef SQLITE_DEBUG -int sqlite3_os_trace = 0; -#define OSTRACE1(X) if( sqlite3_os_trace ) sqlite3DebugPrintf(X) -#define OSTRACE2(X,Y) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y) -#define OSTRACE3(X,Y,Z) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z) -#define OSTRACE4(X,Y,Z,A) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z,A) -#define OSTRACE5(X,Y,Z,A,B) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z,A,B) -#define OSTRACE6(X,Y,Z,A,B,C) \ - if(sqlite3_os_trace) sqlite3DebugPrintf(X,Y,Z,A,B,C) -#define OSTRACE7(X,Y,Z,A,B,C,D) \ - if(sqlite3_os_trace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D) -#else -#define OSTRACE1(X) -#define OSTRACE2(X,Y) -#define OSTRACE3(X,Y,Z) -#define OSTRACE4(X,Y,Z,A) -#define OSTRACE5(X,Y,Z,A,B) -#define OSTRACE6(X,Y,Z,A,B,C) -#define OSTRACE7(X,Y,Z,A,B,C,D) -#endif - -/* -** Macros for performance tracing. Normally turned off. Only works -** on i486 hardware. -*/ -#ifdef SQLITE_PERFORMANCE_TRACE -__inline__ unsigned long long int hwtime(void){ - unsigned long long int x; - __asm__("rdtsc\n\t" - "mov %%edx, %%ecx\n\t" - :"=A" (x)); - return x; -} -static unsigned long long int g_start; -static unsigned int elapse; -#define TIMER_START g_start=hwtime() -#define TIMER_END elapse=hwtime()-g_start -#define TIMER_ELAPSED elapse -#else -#define TIMER_START -#define TIMER_END -#define TIMER_ELAPSED 0 -#endif - -/* -** If we compile with the SQLITE_TEST macro set, then the following block -** of code will give us the ability to simulate a disk I/O error. This -** is used for testing the I/O recovery logic. -*/ -#ifdef SQLITE_TEST -int sqlite3_io_error_hit = 0; -int sqlite3_io_error_pending = 0; -int sqlite3_io_error_persist = 0; -int sqlite3_diskfull_pending = 0; -int sqlite3_diskfull = 0; -#define SimulateIOError(CODE) \ - if( sqlite3_io_error_pending || sqlite3_io_error_hit ) \ - if( sqlite3_io_error_pending-- == 1 \ - || (sqlite3_io_error_persist && sqlite3_io_error_hit) ) \ - { local_ioerr(); CODE; } -static void local_ioerr(){ - IOTRACE(("IOERR\n")); - sqlite3_io_error_hit = 1; -} -#define SimulateDiskfullError(CODE) \ - if( sqlite3_diskfull_pending ){ \ - if( sqlite3_diskfull_pending == 1 ){ \ - local_ioerr(); \ - sqlite3_diskfull = 1; \ - sqlite3_io_error_hit = 1; \ - CODE; \ - }else{ \ - sqlite3_diskfull_pending--; \ - } \ - } -#else -#define SimulateIOError(A) -#define SimulateDiskfullError(A) -#endif - -/* -** When testing, keep a count of the number of open files. -*/ -#ifdef SQLITE_TEST -int sqlite3_open_file_count = 0; -#define OpenCounter(X) sqlite3_open_file_count+=(X) -#else -#define OpenCounter(X) -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c deleted file mode 100644 index c4fbe66d47..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/os_os2.c +++ /dev/null @@ -1,1032 +0,0 @@ -/* -** 2006 Feb 14 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains code that is specific to OS/2. -*/ - -#include "sqliteInt.h" - -#if OS_OS2 - -/* -** Macros used to determine whether or not to use threads. -*/ -#if defined(THREADSAFE) && THREADSAFE -# define SQLITE_OS2_THREADS 1 -#endif - -/* -** Include code that is common to all os_*.c files -*/ -#include "os_common.h" - -/* -** The os2File structure is subclass of OsFile specific for the OS/2 -** protability layer. -*/ -typedef struct os2File os2File; -struct os2File { - IoMethod const *pMethod; /* Always the first entry */ - HFILE h; /* Handle for accessing the file */ - int delOnClose; /* True if file is to be deleted on close */ - char* pathToDel; /* Name of file to delete on close */ - unsigned char locktype; /* Type of lock currently held on this file */ -}; - -/* -** Do not include any of the File I/O interface procedures if the -** SQLITE_OMIT_DISKIO macro is defined (indicating that there database -** will be in-memory only) -*/ -#ifndef SQLITE_OMIT_DISKIO - -/* -** Delete the named file -*/ -int sqlite3Os2Delete( const char *zFilename ){ - APIRET rc = NO_ERROR; - - rc = DosDelete( (PSZ)zFilename ); - OSTRACE2( "DELETE \"%s\"\n", zFilename ); - return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Return TRUE if the named file exists. -*/ -int sqlite3Os2FileExists( const char *zFilename ){ - FILESTATUS3 fsts3ConfigInfo; - memset(&fsts3ConfigInfo, 0, sizeof(fsts3ConfigInfo)); - return DosQueryPathInfo( (PSZ)zFilename, FIL_STANDARD, - &fsts3ConfigInfo, sizeof(FILESTATUS3) ) == NO_ERROR; -} - -/* Forward declaration */ -int allocateOs2File( os2File *pInit, OsFile **pld ); - -/* -** Attempt to open a file for both reading and writing. If that -** fails, try opening it read-only. If the file does not exist, -** try to create it. -** -** On success, a handle for the open file is written to *id -** and *pReadonly is set to 0 if the file was opened for reading and -** writing or 1 if the file was opened read-only. The function returns -** SQLITE_OK. -** -** On failure, the function returns SQLITE_CANTOPEN and leaves -** *id and *pReadonly unchanged. -*/ -int sqlite3Os2OpenReadWrite( - const char *zFilename, - OsFile **pld, - int *pReadonly -){ - os2File f; - HFILE hf; - ULONG ulAction; - APIRET rc = NO_ERROR; - - assert( *pld == 0 ); - rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, - FILE_ARCHIVED | FILE_NORMAL, - OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS, - OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | - OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, (PEAOP2)NULL ); - if( rc != NO_ERROR ){ - rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, - FILE_ARCHIVED | FILE_NORMAL, - OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS, - OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | - OPEN_SHARE_DENYWRITE | OPEN_ACCESS_READONLY, (PEAOP2)NULL ); - if( rc != NO_ERROR ){ - return SQLITE_CANTOPEN; - } - *pReadonly = 1; - } - else{ - *pReadonly = 0; - } - f.h = hf; - f.locktype = NO_LOCK; - f.delOnClose = 0; - f.pathToDel = NULL; - OpenCounter(+1); - OSTRACE3( "OPEN R/W %d \"%s\"\n", hf, zFilename ); - return allocateOs2File( &f, pld ); -} - - -/* -** Attempt to open a new file for exclusive access by this process. -** The file will be opened for both reading and writing. To avoid -** a potential security problem, we do not allow the file to have -** previously existed. Nor do we allow the file to be a symbolic -** link. -** -** If delFlag is true, then make arrangements to automatically delete -** the file when it is closed. -** -** On success, write the file handle into *id and return SQLITE_OK. -** -** On failure, return SQLITE_CANTOPEN. -*/ -int sqlite3Os2OpenExclusive( const char *zFilename, OsFile **pld, int delFlag ){ - os2File f; - HFILE hf; - ULONG ulAction; - APIRET rc = NO_ERROR; - - assert( *pld == 0 ); - rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, FILE_NORMAL, - OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS, - OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | - OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, (PEAOP2)NULL ); - if( rc != NO_ERROR ){ - return SQLITE_CANTOPEN; - } - - f.h = hf; - f.locktype = NO_LOCK; - f.delOnClose = delFlag ? 1 : 0; - f.pathToDel = delFlag ? sqlite3OsFullPathname( zFilename ) : NULL; - OpenCounter( +1 ); - if( delFlag ) DosForceDelete( (PSZ)sqlite3OsFullPathname( zFilename ) ); - OSTRACE3( "OPEN EX %d \"%s\"\n", hf, sqlite3OsFullPathname ( zFilename ) ); - return allocateOs2File( &f, pld ); -} - -/* -** Attempt to open a new file for read-only access. -** -** On success, write the file handle into *id and return SQLITE_OK. -** -** On failure, return SQLITE_CANTOPEN. -*/ -int sqlite3Os2OpenReadOnly( const char *zFilename, OsFile **pld ){ - os2File f; - HFILE hf; - ULONG ulAction; - APIRET rc = NO_ERROR; - - assert( *pld == 0 ); - rc = DosOpen( (PSZ)zFilename, &hf, &ulAction, 0L, - FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS, - OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_RANDOM | - OPEN_SHARE_DENYWRITE | OPEN_ACCESS_READONLY, (PEAOP2)NULL ); - if( rc != NO_ERROR ){ - return SQLITE_CANTOPEN; - } - f.h = hf; - f.locktype = NO_LOCK; - f.delOnClose = 0; - f.pathToDel = NULL; - OpenCounter( +1 ); - OSTRACE3( "OPEN RO %d \"%s\"\n", hf, zFilename ); - return allocateOs2File( &f, pld ); -} - -/* -** Attempt to open a file descriptor for the directory that contains a -** file. This file descriptor can be used to fsync() the directory -** in order to make sure the creation of a new file is actually written -** to disk. -** -** This routine is only meaningful for Unix. It is a no-op under -** OS/2 since OS/2 does not support hard links. -** -** On success, a handle for a previously open file is at *id is -** updated with the new directory file descriptor and SQLITE_OK is -** returned. -** -** On failure, the function returns SQLITE_CANTOPEN and leaves -** *id unchanged. -*/ -int os2OpenDirectory( - OsFile *id, - const char *zDirname -){ - return SQLITE_OK; -} - -/* -** Create a temporary file name in zBuf. zBuf must be big enough to -** hold at least SQLITE_TEMPNAME_SIZE characters. -*/ -int sqlite3Os2TempFileName( char *zBuf ){ - static const unsigned char zChars[] = - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789"; - int i, j; - PSZ zTempPath = 0; - if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){ - if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){ - if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){ - ULONG ulDriveNum = 0, ulDriveMap = 0; - DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap ); - sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) ); - } - } - } - /* strip off a trailing slashes or backslashes, otherwise we would get * - * multiple (back)slashes which causes DosOpen() to fail */ - j = strlen(zTempPath); - while( j > 0 && zTempPath[j-1] == '\\' || zTempPath[j-1] == '/' ){ - j--; - } - zTempPath[j] = '\0'; - for(;;){ - sprintf( zBuf, "%s\\"TEMP_FILE_PREFIX, zTempPath ); - j = strlen( zBuf ); - sqlite3Randomness( 15, &zBuf[j] ); - for( i = 0; i < 15; i++, j++ ){ - zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; - } - zBuf[j] = 0; - if( !sqlite3OsFileExists( zBuf ) ) break; - } - OSTRACE2( "TEMP FILENAME: %s\n", zBuf ); - return SQLITE_OK; -} - -/* -** Close a file. -*/ -int os2Close( OsFile **pld ){ - os2File *pFile; - APIRET rc = NO_ERROR; - if( pld && (pFile = (os2File*)*pld) != 0 ){ - OSTRACE2( "CLOSE %d\n", pFile->h ); - rc = DosClose( pFile->h ); - pFile->locktype = NO_LOCK; - if( pFile->delOnClose != 0 ){ - rc = DosForceDelete( (PSZ)pFile->pathToDel ); - } - *pld = 0; - OpenCounter( -1 ); - } - - return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Read data from a file into a buffer. Return SQLITE_OK if all -** bytes were read successfully and SQLITE_IOERR if anything goes -** wrong. -*/ -int os2Read( OsFile *id, void *pBuf, int amt ){ - ULONG got; - assert( id!=0 ); - SimulateIOError( return SQLITE_IOERR ); - OSTRACE3( "READ %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); - DosRead( ((os2File*)id)->h, pBuf, amt, &got ); - if (got == (ULONG)amt) - return SQLITE_OK; - else if (got == 0) - return SQLITE_IOERR_READ; - else { - memset(&((char*)pBuf)[got], 0, amt-got); - return SQLITE_IOERR_SHORT_READ; - } -} - -/* -** Write data from a buffer into a file. Return SQLITE_OK on success -** or some other error code on failure. -*/ -int os2Write( OsFile *id, const void *pBuf, int amt ){ - APIRET rc = NO_ERROR; - ULONG wrote; - assert( id!=0 ); - SimulateIOError( return SQLITE_IOERR ); - SimulateDiskfullError( return SQLITE_FULL ); - OSTRACE3( "WRITE %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); - while( amt > 0 && - (rc = DosWrite( ((os2File*)id)->h, (PVOID)pBuf, amt, &wrote )) && wrote > 0 ){ - amt -= wrote; - pBuf = &((char*)pBuf)[wrote]; - } - - return ( rc != NO_ERROR || amt > (int)wrote ) ? SQLITE_FULL : SQLITE_OK; -} - -/* -** Move the read/write pointer in a file. -*/ -int os2Seek( OsFile *id, i64 offset ){ - APIRET rc = NO_ERROR; - ULONG filePointer = 0L; - assert( id!=0 ); - rc = DosSetFilePtr( ((os2File*)id)->h, offset, FILE_BEGIN, &filePointer ); - OSTRACE3( "SEEK %d %lld\n", ((os2File*)id)->h, offset ); - return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Make sure all writes to a particular file are committed to disk. -*/ -int os2Sync( OsFile *id, int dataOnly ){ - assert( id!=0 ); - OSTRACE3( "SYNC %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); - return DosResetBuffer( ((os2File*)id)->h ) == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Sync the directory zDirname. This is a no-op on operating systems other -** than UNIX. -*/ -int sqlite3Os2SyncDirectory( const char *zDirname ){ - SimulateIOError( return SQLITE_IOERR ); - return SQLITE_OK; -} - -/* -** Truncate an open file to a specified size -*/ -int os2Truncate( OsFile *id, i64 nByte ){ - APIRET rc = NO_ERROR; - ULONG upperBits = nByte>>32; - assert( id!=0 ); - OSTRACE3( "TRUNCATE %d %lld\n", ((os2File*)id)->h, nByte ); - SimulateIOError( return SQLITE_IOERR ); - rc = DosSetFilePtr( ((os2File*)id)->h, nByte, FILE_BEGIN, &upperBits ); - if( rc != NO_ERROR ){ - return SQLITE_IOERR; - } - rc = DosSetFilePtr( ((os2File*)id)->h, 0L, FILE_END, &upperBits ); - return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Determine the current size of a file in bytes -*/ -int os2FileSize( OsFile *id, i64 *pSize ){ - APIRET rc = NO_ERROR; - FILESTATUS3 fsts3FileInfo; - memset(&fsts3FileInfo, 0, sizeof(fsts3FileInfo)); - assert( id!=0 ); - SimulateIOError( return SQLITE_IOERR ); - rc = DosQueryFileInfo( ((os2File*)id)->h, FIL_STANDARD, &fsts3FileInfo, sizeof(FILESTATUS3) ); - if( rc == NO_ERROR ){ - *pSize = fsts3FileInfo.cbFile; - return SQLITE_OK; - } - else{ - return SQLITE_IOERR; - } -} - -/* -** Acquire a reader lock. -*/ -static int getReadLock( os2File *id ){ - FILELOCK LockArea, - UnlockArea; - memset(&LockArea, 0, sizeof(LockArea)); - memset(&UnlockArea, 0, sizeof(UnlockArea)); - LockArea.lOffset = SHARED_FIRST; - LockArea.lRange = SHARED_SIZE; - UnlockArea.lOffset = 0L; - UnlockArea.lRange = 0L; - return DosSetFileLocks( id->h, &UnlockArea, &LockArea, 2000L, 1L ); -} - -/* -** Undo a readlock -*/ -static int unlockReadLock( os2File *id ){ - FILELOCK LockArea, - UnlockArea; - memset(&LockArea, 0, sizeof(LockArea)); - memset(&UnlockArea, 0, sizeof(UnlockArea)); - LockArea.lOffset = 0L; - LockArea.lRange = 0L; - UnlockArea.lOffset = SHARED_FIRST; - UnlockArea.lRange = SHARED_SIZE; - return DosSetFileLocks( id->h, &UnlockArea, &LockArea, 2000L, 1L ); -} - -#ifndef SQLITE_OMIT_PAGER_PRAGMAS -/* -** Check that a given pathname is a directory and is writable -** -*/ -int sqlite3Os2IsDirWritable( char *zDirname ){ - FILESTATUS3 fsts3ConfigInfo; - APIRET rc = NO_ERROR; - memset(&fsts3ConfigInfo, 0, sizeof(fsts3ConfigInfo)); - if( zDirname==0 ) return 0; - if( strlen(zDirname)>CCHMAXPATH ) return 0; - rc = DosQueryPathInfo( (PSZ)zDirname, FIL_STANDARD, &fsts3ConfigInfo, sizeof(FILESTATUS3) ); - if( rc != NO_ERROR ) return 0; - if( (fsts3ConfigInfo.attrFile & FILE_DIRECTORY) != FILE_DIRECTORY ) return 0; - - return 1; -} -#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ - -/* -** Lock the file with the lock specified by parameter locktype - one -** of the following: -** -** (1) SHARED_LOCK -** (2) RESERVED_LOCK -** (3) PENDING_LOCK -** (4) EXCLUSIVE_LOCK -** -** Sometimes when requesting one lock state, additional lock states -** are inserted in between. The locking might fail on one of the later -** transitions leaving the lock state different from what it started but -** still short of its goal. The following chart shows the allowed -** transitions and the inserted intermediate states: -** -** UNLOCKED -> SHARED -** SHARED -> RESERVED -** SHARED -> (PENDING) -> EXCLUSIVE -** RESERVED -> (PENDING) -> EXCLUSIVE -** PENDING -> EXCLUSIVE -** -** This routine will only increase a lock. The os2Unlock() routine -** erases all locks at once and returns us immediately to locking level 0. -** It is not possible to lower the locking level one step at a time. You -** must go straight to locking level 0. -*/ -int os2Lock( OsFile *id, int locktype ){ - APIRET rc = SQLITE_OK; /* Return code from subroutines */ - APIRET res = NO_ERROR; /* Result of an OS/2 lock call */ - int newLocktype; /* Set id->locktype to this value before exiting */ - int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ - FILELOCK LockArea, - UnlockArea; - os2File *pFile = (os2File*)id; - memset(&LockArea, 0, sizeof(LockArea)); - memset(&UnlockArea, 0, sizeof(UnlockArea)); - assert( pFile!=0 ); - OSTRACE4( "LOCK %d %d was %d\n", pFile->h, locktype, pFile->locktype ); - - /* If there is already a lock of this type or more restrictive on the - ** OsFile, do nothing. Don't use the end_lock: exit path, as - ** sqlite3OsEnterMutex() hasn't been called yet. - */ - if( pFile->locktype>=locktype ){ - return SQLITE_OK; - } - - /* Make sure the locking sequence is correct - */ - assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); - assert( locktype!=PENDING_LOCK ); - assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); - - /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or - ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of - ** the PENDING_LOCK byte is temporary. - */ - newLocktype = pFile->locktype; - if( pFile->locktype==NO_LOCK - || (locktype==EXCLUSIVE_LOCK && pFile->locktype==RESERVED_LOCK) - ){ - int cnt = 3; - - LockArea.lOffset = PENDING_BYTE; - LockArea.lRange = 1L; - UnlockArea.lOffset = 0L; - UnlockArea.lRange = 0L; - - while( cnt-->0 && (res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L) )!=NO_ERROR ){ - /* Try 3 times to get the pending lock. The pending lock might be - ** held by another reader process who will release it momentarily. - */ - OSTRACE2( "could not get a PENDING lock. cnt=%d\n", cnt ); - DosSleep(1); - } - gotPendingLock = res; - } - - /* Acquire a shared lock - */ - if( locktype==SHARED_LOCK && res ){ - assert( pFile->locktype==NO_LOCK ); - res = getReadLock(pFile); - if( res == NO_ERROR ){ - newLocktype = SHARED_LOCK; - } - } - - /* Acquire a RESERVED lock - */ - if( locktype==RESERVED_LOCK && res ){ - assert( pFile->locktype==SHARED_LOCK ); - LockArea.lOffset = RESERVED_BYTE; - LockArea.lRange = 1L; - UnlockArea.lOffset = 0L; - UnlockArea.lRange = 0L; - res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - if( res == NO_ERROR ){ - newLocktype = RESERVED_LOCK; - } - } - - /* Acquire a PENDING lock - */ - if( locktype==EXCLUSIVE_LOCK && res ){ - newLocktype = PENDING_LOCK; - gotPendingLock = 0; - } - - /* Acquire an EXCLUSIVE lock - */ - if( locktype==EXCLUSIVE_LOCK && res ){ - assert( pFile->locktype>=SHARED_LOCK ); - res = unlockReadLock(pFile); - OSTRACE2( "unreadlock = %d\n", res ); - LockArea.lOffset = SHARED_FIRST; - LockArea.lRange = SHARED_SIZE; - UnlockArea.lOffset = 0L; - UnlockArea.lRange = 0L; - res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - if( res == NO_ERROR ){ - newLocktype = EXCLUSIVE_LOCK; - }else{ - OSTRACE2( "error-code = %d\n", res ); - } - } - - /* If we are holding a PENDING lock that ought to be released, then - ** release it now. - */ - if( gotPendingLock && locktype==SHARED_LOCK ){ - LockArea.lOffset = 0L; - LockArea.lRange = 0L; - UnlockArea.lOffset = PENDING_BYTE; - UnlockArea.lRange = 1L; - DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - } - - /* Update the state of the lock has held in the file descriptor then - ** return the appropriate result code. - */ - if( res == NO_ERROR ){ - rc = SQLITE_OK; - }else{ - OSTRACE4( "LOCK FAILED %d trying for %d but got %d\n", pFile->h, - locktype, newLocktype ); - rc = SQLITE_BUSY; - } - pFile->locktype = newLocktype; - return rc; -} - -/* -** This routine checks if there is a RESERVED lock held on the specified -** file by this or any other process. If such a lock is held, return -** non-zero, otherwise zero. -*/ -int os2CheckReservedLock( OsFile *id ){ - APIRET rc = NO_ERROR; - os2File *pFile = (os2File*)id; - assert( pFile!=0 ); - if( pFile->locktype>=RESERVED_LOCK ){ - rc = 1; - OSTRACE3( "TEST WR-LOCK %d %d (local)\n", pFile->h, rc ); - }else{ - FILELOCK LockArea, - UnlockArea; - memset(&LockArea, 0, sizeof(LockArea)); - memset(&UnlockArea, 0, sizeof(UnlockArea)); - LockArea.lOffset = RESERVED_BYTE; - LockArea.lRange = 1L; - UnlockArea.lOffset = 0L; - UnlockArea.lRange = 0L; - rc = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - if( rc == NO_ERROR ){ - LockArea.lOffset = 0L; - LockArea.lRange = 0L; - UnlockArea.lOffset = RESERVED_BYTE; - UnlockArea.lRange = 1L; - rc = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - } - OSTRACE3( "TEST WR-LOCK %d %d (remote)\n", pFile->h, rc ); - } - return rc; -} - -/* -** Lower the locking level on file descriptor id to locktype. locktype -** must be either NO_LOCK or SHARED_LOCK. -** -** If the locking level of the file descriptor is already at or below -** the requested locking level, this routine is a no-op. -** -** It is not possible for this routine to fail if the second argument -** is NO_LOCK. If the second argument is SHARED_LOCK then this routine -** might return SQLITE_IOERR; -*/ -int os2Unlock( OsFile *id, int locktype ){ - int type; - APIRET rc = SQLITE_OK; - os2File *pFile = (os2File*)id; - FILELOCK LockArea, - UnlockArea; - memset(&LockArea, 0, sizeof(LockArea)); - memset(&UnlockArea, 0, sizeof(UnlockArea)); - assert( pFile!=0 ); - assert( locktype<=SHARED_LOCK ); - OSTRACE4( "UNLOCK %d to %d was %d\n", pFile->h, locktype, pFile->locktype ); - type = pFile->locktype; - if( type>=EXCLUSIVE_LOCK ){ - LockArea.lOffset = 0L; - LockArea.lRange = 0L; - UnlockArea.lOffset = SHARED_FIRST; - UnlockArea.lRange = SHARED_SIZE; - DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - if( locktype==SHARED_LOCK && getReadLock(pFile) != NO_ERROR ){ - /* This should never happen. We should always be able to - ** reacquire the read lock */ - rc = SQLITE_IOERR; - } - } - if( type>=RESERVED_LOCK ){ - LockArea.lOffset = 0L; - LockArea.lRange = 0L; - UnlockArea.lOffset = RESERVED_BYTE; - UnlockArea.lRange = 1L; - DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - } - if( locktype==NO_LOCK && type>=SHARED_LOCK ){ - unlockReadLock(pFile); - } - if( type>=PENDING_LOCK ){ - LockArea.lOffset = 0L; - LockArea.lRange = 0L; - UnlockArea.lOffset = PENDING_BYTE; - UnlockArea.lRange = 1L; - DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, 2000L, 1L ); - } - pFile->locktype = locktype; - return rc; -} - -/* -** Turn a relative pathname into a full pathname. Return a pointer -** to the full pathname stored in space obtained from sqliteMalloc(). -** The calling function is responsible for freeing this space once it -** is no longer needed. -*/ -char *sqlite3Os2FullPathname( const char *zRelative ){ - char *zFull = 0; - if( strchr(zRelative, ':') ){ - sqlite3SetString( &zFull, zRelative, (char*)0 ); - }else{ - ULONG ulDriveNum = 0; - ULONG ulDriveMap = 0; - ULONG cbzBufLen = SQLITE_TEMPNAME_SIZE; - char zDrive[2]; - char *zBuff; - - zBuff = sqliteMalloc( cbzBufLen ); - if( zBuff != 0 ){ - DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap ); - if( DosQueryCurrentDir( ulDriveNum, (PBYTE)zBuff, &cbzBufLen ) == NO_ERROR ){ - sprintf( zDrive, "%c", (char)('A' + ulDriveNum - 1) ); - sqlite3SetString( &zFull, zDrive, ":\\", zBuff, - "\\", zRelative, (char*)0 ); - } - sqliteFree( zBuff ); - } - } - return zFull; -} - -/* -** The fullSync option is meaningless on os2, or correct me if I'm wrong. This is a no-op. -** From os_unix.c: Change the value of the fullsync flag in the given file descriptor. -** From os_unix.c: ((unixFile*)id)->fullSync = v; -*/ -static void os2SetFullSync( OsFile *id, int v ){ - return; -} - -/* -** Return the underlying file handle for an OsFile -*/ -static int os2FileHandle( OsFile *id ){ - return (int)((os2File*)id)->h; -} - -/* -** Return an integer that indices the type of lock currently held -** by this handle. (Used for testing and analysis only.) -*/ -static int os2LockState( OsFile *id ){ - return ((os2File*)id)->locktype; -} - -/* -** Return the sector size in bytes of the underlying block device for -** the specified file. This is almost always 512 bytes, but may be -** larger for some devices. -** -** SQLite code assumes this function cannot fail. It also assumes that -** if two files are created in the same file-system directory (i.e. -** a database and it's journal file) that the sector size will be the -** same for both. -*/ -static int os2SectorSize(OsFile *id){ - return SQLITE_DEFAULT_SECTOR_SIZE; -} - -/* -** This vector defines all the methods that can operate on an OsFile -** for os2. -*/ -static const IoMethod sqlite3Os2IoMethod = { - os2Close, - os2OpenDirectory, - os2Read, - os2Write, - os2Seek, - os2Truncate, - os2Sync, - os2SetFullSync, - os2FileHandle, - os2FileSize, - os2Lock, - os2Unlock, - os2LockState, - os2CheckReservedLock, - os2SectorSize, -}; - -/* -** Allocate memory for an OsFile. Initialize the new OsFile -** to the value given in pInit and return a pointer to the new -** OsFile. If we run out of memory, close the file and return NULL. -*/ -int allocateOs2File( os2File *pInit, OsFile **pld ){ - os2File *pNew; - pNew = sqliteMalloc( sizeof(*pNew) ); - if( pNew==0 ){ - DosClose( pInit->h ); - *pld = 0; - return SQLITE_NOMEM; - }else{ - *pNew = *pInit; - pNew->pMethod = &sqlite3Os2IoMethod; - pNew->locktype = NO_LOCK; - *pld = (OsFile*)pNew; - OpenCounter(+1); - return SQLITE_OK; - } -} - -#endif /* SQLITE_OMIT_DISKIO */ -/*************************************************************************** -** Everything above deals with file I/O. Everything that follows deals -** with other miscellanous aspects of the operating system interface -****************************************************************************/ - -#ifndef SQLITE_OMIT_LOAD_EXTENSION -/* -** Interfaces for opening a shared library, finding entry points -** within the shared library, and closing the shared library. -*/ -void *sqlite3Os2Dlopen(const char *zFilename){ - UCHAR loadErr[256]; - HMODULE hmod; - APIRET rc; - rc = DosLoadModule((PSZ)loadErr, sizeof(loadErr), zFilename, &hmod); - if (rc != NO_ERROR) return 0; - return (void*)hmod; -} -void *sqlite3Os2Dlsym(void *pHandle, const char *zSymbol){ - PFN pfn; - APIRET rc; - rc = DosQueryProcAddr((HMODULE)pHandle, 0L, zSymbol, &pfn); - if (rc != NO_ERROR) { - /* if the symbol itself was not found, search again for the same - * symbol with an extra underscore, that might be needed depending - * on the calling convention */ - char _zSymbol[256] = "_"; - strncat(_zSymbol, zSymbol, 255); - rc = DosQueryProcAddr((HMODULE)pHandle, 0L, _zSymbol, &pfn); - } - if (rc != NO_ERROR) return 0; - return (void *)pfn; -} -int sqlite3Os2Dlclose(void *pHandle){ - return DosFreeModule((HMODULE)pHandle); -} -#endif /* SQLITE_OMIT_LOAD_EXTENSION */ - - -/* -** Get information to seed the random number generator. The seed -** is written into the buffer zBuf[256]. The calling function must -** supply a sufficiently large buffer. -*/ -int sqlite3Os2RandomSeed( char *zBuf ){ - /* We have to initialize zBuf to prevent valgrind from reporting - ** errors. The reports issued by valgrind are incorrect - we would - ** prefer that the randomness be increased by making use of the - ** uninitialized space in zBuf - but valgrind errors tend to worry - ** some users. Rather than argue, it seems easier just to initialize - ** the whole array and silence valgrind, even if that means less randomness - ** in the random seed. - ** - ** When testing, initializing zBuf[] to zero is all we do. That means - ** that we always use the same random number sequence. This makes the - ** tests repeatable. - */ - memset( zBuf, 0, 256 ); - DosGetDateTime( (PDATETIME)zBuf ); - return SQLITE_OK; -} - -/* -** Sleep for a little while. Return the amount of time slept. -*/ -int sqlite3Os2Sleep( int ms ){ - DosSleep( ms ); - return ms; -} - -/* -** Static variables used for thread synchronization -*/ -static int inMutex = 0; -#ifdef SQLITE_OS2_THREADS -static ULONG mutexOwner; -#endif - -/* -** The following pair of routines implement mutual exclusion for -** multi-threaded processes. Only a single thread is allowed to -** executed code that is surrounded by EnterMutex() and LeaveMutex(). -** -** SQLite uses only a single Mutex. There is not much critical -** code and what little there is executes quickly and without blocking. -*/ -void sqlite3Os2EnterMutex(){ -#ifdef SQLITE_OS2_THREADS - PTIB ptib; - DosEnterCritSec(); - DosGetInfoBlocks( &ptib, NULL ); - mutexOwner = ptib->tib_ptib2->tib2_ultid; -#endif - assert( !inMutex ); - inMutex = 1; -} -void sqlite3Os2LeaveMutex(){ -#ifdef SQLITE_OS2_THREADS - PTIB ptib; -#endif - assert( inMutex ); - inMutex = 0; -#ifdef SQLITE_OS2_THREADS - DosGetInfoBlocks( &ptib, NULL ); - assert( mutexOwner == ptib->tib_ptib2->tib2_ultid ); - DosExitCritSec(); -#endif -} - -/* -** Return TRUE if the mutex is currently held. -** -** If the thisThreadOnly parameter is true, return true if and only if the -** calling thread holds the mutex. If the parameter is false, return -** true if any thread holds the mutex. -*/ -int sqlite3Os2InMutex( int thisThreadOnly ){ -#ifdef SQLITE_OS2_THREADS - PTIB ptib; - DosGetInfoBlocks( &ptib, NULL ); - return inMutex>0 && (thisThreadOnly==0 || mutexOwner==ptib->tib_ptib2->tib2_ultid); -#else - return inMutex>0; -#endif -} - -/* -** The following variable, if set to a non-zero value, becomes the result -** returned from sqlite3OsCurrentTime(). This is used for testing. -*/ -#ifdef SQLITE_TEST -int sqlite3_current_time = 0; -#endif - -/* -** Find the current time (in Universal Coordinated Time). Write the -** current time and date as a Julian Day number into *prNow and -** return 0. Return 1 if the time and date cannot be found. -*/ -int sqlite3Os2CurrentTime( double *prNow ){ - double now; - USHORT second, minute, hour, - day, month, year; - DATETIME dt; - DosGetDateTime( &dt ); - second = (USHORT)dt.seconds; - minute = (USHORT)dt.minutes + dt.timezone; - hour = (USHORT)dt.hours; - day = (USHORT)dt.day; - month = (USHORT)dt.month; - year = (USHORT)dt.year; - - /* Calculations from http://www.astro.keele.ac.uk/~rno/Astronomy/hjd.html - http://www.astro.keele.ac.uk/~rno/Astronomy/hjd-0.1.c */ - /* Calculate the Julian days */ - now = day - 32076 + - 1461*(year + 4800 + (month - 14)/12)/4 + - 367*(month - 2 - (month - 14)/12*12)/12 - - 3*((year + 4900 + (month - 14)/12)/100)/4; - - /* Add the fractional hours, mins and seconds */ - now += (hour + 12.0)/24.0; - now += minute/1440.0; - now += second/86400.0; - *prNow = now; -#ifdef SQLITE_TEST - if( sqlite3_current_time ){ - *prNow = sqlite3_current_time/86400.0 + 2440587.5; - } -#endif - return 0; -} - -/* -** Remember the number of thread-specific-data blocks allocated. -** Use this to verify that we are not leaking thread-specific-data. -** Ticket #1601 -*/ -#ifdef SQLITE_TEST -int sqlite3_tsd_count = 0; -# define TSD_COUNTER_INCR InterlockedIncrement( &sqlite3_tsd_count ) -# define TSD_COUNTER_DECR InterlockedDecrement( &sqlite3_tsd_count ) -#else -# define TSD_COUNTER_INCR /* no-op */ -# define TSD_COUNTER_DECR /* no-op */ -#endif - -/* -** If called with allocateFlag>1, then return a pointer to thread -** specific data for the current thread. Allocate and zero the -** thread-specific data if it does not already exist necessary. -** -** If called with allocateFlag==0, then check the current thread -** specific data. Return it if it exists. If it does not exist, -** then return NULL. -** -** If called with allocateFlag<0, check to see if the thread specific -** data is allocated and is all zero. If it is then deallocate it. -** Return a pointer to the thread specific data or NULL if it is -** unallocated or gets deallocated. -*/ -ThreadData *sqlite3Os2ThreadSpecificData( int allocateFlag ){ - static ThreadData **s_ppTsd = NULL; - static const ThreadData zeroData = {0, 0, 0}; - ThreadData *pTsd; - - if( !s_ppTsd ){ - sqlite3OsEnterMutex(); - if( !s_ppTsd ){ - PULONG pul; - APIRET rc = DosAllocThreadLocalMemory(1, &pul); - if( rc != NO_ERROR ){ - sqlite3OsLeaveMutex(); - return 0; - } - s_ppTsd = (ThreadData **)pul; - } - sqlite3OsLeaveMutex(); - } - pTsd = *s_ppTsd; - if( allocateFlag>0 ){ - if( !pTsd ){ - pTsd = sqlite3OsMalloc( sizeof(zeroData) ); - if( pTsd ){ - *pTsd = zeroData; - *s_ppTsd = pTsd; - TSD_COUNTER_INCR; - } - } - }else if( pTsd!=0 && allocateFlag<0 - && memcmp( pTsd, &zeroData, sizeof(ThreadData) )==0 ){ - sqlite3OsFree(pTsd); - *s_ppTsd = NULL; - TSD_COUNTER_DECR; - pTsd = 0; - } - return pTsd; -} -#endif /* OS_OS2 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c deleted file mode 100644 index e95435e74b..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/os_unix.c +++ /dev/null @@ -1,2749 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains code that is specific to Unix systems. -*/ -#include "sqliteInt.h" -#if OS_UNIX /* This file is used on unix only */ - -/* #define SQLITE_ENABLE_LOCKING_STYLE 0 */ - -/* -** These #defines should enable >2GB file support on Posix if the -** underlying operating system supports it. If the OS lacks -** large file support, these should be no-ops. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: RedHat 7.2) but you want your code to work -** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in RedHat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - -/* -** standard include files. -*/ -#include -#include -#include -#include -#include -#include -#include -#ifdef SQLITE_ENABLE_LOCKING_STYLE -#include -#include -#include -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - -/* -** If we are to be thread-safe, include the pthreads header and define -** the SQLITE_UNIX_THREADS macro. -*/ -#if SQLITE_THREADSAFE -# include -# define SQLITE_UNIX_THREADS 1 -#endif - -/* -** Default permissions when creating a new file -*/ -#ifndef SQLITE_DEFAULT_FILE_PERMISSIONS -# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 -#endif - -/* -** Maximum supported path-length. -*/ -#define MAX_PATHNAME 512 - - -/* -** The unixFile structure is subclass of sqlite3_file specific for the unix -** protability layer. -*/ -typedef struct unixFile unixFile; -struct unixFile { - sqlite3_io_methods const *pMethod; /* Always the first entry */ -#ifdef SQLITE_TEST - /* In test mode, increase the size of this structure a bit so that - ** it is larger than the struct CrashFile defined in test6.c. - */ - char aPadding[32]; -#endif - struct openCnt *pOpen; /* Info about all open fd's on this inode */ - struct lockInfo *pLock; /* Info about locks on this inode */ -#ifdef SQLITE_ENABLE_LOCKING_STYLE - void *lockingContext; /* Locking style specific state */ -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - int h; /* The file descriptor */ - unsigned char locktype; /* The type of lock held on this fd */ - int dirfd; /* File descriptor for the directory */ -#if SQLITE_THREADSAFE - pthread_t tid; /* The thread that "owns" this unixFile */ -#endif -}; - -/* -** Include code that is common to all os_*.c files -*/ -#include "os_common.h" - -/* -** Define various macros that are missing from some systems. -*/ -#ifndef O_LARGEFILE -# define O_LARGEFILE 0 -#endif -#ifdef SQLITE_DISABLE_LFS -# undef O_LARGEFILE -# define O_LARGEFILE 0 -#endif -#ifndef O_NOFOLLOW -# define O_NOFOLLOW 0 -#endif -#ifndef O_BINARY -# define O_BINARY 0 -#endif - -/* -** The DJGPP compiler environment looks mostly like Unix, but it -** lacks the fcntl() system call. So redefine fcntl() to be something -** that always succeeds. This means that locking does not occur under -** DJGPP. But it's DOS - what did you expect? -*/ -#ifdef __DJGPP__ -# define fcntl(A,B,C) 0 -#endif - -/* -** The threadid macro resolves to the thread-id or to 0. Used for -** testing and debugging only. -*/ -#if SQLITE_THREADSAFE -#define threadid pthread_self() -#else -#define threadid 0 -#endif - -/* -** Set or check the unixFile.tid field. This field is set when an unixFile -** is first opened. All subsequent uses of the unixFile verify that the -** same thread is operating on the unixFile. Some operating systems do -** not allow locks to be overridden by other threads and that restriction -** means that sqlite3* database handles cannot be moved from one thread -** to another. This logic makes sure a user does not try to do that -** by mistake. -** -** Version 3.3.1 (2006-01-15): unixFile can be moved from one thread to -** another as long as we are running on a system that supports threads -** overriding each others locks (which now the most common behavior) -** or if no locks are held. But the unixFile.pLock field needs to be -** recomputed because its key includes the thread-id. See the -** transferOwnership() function below for additional information -*/ -#if SQLITE_THREADSAFE -# define SET_THREADID(X) (X)->tid = pthread_self() -# define CHECK_THREADID(X) (threadsOverrideEachOthersLocks==0 && \ - !pthread_equal((X)->tid, pthread_self())) -#else -# define SET_THREADID(X) -# define CHECK_THREADID(X) 0 -#endif - -/* -** Here is the dirt on POSIX advisory locks: ANSI STD 1003.1 (1996) -** section 6.5.2.2 lines 483 through 490 specify that when a process -** sets or clears a lock, that operation overrides any prior locks set -** by the same process. It does not explicitly say so, but this implies -** that it overrides locks set by the same process using a different -** file descriptor. Consider this test case: -** -** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644); -** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644); -** -** Suppose ./file1 and ./file2 are really the same file (because -** one is a hard or symbolic link to the other) then if you set -** an exclusive lock on fd1, then try to get an exclusive lock -** on fd2, it works. I would have expected the second lock to -** fail since there was already a lock on the file due to fd1. -** But not so. Since both locks came from the same process, the -** second overrides the first, even though they were on different -** file descriptors opened on different file names. -** -** Bummer. If you ask me, this is broken. Badly broken. It means -** that we cannot use POSIX locks to synchronize file access among -** competing threads of the same process. POSIX locks will work fine -** to synchronize access for threads in separate processes, but not -** threads within the same process. -** -** To work around the problem, SQLite has to manage file locks internally -** on its own. Whenever a new database is opened, we have to find the -** specific inode of the database file (the inode is determined by the -** st_dev and st_ino fields of the stat structure that fstat() fills in) -** and check for locks already existing on that inode. When locks are -** created or removed, we have to look at our own internal record of the -** locks to see if another thread has previously set a lock on that same -** inode. -** -** The sqlite3_file structure for POSIX is no longer just an integer file -** descriptor. It is now a structure that holds the integer file -** descriptor and a pointer to a structure that describes the internal -** locks on the corresponding inode. There is one locking structure -** per inode, so if the same inode is opened twice, both unixFile structures -** point to the same locking structure. The locking structure keeps -** a reference count (so we will know when to delete it) and a "cnt" -** field that tells us its internal lock status. cnt==0 means the -** file is unlocked. cnt==-1 means the file has an exclusive lock. -** cnt>0 means there are cnt shared locks on the file. -** -** Any attempt to lock or unlock a file first checks the locking -** structure. The fcntl() system call is only invoked to set a -** POSIX lock if the internal lock structure transitions between -** a locked and an unlocked state. -** -** 2004-Jan-11: -** More recent discoveries about POSIX advisory locks. (The more -** I discover, the more I realize the a POSIX advisory locks are -** an abomination.) -** -** If you close a file descriptor that points to a file that has locks, -** all locks on that file that are owned by the current process are -** released. To work around this problem, each unixFile structure contains -** a pointer to an openCnt structure. There is one openCnt structure -** per open inode, which means that multiple unixFile can point to a single -** openCnt. When an attempt is made to close an unixFile, if there are -** other unixFile open on the same inode that are holding locks, the call -** to close() the file descriptor is deferred until all of the locks clear. -** The openCnt structure keeps a list of file descriptors that need to -** be closed and that list is walked (and cleared) when the last lock -** clears. -** -** First, under Linux threads, because each thread has a separate -** process ID, lock operations in one thread do not override locks -** to the same file in other threads. Linux threads behave like -** separate processes in this respect. But, if you close a file -** descriptor in linux threads, all locks are cleared, even locks -** on other threads and even though the other threads have different -** process IDs. Linux threads is inconsistent in this respect. -** (I'm beginning to think that linux threads is an abomination too.) -** The consequence of this all is that the hash table for the lockInfo -** structure has to include the process id as part of its key because -** locks in different threads are treated as distinct. But the -** openCnt structure should not include the process id in its -** key because close() clears lock on all threads, not just the current -** thread. Were it not for this goofiness in linux threads, we could -** combine the lockInfo and openCnt structures into a single structure. -** -** 2004-Jun-28: -** On some versions of linux, threads can override each others locks. -** On others not. Sometimes you can change the behavior on the same -** system by setting the LD_ASSUME_KERNEL environment variable. The -** POSIX standard is silent as to which behavior is correct, as far -** as I can tell, so other versions of unix might show the same -** inconsistency. There is no little doubt in my mind that posix -** advisory locks and linux threads are profoundly broken. -** -** To work around the inconsistencies, we have to test at runtime -** whether or not threads can override each others locks. This test -** is run once, the first time any lock is attempted. A static -** variable is set to record the results of this test for future -** use. -*/ - -/* -** An instance of the following structure serves as the key used -** to locate a particular lockInfo structure given its inode. -** -** If threads cannot override each others locks, then we set the -** lockKey.tid field to the thread ID. If threads can override -** each others locks then tid is always set to zero. tid is omitted -** if we compile without threading support. -*/ -struct lockKey { - dev_t dev; /* Device number */ - ino_t ino; /* Inode number */ -#if SQLITE_THREADSAFE - pthread_t tid; /* Thread ID or zero if threads can override each other */ -#endif -}; - -/* -** An instance of the following structure is allocated for each open -** inode on each thread with a different process ID. (Threads have -** different process IDs on linux, but not on most other unixes.) -** -** A single inode can have multiple file descriptors, so each unixFile -** structure contains a pointer to an instance of this object and this -** object keeps a count of the number of unixFile pointing to it. -*/ -struct lockInfo { - struct lockKey key; /* The lookup key */ - int cnt; /* Number of SHARED locks held */ - int locktype; /* One of SHARED_LOCK, RESERVED_LOCK etc. */ - int nRef; /* Number of pointers to this structure */ -}; - -/* -** An instance of the following structure serves as the key used -** to locate a particular openCnt structure given its inode. This -** is the same as the lockKey except that the thread ID is omitted. -*/ -struct openKey { - dev_t dev; /* Device number */ - ino_t ino; /* Inode number */ -}; - -/* -** An instance of the following structure is allocated for each open -** inode. This structure keeps track of the number of locks on that -** inode. If a close is attempted against an inode that is holding -** locks, the close is deferred until all locks clear by adding the -** file descriptor to be closed to the pending list. -*/ -struct openCnt { - struct openKey key; /* The lookup key */ - int nRef; /* Number of pointers to this structure */ - int nLock; /* Number of outstanding locks */ - int nPending; /* Number of pending close() operations */ - int *aPending; /* Malloced space holding fd's awaiting a close() */ -}; - -/* -** These hash tables map inodes and file descriptors (really, lockKey and -** openKey structures) into lockInfo and openCnt structures. Access to -** these hash tables must be protected by a mutex. -*/ -static Hash lockHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0}; -static Hash openHash = {SQLITE_HASH_BINARY, 0, 0, 0, 0, 0}; - -#ifdef SQLITE_ENABLE_LOCKING_STYLE -/* -** The locking styles are associated with the different file locking -** capabilities supported by different file systems. -** -** POSIX locking style fully supports shared and exclusive byte-range locks -** ADP locking only supports exclusive byte-range locks -** FLOCK only supports a single file-global exclusive lock -** DOTLOCK isn't a true locking style, it refers to the use of a special -** file named the same as the database file with a '.lock' extension, this -** can be used on file systems that do not offer any reliable file locking -** NO locking means that no locking will be attempted, this is only used for -** read-only file systems currently -** UNSUPPORTED means that no locking will be attempted, this is only used for -** file systems that are known to be unsupported -*/ -typedef enum { - posixLockingStyle = 0, /* standard posix-advisory locks */ - afpLockingStyle, /* use afp locks */ - flockLockingStyle, /* use flock() */ - dotlockLockingStyle, /* use .lock files */ - noLockingStyle, /* useful for read-only file system */ - unsupportedLockingStyle /* indicates unsupported file system */ -} sqlite3LockingStyle; -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - -/* -** Helper functions to obtain and relinquish the global mutex. -*/ -static void enterMutex(){ - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); -} -static void leaveMutex(){ - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER)); -} - -#if SQLITE_THREADSAFE -/* -** This variable records whether or not threads can override each others -** locks. -** -** 0: No. Threads cannot override each others locks. -** 1: Yes. Threads can override each others locks. -** -1: We don't know yet. -** -** On some systems, we know at compile-time if threads can override each -** others locks. On those systems, the SQLITE_THREAD_OVERRIDE_LOCK macro -** will be set appropriately. On other systems, we have to check at -** runtime. On these latter systems, SQLTIE_THREAD_OVERRIDE_LOCK is -** undefined. -** -** This variable normally has file scope only. But during testing, we make -** it a global so that the test code can change its value in order to verify -** that the right stuff happens in either case. -*/ -#ifndef SQLITE_THREAD_OVERRIDE_LOCK -# define SQLITE_THREAD_OVERRIDE_LOCK -1 -#endif -#ifdef SQLITE_TEST -int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK; -#else -static int threadsOverrideEachOthersLocks = SQLITE_THREAD_OVERRIDE_LOCK; -#endif - -/* -** This structure holds information passed into individual test -** threads by the testThreadLockingBehavior() routine. -*/ -struct threadTestData { - int fd; /* File to be locked */ - struct flock lock; /* The locking operation */ - int result; /* Result of the locking operation */ -}; - -#ifdef SQLITE_LOCK_TRACE -/* -** Print out information about all locking operations. -** -** This routine is used for troubleshooting locks on multithreaded -** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE -** command-line option on the compiler. This code is normally -** turned off. -*/ -static int lockTrace(int fd, int op, struct flock *p){ - char *zOpName, *zType; - int s; - int savedErrno; - if( op==F_GETLK ){ - zOpName = "GETLK"; - }else if( op==F_SETLK ){ - zOpName = "SETLK"; - }else{ - s = fcntl(fd, op, p); - sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s); - return s; - } - if( p->l_type==F_RDLCK ){ - zType = "RDLCK"; - }else if( p->l_type==F_WRLCK ){ - zType = "WRLCK"; - }else if( p->l_type==F_UNLCK ){ - zType = "UNLCK"; - }else{ - assert( 0 ); - } - assert( p->l_whence==SEEK_SET ); - s = fcntl(fd, op, p); - savedErrno = errno; - sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n", - threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len, - (int)p->l_pid, s); - if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){ - struct flock l2; - l2 = *p; - fcntl(fd, F_GETLK, &l2); - if( l2.l_type==F_RDLCK ){ - zType = "RDLCK"; - }else if( l2.l_type==F_WRLCK ){ - zType = "WRLCK"; - }else if( l2.l_type==F_UNLCK ){ - zType = "UNLCK"; - }else{ - assert( 0 ); - } - sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n", - zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid); - } - errno = savedErrno; - return s; -} -#define fcntl lockTrace -#endif /* SQLITE_LOCK_TRACE */ - -/* -** The testThreadLockingBehavior() routine launches two separate -** threads on this routine. This routine attempts to lock a file -** descriptor then returns. The success or failure of that attempt -** allows the testThreadLockingBehavior() procedure to determine -** whether or not threads can override each others locks. -*/ -static void *threadLockingTest(void *pArg){ - struct threadTestData *pData = (struct threadTestData*)pArg; - pData->result = fcntl(pData->fd, F_SETLK, &pData->lock); - return pArg; -} - -/* -** This procedure attempts to determine whether or not threads -** can override each others locks then sets the -** threadsOverrideEachOthersLocks variable appropriately. -*/ -static void testThreadLockingBehavior(int fd_orig){ - int fd; - struct threadTestData d[2]; - pthread_t t[2]; - - fd = dup(fd_orig); - if( fd<0 ) return; - memset(d, 0, sizeof(d)); - d[0].fd = fd; - d[0].lock.l_type = F_RDLCK; - d[0].lock.l_len = 1; - d[0].lock.l_start = 0; - d[0].lock.l_whence = SEEK_SET; - d[1] = d[0]; - d[1].lock.l_type = F_WRLCK; - pthread_create(&t[0], 0, threadLockingTest, &d[0]); - pthread_create(&t[1], 0, threadLockingTest, &d[1]); - pthread_join(t[0], 0); - pthread_join(t[1], 0); - close(fd); - threadsOverrideEachOthersLocks = d[0].result==0 && d[1].result==0; -} -#endif /* SQLITE_THREADSAFE */ - -/* -** Release a lockInfo structure previously allocated by findLockInfo(). -*/ -static void releaseLockInfo(struct lockInfo *pLock){ - if (pLock == NULL) - return; - pLock->nRef--; - if( pLock->nRef==0 ){ - sqlite3HashInsert(&lockHash, &pLock->key, sizeof(pLock->key), 0); - sqlite3_free(pLock); - } -} - -/* -** Release a openCnt structure previously allocated by findLockInfo(). -*/ -static void releaseOpenCnt(struct openCnt *pOpen){ - if (pOpen == NULL) - return; - pOpen->nRef--; - if( pOpen->nRef==0 ){ - sqlite3HashInsert(&openHash, &pOpen->key, sizeof(pOpen->key), 0); - free(pOpen->aPending); - sqlite3_free(pOpen); - } -} - -#ifdef SQLITE_ENABLE_LOCKING_STYLE -/* -** Tests a byte-range locking query to see if byte range locks are -** supported, if not we fall back to dotlockLockingStyle. -*/ -static sqlite3LockingStyle sqlite3TestLockingStyle( - const char *filePath, - int fd -){ - /* test byte-range lock using fcntl */ - struct flock lockInfo; - - lockInfo.l_len = 1; - lockInfo.l_start = 0; - lockInfo.l_whence = SEEK_SET; - lockInfo.l_type = F_RDLCK; - - if( fcntl(fd, F_GETLK, &lockInfo)!=-1 ) { - return posixLockingStyle; - } - - /* testing for flock can give false positives. So if if the above test - ** fails, then we fall back to using dot-lock style locking. - */ - return dotlockLockingStyle; -} - -/* -** Examines the f_fstypename entry in the statfs structure as returned by -** stat() for the file system hosting the database file, assigns the -** appropriate locking style based on it's value. These values and -** assignments are based on Darwin/OSX behavior and have not been tested on -** other systems. -*/ -static sqlite3LockingStyle sqlite3DetectLockingStyle( - const char *filePath, - int fd -){ - -#ifdef SQLITE_FIXED_LOCKING_STYLE - return (sqlite3LockingStyle)SQLITE_FIXED_LOCKING_STYLE; -#else - struct statfs fsInfo; - - if (statfs(filePath, &fsInfo) == -1) - return sqlite3TestLockingStyle(filePath, fd); - - if (fsInfo.f_flags & MNT_RDONLY) - return noLockingStyle; - - if( (!strcmp(fsInfo.f_fstypename, "hfs")) || - (!strcmp(fsInfo.f_fstypename, "ufs")) ) - return posixLockingStyle; - - if(!strcmp(fsInfo.f_fstypename, "afpfs")) - return afpLockingStyle; - - if(!strcmp(fsInfo.f_fstypename, "nfs")) - return sqlite3TestLockingStyle(filePath, fd); - - if(!strcmp(fsInfo.f_fstypename, "smbfs")) - return flockLockingStyle; - - if(!strcmp(fsInfo.f_fstypename, "msdos")) - return dotlockLockingStyle; - - if(!strcmp(fsInfo.f_fstypename, "webdav")) - return unsupportedLockingStyle; - - return sqlite3TestLockingStyle(filePath, fd); -#endif /* SQLITE_FIXED_LOCKING_STYLE */ -} - -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - -/* -** Given a file descriptor, locate lockInfo and openCnt structures that -** describes that file descriptor. Create new ones if necessary. The -** return values might be uninitialized if an error occurs. -** -** Return the number of errors. -*/ -static int findLockInfo( - int fd, /* The file descriptor used in the key */ - struct lockInfo **ppLock, /* Return the lockInfo structure here */ - struct openCnt **ppOpen /* Return the openCnt structure here */ -){ - int rc; - struct lockKey key1; - struct openKey key2; - struct stat statbuf; - struct lockInfo *pLock; - struct openCnt *pOpen; - rc = fstat(fd, &statbuf); - if( rc!=0 ) return 1; - - memset(&key1, 0, sizeof(key1)); - key1.dev = statbuf.st_dev; - key1.ino = statbuf.st_ino; -#if SQLITE_THREADSAFE - if( threadsOverrideEachOthersLocks<0 ){ - testThreadLockingBehavior(fd); - } - key1.tid = threadsOverrideEachOthersLocks ? 0 : pthread_self(); -#endif - memset(&key2, 0, sizeof(key2)); - key2.dev = statbuf.st_dev; - key2.ino = statbuf.st_ino; - pLock = (struct lockInfo*)sqlite3HashFind(&lockHash, &key1, sizeof(key1)); - if( pLock==0 ){ - struct lockInfo *pOld; - pLock = sqlite3_malloc( sizeof(*pLock) ); - if( pLock==0 ){ - rc = 1; - goto exit_findlockinfo; - } - pLock->key = key1; - pLock->nRef = 1; - pLock->cnt = 0; - pLock->locktype = 0; - pOld = sqlite3HashInsert(&lockHash, &pLock->key, sizeof(key1), pLock); - if( pOld!=0 ){ - assert( pOld==pLock ); - sqlite3_free(pLock); - rc = 1; - goto exit_findlockinfo; - } - }else{ - pLock->nRef++; - } - *ppLock = pLock; - if( ppOpen!=0 ){ - pOpen = (struct openCnt*)sqlite3HashFind(&openHash, &key2, sizeof(key2)); - if( pOpen==0 ){ - struct openCnt *pOld; - pOpen = sqlite3_malloc( sizeof(*pOpen) ); - if( pOpen==0 ){ - releaseLockInfo(pLock); - rc = 1; - goto exit_findlockinfo; - } - pOpen->key = key2; - pOpen->nRef = 1; - pOpen->nLock = 0; - pOpen->nPending = 0; - pOpen->aPending = 0; - pOld = sqlite3HashInsert(&openHash, &pOpen->key, sizeof(key2), pOpen); - if( pOld!=0 ){ - assert( pOld==pOpen ); - sqlite3_free(pOpen); - releaseLockInfo(pLock); - rc = 1; - goto exit_findlockinfo; - } - }else{ - pOpen->nRef++; - } - *ppOpen = pOpen; - } - -exit_findlockinfo: - return rc; -} - -#ifdef SQLITE_DEBUG -/* -** Helper function for printing out trace information from debugging -** binaries. This returns the string represetation of the supplied -** integer lock-type. -*/ -static const char *locktypeName(int locktype){ - switch( locktype ){ - case NO_LOCK: return "NONE"; - case SHARED_LOCK: return "SHARED"; - case RESERVED_LOCK: return "RESERVED"; - case PENDING_LOCK: return "PENDING"; - case EXCLUSIVE_LOCK: return "EXCLUSIVE"; - } - return "ERROR"; -} -#endif - -/* -** If we are currently in a different thread than the thread that the -** unixFile argument belongs to, then transfer ownership of the unixFile -** over to the current thread. -** -** A unixFile is only owned by a thread on systems where one thread is -** unable to override locks created by a different thread. RedHat9 is -** an example of such a system. -** -** Ownership transfer is only allowed if the unixFile is currently unlocked. -** If the unixFile is locked and an ownership is wrong, then return -** SQLITE_MISUSE. SQLITE_OK is returned if everything works. -*/ -#if SQLITE_THREADSAFE -static int transferOwnership(unixFile *pFile){ - int rc; - pthread_t hSelf; - if( threadsOverrideEachOthersLocks ){ - /* Ownership transfers not needed on this system */ - return SQLITE_OK; - } - hSelf = pthread_self(); - if( pthread_equal(pFile->tid, hSelf) ){ - /* We are still in the same thread */ - OSTRACE1("No-transfer, same thread\n"); - return SQLITE_OK; - } - if( pFile->locktype!=NO_LOCK ){ - /* We cannot change ownership while we are holding a lock! */ - return SQLITE_MISUSE; - } - OSTRACE4("Transfer ownership of %d from %d to %d\n", - pFile->h, pFile->tid, hSelf); - pFile->tid = hSelf; - if (pFile->pLock != NULL) { - releaseLockInfo(pFile->pLock); - rc = findLockInfo(pFile->h, &pFile->pLock, 0); - OSTRACE5("LOCK %d is now %s(%s,%d)\n", pFile->h, - locktypeName(pFile->locktype), - locktypeName(pFile->pLock->locktype), pFile->pLock->cnt); - return rc; - } else { - return SQLITE_OK; - } -} -#else - /* On single-threaded builds, ownership transfer is a no-op */ -# define transferOwnership(X) SQLITE_OK -#endif - -/* -** Seek to the offset passed as the second argument, then read cnt -** bytes into pBuf. Return the number of bytes actually read. -*/ -static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ - int got; - i64 newOffset; - TIMER_START; -#if defined(USE_PREAD) - got = pread(id->h, pBuf, cnt, offset); - SimulateIOError( got = -1 ); -#elif defined(USE_PREAD64) - got = pread64(id->h, pBuf, cnt, offset); - SimulateIOError( got = -1 ); -#else - newOffset = lseek(id->h, offset, SEEK_SET); - SimulateIOError( newOffset-- ); - if( newOffset!=offset ){ - return -1; - } - got = read(id->h, pBuf, cnt); -#endif - TIMER_END; - OSTRACE5("READ %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED); - return got; -} - -/* -** Read data from a file into a buffer. Return SQLITE_OK if all -** bytes were read successfully and SQLITE_IOERR if anything goes -** wrong. -*/ -static int unixRead( - sqlite3_file *id, - void *pBuf, - int amt, - sqlite3_int64 offset -){ - int got; - assert( id ); - got = seekAndRead((unixFile*)id, offset, pBuf, amt); - if( got==amt ){ - return SQLITE_OK; - }else if( got<0 ){ - return SQLITE_IOERR_READ; - }else{ - memset(&((char*)pBuf)[got], 0, amt-got); - return SQLITE_IOERR_SHORT_READ; - } -} - -/* -** Seek to the offset in id->offset then read cnt bytes into pBuf. -** Return the number of bytes actually read. Update the offset. -*/ -static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){ - int got; - i64 newOffset; - TIMER_START; -#if defined(USE_PREAD) - got = pwrite(id->h, pBuf, cnt, offset); -#elif defined(USE_PREAD64) - got = pwrite64(id->h, pBuf, cnt, offset); -#else - newOffset = lseek(id->h, offset, SEEK_SET); - if( newOffset!=offset ){ - return -1; - } - got = write(id->h, pBuf, cnt); -#endif - TIMER_END; - OSTRACE5("WRITE %-3d %5d %7lld %d\n", id->h, got, offset, TIMER_ELAPSED); - return got; -} - - -/* -** Write data from a buffer into a file. Return SQLITE_OK on success -** or some other error code on failure. -*/ -static int unixWrite( - sqlite3_file *id, - const void *pBuf, - int amt, - sqlite3_int64 offset -){ - int wrote = 0; - assert( id ); - assert( amt>0 ); - while( amt>0 && (wrote = seekAndWrite((unixFile*)id, offset, pBuf, amt))>0 ){ - amt -= wrote; - offset += wrote; - pBuf = &((char*)pBuf)[wrote]; - } - SimulateIOError(( wrote=(-1), amt=1 )); - SimulateDiskfullError(( wrote=0, amt=1 )); - if( amt>0 ){ - if( wrote<0 ){ - return SQLITE_IOERR_WRITE; - }else{ - return SQLITE_FULL; - } - } - return SQLITE_OK; -} - -#ifdef SQLITE_TEST -/* -** Count the number of fullsyncs and normal syncs. This is used to test -** that syncs and fullsyncs are occuring at the right times. -*/ -int sqlite3_sync_count = 0; -int sqlite3_fullsync_count = 0; -#endif - -/* -** Use the fdatasync() API only if the HAVE_FDATASYNC macro is defined. -** Otherwise use fsync() in its place. -*/ -#ifndef HAVE_FDATASYNC -# define fdatasync fsync -#endif - -/* -** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not -** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently -** only available on Mac OS X. But that could change. -*/ -#ifdef F_FULLFSYNC -# define HAVE_FULLFSYNC 1 -#else -# define HAVE_FULLFSYNC 0 -#endif - - -/* -** The fsync() system call does not work as advertised on many -** unix systems. The following procedure is an attempt to make -** it work better. -** -** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful -** for testing when we want to run through the test suite quickly. -** You are strongly advised *not* to deploy with SQLITE_NO_SYNC -** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash -** or power failure will likely corrupt the database file. -*/ -static int full_fsync(int fd, int fullSync, int dataOnly){ - int rc; - - /* Record the number of times that we do a normal fsync() and - ** FULLSYNC. This is used during testing to verify that this procedure - ** gets called with the correct arguments. - */ -#ifdef SQLITE_TEST - if( fullSync ) sqlite3_fullsync_count++; - sqlite3_sync_count++; -#endif - - /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a - ** no-op - */ -#ifdef SQLITE_NO_SYNC - rc = SQLITE_OK; -#else - -#if HAVE_FULLFSYNC - if( fullSync ){ - rc = fcntl(fd, F_FULLFSYNC, 0); - }else{ - rc = 1; - } - /* If the FULLFSYNC failed, fall back to attempting an fsync(). - * It shouldn't be possible for fullfsync to fail on the local - * file system (on OSX), so failure indicates that FULLFSYNC - * isn't supported for this file system. So, attempt an fsync - * and (for now) ignore the overhead of a superfluous fcntl call. - * It'd be better to detect fullfsync support once and avoid - * the fcntl call every time sync is called. - */ - if( rc ) rc = fsync(fd); - -#else - if( dataOnly ){ - rc = fdatasync(fd); - }else{ - rc = fsync(fd); - } -#endif /* HAVE_FULLFSYNC */ -#endif /* defined(SQLITE_NO_SYNC) */ - - return rc; -} - -/* -** Make sure all writes to a particular file are committed to disk. -** -** If dataOnly==0 then both the file itself and its metadata (file -** size, access time, etc) are synced. If dataOnly!=0 then only the -** file data is synced. -** -** Under Unix, also make sure that the directory entry for the file -** has been created by fsync-ing the directory that contains the file. -** If we do not do this and we encounter a power failure, the directory -** entry for the journal might not exist after we reboot. The next -** SQLite to access the file will not know that the journal exists (because -** the directory entry for the journal was never created) and the transaction -** will not roll back - possibly leading to database corruption. -*/ -static int unixSync(sqlite3_file *id, int flags){ - int rc; - unixFile *pFile = (unixFile*)id; - - int isDataOnly = (flags&SQLITE_SYNC_DATAONLY); - int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL; - - /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ - assert((flags&0x0F)==SQLITE_SYNC_NORMAL - || (flags&0x0F)==SQLITE_SYNC_FULL - ); - - assert( pFile ); - OSTRACE2("SYNC %-3d\n", pFile->h); - rc = full_fsync(pFile->h, isFullsync, isDataOnly); - SimulateIOError( rc=1 ); - if( rc ){ - return SQLITE_IOERR_FSYNC; - } - if( pFile->dirfd>=0 ){ - OSTRACE4("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd, - HAVE_FULLFSYNC, isFullsync); -#ifndef SQLITE_DISABLE_DIRSYNC - /* The directory sync is only attempted if full_fsync is - ** turned off or unavailable. If a full_fsync occurred above, - ** then the directory sync is superfluous. - */ - if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){ - /* - ** We have received multiple reports of fsync() returning - ** errors when applied to directories on certain file systems. - ** A failed directory sync is not a big deal. So it seems - ** better to ignore the error. Ticket #1657 - */ - /* return SQLITE_IOERR; */ - } -#endif - close(pFile->dirfd); /* Only need to sync once, so close the directory */ - pFile->dirfd = -1; /* when we are done. */ - } - return SQLITE_OK; -} - -/* -** Truncate an open file to a specified size -*/ -static int unixTruncate(sqlite3_file *id, i64 nByte){ - int rc; - assert( id ); - rc = ftruncate(((unixFile*)id)->h, (off_t)nByte); - SimulateIOError( rc=1 ); - if( rc ){ - return SQLITE_IOERR_TRUNCATE; - }else{ - return SQLITE_OK; - } -} - -/* -** Determine the current size of a file in bytes -*/ -static int unixFileSize(sqlite3_file *id, i64 *pSize){ - int rc; - struct stat buf; - assert( id ); - rc = fstat(((unixFile*)id)->h, &buf); - SimulateIOError( rc=1 ); - if( rc!=0 ){ - return SQLITE_IOERR_FSTAT; - } - *pSize = buf.st_size; - return SQLITE_OK; -} - -/* -** This routine checks if there is a RESERVED lock held on the specified -** file by this or any other process. If such a lock is held, return -** non-zero. If the file is unlocked or holds only SHARED locks, then -** return zero. -*/ -static int unixCheckReservedLock(sqlite3_file *id){ - int r = 0; - unixFile *pFile = (unixFile*)id; - - assert( pFile ); - enterMutex(); /* Because pFile->pLock is shared across threads */ - - /* Check if a thread in this process holds such a lock */ - if( pFile->pLock->locktype>SHARED_LOCK ){ - r = 1; - } - - /* Otherwise see if some other process holds it. - */ - if( !r ){ - struct flock lock; - lock.l_whence = SEEK_SET; - lock.l_start = RESERVED_BYTE; - lock.l_len = 1; - lock.l_type = F_WRLCK; - fcntl(pFile->h, F_GETLK, &lock); - if( lock.l_type!=F_UNLCK ){ - r = 1; - } - } - - leaveMutex(); - OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r); - - return r; -} - -/* -** Lock the file with the lock specified by parameter locktype - one -** of the following: -** -** (1) SHARED_LOCK -** (2) RESERVED_LOCK -** (3) PENDING_LOCK -** (4) EXCLUSIVE_LOCK -** -** Sometimes when requesting one lock state, additional lock states -** are inserted in between. The locking might fail on one of the later -** transitions leaving the lock state different from what it started but -** still short of its goal. The following chart shows the allowed -** transitions and the inserted intermediate states: -** -** UNLOCKED -> SHARED -** SHARED -> RESERVED -** SHARED -> (PENDING) -> EXCLUSIVE -** RESERVED -> (PENDING) -> EXCLUSIVE -** PENDING -> EXCLUSIVE -** -** This routine will only increase a lock. Use the sqlite3OsUnlock() -** routine to lower a locking level. -*/ -static int unixLock(sqlite3_file *id, int locktype){ - /* The following describes the implementation of the various locks and - ** lock transitions in terms of the POSIX advisory shared and exclusive - ** lock primitives (called read-locks and write-locks below, to avoid - ** confusion with SQLite lock names). The algorithms are complicated - ** slightly in order to be compatible with windows systems simultaneously - ** accessing the same database file, in case that is ever required. - ** - ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved - ** byte', each single bytes at well known offsets, and the 'shared byte - ** range', a range of 510 bytes at a well known offset. - ** - ** To obtain a SHARED lock, a read-lock is obtained on the 'pending - ** byte'. If this is successful, a random byte from the 'shared byte - ** range' is read-locked and the lock on the 'pending byte' released. - ** - ** A process may only obtain a RESERVED lock after it has a SHARED lock. - ** A RESERVED lock is implemented by grabbing a write-lock on the - ** 'reserved byte'. - ** - ** A process may only obtain a PENDING lock after it has obtained a - ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock - ** on the 'pending byte'. This ensures that no new SHARED locks can be - ** obtained, but existing SHARED locks are allowed to persist. A process - ** does not have to obtain a RESERVED lock on the way to a PENDING lock. - ** This property is used by the algorithm for rolling back a journal file - ** after a crash. - ** - ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is - ** implemented by obtaining a write-lock on the entire 'shared byte - ** range'. Since all other locks require a read-lock on one of the bytes - ** within this range, this ensures that no other locks are held on the - ** database. - ** - ** The reason a single byte cannot be used instead of the 'shared byte - ** range' is that some versions of windows do not support read-locks. By - ** locking a random byte from a range, concurrent SHARED locks may exist - ** even if the locking primitive used is always a write-lock. - */ - int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - struct lockInfo *pLock = pFile->pLock; - struct flock lock; - int s; - - assert( pFile ); - OSTRACE7("LOCK %d %s was %s(%s,%d) pid=%d\n", pFile->h, - locktypeName(locktype), locktypeName(pFile->locktype), - locktypeName(pLock->locktype), pLock->cnt , getpid()); - - /* If there is already a lock of this type or more restrictive on the - ** unixFile, do nothing. Don't use the end_lock: exit path, as - ** enterMutex() hasn't been called yet. - */ - if( pFile->locktype>=locktype ){ - OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h, - locktypeName(locktype)); - return SQLITE_OK; - } - - /* Make sure the locking sequence is correct - */ - assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); - assert( locktype!=PENDING_LOCK ); - assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); - - /* This mutex is needed because pFile->pLock is shared across threads - */ - enterMutex(); - - /* Make sure the current thread owns the pFile. - */ - rc = transferOwnership(pFile); - if( rc!=SQLITE_OK ){ - leaveMutex(); - return rc; - } - pLock = pFile->pLock; - - /* If some thread using this PID has a lock via a different unixFile* - ** handle that precludes the requested lock, return BUSY. - */ - if( (pFile->locktype!=pLock->locktype && - (pLock->locktype>=PENDING_LOCK || locktype>SHARED_LOCK)) - ){ - rc = SQLITE_BUSY; - goto end_lock; - } - - /* If a SHARED lock is requested, and some thread using this PID already - ** has a SHARED or RESERVED lock, then increment reference counts and - ** return SQLITE_OK. - */ - if( locktype==SHARED_LOCK && - (pLock->locktype==SHARED_LOCK || pLock->locktype==RESERVED_LOCK) ){ - assert( locktype==SHARED_LOCK ); - assert( pFile->locktype==0 ); - assert( pLock->cnt>0 ); - pFile->locktype = SHARED_LOCK; - pLock->cnt++; - pFile->pOpen->nLock++; - goto end_lock; - } - - lock.l_len = 1L; - - lock.l_whence = SEEK_SET; - - /* A PENDING lock is needed before acquiring a SHARED lock and before - ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will - ** be released. - */ - if( locktype==SHARED_LOCK - || (locktype==EXCLUSIVE_LOCK && pFile->locktypeh, F_SETLK, &lock); - if( s==(-1) ){ - rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; - goto end_lock; - } - } - - - /* If control gets to this point, then actually go ahead and make - ** operating system calls for the specified lock. - */ - if( locktype==SHARED_LOCK ){ - assert( pLock->cnt==0 ); - assert( pLock->locktype==0 ); - - /* Now get the read-lock */ - lock.l_start = SHARED_FIRST; - lock.l_len = SHARED_SIZE; - s = fcntl(pFile->h, F_SETLK, &lock); - - /* Drop the temporary PENDING lock */ - lock.l_start = PENDING_BYTE; - lock.l_len = 1L; - lock.l_type = F_UNLCK; - if( fcntl(pFile->h, F_SETLK, &lock)!=0 ){ - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - goto end_lock; - } - if( s==(-1) ){ - rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; - }else{ - pFile->locktype = SHARED_LOCK; - pFile->pOpen->nLock++; - pLock->cnt = 1; - } - }else if( locktype==EXCLUSIVE_LOCK && pLock->cnt>1 ){ - /* We are trying for an exclusive lock but another thread in this - ** same process is still holding a shared lock. */ - rc = SQLITE_BUSY; - }else{ - /* The request was for a RESERVED or EXCLUSIVE lock. It is - ** assumed that there is a SHARED or greater lock on the file - ** already. - */ - assert( 0!=pFile->locktype ); - lock.l_type = F_WRLCK; - switch( locktype ){ - case RESERVED_LOCK: - lock.l_start = RESERVED_BYTE; - break; - case EXCLUSIVE_LOCK: - lock.l_start = SHARED_FIRST; - lock.l_len = SHARED_SIZE; - break; - default: - assert(0); - } - s = fcntl(pFile->h, F_SETLK, &lock); - if( s==(-1) ){ - rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; - } - } - - if( rc==SQLITE_OK ){ - pFile->locktype = locktype; - pLock->locktype = locktype; - }else if( locktype==EXCLUSIVE_LOCK ){ - pFile->locktype = PENDING_LOCK; - pLock->locktype = PENDING_LOCK; - } - -end_lock: - leaveMutex(); - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), - rc==SQLITE_OK ? "ok" : "failed"); - return rc; -} - -/* -** Lower the locking level on file descriptor pFile to locktype. locktype -** must be either NO_LOCK or SHARED_LOCK. -** -** If the locking level of the file descriptor is already at or below -** the requested locking level, this routine is a no-op. -*/ -static int unixUnlock(sqlite3_file *id, int locktype){ - struct lockInfo *pLock; - struct flock lock; - int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - - assert( pFile ); - OSTRACE7("UNLOCK %d %d was %d(%d,%d) pid=%d\n", pFile->h, locktype, - pFile->locktype, pFile->pLock->locktype, pFile->pLock->cnt, getpid()); - - assert( locktype<=SHARED_LOCK ); - if( pFile->locktype<=locktype ){ - return SQLITE_OK; - } - if( CHECK_THREADID(pFile) ){ - return SQLITE_MISUSE; - } - enterMutex(); - pLock = pFile->pLock; - assert( pLock->cnt!=0 ); - if( pFile->locktype>SHARED_LOCK ){ - assert( pLock->locktype==pFile->locktype ); - if( locktype==SHARED_LOCK ){ - lock.l_type = F_RDLCK; - lock.l_whence = SEEK_SET; - lock.l_start = SHARED_FIRST; - lock.l_len = SHARED_SIZE; - if( fcntl(pFile->h, F_SETLK, &lock)==(-1) ){ - /* This should never happen */ - rc = SQLITE_IOERR_RDLOCK; - } - } - lock.l_type = F_UNLCK; - lock.l_whence = SEEK_SET; - lock.l_start = PENDING_BYTE; - lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE ); - if( fcntl(pFile->h, F_SETLK, &lock)!=(-1) ){ - pLock->locktype = SHARED_LOCK; - }else{ - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - } - } - if( locktype==NO_LOCK ){ - struct openCnt *pOpen; - - /* Decrement the shared lock counter. Release the lock using an - ** OS call only when all threads in this same process have released - ** the lock. - */ - pLock->cnt--; - if( pLock->cnt==0 ){ - lock.l_type = F_UNLCK; - lock.l_whence = SEEK_SET; - lock.l_start = lock.l_len = 0L; - if( fcntl(pFile->h, F_SETLK, &lock)!=(-1) ){ - pLock->locktype = NO_LOCK; - }else{ - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - } - } - - /* Decrement the count of locks against this same file. When the - ** count reaches zero, close any other file descriptors whose close - ** was deferred because of outstanding locks. - */ - pOpen = pFile->pOpen; - pOpen->nLock--; - assert( pOpen->nLock>=0 ); - if( pOpen->nLock==0 && pOpen->nPending>0 ){ - int i; - for(i=0; inPending; i++){ - close(pOpen->aPending[i]); - } - free(pOpen->aPending); - pOpen->nPending = 0; - pOpen->aPending = 0; - } - } - leaveMutex(); - pFile->locktype = locktype; - return rc; -} - -/* -** Close a file. -*/ -static int unixClose(sqlite3_file *id){ - unixFile *pFile = (unixFile *)id; - if( !pFile ) return SQLITE_OK; - unixUnlock(id, NO_LOCK); - if( pFile->dirfd>=0 ) close(pFile->dirfd); - pFile->dirfd = -1; - enterMutex(); - - if( pFile->pOpen->nLock ){ - /* If there are outstanding locks, do not actually close the file just - ** yet because that would clear those locks. Instead, add the file - ** descriptor to pOpen->aPending. It will be automatically closed when - ** the last lock is cleared. - */ - int *aNew; - struct openCnt *pOpen = pFile->pOpen; - aNew = realloc( pOpen->aPending, (pOpen->nPending+1)*sizeof(int) ); - if( aNew==0 ){ - /* If a malloc fails, just leak the file descriptor */ - }else{ - pOpen->aPending = aNew; - pOpen->aPending[pOpen->nPending] = pFile->h; - pOpen->nPending++; - } - }else{ - /* There are no outstanding locks so we can close the file immediately */ - close(pFile->h); - } - releaseLockInfo(pFile->pLock); - releaseOpenCnt(pFile->pOpen); - - leaveMutex(); - OSTRACE2("CLOSE %-3d\n", pFile->h); - OpenCounter(-1); - memset(pFile, 0, sizeof(unixFile)); - return SQLITE_OK; -} - - -#ifdef SQLITE_ENABLE_LOCKING_STYLE -#pragma mark AFP Support - -/* - ** The afpLockingContext structure contains all afp lock specific state - */ -typedef struct afpLockingContext afpLockingContext; -struct afpLockingContext { - unsigned long long sharedLockByte; - char *filePath; -}; - -struct ByteRangeLockPB2 -{ - unsigned long long offset; /* offset to first byte to lock */ - unsigned long long length; /* nbr of bytes to lock */ - unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */ - unsigned char unLockFlag; /* 1 = unlock, 0 = lock */ - unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */ - int fd; /* file desc to assoc this lock with */ -}; - -#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) - -/* -** Return 0 on success, 1 on failure. To match the behavior of the -** normal posix file locking (used in unixLock for example), we should -** provide 'richer' return codes - specifically to differentiate between -** 'file busy' and 'file system error' results. -*/ -static int _AFPFSSetLock( - const char *path, - int fd, - unsigned long long offset, - unsigned long long length, - int setLockFlag -){ - struct ByteRangeLockPB2 pb; - int err; - - pb.unLockFlag = setLockFlag ? 0 : 1; - pb.startEndFlag = 0; - pb.offset = offset; - pb.length = length; - pb.fd = fd; - OSTRACE5("AFPLOCK setting lock %s for %d in range %llx:%llx\n", - (setLockFlag?"ON":"OFF"), fd, offset, length); - err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0); - if ( err==-1 ) { - OSTRACE4("AFPLOCK failed to fsctl() '%s' %d %s\n", path, errno, - strerror(errno)); - return 1; /* error */ - } else { - return 0; - } -} - -/* - ** This routine checks if there is a RESERVED lock held on the specified - ** file by this or any other process. If such a lock is held, return - ** non-zero. If the file is unlocked or holds only SHARED locks, then - ** return zero. - */ -static int afpUnixCheckReservedLock(sqlite3_file *id){ - int r = 0; - unixFile *pFile = (unixFile*)id; - - assert( pFile ); - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; - - /* Check if a thread in this process holds such a lock */ - if( pFile->locktype>SHARED_LOCK ){ - r = 1; - } - - /* Otherwise see if some other process holds it. - */ - if ( !r ) { - /* lock the byte */ - int failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1); - if (failed) { - /* if we failed to get the lock then someone else must have it */ - r = 1; - } else { - /* if we succeeded in taking the reserved lock, unlock it to restore - ** the original state */ - _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0); - } - } - OSTRACE3("TEST WR-LOCK %d %d\n", pFile->h, r); - - return r; -} - -/* AFP-style locking following the behavior of unixLock, see the unixLock -** function comments for details of lock management. */ -static int afpUnixLock(sqlite3_file *id, int locktype) -{ - int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; - int gotPendingLock = 0; - - assert( pFile ); - OSTRACE5("LOCK %d %s was %s pid=%d\n", pFile->h, - locktypeName(locktype), locktypeName(pFile->locktype), getpid()); - /* If there is already a lock of this type or more restrictive on the - ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as - ** enterMutex() hasn't been called yet. - */ - if( pFile->locktype>=locktype ){ - OSTRACE3("LOCK %d %s ok (already held)\n", pFile->h, - locktypeName(locktype)); - return SQLITE_OK; - } - - /* Make sure the locking sequence is correct - */ - assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); - assert( locktype!=PENDING_LOCK ); - assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); - - /* This mutex is needed because pFile->pLock is shared across threads - */ - enterMutex(); - - /* Make sure the current thread owns the pFile. - */ - rc = transferOwnership(pFile); - if( rc!=SQLITE_OK ){ - leaveMutex(); - return rc; - } - - /* A PENDING lock is needed before acquiring a SHARED lock and before - ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will - ** be released. - */ - if( locktype==SHARED_LOCK - || (locktype==EXCLUSIVE_LOCK && pFile->locktypefilePath, pFile->h, - PENDING_BYTE, 1, 1); - if (failed) { - rc = SQLITE_BUSY; - goto afp_end_lock; - } - } - - /* If control gets to this point, then actually go ahead and make - ** operating system calls for the specified lock. - */ - if( locktype==SHARED_LOCK ){ - int lk, failed; - int tries = 0; - - /* Now get the read-lock */ - /* note that the quality of the randomness doesn't matter that much */ - lk = random(); - context->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1); - failed = _AFPFSSetLock(context->filePath, pFile->h, - SHARED_FIRST+context->sharedLockByte, 1, 1); - - /* Drop the temporary PENDING lock */ - if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)) { - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - goto afp_end_lock; - } - - if( failed ){ - rc = SQLITE_BUSY; - } else { - pFile->locktype = SHARED_LOCK; - } - }else{ - /* The request was for a RESERVED or EXCLUSIVE lock. It is - ** assumed that there is a SHARED or greater lock on the file - ** already. - */ - int failed = 0; - assert( 0!=pFile->locktype ); - if (locktype >= RESERVED_LOCK && pFile->locktype < RESERVED_LOCK) { - /* Acquire a RESERVED lock */ - failed = _AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1,1); - } - if (!failed && locktype == EXCLUSIVE_LOCK) { - /* Acquire an EXCLUSIVE lock */ - - /* Remove the shared lock before trying the range. we'll need to - ** reestablish the shared lock if we can't get the afpUnixUnlock - */ - if (!_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST + - context->sharedLockByte, 1, 0)) { - /* now attemmpt to get the exclusive lock range */ - failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST, - SHARED_SIZE, 1); - if (failed && _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST + - context->sharedLockByte, 1, 1)) { - rc = SQLITE_IOERR_RDLOCK; /* this should never happen */ - } - } else { - /* */ - rc = SQLITE_IOERR_UNLOCK; /* this should never happen */ - } - } - if( failed && rc == SQLITE_OK){ - rc = SQLITE_BUSY; - } - } - - if( rc==SQLITE_OK ){ - pFile->locktype = locktype; - }else if( locktype==EXCLUSIVE_LOCK ){ - pFile->locktype = PENDING_LOCK; - } - -afp_end_lock: - leaveMutex(); - OSTRACE4("LOCK %d %s %s\n", pFile->h, locktypeName(locktype), - rc==SQLITE_OK ? "ok" : "failed"); - return rc; -} - -/* - ** Lower the locking level on file descriptor pFile to locktype. locktype - ** must be either NO_LOCK or SHARED_LOCK. - ** - ** If the locking level of the file descriptor is already at or below - ** the requested locking level, this routine is a no-op. - */ -static int afpUnixUnlock(sqlite3_file *id, int locktype) { - struct flock lock; - int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; - - assert( pFile ); - OSTRACE5("UNLOCK %d %d was %d pid=%d\n", pFile->h, locktype, - pFile->locktype, getpid()); - - assert( locktype<=SHARED_LOCK ); - if( pFile->locktype<=locktype ){ - return SQLITE_OK; - } - if( CHECK_THREADID(pFile) ){ - return SQLITE_MISUSE; - } - enterMutex(); - if( pFile->locktype>SHARED_LOCK ){ - if( locktype==SHARED_LOCK ){ - int failed = 0; - - /* unlock the exclusive range - then re-establish the shared lock */ - if (pFile->locktype==EXCLUSIVE_LOCK) { - failed = _AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST, - SHARED_SIZE, 0); - if (!failed) { - /* successfully removed the exclusive lock */ - if (_AFPFSSetLock(context->filePath, pFile->h, SHARED_FIRST+ - context->sharedLockByte, 1, 1)) { - /* failed to re-establish our shared lock */ - rc = SQLITE_IOERR_RDLOCK; /* This should never happen */ - } - } else { - /* This should never happen - failed to unlock the exclusive range */ - rc = SQLITE_IOERR_UNLOCK; - } - } - } - if (rc == SQLITE_OK && pFile->locktype>=PENDING_LOCK) { - if (_AFPFSSetLock(context->filePath, pFile->h, PENDING_BYTE, 1, 0)){ - /* failed to release the pending lock */ - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - } - } - if (rc == SQLITE_OK && pFile->locktype>=RESERVED_LOCK) { - if (_AFPFSSetLock(context->filePath, pFile->h, RESERVED_BYTE, 1, 0)) { - /* failed to release the reserved lock */ - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - } - } - } - if( locktype==NO_LOCK ){ - int failed = _AFPFSSetLock(context->filePath, pFile->h, - SHARED_FIRST + context->sharedLockByte, 1, 0); - if (failed) { - rc = SQLITE_IOERR_UNLOCK; /* This should never happen */ - } - } - if (rc == SQLITE_OK) - pFile->locktype = locktype; - leaveMutex(); - return rc; -} - -/* - ** Close a file & cleanup AFP specific locking context - */ -static int afpUnixClose(sqlite3_file *id) { - unixFile *pFile = (unixFile*)pId; - - if( !pFile ) return SQLITE_OK; - afpUnixUnlock(*pId, NO_LOCK); - /* free the AFP locking structure */ - if (pFile->lockingContext != NULL) { - if (((afpLockingContext *)pFile->lockingContext)->filePath != NULL) - sqlite3_free(((afpLockingContext*)pFile->lockingContext)->filePath); - sqlite3_free(pFile->lockingContext); - } - - if( pFile->dirfd>=0 ) close(pFile->dirfd); - pFile->dirfd = -1; - close(pFile->h); - OSTRACE2("CLOSE %-3d\n", pFile->h); - OpenCounter(-1); - return SQLITE_OK; -} - - -#pragma mark flock() style locking - -/* - ** The flockLockingContext is not used - */ -typedef void flockLockingContext; - -static int flockUnixCheckReservedLock(sqlite3_file *id) { - unixFile *pFile = (unixFile*)id; - - if (pFile->locktype == RESERVED_LOCK) { - return 1; /* already have a reserved lock */ - } else { - /* attempt to get the lock */ - int rc = flock(pFile->h, LOCK_EX | LOCK_NB); - if (!rc) { - /* got the lock, unlock it */ - flock(pFile->h, LOCK_UN); - return 0; /* no one has it reserved */ - } - return 1; /* someone else might have it reserved */ - } -} - -static int flockUnixLock(sqlite3_file *id, int locktype) { - unixFile *pFile = (unixFile*)id; - - /* if we already have a lock, it is exclusive. - ** Just adjust level and punt on outta here. */ - if (pFile->locktype > NO_LOCK) { - pFile->locktype = locktype; - return SQLITE_OK; - } - - /* grab an exclusive lock */ - int rc = flock(pFile->h, LOCK_EX | LOCK_NB); - if (rc) { - /* didn't get, must be busy */ - return SQLITE_BUSY; - } else { - /* got it, set the type and return ok */ - pFile->locktype = locktype; - return SQLITE_OK; - } -} - -static int flockUnixUnlock(sqlite3_file *id, int locktype) { - unixFile *pFile = (unixFile*)id; - - assert( locktype<=SHARED_LOCK ); - - /* no-op if possible */ - if( pFile->locktype==locktype ){ - return SQLITE_OK; - } - - /* shared can just be set because we always have an exclusive */ - if (locktype==SHARED_LOCK) { - pFile->locktype = locktype; - return SQLITE_OK; - } - - /* no, really, unlock. */ - int rc = flock(pFile->h, LOCK_UN); - if (rc) - return SQLITE_IOERR_UNLOCK; - else { - pFile->locktype = NO_LOCK; - return SQLITE_OK; - } -} - -/* - ** Close a file. - */ -static int flockUnixClose(sqlite3_file *pId) { - unixFile *pFile = (unixFile*)*pId; - - if( !pFile ) return SQLITE_OK; - flockUnixUnlock(*pId, NO_LOCK); - - if( pFile->dirfd>=0 ) close(pFile->dirfd); - pFile->dirfd = -1; - enterMutex(); - - close(pFile->h); - leaveMutex(); - OSTRACE2("CLOSE %-3d\n", pFile->h); - OpenCounter(-1); - return SQLITE_OK; -} - -#pragma mark Old-School .lock file based locking - -/* - ** The dotlockLockingContext structure contains all dotlock (.lock) lock - ** specific state - */ -typedef struct dotlockLockingContext dotlockLockingContext; -struct dotlockLockingContext { - char *lockPath; -}; - - -static int dotlockUnixCheckReservedLock(sqlite3_file *id) { - unixFile *pFile = (unixFile*)id; - dotlockLockingContext *context = - (dotlockLockingContext *) pFile->lockingContext; - - if (pFile->locktype == RESERVED_LOCK) { - return 1; /* already have a reserved lock */ - } else { - struct stat statBuf; - if (lstat(context->lockPath,&statBuf) == 0) - /* file exists, someone else has the lock */ - return 1; - else - /* file does not exist, we could have it if we want it */ - return 0; - } -} - -static int dotlockUnixLock(sqlite3_file *id, int locktype) { - unixFile *pFile = (unixFile*)id; - dotlockLockingContext *context = - (dotlockLockingContext *) pFile->lockingContext; - - /* if we already have a lock, it is exclusive. - ** Just adjust level and punt on outta here. */ - if (pFile->locktype > NO_LOCK) { - pFile->locktype = locktype; - - /* Always update the timestamp on the old file */ - utimes(context->lockPath,NULL); - return SQLITE_OK; - } - - /* check to see if lock file already exists */ - struct stat statBuf; - if (lstat(context->lockPath,&statBuf) == 0){ - return SQLITE_BUSY; /* it does, busy */ - } - - /* grab an exclusive lock */ - int fd = open(context->lockPath,O_RDONLY|O_CREAT|O_EXCL,0600); - if (fd < 0) { - /* failed to open/create the file, someone else may have stolen the lock */ - return SQLITE_BUSY; - } - close(fd); - - /* got it, set the type and return ok */ - pFile->locktype = locktype; - return SQLITE_OK; -} - -static int dotlockUnixUnlock(sqlite3_file *id, int locktype) { - unixFile *pFile = (unixFile*)id; - dotlockLockingContext *context = - (dotlockLockingContext *) pFile->lockingContext; - - assert( locktype<=SHARED_LOCK ); - - /* no-op if possible */ - if( pFile->locktype==locktype ){ - return SQLITE_OK; - } - - /* shared can just be set because we always have an exclusive */ - if (locktype==SHARED_LOCK) { - pFile->locktype = locktype; - return SQLITE_OK; - } - - /* no, really, unlock. */ - unlink(context->lockPath); - pFile->locktype = NO_LOCK; - return SQLITE_OK; -} - -/* - ** Close a file. - */ -static int dotlockUnixClose(sqlite3_file *id) { - unixFile *pFile = (unixFile*)id; - - if( !pFile ) return SQLITE_OK; - dotlockUnixUnlock(*pId, NO_LOCK); - /* free the dotlock locking structure */ - if (pFile->lockingContext != NULL) { - if (((dotlockLockingContext *)pFile->lockingContext)->lockPath != NULL) - sqlite3_free( ( (dotlockLockingContext *) - pFile->lockingContext)->lockPath); - sqlite3_free(pFile->lockingContext); - } - - if( pFile->dirfd>=0 ) close(pFile->dirfd); - pFile->dirfd = -1; - enterMutex(); - - close(pFile->h); - - leaveMutex(); - OSTRACE2("CLOSE %-3d\n", pFile->h); - OpenCounter(-1); - return SQLITE_OK; -} - - -#pragma mark No locking - -/* - ** The nolockLockingContext is void - */ -typedef void nolockLockingContext; - -static int nolockUnixCheckReservedLock(sqlite3_file *id) { - return 0; -} - -static int nolockUnixLock(sqlite3_file *id, int locktype) { - return SQLITE_OK; -} - -static int nolockUnixUnlock(sqlite3_file *id, int locktype) { - return SQLITE_OK; -} - -/* - ** Close a file. - */ -static int nolockUnixClose(sqlite3_file *id) { - unixFile *pFile = (unixFile*)id; - - if( !pFile ) return SQLITE_OK; - if( pFile->dirfd>=0 ) close(pFile->dirfd); - pFile->dirfd = -1; - enterMutex(); - - close(pFile->h); - - leaveMutex(); - OSTRACE2("CLOSE %-3d\n", pFile->h); - OpenCounter(-1); - return SQLITE_OK; -} - -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - - -/* -** Information and control of an open file handle. -*/ -static int unixFileControl(sqlite3_file *id, int op, void *pArg){ - switch( op ){ - case SQLITE_FCNTL_LOCKSTATE: { - *(int*)pArg = ((unixFile*)id)->locktype; - return SQLITE_OK; - } - } - return SQLITE_ERROR; -} - -/* -** Return the sector size in bytes of the underlying block device for -** the specified file. This is almost always 512 bytes, but may be -** larger for some devices. -** -** SQLite code assumes this function cannot fail. It also assumes that -** if two files are created in the same file-system directory (i.e. -** a database and it's journal file) that the sector size will be the -** same for both. -*/ -static int unixSectorSize(sqlite3_file *id){ - return SQLITE_DEFAULT_SECTOR_SIZE; -} - -/* -** Return the device characteristics for the file. This is always 0. -*/ -static int unixDeviceCharacteristics(sqlite3_file *id){ - return 0; -} - -/* -** This vector defines all the methods that can operate on an sqlite3_file -** for unix. -*/ -static const sqlite3_io_methods sqlite3UnixIoMethod = { - 1, /* iVersion */ - unixClose, - unixRead, - unixWrite, - unixTruncate, - unixSync, - unixFileSize, - unixLock, - unixUnlock, - unixCheckReservedLock, - unixFileControl, - unixSectorSize, - unixDeviceCharacteristics -}; - -#ifdef SQLITE_ENABLE_LOCKING_STYLE -/* -** This vector defines all the methods that can operate on an sqlite3_file -** for unix with AFP style file locking. -*/ -static const sqlite3_io_methods sqlite3AFPLockingUnixIoMethod = { - 1, /* iVersion */ - unixClose, - unixRead, - unixWrite, - unixTruncate, - unixSync, - unixFileSize, - afpUnixLock, - afpUnixUnlock, - afpUnixCheckReservedLock, - unixFileControl, - unixSectorSize, - unixDeviceCharacteristics -}; - -/* -** This vector defines all the methods that can operate on an sqlite3_file -** for unix with flock() style file locking. -*/ -static const sqlite3_io_methods sqlite3FlockLockingUnixIoMethod = { - 1, /* iVersion */ - flockUnixClose, - unixRead, - unixWrite, - unixTruncate, - unixSync, - unixFileSize, - flockUnixLock, - flockUnixUnlock, - flockUnixCheckReservedLock, - unixFileControl, - unixSectorSize, - unixDeviceCharacteristics -}; - -/* -** This vector defines all the methods that can operate on an sqlite3_file -** for unix with dotlock style file locking. -*/ -static const sqlite3_io_methods sqlite3DotlockLockingUnixIoMethod = { - 1, /* iVersion */ - dotlockUnixClose, - unixRead, - unixWrite, - unixTruncate, - unixSync, - unixFileSize, - dotlockUnixLock, - dotlockUnixUnlock, - dotlockUnixCheckReservedLock, - unixFileControl, - unixSectorSize, - unixDeviceCharacteristics -}; - -/* -** This vector defines all the methods that can operate on an sqlite3_file -** for unix with dotlock style file locking. -*/ -static const sqlite3_io_methods sqlite3NolockLockingUnixIoMethod = { - 1, /* iVersion */ - nolockUnixClose, - unixRead, - unixWrite, - unixTruncate, - unixSync, - unixFileSize, - nolockUnixLock, - nolockUnixUnlock, - nolockUnixCheckReservedLock, - unixFileControl, - unixSectorSize, - unixDeviceCharacteristics -}; - -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - -/* -** Allocate memory for a new unixFile and initialize that unixFile. -** Write a pointer to the new unixFile into *pId. -** If we run out of memory, close the file and return an error. -*/ -#ifdef SQLITE_ENABLE_LOCKING_STYLE -/* -** When locking extensions are enabled, the filepath and locking style -** are needed to determine the unixFile pMethod to use for locking operations. -** The locking-style specific lockingContext data structure is created -** and assigned here also. -*/ -static int fillInUnixFile( - int h, /* Open file descriptor of file being opened */ - int dirfd, /* Directory file descriptor */ - sqlite3_file *pId, /* Write completed initialization here */ - const char *zFilename, /* Name of the file being opened */ -){ - sqlite3LockingStyle lockingStyle; - unixFile *pNew = (unixFile *)pId; - int rc; - - memset(pNew, 0, sizeof(unixFile)); - lockingStyle = sqlite3DetectLockingStyle(zFilename, h); - if ( lockingStyle == posixLockingStyle ) { - enterMutex(); - rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen); - leaveMutex(); - if( rc ){ - close(h); - unlink(zFilename); - return SQLITE_NOMEM; - } - } else { - /* pLock and pOpen are only used for posix advisory locking */ - pNew->pLock = NULL; - pNew->pOpen = NULL; - } - pNew->dirfd = -1; - pNew->h = h; - SET_THREADID(pNew); - pNew = sqlite3_malloc( sizeof(unixFile) ); - if( pNew==0 ){ - close(h); - enterMutex(); - releaseLockInfo(pNew->pLock); - releaseOpenCnt(pNew->pOpen); - leaveMutex(); - return SQLITE_NOMEM; - }else{ - switch(lockingStyle) { - case afpLockingStyle: { - /* afp locking uses the file path so it needs to be included in - ** the afpLockingContext */ - int nFilename; - pNew->pMethod = &sqlite3AFPLockingUnixIoMethod; - pNew->lockingContext = - sqlite3_malloc(sizeof(afpLockingContext)); - nFilename = strlen(zFilename)+1; - ((afpLockingContext *)pNew->lockingContext)->filePath = - sqlite3_malloc(nFilename); - memcpy(((afpLockingContext *)pNew->lockingContext)->filePath, - zFilename, nFilename); - srandomdev(); - break; - } - case flockLockingStyle: - /* flock locking doesn't need additional lockingContext information */ - pNew->pMethod = &sqlite3FlockLockingUnixIoMethod; - break; - case dotlockLockingStyle: { - /* dotlock locking uses the file path so it needs to be included in - ** the dotlockLockingContext */ - int nFilename; - pNew->pMethod = &sqlite3DotlockLockingUnixIoMethod; - pNew->lockingContext = sqlite3_malloc( - sizeof(dotlockLockingContext)); - nFilename = strlen(zFilename) + 6; - ((dotlockLockingContext *)pNew->lockingContext)->lockPath = - sqlite3_malloc( nFilename ); - sqlite3_snprintf(nFilename, - ((dotlockLockingContext *)pNew->lockingContext)->lockPath, - "%s.lock", zFilename); - break; - } - case posixLockingStyle: - /* posix locking doesn't need additional lockingContext information */ - pNew->pMethod = &sqlite3UnixIoMethod; - break; - case noLockingStyle: - case unsupportedLockingStyle: - default: - pNew->pMethod = &sqlite3NolockLockingUnixIoMethod; - } - OpenCounter(+1); - return SQLITE_OK; - } -} -#else /* SQLITE_ENABLE_LOCKING_STYLE */ -static int fillInUnixFile( - int h, /* Open file descriptor on file being opened */ - int dirfd, - sqlite3_file *pId, /* Write to the unixFile structure here */ - const char *zFilename /* Name of the file being opened */ -){ - unixFile *pNew = (unixFile *)pId; - int rc; - -#ifdef FD_CLOEXEC - fcntl(h, F_SETFD, fcntl(h, F_GETFD, 0) | FD_CLOEXEC); -#endif - - enterMutex(); - rc = findLockInfo(h, &pNew->pLock, &pNew->pOpen); - leaveMutex(); - if( rc ){ - close(h); - return SQLITE_NOMEM; - } - - OSTRACE3("OPEN %-3d %s\n", h, zFilename); - pNew->dirfd = -1; - pNew->h = h; - pNew->dirfd = dirfd; - SET_THREADID(pNew); - - pNew->pMethod = &sqlite3UnixIoMethod; - OpenCounter(+1); - return SQLITE_OK; -} -#endif /* SQLITE_ENABLE_LOCKING_STYLE */ - -/* -** Open a file descriptor to the directory containing file zFilename. -** If successful, *pFd is set to the opened file descriptor and -** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM -** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined -** value. -** -** If SQLITE_OK is returned, the caller is responsible for closing -** the file descriptor *pFd using close(). -*/ -static int openDirectory(const char *zFilename, int *pFd){ - int ii; - int fd = -1; - char zDirname[MAX_PATHNAME+1]; - - sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); - for(ii=strlen(zDirname); ii>=0 && zDirname[ii]!='/'; ii--); - if( ii>0 ){ - zDirname[ii] = '\0'; - fd = open(zDirname, O_RDONLY|O_BINARY, 0); - if( fd>=0 ){ -#ifdef FD_CLOEXEC - fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) | FD_CLOEXEC); -#endif - OSTRACE3("OPENDIR %-3d %s\n", fd, zDirname); - } - } - *pFd = fd; - return (fd>=0?SQLITE_OK:SQLITE_CANTOPEN); -} - -/* -** Open the file zPath. -** -** Previously, the SQLite OS layer used three functions in place of this -** one: -** -** sqlite3OsOpenReadWrite(); -** sqlite3OsOpenReadOnly(); -** sqlite3OsOpenExclusive(); -** -** These calls correspond to the following combinations of flags: -** -** ReadWrite() -> (READWRITE | CREATE) -** ReadOnly() -> (READONLY) -** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE) -** -** The old OpenExclusive() accepted a boolean argument - "delFlag". If -** true, the file was configured to be automatically deleted when the -** file handle closed. To achieve the same effect using this new -** interface, add the DELETEONCLOSE flag to those specified above for -** OpenExclusive(). -*/ -static int unixOpen( - sqlite3_vfs *pVfs, - const char *zPath, - sqlite3_file *pFile, - int flags, - int *pOutFlags -){ - int fd = 0; /* File descriptor returned by open() */ - int dirfd = -1; /* Directory file descriptor */ - int oflags = 0; /* Flags to pass to open() */ - int eType = flags&0xFFFFFF00; /* Type of file to open */ - - int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); - int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); - int isCreate = (flags & SQLITE_OPEN_CREATE); - int isReadonly = (flags & SQLITE_OPEN_READONLY); - int isReadWrite = (flags & SQLITE_OPEN_READWRITE); - - /* If creating a master or main-file journal, this function will open - ** a file-descriptor on the directory too. The first time unixSync() - ** is called the directory file descriptor will be fsync()ed and close()d. - */ - int isOpenDirectory = (isCreate && - (eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL) - ); - - /* Check the following statements are true: - ** - ** (a) Exactly one of the READWRITE and READONLY flags must be set, and - ** (b) if CREATE is set, then READWRITE must also be set, and - ** (c) if EXCLUSIVE is set, then CREATE must also be set. - ** (d) if DELETEONCLOSE is set, then CREATE must also be set. - */ - assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); - assert(isCreate==0 || isReadWrite); - assert(isExclusive==0 || isCreate); - assert(isDelete==0 || isCreate); - - - /* The main DB, main journal, and master journal are never automatically - ** deleted - */ - assert( eType!=SQLITE_OPEN_MAIN_DB || !isDelete ); - assert( eType!=SQLITE_OPEN_MAIN_JOURNAL || !isDelete ); - assert( eType!=SQLITE_OPEN_MASTER_JOURNAL || !isDelete ); - - /* Assert that the upper layer has set one of the "file-type" flags. */ - assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB - || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL - || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL - || eType==SQLITE_OPEN_TRANSIENT_DB - ); - - if( isReadonly ) oflags |= O_RDONLY; - if( isReadWrite ) oflags |= O_RDWR; - if( isCreate ) oflags |= O_CREAT; - if( isExclusive ) oflags |= (O_EXCL|O_NOFOLLOW); - oflags |= (O_LARGEFILE|O_BINARY); - - memset(pFile, 0, sizeof(unixFile)); - fd = open(zPath, oflags, isDelete?0600:SQLITE_DEFAULT_FILE_PERMISSIONS); - if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){ - /* Failed to open the file for read/write access. Try read-only. */ - flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); - flags |= SQLITE_OPEN_READONLY; - return unixOpen(pVfs, zPath, pFile, flags, pOutFlags); - } - if( fd<0 ){ - return SQLITE_CANTOPEN; - } - if( isDelete ){ - unlink(zPath); - } - if( pOutFlags ){ - *pOutFlags = flags; - } - - assert(fd!=0); - if( isOpenDirectory ){ - int rc = openDirectory(zPath, &dirfd); - if( rc!=SQLITE_OK ){ - close(fd); - return rc; - } - } - return fillInUnixFile(fd, dirfd, pFile, zPath); -} - -/* -** Delete the file at zPath. If the dirSync argument is true, fsync() -** the directory after deleting the file. -*/ -static int unixDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ - int rc = SQLITE_OK; - SimulateIOError(return SQLITE_IOERR_DELETE); - unlink(zPath); - if( dirSync ){ - int fd; - rc = openDirectory(zPath, &fd); - if( rc==SQLITE_OK ){ - if( fsync(fd) ){ - rc = SQLITE_IOERR_DIR_FSYNC; - } - close(fd); - } - } - return rc; -} - -/* -** Test the existance of or access permissions of file zPath. The -** test performed depends on the value of flags: -** -** SQLITE_ACCESS_EXISTS: Return 1 if the file exists -** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable. -** SQLITE_ACCESS_READONLY: Return 1 if the file is readable. -** -** Otherwise return 0. -*/ -static int unixAccess(sqlite3_vfs *pVfs, const char *zPath, int flags){ - int amode = 0; - switch( flags ){ - case SQLITE_ACCESS_EXISTS: - amode = F_OK; - break; - case SQLITE_ACCESS_READWRITE: - amode = W_OK|R_OK; - break; - case SQLITE_ACCESS_READ: - amode = R_OK; - break; - - default: - assert(!"Invalid flags argument"); - } - return (access(zPath, amode)==0); -} - -/* -** Create a temporary file name in zBuf. zBuf must be allocated -** by the calling process and must be big enough to hold at least -** pVfs->mxPathname bytes. -*/ -static int unixGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ - static const char *azDirs[] = { - 0, - "/var/tmp", - "/usr/tmp", - "/tmp", - ".", - }; - static const unsigned char zChars[] = - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789"; - int i, j; - struct stat buf; - const char *zDir = "."; - - /* It's odd to simulate an io-error here, but really this is just - ** using the io-error infrastructure to test that SQLite handles this - ** function failing. - */ - SimulateIOError( return SQLITE_ERROR ); - - azDirs[0] = sqlite3_temp_directory; - for(i=0; imxPathname==MAX_PATHNAME ); - assert( nBuf>=MAX_PATHNAME ); - sqlite3_snprintf(MAX_PATHNAME-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); - j = strlen(zBuf); - sqlite3Randomness(15, &zBuf[j]); - for(i=0; i<15; i++, j++){ - zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; - } - zBuf[j] = 0; - }while( access(zBuf,0)==0 ); - return SQLITE_OK; -} - - -/* -** Turn a relative pathname into a full pathname. The relative path -** is stored as a nul-terminated string in the buffer pointed to by -** zPath. -** -** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes -** (in this case, MAX_PATHNAME bytes). The full-path is written to -** this buffer before returning. -*/ -static int unixFullPathname( - sqlite3_vfs *pVfs, /* Pointer to vfs object */ - const char *zPath, /* Possibly relative input path */ - int nOut, /* Size of output buffer in bytes */ - char *zOut /* Output buffer */ -){ - - /* It's odd to simulate an io-error here, but really this is just - ** using the io-error infrastructure to test that SQLite handles this - ** function failing. This function could fail if, for example, the - ** current working directly has been unlinked. - */ - SimulateIOError( return SQLITE_ERROR ); - - assert( pVfs->mxPathname==MAX_PATHNAME ); - zOut[MAX_PATHNAME-1] = '\0'; - if( zPath[0]=='/' ){ - sqlite3_snprintf(MAX_PATHNAME, zOut, "%s", zPath); - }else{ - int nCwd; - if( getcwd(zOut, MAX_PATHNAME-1)==0 ){ - return SQLITE_CANTOPEN; - } - nCwd = strlen(zOut); - sqlite3_snprintf(MAX_PATHNAME-nCwd, &zOut[nCwd], "/%s", zPath); - } - return SQLITE_OK; - -#if 0 - /* - ** Remove "/./" path elements and convert "/A/./" path elements - ** to just "/". - */ - if( zFull ){ - int i, j; - for(i=j=0; zFull[i]; i++){ - if( zFull[i]=='/' ){ - if( zFull[i+1]=='/' ) continue; - if( zFull[i+1]=='.' && zFull[i+2]=='/' ){ - i += 1; - continue; - } - if( zFull[i+1]=='.' && zFull[i+2]=='.' && zFull[i+3]=='/' ){ - while( j>0 && zFull[j-1]!='/' ){ j--; } - i += 3; - continue; - } - } - zFull[j++] = zFull[i]; - } - zFull[j] = 0; - } -#endif -} - - -#ifndef SQLITE_OMIT_LOAD_EXTENSION -/* -** Interfaces for opening a shared library, finding entry points -** within the shared library, and closing the shared library. -*/ -#include -static void *unixDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ - return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); -} - -/* -** SQLite calls this function immediately after a call to unixDlSym() or -** unixDlOpen() fails (returns a null pointer). If a more detailed error -** message is available, it is written to zBufOut. If no error message -** is available, zBufOut is left unmodified and SQLite uses a default -** error message. -*/ -static void unixDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ - char *zErr; - enterMutex(); - zErr = dlerror(); - if( zErr ){ - sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); - } - leaveMutex(); -} -static void *unixDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ - return dlsym(pHandle, zSymbol); -} -static void unixDlClose(sqlite3_vfs *pVfs, void *pHandle){ - dlclose(pHandle); -} -#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ - #define unixDlOpen 0 - #define unixDlError 0 - #define unixDlSym 0 - #define unixDlClose 0 -#endif - -/* -** Write nBuf bytes of random data to the supplied buffer zBuf. -*/ -static int unixRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ - - assert(nBuf>=(sizeof(time_t)+sizeof(int))); - - /* We have to initialize zBuf to prevent valgrind from reporting - ** errors. The reports issued by valgrind are incorrect - we would - ** prefer that the randomness be increased by making use of the - ** uninitialized space in zBuf - but valgrind errors tend to worry - ** some users. Rather than argue, it seems easier just to initialize - ** the whole array and silence valgrind, even if that means less randomness - ** in the random seed. - ** - ** When testing, initializing zBuf[] to zero is all we do. That means - ** that we always use the same random number sequence. This makes the - ** tests repeatable. - */ - memset(zBuf, 0, nBuf); -#if !defined(SQLITE_TEST) - { - int pid, fd; - fd = open("/dev/urandom", O_RDONLY); - if( fd<0 ){ - time_t t; - time(&t); - memcpy(zBuf, &t, sizeof(t)); - pid = getpid(); - memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid)); - }else{ - read(fd, zBuf, nBuf); - close(fd); - } - } -#endif - return SQLITE_OK; -} - - -/* -** Sleep for a little while. Return the amount of time slept. -** The argument is the number of microseconds we want to sleep. -** The return value is the number of microseconds of sleep actually -** requested from the underlying operating system, a number which -** might be greater than or equal to the argument, but not less -** than the argument. -*/ -static int unixSleep(sqlite3_vfs *pVfs, int microseconds){ -#if defined(HAVE_USLEEP) && HAVE_USLEEP - usleep(microseconds); - return microseconds; -#else - int seconds = (microseconds+999999)/1000000; - sleep(seconds); - return seconds*1000000; -#endif -} - -/* -** The following variable, if set to a non-zero value, becomes the result -** returned from sqlite3OsCurrentTime(). This is used for testing. -*/ -#ifdef SQLITE_TEST -int sqlite3_current_time = 0; -#endif - -/* -** Find the current time (in Universal Coordinated Time). Write the -** current time and date as a Julian Day number into *prNow and -** return 0. Return 1 if the time and date cannot be found. -*/ -static int unixCurrentTime(sqlite3_vfs *pVfs, double *prNow){ -#ifdef NO_GETTOD - time_t t; - time(&t); - *prNow = t/86400.0 + 2440587.5; -#else - struct timeval sNow; - gettimeofday(&sNow, 0); - *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_usec/86400000000.0; -#endif -#ifdef SQLITE_TEST - if( sqlite3_current_time ){ - *prNow = sqlite3_current_time/86400.0 + 2440587.5; - } -#endif - return 0; -} - -/* -** Return a pointer to the sqlite3DefaultVfs structure. We use -** a function rather than give the structure global scope because -** some compilers (MSVC) do not allow forward declarations of -** initialized structures. -*/ -sqlite3_vfs *sqlite3OsDefaultVfs(void){ - static sqlite3_vfs unixVfs = { - 1, /* iVersion */ - sizeof(unixFile), /* szOsFile */ - MAX_PATHNAME, /* mxPathname */ - 0, /* pNext */ - "unix", /* zName */ - 0, /* pAppData */ - - unixOpen, /* xOpen */ - unixDelete, /* xDelete */ - unixAccess, /* xAccess */ - unixGetTempname, /* xGetTempName */ - unixFullPathname, /* xFullPathname */ - unixDlOpen, /* xDlOpen */ - unixDlError, /* xDlError */ - unixDlSym, /* xDlSym */ - unixDlClose, /* xDlClose */ - unixRandomness, /* xRandomness */ - unixSleep, /* xSleep */ - unixCurrentTime /* xCurrentTime */ - }; - - return &unixVfs; -} - -#endif /* OS_UNIX */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c b/libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c deleted file mode 100644 index bcb1c6ec2c..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/os_win.c +++ /dev/null @@ -1,1545 +0,0 @@ -/* -** 2004 May 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains code that is specific to windows. -*/ -#include "sqliteInt.h" -#if OS_WIN /* This file is used for windows only */ - - -/* -** A Note About Memory Allocation: -** -** This driver uses malloc()/free() directly rather than going through -** the SQLite-wrappers sqlite3_malloc()/sqlite3_free(). Those wrappers -** are designed for use on embedded systems where memory is scarce and -** malloc failures happen frequently. Win32 does not typically run on -** embedded systems, and when it does the developers normally have bigger -** problems to worry about than running out of memory. So there is not -** a compelling need to use the wrappers. -** -** But there is a good reason to not use the wrappers. If we use the -** wrappers then we will get simulated malloc() failures within this -** driver. And that causes all kinds of problems for our tests. We -** could enhance SQLite to deal with simulated malloc failures within -** the OS driver, but the code to deal with those failure would not -** be exercised on Linux (which does not need to malloc() in the driver) -** and so we would have difficulty writing coverage tests for that -** code. Better to leave the code out, we think. -** -** The point of this discussion is as follows: When creating a new -** OS layer for an embedded system, if you use this file as an example, -** avoid the use of malloc()/free(). Those routines work ok on windows -** desktops but not so well in embedded systems. -*/ - -#include - -#ifdef __CYGWIN__ -# include -#endif - -/* -** Macros used to determine whether or not to use threads. -*/ -#if defined(THREADSAFE) && THREADSAFE -# define SQLITE_W32_THREADS 1 -#endif - -/* -** Include code that is common to all os_*.c files -*/ -#include "os_common.h" - -/* -** Determine if we are dealing with WindowsCE - which has a much -** reduced API. -*/ -#if defined(_WIN32_WCE) -# define OS_WINCE 1 -# define AreFileApisANSI() 1 -#else -# define OS_WINCE 0 -#endif - -/* -** WinCE lacks native support for file locking so we have to fake it -** with some code of our own. -*/ -#if OS_WINCE -typedef struct winceLock { - int nReaders; /* Number of reader locks obtained */ - BOOL bPending; /* Indicates a pending lock has been obtained */ - BOOL bReserved; /* Indicates a reserved lock has been obtained */ - BOOL bExclusive; /* Indicates an exclusive lock has been obtained */ -} winceLock; -#endif - -/* -** The winFile structure is a subclass of sqlite3_file* specific to the win32 -** portability layer. -*/ -typedef struct winFile winFile; -struct winFile { - const sqlite3_io_methods *pMethod;/* Must be first */ - HANDLE h; /* Handle for accessing the file */ - unsigned char locktype; /* Type of lock currently held on this file */ - short sharedLockByte; /* Randomly chosen byte used as a shared lock */ -#if OS_WINCE - WCHAR *zDeleteOnClose; /* Name of file to delete when closing */ - HANDLE hMutex; /* Mutex used to control access to shared lock */ - HANDLE hShared; /* Shared memory segment used for locking */ - winceLock local; /* Locks obtained by this instance of winFile */ - winceLock *shared; /* Global shared lock memory for the file */ -#endif -}; - - -/* -** The following variable is (normally) set once and never changes -** thereafter. It records whether the operating system is Win95 -** or WinNT. -** -** 0: Operating system unknown. -** 1: Operating system is Win95. -** 2: Operating system is WinNT. -** -** In order to facilitate testing on a WinNT system, the test fixture -** can manually set this value to 1 to emulate Win98 behavior. -*/ -#ifdef SQLITE_TEST -int sqlite3_os_type = 0; -#else -static int sqlite3_os_type = 0; -#endif - -/* -** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, -** or WinCE. Return false (zero) for Win95, Win98, or WinME. -** -** Here is an interesting observation: Win95, Win98, and WinME lack -** the LockFileEx() API. But we can still statically link against that -** API as long as we don't call it win running Win95/98/ME. A call to -** this routine is used to determine if the host is Win95/98/ME or -** WinNT/2K/XP so that we will know whether or not we can safely call -** the LockFileEx() API. -*/ -#if OS_WINCE -# define isNT() (1) -#else - static int isNT(void){ - if( sqlite3_os_type==0 ){ - OSVERSIONINFO sInfo; - sInfo.dwOSVersionInfoSize = sizeof(sInfo); - GetVersionEx(&sInfo); - sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; - } - return sqlite3_os_type==2; - } -#endif /* OS_WINCE */ - -/* -** Convert a UTF-8 string to microsoft unicode (UTF-16?). -** -** Space to hold the returned string is obtained from malloc. -*/ -static WCHAR *utf8ToUnicode(const char *zFilename){ - int nChar; - WCHAR *zWideFilename; - - nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); - zWideFilename = malloc( nChar*sizeof(zWideFilename[0]) ); - if( zWideFilename==0 ){ - return 0; - } - nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar); - if( nChar==0 ){ - free(zWideFilename); - zWideFilename = 0; - } - return zWideFilename; -} - -/* -** Convert microsoft unicode to UTF-8. Space to hold the returned string is -** obtained from malloc(). -*/ -static char *unicodeToUtf8(const WCHAR *zWideFilename){ - int nByte; - char *zFilename; - - nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); - zFilename = malloc( nByte ); - if( zFilename==0 ){ - return 0; - } - nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, - 0, 0); - if( nByte == 0 ){ - free(zFilename); - zFilename = 0; - } - return zFilename; -} - -/* -** Convert an ansi string to microsoft unicode, based on the -** current codepage settings for file apis. -** -** Space to hold the returned string is obtained -** from malloc. -*/ -static WCHAR *mbcsToUnicode(const char *zFilename){ - int nByte; - WCHAR *zMbcsFilename; - int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; - - nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR); - zMbcsFilename = malloc( nByte*sizeof(zMbcsFilename[0]) ); - if( zMbcsFilename==0 ){ - return 0; - } - nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte); - if( nByte==0 ){ - free(zMbcsFilename); - zMbcsFilename = 0; - } - return zMbcsFilename; -} - -/* -** Convert microsoft unicode to multibyte character string, based on the -** user's Ansi codepage. -** -** Space to hold the returned string is obtained from -** malloc(). -*/ -static char *unicodeToMbcs(const WCHAR *zWideFilename){ - int nByte; - char *zFilename; - int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; - - nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); - zFilename = malloc( nByte ); - if( zFilename==0 ){ - return 0; - } - nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte, - 0, 0); - if( nByte == 0 ){ - free(zFilename); - zFilename = 0; - } - return zFilename; -} - -/* -** Convert multibyte character string to UTF-8. Space to hold the -** returned string is obtained from malloc(). -*/ -static char *mbcsToUtf8(const char *zFilename){ - char *zFilenameUtf8; - WCHAR *zTmpWide; - - zTmpWide = mbcsToUnicode(zFilename); - if( zTmpWide==0 ){ - return 0; - } - zFilenameUtf8 = unicodeToUtf8(zTmpWide); - free(zTmpWide); - return zFilenameUtf8; -} - -/* -** Convert UTF-8 to multibyte character string. Space to hold the -** returned string is obtained from malloc(). -*/ -static char *utf8ToMbcs(const char *zFilename){ - char *zFilenameMbcs; - WCHAR *zTmpWide; - - zTmpWide = utf8ToUnicode(zFilename); - if( zTmpWide==0 ){ - return 0; - } - zFilenameMbcs = unicodeToMbcs(zTmpWide); - free(zTmpWide); - return zFilenameMbcs; -} - -#if OS_WINCE -/************************************************************************* -** This section contains code for WinCE only. -*/ -/* -** WindowsCE does not have a localtime() function. So create a -** substitute. -*/ -#include -struct tm *__cdecl localtime(const time_t *t) -{ - static struct tm y; - FILETIME uTm, lTm; - SYSTEMTIME pTm; - sqlite3_int64 t64; - t64 = *t; - t64 = (t64 + 11644473600)*10000000; - uTm.dwLowDateTime = t64 & 0xFFFFFFFF; - uTm.dwHighDateTime= t64 >> 32; - FileTimeToLocalFileTime(&uTm,&lTm); - FileTimeToSystemTime(&lTm,&pTm); - y.tm_year = pTm.wYear - 1900; - y.tm_mon = pTm.wMonth - 1; - y.tm_wday = pTm.wDayOfWeek; - y.tm_mday = pTm.wDay; - y.tm_hour = pTm.wHour; - y.tm_min = pTm.wMinute; - y.tm_sec = pTm.wSecond; - return &y; -} - -/* This will never be called, but defined to make the code compile */ -#define GetTempPathA(a,b) - -#define LockFile(a,b,c,d,e) winceLockFile(&a, b, c, d, e) -#define UnlockFile(a,b,c,d,e) winceUnlockFile(&a, b, c, d, e) -#define LockFileEx(a,b,c,d,e,f) winceLockFileEx(&a, b, c, d, e, f) - -#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-offsetof(winFile,h)] - -/* -** Acquire a lock on the handle h -*/ -static void winceMutexAcquire(HANDLE h){ - DWORD dwErr; - do { - dwErr = WaitForSingleObject(h, INFINITE); - } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); -} -/* -** Release a lock acquired by winceMutexAcquire() -*/ -#define winceMutexRelease(h) ReleaseMutex(h) - -/* -** Create the mutex and shared memory used for locking in the file -** descriptor pFile -*/ -static BOOL winceCreateLock(const char *zFilename, winFile *pFile){ - WCHAR *zTok; - WCHAR *zName = utf8ToUnicode(zFilename); - BOOL bInit = TRUE; - - /* Initialize the local lockdata */ - ZeroMemory(&pFile->local, sizeof(pFile->local)); - - /* Replace the backslashes from the filename and lowercase it - ** to derive a mutex name. */ - zTok = CharLowerW(zName); - for (;*zTok;zTok++){ - if (*zTok == '\\') *zTok = '_'; - } - - /* Create/open the named mutex */ - pFile->hMutex = CreateMutexW(NULL, FALSE, zName); - if (!pFile->hMutex){ - free(zName); - return FALSE; - } - - /* Acquire the mutex before continuing */ - winceMutexAcquire(pFile->hMutex); - - /* Since the names of named mutexes, semaphores, file mappings etc are - ** case-sensitive, take advantage of that by uppercasing the mutex name - ** and using that as the shared filemapping name. - */ - CharUpperW(zName); - pFile->hShared = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, - PAGE_READWRITE, 0, sizeof(winceLock), - zName); - - /* Set a flag that indicates we're the first to create the memory so it - ** must be zero-initialized */ - if (GetLastError() == ERROR_ALREADY_EXISTS){ - bInit = FALSE; - } - - free(zName); - - /* If we succeeded in making the shared memory handle, map it. */ - if (pFile->hShared){ - pFile->shared = (winceLock*)MapViewOfFile(pFile->hShared, - FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); - /* If mapping failed, close the shared memory handle and erase it */ - if (!pFile->shared){ - CloseHandle(pFile->hShared); - pFile->hShared = NULL; - } - } - - /* If shared memory could not be created, then close the mutex and fail */ - if (pFile->hShared == NULL){ - winceMutexRelease(pFile->hMutex); - CloseHandle(pFile->hMutex); - pFile->hMutex = NULL; - return FALSE; - } - - /* Initialize the shared memory if we're supposed to */ - if (bInit) { - ZeroMemory(pFile->shared, sizeof(winceLock)); - } - - winceMutexRelease(pFile->hMutex); - return TRUE; -} - -/* -** Destroy the part of winFile that deals with wince locks -*/ -static void winceDestroyLock(winFile *pFile){ - if (pFile->hMutex){ - /* Acquire the mutex */ - winceMutexAcquire(pFile->hMutex); - - /* The following blocks should probably assert in debug mode, but they - are to cleanup in case any locks remained open */ - if (pFile->local.nReaders){ - pFile->shared->nReaders --; - } - if (pFile->local.bReserved){ - pFile->shared->bReserved = FALSE; - } - if (pFile->local.bPending){ - pFile->shared->bPending = FALSE; - } - if (pFile->local.bExclusive){ - pFile->shared->bExclusive = FALSE; - } - - /* De-reference and close our copy of the shared memory handle */ - UnmapViewOfFile(pFile->shared); - CloseHandle(pFile->hShared); - - if( pFile->zDeleteOnClose ){ - DeleteFileW(pFile->zDeleteOnClose); - free(pFile->zDeleteOnClose); - pFile->zDeleteOnClose = 0; - } - - /* Done with the mutex */ - winceMutexRelease(pFile->hMutex); - CloseHandle(pFile->hMutex); - pFile->hMutex = NULL; - } -} - -/* -** An implementation of the LockFile() API of windows for wince -*/ -static BOOL winceLockFile( - HANDLE *phFile, - DWORD dwFileOffsetLow, - DWORD dwFileOffsetHigh, - DWORD nNumberOfBytesToLockLow, - DWORD nNumberOfBytesToLockHigh -){ - winFile *pFile = HANDLE_TO_WINFILE(phFile); - BOOL bReturn = FALSE; - - if (!pFile->hMutex) return TRUE; - winceMutexAcquire(pFile->hMutex); - - /* Wanting an exclusive lock? */ - if (dwFileOffsetLow == SHARED_FIRST - && nNumberOfBytesToLockLow == SHARED_SIZE){ - if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){ - pFile->shared->bExclusive = TRUE; - pFile->local.bExclusive = TRUE; - bReturn = TRUE; - } - } - - /* Want a read-only lock? */ - else if ((dwFileOffsetLow >= SHARED_FIRST && - dwFileOffsetLow < SHARED_FIRST + SHARED_SIZE) && - nNumberOfBytesToLockLow == 1){ - if (pFile->shared->bExclusive == 0){ - pFile->local.nReaders ++; - if (pFile->local.nReaders == 1){ - pFile->shared->nReaders ++; - } - bReturn = TRUE; - } - } - - /* Want a pending lock? */ - else if (dwFileOffsetLow == PENDING_BYTE && nNumberOfBytesToLockLow == 1){ - /* If no pending lock has been acquired, then acquire it */ - if (pFile->shared->bPending == 0) { - pFile->shared->bPending = TRUE; - pFile->local.bPending = TRUE; - bReturn = TRUE; - } - } - /* Want a reserved lock? */ - else if (dwFileOffsetLow == RESERVED_BYTE && nNumberOfBytesToLockLow == 1){ - if (pFile->shared->bReserved == 0) { - pFile->shared->bReserved = TRUE; - pFile->local.bReserved = TRUE; - bReturn = TRUE; - } - } - - winceMutexRelease(pFile->hMutex); - return bReturn; -} - -/* -** An implementation of the UnlockFile API of windows for wince -*/ -static BOOL winceUnlockFile( - HANDLE *phFile, - DWORD dwFileOffsetLow, - DWORD dwFileOffsetHigh, - DWORD nNumberOfBytesToUnlockLow, - DWORD nNumberOfBytesToUnlockHigh -){ - winFile *pFile = HANDLE_TO_WINFILE(phFile); - BOOL bReturn = FALSE; - - if (!pFile->hMutex) return TRUE; - winceMutexAcquire(pFile->hMutex); - - /* Releasing a reader lock or an exclusive lock */ - if (dwFileOffsetLow >= SHARED_FIRST && - dwFileOffsetLow < SHARED_FIRST + SHARED_SIZE){ - /* Did we have an exclusive lock? */ - if (pFile->local.bExclusive){ - pFile->local.bExclusive = FALSE; - pFile->shared->bExclusive = FALSE; - bReturn = TRUE; - } - - /* Did we just have a reader lock? */ - else if (pFile->local.nReaders){ - pFile->local.nReaders --; - if (pFile->local.nReaders == 0) - { - pFile->shared->nReaders --; - } - bReturn = TRUE; - } - } - - /* Releasing a pending lock */ - else if (dwFileOffsetLow == PENDING_BYTE && nNumberOfBytesToUnlockLow == 1){ - if (pFile->local.bPending){ - pFile->local.bPending = FALSE; - pFile->shared->bPending = FALSE; - bReturn = TRUE; - } - } - /* Releasing a reserved lock */ - else if (dwFileOffsetLow == RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1){ - if (pFile->local.bReserved) { - pFile->local.bReserved = FALSE; - pFile->shared->bReserved = FALSE; - bReturn = TRUE; - } - } - - winceMutexRelease(pFile->hMutex); - return bReturn; -} - -/* -** An implementation of the LockFileEx() API of windows for wince -*/ -static BOOL winceLockFileEx( - HANDLE *phFile, - DWORD dwFlags, - DWORD dwReserved, - DWORD nNumberOfBytesToLockLow, - DWORD nNumberOfBytesToLockHigh, - LPOVERLAPPED lpOverlapped -){ - /* If the caller wants a shared read lock, forward this call - ** to winceLockFile */ - if (lpOverlapped->Offset == SHARED_FIRST && - dwFlags == 1 && - nNumberOfBytesToLockLow == SHARED_SIZE){ - return winceLockFile(phFile, SHARED_FIRST, 0, 1, 0); - } - return FALSE; -} -/* -** End of the special code for wince -*****************************************************************************/ -#endif /* OS_WINCE */ - -/***************************************************************************** -** The next group of routines implement the I/O methods specified -** by the sqlite3_io_methods object. -******************************************************************************/ - -/* -** Close a file. -** -** It is reported that an attempt to close a handle might sometimes -** fail. This is a very unreasonable result, but windows is notorious -** for being unreasonable so I do not doubt that it might happen. If -** the close fails, we pause for 100 milliseconds and try again. As -** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before -** giving up and returning an error. -*/ -#define MX_CLOSE_ATTEMPT 3 -static int winClose(sqlite3_file *id){ - int rc, cnt = 0; - winFile *pFile = (winFile*)id; - OSTRACE2("CLOSE %d\n", pFile->h); - do{ - rc = CloseHandle(pFile->h); - }while( rc==0 && cnt++ < MX_CLOSE_ATTEMPT && (Sleep(100), 1) ); -#if OS_WINCE - winceDestroyLock(pFile); -#endif - OpenCounter(-1); - return rc ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Some microsoft compilers lack this definition. -*/ -#ifndef INVALID_SET_FILE_POINTER -# define INVALID_SET_FILE_POINTER ((DWORD)-1) -#endif - -/* -** Read data from a file into a buffer. Return SQLITE_OK if all -** bytes were read successfully and SQLITE_IOERR if anything goes -** wrong. -*/ -static int winRead( - sqlite3_file *id, /* File to read from */ - void *pBuf, /* Write content into this buffer */ - int amt, /* Number of bytes to read */ - sqlite3_int64 offset /* Begin reading at this offset */ -){ - LONG upperBits = (offset>>32) & 0x7fffffff; - LONG lowerBits = offset & 0xffffffff; - DWORD rc; - DWORD got; - winFile *pFile = (winFile*)id; - assert( id!=0 ); - SimulateIOError(return SQLITE_IOERR_READ); - OSTRACE3("READ %d lock=%d\n", pFile->h, pFile->locktype); - rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); - if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){ - return SQLITE_FULL; - } - if( !ReadFile(pFile->h, pBuf, amt, &got, 0) ){ - return SQLITE_IOERR_READ; - } - if( got==(DWORD)amt ){ - return SQLITE_OK; - }else{ - memset(&((char*)pBuf)[got], 0, amt-got); - return SQLITE_IOERR_SHORT_READ; - } -} - -/* -** Write data from a buffer into a file. Return SQLITE_OK on success -** or some other error code on failure. -*/ -static int winWrite( - sqlite3_file *id, /* File to write into */ - const void *pBuf, /* The bytes to be written */ - int amt, /* Number of bytes to write */ - sqlite3_int64 offset /* Offset into the file to begin writing at */ -){ - LONG upperBits = (offset>>32) & 0x7fffffff; - LONG lowerBits = offset & 0xffffffff; - DWORD rc; - DWORD wrote; - winFile *pFile = (winFile*)id; - assert( id!=0 ); - SimulateIOError(return SQLITE_IOERR_WRITE); - SimulateDiskfullError(return SQLITE_FULL); - OSTRACE3("WRITE %d lock=%d\n", pFile->h, pFile->locktype); - rc = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); - if( rc==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR ){ - return SQLITE_FULL; - } - assert( amt>0 ); - while( - amt>0 - && (rc = WriteFile(pFile->h, pBuf, amt, &wrote, 0))!=0 - && wrote>0 - ){ - amt -= wrote; - pBuf = &((char*)pBuf)[wrote]; - } - if( !rc || amt>(int)wrote ){ - return SQLITE_FULL; - } - return SQLITE_OK; -} - -/* -** Truncate an open file to a specified size -*/ -static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ - LONG upperBits = (nByte>>32) & 0x7fffffff; - LONG lowerBits = nByte & 0xffffffff; - winFile *pFile = (winFile*)id; - OSTRACE3("TRUNCATE %d %lld\n", pFile->h, nByte); - SimulateIOError(return SQLITE_IOERR_TRUNCATE); - SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); - SetEndOfFile(pFile->h); - return SQLITE_OK; -} - -#ifdef SQLITE_TEST -/* -** Count the number of fullsyncs and normal syncs. This is used to test -** that syncs and fullsyncs are occuring at the right times. -*/ -int sqlite3_sync_count = 0; -int sqlite3_fullsync_count = 0; -#endif - -/* -** Make sure all writes to a particular file are committed to disk. -*/ -static int winSync(sqlite3_file *id, int flags){ - winFile *pFile = (winFile*)id; - OSTRACE3("SYNC %d lock=%d\n", pFile->h, pFile->locktype); -#ifdef SQLITE_TEST - if( flags & SQLITE_SYNC_FULL ){ - sqlite3_fullsync_count++; - } - sqlite3_sync_count++; -#endif - if( FlushFileBuffers(pFile->h) ){ - return SQLITE_OK; - }else{ - return SQLITE_IOERR; - } -} - -/* -** Determine the current size of a file in bytes -*/ -static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ - winFile *pFile = (winFile*)id; - DWORD upperBits, lowerBits; - SimulateIOError(return SQLITE_IOERR_FSTAT); - lowerBits = GetFileSize(pFile->h, &upperBits); - *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; - return SQLITE_OK; -} - -/* -** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. -*/ -#ifndef LOCKFILE_FAIL_IMMEDIATELY -# define LOCKFILE_FAIL_IMMEDIATELY 1 -#endif - -/* -** Acquire a reader lock. -** Different API routines are called depending on whether or not this -** is Win95 or WinNT. -*/ -static int getReadLock(winFile *pFile){ - int res; - if( isNT() ){ - OVERLAPPED ovlp; - ovlp.Offset = SHARED_FIRST; - ovlp.OffsetHigh = 0; - ovlp.hEvent = 0; - res = LockFileEx(pFile->h, LOCKFILE_FAIL_IMMEDIATELY, - 0, SHARED_SIZE, 0, &ovlp); - }else{ - int lk; - sqlite3Randomness(sizeof(lk), &lk); - pFile->sharedLockByte = (lk & 0x7fffffff)%(SHARED_SIZE - 1); - res = LockFile(pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); - } - return res; -} - -/* -** Undo a readlock -*/ -static int unlockReadLock(winFile *pFile){ - int res; - if( isNT() ){ - res = UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); - }else{ - res = UnlockFile(pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0); - } - return res; -} - -/* -** Lock the file with the lock specified by parameter locktype - one -** of the following: -** -** (1) SHARED_LOCK -** (2) RESERVED_LOCK -** (3) PENDING_LOCK -** (4) EXCLUSIVE_LOCK -** -** Sometimes when requesting one lock state, additional lock states -** are inserted in between. The locking might fail on one of the later -** transitions leaving the lock state different from what it started but -** still short of its goal. The following chart shows the allowed -** transitions and the inserted intermediate states: -** -** UNLOCKED -> SHARED -** SHARED -> RESERVED -** SHARED -> (PENDING) -> EXCLUSIVE -** RESERVED -> (PENDING) -> EXCLUSIVE -** PENDING -> EXCLUSIVE -** -** This routine will only increase a lock. The winUnlock() routine -** erases all locks at once and returns us immediately to locking level 0. -** It is not possible to lower the locking level one step at a time. You -** must go straight to locking level 0. -*/ -static int winLock(sqlite3_file *id, int locktype){ - int rc = SQLITE_OK; /* Return code from subroutines */ - int res = 1; /* Result of a windows lock call */ - int newLocktype; /* Set pFile->locktype to this value before exiting */ - int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ - winFile *pFile = (winFile*)id; - - assert( pFile!=0 ); - OSTRACE5("LOCK %d %d was %d(%d)\n", - pFile->h, locktype, pFile->locktype, pFile->sharedLockByte); - - /* If there is already a lock of this type or more restrictive on the - ** OsFile, do nothing. Don't use the end_lock: exit path, as - ** sqlite3OsEnterMutex() hasn't been called yet. - */ - if( pFile->locktype>=locktype ){ - return SQLITE_OK; - } - - /* Make sure the locking sequence is correct - */ - assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); - assert( locktype!=PENDING_LOCK ); - assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); - - /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or - ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of - ** the PENDING_LOCK byte is temporary. - */ - newLocktype = pFile->locktype; - if( pFile->locktype==NO_LOCK - || (locktype==EXCLUSIVE_LOCK && pFile->locktype==RESERVED_LOCK) - ){ - int cnt = 3; - while( cnt-->0 && (res = LockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){ - /* Try 3 times to get the pending lock. The pending lock might be - ** held by another reader process who will release it momentarily. - */ - OSTRACE2("could not get a PENDING lock. cnt=%d\n", cnt); - Sleep(1); - } - gotPendingLock = res; - } - - /* Acquire a shared lock - */ - if( locktype==SHARED_LOCK && res ){ - assert( pFile->locktype==NO_LOCK ); - res = getReadLock(pFile); - if( res ){ - newLocktype = SHARED_LOCK; - } - } - - /* Acquire a RESERVED lock - */ - if( locktype==RESERVED_LOCK && res ){ - assert( pFile->locktype==SHARED_LOCK ); - res = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); - if( res ){ - newLocktype = RESERVED_LOCK; - } - } - - /* Acquire a PENDING lock - */ - if( locktype==EXCLUSIVE_LOCK && res ){ - newLocktype = PENDING_LOCK; - gotPendingLock = 0; - } - - /* Acquire an EXCLUSIVE lock - */ - if( locktype==EXCLUSIVE_LOCK && res ){ - assert( pFile->locktype>=SHARED_LOCK ); - res = unlockReadLock(pFile); - OSTRACE2("unreadlock = %d\n", res); - res = LockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); - if( res ){ - newLocktype = EXCLUSIVE_LOCK; - }else{ - OSTRACE2("error-code = %d\n", GetLastError()); - getReadLock(pFile); - } - } - - /* If we are holding a PENDING lock that ought to be released, then - ** release it now. - */ - if( gotPendingLock && locktype==SHARED_LOCK ){ - UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); - } - - /* Update the state of the lock has held in the file descriptor then - ** return the appropriate result code. - */ - if( res ){ - rc = SQLITE_OK; - }else{ - OSTRACE4("LOCK FAILED %d trying for %d but got %d\n", pFile->h, - locktype, newLocktype); - rc = SQLITE_BUSY; - } - pFile->locktype = newLocktype; - return rc; -} - -/* -** This routine checks if there is a RESERVED lock held on the specified -** file by this or any other process. If such a lock is held, return -** non-zero, otherwise zero. -*/ -static int winCheckReservedLock(sqlite3_file *id){ - int rc; - winFile *pFile = (winFile*)id; - assert( pFile!=0 ); - if( pFile->locktype>=RESERVED_LOCK ){ - rc = 1; - OSTRACE3("TEST WR-LOCK %d %d (local)\n", pFile->h, rc); - }else{ - rc = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); - if( rc ){ - UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); - } - rc = !rc; - OSTRACE3("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc); - } - return rc; -} - -/* -** Lower the locking level on file descriptor id to locktype. locktype -** must be either NO_LOCK or SHARED_LOCK. -** -** If the locking level of the file descriptor is already at or below -** the requested locking level, this routine is a no-op. -** -** It is not possible for this routine to fail if the second argument -** is NO_LOCK. If the second argument is SHARED_LOCK then this routine -** might return SQLITE_IOERR; -*/ -static int winUnlock(sqlite3_file *id, int locktype){ - int type; - winFile *pFile = (winFile*)id; - int rc = SQLITE_OK; - assert( pFile!=0 ); - assert( locktype<=SHARED_LOCK ); - OSTRACE5("UNLOCK %d to %d was %d(%d)\n", pFile->h, locktype, - pFile->locktype, pFile->sharedLockByte); - type = pFile->locktype; - if( type>=EXCLUSIVE_LOCK ){ - UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); - if( locktype==SHARED_LOCK && !getReadLock(pFile) ){ - /* This should never happen. We should always be able to - ** reacquire the read lock */ - rc = SQLITE_IOERR_UNLOCK; - } - } - if( type>=RESERVED_LOCK ){ - UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); - } - if( locktype==NO_LOCK && type>=SHARED_LOCK ){ - unlockReadLock(pFile); - } - if( type>=PENDING_LOCK ){ - UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); - } - pFile->locktype = locktype; - return rc; -} - -/* -** Control and query of the open file handle. -*/ -static int winFileControl(sqlite3_file *id, int op, void *pArg){ - switch( op ){ - case SQLITE_FCNTL_LOCKSTATE: { - *(int*)pArg = ((winFile*)id)->locktype; - return SQLITE_OK; - } - } - return SQLITE_ERROR; -} - -/* -** Return the sector size in bytes of the underlying block device for -** the specified file. This is almost always 512 bytes, but may be -** larger for some devices. -** -** SQLite code assumes this function cannot fail. It also assumes that -** if two files are created in the same file-system directory (i.e. -** a database and it's journal file) that the sector size will be the -** same for both. -*/ -static int winSectorSize(sqlite3_file *id){ - return SQLITE_DEFAULT_SECTOR_SIZE; -} - -/* -** Return a vector of device characteristics. -*/ -static int winDeviceCharacteristics(sqlite3_file *id){ - return 0; -} - -/* -** This vector defines all the methods that can operate on an -** sqlite3_file for win32. -*/ -static const sqlite3_io_methods winIoMethod = { - 1, /* iVersion */ - winClose, - winRead, - winWrite, - winTruncate, - winSync, - winFileSize, - winLock, - winUnlock, - winCheckReservedLock, - winFileControl, - winSectorSize, - winDeviceCharacteristics -}; - -/*************************************************************************** -** Here ends the I/O methods that form the sqlite3_io_methods object. -** -** The next block of code implements the VFS methods. -****************************************************************************/ - -/* -** Convert a UTF-8 filename into whatever form the underlying -** operating system wants filenames in. Space to hold the result -** is obtained from malloc and must be freed by the calling -** function. -*/ -static void *convertUtf8Filename(const char *zFilename){ - void *zConverted = 0; - if( isNT() ){ - zConverted = utf8ToUnicode(zFilename); - }else{ - zConverted = utf8ToMbcs(zFilename); - } - /* caller will handle out of memory */ - return zConverted; -} - -/* -** Open a file. -*/ -static int winOpen( - sqlite3_vfs *pVfs, /* Not used */ - const char *zName, /* Name of the file (UTF-8) */ - sqlite3_file *id, /* Write the SQLite file handle here */ - int flags, /* Open mode flags */ - int *pOutFlags /* Status return flags */ -){ - HANDLE h; - DWORD dwDesiredAccess; - DWORD dwShareMode; - DWORD dwCreationDisposition; - DWORD dwFlagsAndAttributes = 0; - winFile *pFile = (winFile*)id; - void *zConverted = convertUtf8Filename(zName); - if( zConverted==0 ){ - return SQLITE_NOMEM; - } - - if( flags & SQLITE_OPEN_READWRITE ){ - dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; - }else{ - dwDesiredAccess = GENERIC_READ; - } - if( flags & SQLITE_OPEN_CREATE ){ - dwCreationDisposition = OPEN_ALWAYS; - }else{ - dwCreationDisposition = OPEN_EXISTING; - } - if( flags & SQLITE_OPEN_MAIN_DB ){ - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; - }else{ - dwShareMode = 0; - } - if( flags & (SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TEMP_JOURNAL - | SQLITE_OPEN_SUBJOURNAL) ){ - dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY - | FILE_ATTRIBUTE_HIDDEN - | FILE_FLAG_DELETE_ON_CLOSE; - }else{ - dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; - } - if( flags & (SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB) ){ - dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; - }else{ - dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN; - } - if( isNT() ){ - h = CreateFileW((WCHAR*)zConverted, - dwDesiredAccess, - dwShareMode, - NULL, - dwCreationDisposition, - dwFlagsAndAttributes, - NULL - ); - }else{ -#if OS_WINCE - return SQLITE_NOMEM; -#else - h = CreateFileA((char*)zConverted, - dwDesiredAccess, - dwShareMode, - NULL, - dwCreationDisposition, - dwFlagsAndAttributes, - NULL - ); -#endif - } - if( h==INVALID_HANDLE_VALUE ){ - free(zConverted); - if( flags & SQLITE_OPEN_READWRITE ){ - return winOpen(0, zName, id, - ((flags|SQLITE_OPEN_READONLY)&~SQLITE_OPEN_READWRITE), pOutFlags); - }else{ - return SQLITE_CANTOPEN; - } - } - if( pOutFlags ){ - if( flags & SQLITE_OPEN_READWRITE ){ - *pOutFlags = SQLITE_OPEN_READWRITE; - }else{ - *pOutFlags = SQLITE_OPEN_READONLY; - } - } - memset(pFile, 0, sizeof(*pFile)); - pFile->pMethod = &winIoMethod; - pFile->h = h; -#if OS_WINCE - if( (flags & (SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB)) == - (SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_DB) - && !winceCreateLock(zFilename, pFile) - ){ - CloseHandle(h); - free(zConverted); - return SQLITE_CANTOPEN; - } - if( dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE ){ - pFile->zDeleteOnClose = zConverted; - }else -#endif - { - free(zConverted); - } - OpenCounter(+1); - return SQLITE_OK; -} - -/* -** Delete the named file. -** -** Note that windows does not allow a file to be deleted if some other -** process has it open. Sometimes a virus scanner or indexing program -** will open a journal file shortly after it is created in order to do -** whatever it is it does. While this other process is holding the -** file open, we will be unable to delete it. To work around this -** problem, we delay 100 milliseconds and try to delete again. Up -** to MX_DELETION_ATTEMPTs deletion attempts are run before giving -** up and returning an error. -*/ -#define MX_DELETION_ATTEMPTS 3 -static int winDelete( - sqlite3_vfs *pVfs, /* Not used on win32 */ - const char *zFilename, /* Name of file to delete */ - int syncDir /* Not used on win32 */ -){ - int cnt = 0; - int rc; - void *zConverted = convertUtf8Filename(zFilename); - if( zConverted==0 ){ - return SQLITE_NOMEM; - } - SimulateIOError(return SQLITE_IOERR_DELETE); - if( isNT() ){ - do{ - rc = DeleteFileW(zConverted); - }while( rc==0 && GetFileAttributesW(zConverted)!=0xffffffff - && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) ); - }else{ -#if OS_WINCE - return SQLITE_NOMEM; -#else - do{ - rc = DeleteFileA(zConverted); - }while( rc==0 && GetFileAttributesA(zConverted)!=0xffffffff - && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) ); -#endif - } - free(zConverted); - OSTRACE2("DELETE \"%s\"\n", zFilename); - return rc!=0 ? SQLITE_OK : SQLITE_IOERR; -} - -/* -** Check the existance and status of a file. -*/ -static int winAccess( - sqlite3_vfs *pVfs, /* Not used on win32 */ - const char *zFilename, /* Name of file to check */ - int flags /* Type of test to make on this file */ -){ - DWORD attr; - int rc; - void *zConverted = convertUtf8Filename(zFilename); - if( zConverted==0 ){ - return SQLITE_NOMEM; - } - if( isNT() ){ - attr = GetFileAttributesW((WCHAR*)zConverted); - }else{ -#if OS_WINCE - return SQLITE_NOMEM; -#else - attr = GetFileAttributesA((char*)zConverted); -#endif - } - free(zConverted); - switch( flags ){ - case SQLITE_ACCESS_READ: - case SQLITE_ACCESS_EXISTS: - rc = attr!=0xffffffff; - break; - case SQLITE_ACCESS_READWRITE: - rc = (attr & FILE_ATTRIBUTE_READONLY)==0; - break; - default: - assert(!"Invalid flags argument"); - } - return rc; -} - - -/* -** Create a temporary file name in zBuf. zBuf must be big enough to -** hold at pVfs->mxPathname characters. -*/ -static int winGetTempname(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ - static char zChars[] = - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789"; - int i, j; - char zTempPath[MAX_PATH+1]; - if( sqlite3_temp_directory ){ - sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory); - }else if( isNT() ){ - char *zMulti; - WCHAR zWidePath[MAX_PATH]; - GetTempPathW(MAX_PATH-30, zWidePath); - zMulti = unicodeToUtf8(zWidePath); - if( zMulti ){ - sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti); - free(zMulti); - }else{ - return SQLITE_NOMEM; - } - }else{ - char *zUtf8; - char zMbcsPath[MAX_PATH]; - GetTempPathA(MAX_PATH-30, zMbcsPath); - zUtf8 = mbcsToUtf8(zMbcsPath); - if( zUtf8 ){ - sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8); - free(zUtf8); - }else{ - return SQLITE_NOMEM; - } - } - for(i=strlen(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){} - zTempPath[i] = 0; - sqlite3_snprintf(pVfs->mxPathname-30, zBuf, - "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath); - j = strlen(zBuf); - sqlite3Randomness(20, &zBuf[j]); - for(i=0; i<20; i++, j++){ - zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; - } - zBuf[j] = 0; - OSTRACE2("TEMP FILENAME: %s\n", zBuf); - return SQLITE_OK; -} - -/* -** Turn a relative pathname into a full pathname. Write the full -** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname -** bytes in size. -*/ -static int winFullPathname( - sqlite3_vfs *pVfs, /* Pointer to vfs object */ - const char *zRelative, /* Possibly relative input path */ - int nFull, /* Size of output buffer in bytes */ - char *zFull /* Output buffer */ -){ - -#if defined(__CYGWIN__) - cygwin_conv_to_full_win32_path(zRelative, zFull); - return SQLITE_OK; -#endif - -#if OS_WINCE - /* WinCE has no concept of a relative pathname, or so I am told. */ - sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zRelative); -#endif - -#if !OS_WINCE && !defined(__CYGWIN__) - int nByte; - void *zConverted; - char *zOut; - zConverted = convertUtf8Filename(zRelative); - if( isNT() ){ - WCHAR *zTemp; - nByte = GetFullPathNameW((WCHAR*)zConverted, 0, 0, 0) + 3; - zTemp = malloc( nByte*sizeof(zTemp[0]) ); - if( zTemp==0 ){ - free(zConverted); - return SQLITE_NOMEM; - } - GetFullPathNameW((WCHAR*)zConverted, nByte, zTemp, 0); - free(zConverted); - zOut = unicodeToUtf8(zTemp); - free(zTemp); - }else{ - char *zTemp; - nByte = GetFullPathNameA((char*)zConverted, 0, 0, 0) + 3; - zTemp = malloc( nByte*sizeof(zTemp[0]) ); - if( zTemp==0 ){ - free(zConverted); - return SQLITE_NOMEM; - } - GetFullPathNameA((char*)zConverted, nByte, zTemp, 0); - free(zConverted); - zOut = mbcsToUtf8(zTemp); - free(zTemp); - } - if( zOut ){ - sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zOut); - free(zOut); - return SQLITE_OK; - }else{ - return SQLITE_NOMEM; - } -#endif -} - -#ifndef SQLITE_OMIT_LOAD_EXTENSION -/* -** Interfaces for opening a shared library, finding entry points -** within the shared library, and closing the shared library. -*/ -/* -** Interfaces for opening a shared library, finding entry points -** within the shared library, and closing the shared library. -*/ -static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ - HANDLE h; - void *zConverted = convertUtf8Filename(zFilename); - if( zConverted==0 ){ - return 0; - } - if( isNT() ){ - h = LoadLibraryW((WCHAR*)zConverted); - }else{ -#if OS_WINCE - return 0; -#else - h = LoadLibraryA((char*)zConverted); -#endif - } - free(zConverted); - return (void*)h; -} -static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ - FormatMessage( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - 0, - zBufOut, - nBuf-1, - 0 - ); -} -void *winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol){ -#if OS_WINCE - /* The GetProcAddressA() routine is only available on wince. */ - return GetProcAddressA((HANDLE)pHandle, zSymbol); -#else - /* All other windows platforms expect GetProcAddress() to take - ** an Ansi string regardless of the _UNICODE setting */ - return GetProcAddress((HANDLE)pHandle, zSymbol); -#endif -} -void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ - FreeLibrary((HANDLE)pHandle); -} -#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ - #define winDlOpen 0 - #define winDlError 0 - #define winDlSym 0 - #define winDlClose 0 -#endif - - -/* -** Write up to nBuf bytes of randomness into zBuf. -*/ -static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ - int n = 0; - if( sizeof(SYSTEMTIME)<=nBuf-n ){ - SYSTEMTIME x; - GetSystemTime(&x); - memcpy(&zBuf[n], &x, sizeof(x)); - n += sizeof(x); - } - if( sizeof(DWORD)<=nBuf-n ){ - DWORD pid = GetCurrentProcessId(); - memcpy(&zBuf[n], &pid, sizeof(pid)); - n += sizeof(pid); - } - if( sizeof(DWORD)<=nBuf-n ){ - DWORD cnt = GetTickCount(); - memcpy(&zBuf[n], &cnt, sizeof(cnt)); - n += sizeof(cnt); - } - if( sizeof(LARGE_INTEGER)<=nBuf-n ){ - LARGE_INTEGER i; - QueryPerformanceCounter(&i); - memcpy(&zBuf[n], &i, sizeof(i)); - n += sizeof(i); - } - return n; -} - - -/* -** Sleep for a little while. Return the amount of time slept. -*/ -static int winSleep(sqlite3_vfs *pVfs, int microsec){ - Sleep((microsec+999)/1000); - return ((microsec+999)/1000)*1000; -} - -/* -** The following variable, if set to a non-zero value, becomes the result -** returned from sqlite3OsCurrentTime(). This is used for testing. -*/ -#ifdef SQLITE_TEST -int sqlite3_current_time = 0; -#endif - -/* -** Find the current time (in Universal Coordinated Time). Write the -** current time and date as a Julian Day number into *prNow and -** return 0. Return 1 if the time and date cannot be found. -*/ -int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ - FILETIME ft; - /* FILETIME structure is a 64-bit value representing the number of - 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5). - */ - double now; -#if OS_WINCE - SYSTEMTIME time; - GetSystemTime(&time); - SystemTimeToFileTime(&time,&ft); -#else - GetSystemTimeAsFileTime( &ft ); -#endif - now = ((double)ft.dwHighDateTime) * 4294967296.0; - *prNow = (now + ft.dwLowDateTime)/864000000000.0 + 2305813.5; -#ifdef SQLITE_TEST - if( sqlite3_current_time ){ - *prNow = sqlite3_current_time/86400.0 + 2440587.5; - } -#endif - return 0; -} - - -/* -** Return a pointer to the sqlite3DefaultVfs structure. We use -** a function rather than give the structure global scope because -** some compilers (MSVC) do not allow forward declarations of -** initialized structures. -*/ -sqlite3_vfs *sqlite3OsDefaultVfs(void){ - static sqlite3_vfs winVfs = { - 1, /* iVersion */ - sizeof(winFile), /* szOsFile */ - MAX_PATH, /* mxPathname */ - 0, /* pNext */ - "win32", /* zName */ - 0, /* pAppData */ - - winOpen, /* xOpen */ - winDelete, /* xDelete */ - winAccess, /* xAccess */ - winGetTempname, /* xGetTempName */ - winFullPathname, /* xFullPathname */ - winDlOpen, /* xDlOpen */ - winDlError, /* xDlError */ - winDlSym, /* xDlSym */ - winDlClose, /* xDlClose */ - winRandomness, /* xRandomness */ - winSleep, /* xSleep */ - winCurrentTime /* xCurrentTime */ - }; - - return &winVfs; -} - -#endif /* OS_WIN */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/pager.c b/libraries/sqlite/unix/sqlite-3.5.1/src/pager.c deleted file mode 100644 index b0ad7158bc..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/pager.c +++ /dev/null @@ -1,5104 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the implementation of the page cache subsystem or "pager". -** -** The pager is used to access a database disk file. It implements -** atomic commit and rollback through the use of a journal file that -** is separate from the database file. The pager also implements file -** locking to prevent two processes from writing the same database -** file simultaneously, or one process from reading the database while -** another is writing. -** -** @(#) $Id: pager.c,v 1.392 2007/10/03 15:22:26 danielk1977 Exp $ -*/ -#ifndef SQLITE_OMIT_DISKIO -#include "sqliteInt.h" -#include -#include - -/* -** Macros for troubleshooting. Normally turned off -*/ -#if 0 -#define sqlite3DebugPrintf printf -#define PAGERTRACE1(X) sqlite3DebugPrintf(X) -#define PAGERTRACE2(X,Y) sqlite3DebugPrintf(X,Y) -#define PAGERTRACE3(X,Y,Z) sqlite3DebugPrintf(X,Y,Z) -#define PAGERTRACE4(X,Y,Z,W) sqlite3DebugPrintf(X,Y,Z,W) -#define PAGERTRACE5(X,Y,Z,W,V) sqlite3DebugPrintf(X,Y,Z,W,V) -#else -#define PAGERTRACE1(X) -#define PAGERTRACE2(X,Y) -#define PAGERTRACE3(X,Y,Z) -#define PAGERTRACE4(X,Y,Z,W) -#define PAGERTRACE5(X,Y,Z,W,V) -#endif - -/* -** The following two macros are used within the PAGERTRACEX() macros above -** to print out file-descriptors. -** -** PAGERID() takes a pointer to a Pager struct as it's argument. The -** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file -** struct as it's argument. -*/ -#define PAGERID(p) ((int)(p->fd)) -#define FILEHANDLEID(fd) ((int)fd) - -/* -** The page cache as a whole is always in one of the following -** states: -** -** PAGER_UNLOCK The page cache is not currently reading or -** writing the database file. There is no -** data held in memory. This is the initial -** state. -** -** PAGER_SHARED The page cache is reading the database. -** Writing is not permitted. There can be -** multiple readers accessing the same database -** file at the same time. -** -** PAGER_RESERVED This process has reserved the database for writing -** but has not yet made any changes. Only one process -** at a time can reserve the database. The original -** database file has not been modified so other -** processes may still be reading the on-disk -** database file. -** -** PAGER_EXCLUSIVE The page cache is writing the database. -** Access is exclusive. No other processes or -** threads can be reading or writing while one -** process is writing. -** -** PAGER_SYNCED The pager moves to this state from PAGER_EXCLUSIVE -** after all dirty pages have been written to the -** database file and the file has been synced to -** disk. All that remains to do is to remove or -** truncate the journal file and the transaction -** will be committed. -** -** The page cache comes up in PAGER_UNLOCK. The first time a -** sqlite3PagerGet() occurs, the state transitions to PAGER_SHARED. -** After all pages have been released using sqlite_page_unref(), -** the state transitions back to PAGER_UNLOCK. The first time -** that sqlite3PagerWrite() is called, the state transitions to -** PAGER_RESERVED. (Note that sqlite3PagerWrite() can only be -** called on an outstanding page which means that the pager must -** be in PAGER_SHARED before it transitions to PAGER_RESERVED.) -** PAGER_RESERVED means that there is an open rollback journal. -** The transition to PAGER_EXCLUSIVE occurs before any changes -** are made to the database file, though writes to the rollback -** journal occurs with just PAGER_RESERVED. After an sqlite3PagerRollback() -** or sqlite3PagerCommitPhaseTwo(), the state can go back to PAGER_SHARED, -** or it can stay at PAGER_EXCLUSIVE if we are in exclusive access mode. -*/ -#define PAGER_UNLOCK 0 -#define PAGER_SHARED 1 /* same as SHARED_LOCK */ -#define PAGER_RESERVED 2 /* same as RESERVED_LOCK */ -#define PAGER_EXCLUSIVE 4 /* same as EXCLUSIVE_LOCK */ -#define PAGER_SYNCED 5 - -/* -** If the SQLITE_BUSY_RESERVED_LOCK macro is set to true at compile-time, -** then failed attempts to get a reserved lock will invoke the busy callback. -** This is off by default. To see why, consider the following scenario: -** -** Suppose thread A already has a shared lock and wants a reserved lock. -** Thread B already has a reserved lock and wants an exclusive lock. If -** both threads are using their busy callbacks, it might be a long time -** be for one of the threads give up and allows the other to proceed. -** But if the thread trying to get the reserved lock gives up quickly -** (if it never invokes its busy callback) then the contention will be -** resolved quickly. -*/ -#ifndef SQLITE_BUSY_RESERVED_LOCK -# define SQLITE_BUSY_RESERVED_LOCK 0 -#endif - -/* -** This macro rounds values up so that if the value is an address it -** is guaranteed to be an address that is aligned to an 8-byte boundary. -*/ -#define FORCE_ALIGNMENT(X) (((X)+7)&~7) - -typedef struct PgHdr PgHdr; - -/* -** Each pager stores all currently unreferenced pages in a list sorted -** in least-recently-used (LRU) order (i.e. the first item on the list has -** not been referenced in a long time, the last item has been recently -** used). An instance of this structure is included as part of each -** pager structure for this purpose (variable Pager.lru). -** -** Additionally, if memory-management is enabled, all unreferenced pages -** are stored in a global LRU list (global variable sqlite3LruPageList). -** -** In both cases, the PagerLruList.pFirstSynced variable points to -** the first page in the corresponding list that does not require an -** fsync() operation before it's memory can be reclaimed. If no such -** page exists, PagerLruList.pFirstSynced is set to NULL. -*/ -typedef struct PagerLruList PagerLruList; -struct PagerLruList { - PgHdr *pFirst; /* First page in LRU list */ - PgHdr *pLast; /* Last page in LRU list (the most recently used) */ - PgHdr *pFirstSynced; /* First page in list with PgHdr.needSync==0 */ -}; - -/* -** The following structure contains the next and previous pointers used -** to link a PgHdr structure into a PagerLruList linked list. -*/ -typedef struct PagerLruLink PagerLruLink; -struct PagerLruLink { - PgHdr *pNext; - PgHdr *pPrev; -}; - -/* -** Each in-memory image of a page begins with the following header. -** This header is only visible to this pager module. The client -** code that calls pager sees only the data that follows the header. -** -** Client code should call sqlite3PagerWrite() on a page prior to making -** any modifications to that page. The first time sqlite3PagerWrite() -** is called, the original page contents are written into the rollback -** journal and PgHdr.inJournal and PgHdr.needSync are set. Later, once -** the journal page has made it onto the disk surface, PgHdr.needSync -** is cleared. The modified page cannot be written back into the original -** database file until the journal pages has been synced to disk and the -** PgHdr.needSync has been cleared. -** -** The PgHdr.dirty flag is set when sqlite3PagerWrite() is called and -** is cleared again when the page content is written back to the original -** database file. -** -** Details of important structure elements: -** -** needSync -** -** If this is true, this means that it is not safe to write the page -** content to the database because the original content needed -** for rollback has not by synced to the main rollback journal. -** The original content may have been written to the rollback journal -** but it has not yet been synced. So we cannot write to the database -** file because power failure might cause the page in the journal file -** to never reach the disk. It is as if the write to the journal file -** does not occur until the journal file is synced. -** -** This flag is false if the page content exactly matches what -** currently exists in the database file. The needSync flag is also -** false if the original content has been written to the main rollback -** journal and synced. If the page represents a new page that has -** been added onto the end of the database during the current -** transaction, the needSync flag is true until the original database -** size in the journal header has been synced to disk. -** -** inJournal -** -** This is true if the original page has been written into the main -** rollback journal. This is always false for new pages added to -** the end of the database file during the current transaction. -** And this flag says nothing about whether or not the journal -** has been synced to disk. For pages that are in the original -** database file, the following expression should always be true: -** -** inJournal = (pPager->aInJournal[(pgno-1)/8] & (1<<((pgno-1)%8))!=0 -** -** The pPager->aInJournal[] array is only valid for the original -** pages of the database, not new pages that are added to the end -** of the database, so obviously the above expression cannot be -** valid for new pages. For new pages inJournal is always 0. -** -** dirty -** -** When true, this means that the content of the page has been -** modified and needs to be written back to the database file. -** If false, it means that either the content of the page is -** unchanged or else the content is unimportant and we do not -** care whether or not it is preserved. -** -** alwaysRollback -** -** This means that the sqlite3PagerDontRollback() API should be -** ignored for this page. The DontRollback() API attempts to say -** that the content of the page on disk is unimportant (it is an -** unused page on the freelist) so that it is unnecessary to -** rollback changes to this page because the content of the page -** can change without changing the meaning of the database. This -** flag overrides any DontRollback() attempt. This flag is set -** when a page that originally contained valid data is added to -** the freelist. Later in the same transaction, this page might -** be pulled from the freelist and reused for something different -** and at that point the DontRollback() API will be called because -** pages taken from the freelist do not need to be protected by -** the rollback journal. But this flag says that the page was -** not originally part of the freelist so that it still needs to -** be rolled back in spite of any subsequent DontRollback() calls. -** -** needRead -** -** This flag means (when true) that the content of the page has -** not yet been loaded from disk. The in-memory content is just -** garbage. (Actually, we zero the content, but you should not -** make any assumptions about the content nevertheless.) If the -** content is needed in the future, it should be read from the -** original database file. -*/ -struct PgHdr { - Pager *pPager; /* The pager to which this page belongs */ - Pgno pgno; /* The page number for this page */ - PgHdr *pNextHash, *pPrevHash; /* Hash collision chain for PgHdr.pgno */ - PagerLruLink free; /* Next and previous free pages */ - PgHdr *pNextAll; /* A list of all pages */ - u8 inJournal; /* TRUE if has been written to journal */ - u8 dirty; /* TRUE if we need to write back changes */ - u8 needSync; /* Sync journal before writing this page */ - u8 alwaysRollback; /* Disable DontRollback() for this page */ - u8 needRead; /* Read content if PagerWrite() is called */ - short int nRef; /* Number of users of this page */ - PgHdr *pDirty, *pPrevDirty; /* Dirty pages */ -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - PagerLruLink gfree; /* Global list of nRef==0 pages */ -#endif -#ifdef SQLITE_CHECK_PAGES - u32 pageHash; -#endif - void *pData; /* Page data */ - /* Pager.nExtra bytes of local data appended to this header */ -}; - -/* -** For an in-memory only database, some extra information is recorded about -** each page so that changes can be rolled back. (Journal files are not -** used for in-memory databases.) The following information is added to -** the end of every EXTRA block for in-memory databases. -** -** This information could have been added directly to the PgHdr structure. -** But then it would take up an extra 8 bytes of storage on every PgHdr -** even for disk-based databases. Splitting it out saves 8 bytes. This -** is only a savings of 0.8% but those percentages add up. -*/ -typedef struct PgHistory PgHistory; -struct PgHistory { - u8 *pOrig; /* Original page text. Restore to this on a full rollback */ - u8 *pStmt; /* Text as it was at the beginning of the current statement */ - PgHdr *pNextStmt, *pPrevStmt; /* List of pages in the statement journal */ - u8 inStmt; /* TRUE if in the statement subjournal */ -}; - -/* -** A macro used for invoking the codec if there is one -*/ -#ifdef SQLITE_HAS_CODEC -# define CODEC1(P,D,N,X) if( P->xCodec!=0 ){ P->xCodec(P->pCodecArg,D,N,X); } -# define CODEC2(P,D,N,X) ((char*)(P->xCodec!=0?P->xCodec(P->pCodecArg,D,N,X):D)) -#else -# define CODEC1(P,D,N,X) /* NO-OP */ -# define CODEC2(P,D,N,X) ((char*)D) -#endif - -/* -** Convert a pointer to a PgHdr into a pointer to its data -** and back again. -*/ -#define PGHDR_TO_DATA(P) ((P)->pData) -#define PGHDR_TO_EXTRA(G,P) ((void*)&((G)[1])) -#define PGHDR_TO_HIST(P,PGR) \ - ((PgHistory*)&((char*)(&(P)[1]))[(PGR)->nExtra]) - -/* -** A open page cache is an instance of the following structure. -** -** Pager.errCode may be set to SQLITE_IOERR, SQLITE_CORRUPT, or -** or SQLITE_FULL. Once one of the first three errors occurs, it persists -** and is returned as the result of every major pager API call. The -** SQLITE_FULL return code is slightly different. It persists only until the -** next successful rollback is performed on the pager cache. Also, -** SQLITE_FULL does not affect the sqlite3PagerGet() and sqlite3PagerLookup() -** APIs, they may still be used successfully. -*/ -struct Pager { - sqlite3_vfs *pVfs; /* OS functions to use for IO */ - u8 journalOpen; /* True if journal file descriptors is valid */ - u8 journalStarted; /* True if header of journal is synced */ - u8 useJournal; /* Use a rollback journal on this file */ - u8 noReadlock; /* Do not bother to obtain readlocks */ - u8 stmtOpen; /* True if the statement subjournal is open */ - u8 stmtInUse; /* True we are in a statement subtransaction */ - u8 stmtAutoopen; /* Open stmt journal when main journal is opened*/ - u8 noSync; /* Do not sync the journal if true */ - u8 fullSync; /* Do extra syncs of the journal for robustness */ - u8 sync_flags; /* One of SYNC_NORMAL or SYNC_FULL */ - u8 state; /* PAGER_UNLOCK, _SHARED, _RESERVED, etc. */ - u8 tempFile; /* zFilename is a temporary file */ - u8 readOnly; /* True for a read-only database */ - u8 needSync; /* True if an fsync() is needed on the journal */ - u8 dirtyCache; /* True if cached pages have changed */ - u8 alwaysRollback; /* Disable DontRollback() for all pages */ - u8 memDb; /* True to inhibit all file I/O */ - u8 setMaster; /* True if a m-j name has been written to jrnl */ - u8 doNotSync; /* Boolean. While true, do not spill the cache */ - u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ - u8 changeCountDone; /* Set after incrementing the change-counter */ - u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ - int errCode; /* One of several kinds of errors */ - int dbSize; /* Number of pages in the file */ - int origDbSize; /* dbSize before the current change */ - int stmtSize; /* Size of database (in pages) at stmt_begin() */ - int nRec; /* Number of pages written to the journal */ - u32 cksumInit; /* Quasi-random value added to every checksum */ - int stmtNRec; /* Number of records in stmt subjournal */ - int nExtra; /* Add this many bytes to each in-memory page */ - int pageSize; /* Number of bytes in a page */ - int nPage; /* Total number of in-memory pages */ - int nRef; /* Number of in-memory pages with PgHdr.nRef>0 */ - int mxPage; /* Maximum number of pages to hold in cache */ - Pgno mxPgno; /* Maximum allowed size of the database */ - u8 *aInJournal; /* One bit for each page in the database file */ - u8 *aInStmt; /* One bit for each page in the database */ - char *zFilename; /* Name of the database file */ - char *zJournal; /* Name of the journal file */ - char *zDirectory; /* Directory hold database and journal files */ - char *zStmtJrnl; /* Name of the statement journal file */ - sqlite3_file *fd, *jfd; /* File descriptors for database and journal */ - sqlite3_file *stfd; /* File descriptor for the statement subjournal*/ - BusyHandler *pBusyHandler; /* Pointer to sqlite.busyHandler */ - PagerLruList lru; /* LRU list of free pages */ - PgHdr *pAll; /* List of all pages */ - PgHdr *pStmt; /* List of pages in the statement subjournal */ - PgHdr *pDirty; /* List of all dirty pages */ - i64 journalOff; /* Current byte offset in the journal file */ - i64 journalHdr; /* Byte offset to previous journal header */ - i64 stmtHdrOff; /* First journal header written this statement */ - i64 stmtCksum; /* cksumInit when statement was started */ - i64 stmtJSize; /* Size of journal at stmt_begin() */ - int sectorSize; /* Assumed sector size during rollback */ -#ifdef SQLITE_TEST - int nHit, nMiss; /* Cache hits and missing */ - int nRead, nWrite; /* Database pages read/written */ -#endif - void (*xDestructor)(DbPage*,int); /* Call this routine when freeing pages */ - void (*xReiniter)(DbPage*,int); /* Call this routine when reloading pages */ -#ifdef SQLITE_HAS_CODEC - void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ - void *pCodecArg; /* First argument to xCodec() */ -#endif - int nHash; /* Size of the pager hash table */ - PgHdr **aHash; /* Hash table to map page number to PgHdr */ -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - Pager *pNext; /* Doubly linked list of pagers on which */ - Pager *pPrev; /* sqlite3_release_memory() will work */ - int iInUseMM; /* Non-zero if unavailable to MM */ - int iInUseDB; /* Non-zero if in sqlite3_release_memory() */ -#endif - char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ - char dbFileVers[16]; /* Changes whenever database file changes */ -}; - -/* -** The following global variables hold counters used for -** testing purposes only. These variables do not exist in -** a non-testing build. These variables are not thread-safe. -*/ -#ifdef SQLITE_TEST -int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ -int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ -int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ -int sqlite3_pager_pgfree_count = 0; /* Number of cache pages freed */ -# define PAGER_INCR(v) v++ -#else -# define PAGER_INCR(v) -#endif - -/* -** The following variable points to the head of a double-linked list -** of all pagers that are eligible for page stealing by the -** sqlite3_release_memory() interface. Access to this list is -** protected by the SQLITE_MUTEX_STATIC_MEM2 mutex. -*/ -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -static Pager *sqlite3PagerList = 0; -static PagerLruList sqlite3LruPageList = {0, 0, 0}; -#endif - - -/* -** Journal files begin with the following magic string. The data -** was obtained from /dev/random. It is used only as a sanity check. -** -** Since version 2.8.0, the journal format contains additional sanity -** checking information. If the power fails while the journal is begin -** written, semi-random garbage data might appear in the journal -** file after power is restored. If an attempt is then made -** to roll the journal back, the database could be corrupted. The additional -** sanity checking data is an attempt to discover the garbage in the -** journal and ignore it. -** -** The sanity checking information for the new journal format consists -** of a 32-bit checksum on each page of data. The checksum covers both -** the page number and the pPager->pageSize bytes of data for the page. -** This cksum is initialized to a 32-bit random value that appears in the -** journal file right after the header. The random initializer is important, -** because garbage data that appears at the end of a journal is likely -** data that was once in other files that have now been deleted. If the -** garbage data came from an obsolete journal file, the checksums might -** be correct. But by initializing the checksum to random value which -** is different for every journal, we minimize that risk. -*/ -static const unsigned char aJournalMagic[] = { - 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7, -}; - -/* -** The size of the header and of each page in the journal is determined -** by the following macros. -*/ -#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) - -/* -** The journal header size for this pager. In the future, this could be -** set to some value read from the disk controller. The important -** characteristic is that it is the same size as a disk sector. -*/ -#define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) - -/* -** The macro MEMDB is true if we are dealing with an in-memory database. -** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set, -** the value of MEMDB will be a constant and the compiler will optimize -** out code that would never execute. -*/ -#ifdef SQLITE_OMIT_MEMORYDB -# define MEMDB 0 -#else -# define MEMDB pPager->memDb -#endif - -/* -** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is -** reserved for working around a windows/posix incompatibility). It is -** used in the journal to signify that the remainder of the journal file -** is devoted to storing a master journal name - there are no more pages to -** roll back. See comments for function writeMasterJournal() for details. -*/ -/* #define PAGER_MJ_PGNO(x) (PENDING_BYTE/((x)->pageSize)) */ -#define PAGER_MJ_PGNO(x) ((PENDING_BYTE/((x)->pageSize))+1) - -/* -** The maximum legal page number is (2^31 - 1). -*/ -#define PAGER_MAX_PGNO 2147483647 - -/* -** The pagerEnter() and pagerLeave() routines acquire and release -** a mutex on each pager. The mutex is recursive. -** -** This is a special-purpose mutex. It only provides mutual exclusion -** between the Btree and the Memory Management sqlite3_release_memory() -** function. It does not prevent, for example, two Btrees from accessing -** the same pager at the same time. Other general-purpose mutexes in -** the btree layer handle that chore. -*/ -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - static void pagerEnter(Pager *p){ - p->iInUseDB++; - if( p->iInUseMM && p->iInUseDB==1 ){ - sqlite3_mutex *mutex; - mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); - p->iInUseDB = 0; - sqlite3_mutex_enter(mutex); - p->iInUseDB = 1; - sqlite3_mutex_leave(mutex); - } - assert( p->iInUseMM==0 ); - } - static void pagerLeave(Pager *p){ - p->iInUseDB--; - assert( p->iInUseDB>=0 ); - } -#else -# define pagerEnter(X) -# define pagerLeave(X) -#endif - -/* -** Enable reference count tracking (for debugging) here: -*/ -#ifdef SQLITE_DEBUG - int pager3_refinfo_enable = 0; - static void pager_refinfo(PgHdr *p){ - static int cnt = 0; - if( !pager3_refinfo_enable ) return; - sqlite3DebugPrintf( - "REFCNT: %4d addr=%p nRef=%-3d total=%d\n", - p->pgno, PGHDR_TO_DATA(p), p->nRef, p->pPager->nRef - ); - cnt++; /* Something to set a breakpoint on */ - } -# define REFINFO(X) pager_refinfo(X) -#else -# define REFINFO(X) -#endif - -/* -** Add page pPg to the end of the linked list managed by structure -** pList (pPg becomes the last entry in the list - the most recently -** used). Argument pLink should point to either pPg->free or pPg->gfree, -** depending on whether pPg is being added to the pager-specific or -** global LRU list. -*/ -static void listAdd(PagerLruList *pList, PagerLruLink *pLink, PgHdr *pPg){ - pLink->pNext = 0; - pLink->pPrev = pList->pLast; - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - assert(pLink==&pPg->free || pLink==&pPg->gfree); - assert(pLink==&pPg->gfree || pList!=&sqlite3LruPageList); -#endif - - if( pList->pLast ){ - int iOff = (char *)pLink - (char *)pPg; - PagerLruLink *pLastLink = (PagerLruLink *)(&((u8 *)pList->pLast)[iOff]); - pLastLink->pNext = pPg; - }else{ - assert(!pList->pFirst); - pList->pFirst = pPg; - } - - pList->pLast = pPg; - if( !pList->pFirstSynced && pPg->needSync==0 ){ - pList->pFirstSynced = pPg; - } -} - -/* -** Remove pPg from the list managed by the structure pointed to by pList. -** -** Argument pLink should point to either pPg->free or pPg->gfree, depending -** on whether pPg is being added to the pager-specific or global LRU list. -*/ -static void listRemove(PagerLruList *pList, PagerLruLink *pLink, PgHdr *pPg){ - int iOff = (char *)pLink - (char *)pPg; - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - assert(pLink==&pPg->free || pLink==&pPg->gfree); - assert(pLink==&pPg->gfree || pList!=&sqlite3LruPageList); -#endif - - if( pPg==pList->pFirst ){ - pList->pFirst = pLink->pNext; - } - if( pPg==pList->pLast ){ - pList->pLast = pLink->pPrev; - } - if( pLink->pPrev ){ - PagerLruLink *pPrevLink = (PagerLruLink *)(&((u8 *)pLink->pPrev)[iOff]); - pPrevLink->pNext = pLink->pNext; - } - if( pLink->pNext ){ - PagerLruLink *pNextLink = (PagerLruLink *)(&((u8 *)pLink->pNext)[iOff]); - pNextLink->pPrev = pLink->pPrev; - } - if( pPg==pList->pFirstSynced ){ - PgHdr *p = pLink->pNext; - while( p && p->needSync ){ - PagerLruLink *pL = (PagerLruLink *)(&((u8 *)p)[iOff]); - p = pL->pNext; - } - pList->pFirstSynced = p; - } - - pLink->pNext = pLink->pPrev = 0; -} - -/* -** Add page pPg to the list of free pages for the pager. If -** memory-management is enabled, also add the page to the global -** list of free pages. -*/ -static void lruListAdd(PgHdr *pPg){ - listAdd(&pPg->pPager->lru, &pPg->free, pPg); -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - if( !pPg->pPager->memDb ){ - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - listAdd(&sqlite3LruPageList, &pPg->gfree, pPg); - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - } -#endif -} - -/* -** Remove page pPg from the list of free pages for the associated pager. -** If memory-management is enabled, also remove pPg from the global list -** of free pages. -*/ -static void lruListRemove(PgHdr *pPg){ - listRemove(&pPg->pPager->lru, &pPg->free, pPg); -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - if( !pPg->pPager->memDb ){ - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - listRemove(&sqlite3LruPageList, &pPg->gfree, pPg); - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - } -#endif -} - -/* -** This function is called just after the needSync flag has been cleared -** from all pages managed by pPager (usually because the journal file -** has just been synced). It updates the pPager->lru.pFirstSynced variable -** and, if memory-management is enabled, the sqlite3LruPageList.pFirstSynced -** variable also. -*/ -static void lruListSetFirstSynced(Pager *pPager){ - pPager->lru.pFirstSynced = pPager->lru.pFirst; -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - if( !pPager->memDb ){ - PgHdr *p; - sqlite3_mutex_enter(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - for(p=sqlite3LruPageList.pFirst; p && p->needSync; p=p->gfree.pNext); - assert(p==pPager->lru.pFirstSynced || p==sqlite3LruPageList.pFirstSynced); - sqlite3LruPageList.pFirstSynced = p; - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - } -#endif -} - -/* -** Return true if page *pPg has already been written to the statement -** journal (or statement snapshot has been created, if *pPg is part -** of an in-memory database). -*/ -static int pageInStatement(PgHdr *pPg){ - Pager *pPager = pPg->pPager; - if( MEMDB ){ - return PGHDR_TO_HIST(pPg, pPager)->inStmt; - }else{ - Pgno pgno = pPg->pgno; - u8 *a = pPager->aInStmt; - return (a && (int)pgno<=pPager->stmtSize && (a[pgno/8] & (1<<(pgno&7)))); - } -} - -/* -** Change the size of the pager hash table to N. N must be a power -** of two. -*/ -static void pager_resize_hash_table(Pager *pPager, int N){ - PgHdr **aHash, *pPg; - assert( N>0 && (N&(N-1))==0 ); - pagerLeave(pPager); - sqlite3MallocBenignFailure((int)pPager->aHash); - aHash = sqlite3MallocZero( sizeof(aHash[0])*N ); - pagerEnter(pPager); - if( aHash==0 ){ - /* Failure to rehash is not an error. It is only a performance hit. */ - return; - } - sqlite3_free(pPager->aHash); - pPager->nHash = N; - pPager->aHash = aHash; - for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ - int h; - if( pPg->pgno==0 ){ - assert( pPg->pNextHash==0 && pPg->pPrevHash==0 ); - continue; - } - h = pPg->pgno & (N-1); - pPg->pNextHash = aHash[h]; - if( aHash[h] ){ - aHash[h]->pPrevHash = pPg; - } - aHash[h] = pPg; - pPg->pPrevHash = 0; - } -} - -/* -** Read a 32-bit integer from the given file descriptor. Store the integer -** that is read in *pRes. Return SQLITE_OK if everything worked, or an -** error code is something goes wrong. -** -** All values are stored on disk as big-endian. -*/ -static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ - unsigned char ac[4]; - int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset); - if( rc==SQLITE_OK ){ - *pRes = sqlite3Get4byte(ac); - } - return rc; -} - -/* -** Write a 32-bit integer into a string buffer in big-endian byte order. -*/ -#define put32bits(A,B) sqlite3Put4byte((u8*)A,B) - -/* -** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK -** on success or an error code is something goes wrong. -*/ -static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ - char ac[4]; - put32bits(ac, val); - return sqlite3OsWrite(fd, ac, 4, offset); -} - -/* -** If file pFd is open, call sqlite3OsUnlock() on it. -*/ -static int osUnlock(sqlite3_file *pFd, int eLock){ - if( !pFd->pMethods ){ - return SQLITE_OK; - } - return sqlite3OsUnlock(pFd, eLock); -} - -/* -** This function determines whether or not the atomic-write optimization -** can be used with this pager. The optimization can be used if: -** -** (a) the value returned by OsDeviceCharacteristics() indicates that -** a database page may be written atomically, and -** (b) the value returned by OsSectorSize() is less than or equal -** to the page size. -** -** If the optimization cannot be used, 0 is returned. If it can be used, -** then the value returned is the size of the journal file when it -** contains rollback data for exactly one page. -*/ -#ifdef SQLITE_ENABLE_ATOMIC_WRITE -static int jrnlBufferSize(Pager *pPager){ - int dc; /* Device characteristics */ - int nSector; /* Sector size */ - int nPage; /* Page size */ - sqlite3_file *fd = pPager->fd; - - if( fd->pMethods ){ - dc = sqlite3OsDeviceCharacteristics(fd); - nSector = sqlite3OsSectorSize(fd); - nPage = pPager->pageSize; - } - - assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); - assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); - - if( !fd->pMethods || (dc&(SQLITE_IOCAP_ATOMIC|(nPage>>8))&&nSector<=nPage) ){ - return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); - } - return 0; -} -#endif - -/* -** This function should be called when an error occurs within the pager -** code. The first argument is a pointer to the pager structure, the -** second the error-code about to be returned by a pager API function. -** The value returned is a copy of the second argument to this function. -** -** If the second argument is SQLITE_IOERR, SQLITE_CORRUPT, or SQLITE_FULL -** the error becomes persistent. Until the persisten error is cleared, -** subsequent API calls on this Pager will immediately return the same -** error code. -** -** A persistent error indicates that the contents of the pager-cache -** cannot be trusted. This state can be cleared by completely discarding -** the contents of the pager-cache. If a transaction was active when -** the persistent error occured, then the rollback journal may need -** to be replayed. -*/ -static void pager_unlock(Pager *pPager); -static int pager_error(Pager *pPager, int rc){ - int rc2 = rc & 0xff; - assert( - pPager->errCode==SQLITE_FULL || - pPager->errCode==SQLITE_OK || - (pPager->errCode & 0xff)==SQLITE_IOERR - ); - if( - rc2==SQLITE_FULL || - rc2==SQLITE_IOERR || - rc2==SQLITE_CORRUPT - ){ - pPager->errCode = rc; - if( pPager->state==PAGER_UNLOCK && pPager->nRef==0 ){ - /* If the pager is already unlocked, call pager_unlock() now to - ** clear the error state and ensure that the pager-cache is - ** completely empty. - */ - pager_unlock(pPager); - } - } - return rc; -} - -/* -** If SQLITE_CHECK_PAGES is defined then we do some sanity checking -** on the cache using a hash function. This is used for testing -** and debugging only. -*/ -#ifdef SQLITE_CHECK_PAGES -/* -** Return a 32-bit hash of the page data for pPage. -*/ -static u32 pager_datahash(int nByte, unsigned char *pData){ - u32 hash = 0; - int i; - for(i=0; ipPager->pageSize, - (unsigned char *)PGHDR_TO_DATA(pPage)); -} - -/* -** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES -** is defined, and NDEBUG is not defined, an assert() statement checks -** that the page is either dirty or still matches the calculated page-hash. -*/ -#define CHECK_PAGE(x) checkPage(x) -static void checkPage(PgHdr *pPg){ - Pager *pPager = pPg->pPager; - assert( !pPg->pageHash || pPager->errCode || MEMDB || pPg->dirty || - pPg->pageHash==pager_pagehash(pPg) ); -} - -#else -#define pager_datahash(X,Y) 0 -#define pager_pagehash(X) 0 -#define CHECK_PAGE(x) -#endif - -/* -** When this is called the journal file for pager pPager must be open. -** The master journal file name is read from the end of the file and -** written into memory supplied by the caller. -** -** zMaster must point to a buffer of at least nMaster bytes allocated by -** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is -** enough space to write the master journal name). If the master journal -** name in the journal is longer than nMaster bytes (including a -** nul-terminator), then this is handled as if no master journal name -** were present in the journal. -** -** If no master journal file name is present zMaster[0] is set to 0 and -** SQLITE_OK returned. -*/ -static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, int nMaster){ - int rc; - u32 len; - i64 szJ; - u32 cksum; - int i; - unsigned char aMagic[8]; /* A buffer to hold the magic header */ - - zMaster[0] = '\0'; - - rc = sqlite3OsFileSize(pJrnl, &szJ); - if( rc!=SQLITE_OK || szJ<16 ) return rc; - - rc = read32bits(pJrnl, szJ-16, &len); - if( rc!=SQLITE_OK ) return rc; - - if( len>=nMaster ){ - return SQLITE_OK; - } - - rc = read32bits(pJrnl, szJ-12, &cksum); - if( rc!=SQLITE_OK ) return rc; - - rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8); - if( rc!=SQLITE_OK || memcmp(aMagic, aJournalMagic, 8) ) return rc; - - rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len); - if( rc!=SQLITE_OK ){ - return rc; - } - zMaster[len] = '\0'; - - /* See if the checksum matches the master journal name */ - for(i=0; ijournalOff; - if( c ){ - offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); - } - assert( offset%JOURNAL_HDR_SZ(pPager)==0 ); - assert( offset>=c ); - assert( (offset-c)journalOff = offset; -} - -/* -** The journal file must be open when this routine is called. A journal -** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the -** current location. -** -** The format for the journal header is as follows: -** - 8 bytes: Magic identifying journal format. -** - 4 bytes: Number of records in journal, or -1 no-sync mode is on. -** - 4 bytes: Random number used for page hash. -** - 4 bytes: Initial database page count. -** - 4 bytes: Sector size used by the process that wrote this journal. -** -** Followed by (JOURNAL_HDR_SZ - 24) bytes of unused space. -*/ -static int writeJournalHdr(Pager *pPager){ - char zHeader[sizeof(aJournalMagic)+16]; - int rc; - - if( pPager->stmtHdrOff==0 ){ - pPager->stmtHdrOff = pPager->journalOff; - } - - seekJournalHdr(pPager); - pPager->journalHdr = pPager->journalOff; - - memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); - - /* - ** Write the nRec Field - the number of page records that follow this - ** journal header. Normally, zero is written to this value at this time. - ** After the records are added to the journal (and the journal synced, - ** if in full-sync mode), the zero is overwritten with the true number - ** of records (see syncJournal()). - ** - ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When - ** reading the journal this value tells SQLite to assume that the - ** rest of the journal file contains valid page records. This assumption - ** is dangerous, as if a failure occured whilst writing to the journal - ** file it may contain some garbage data. There are two scenarios - ** where this risk can be ignored: - ** - ** * When the pager is in no-sync mode. Corruption can follow a - ** power failure in this case anyway. - ** - ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees - ** that garbage data is never appended to the journal file. - */ - assert(pPager->fd->pMethods||pPager->noSync); - if( (pPager->noSync) - || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) - ){ - put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); - }else{ - put32bits(&zHeader[sizeof(aJournalMagic)], 0); - } - - /* The random check-hash initialiser */ - sqlite3Randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); - put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); - /* The initial database size */ - put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbSize); - /* The assumed sector size for this process */ - put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); - IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, sizeof(zHeader))) - rc = sqlite3OsWrite(pPager->jfd, zHeader, sizeof(zHeader),pPager->journalOff); - pPager->journalOff += JOURNAL_HDR_SZ(pPager); - - /* The journal header has been written successfully. Seek the journal - ** file descriptor to the end of the journal header sector. - */ - if( rc==SQLITE_OK ){ - IOTRACE(("JTAIL %p %lld\n", pPager, pPager->journalOff-1)) - rc = sqlite3OsWrite(pPager->jfd, "\000", 1, pPager->journalOff-1); - } - return rc; -} - -/* -** The journal file must be open when this is called. A journal header file -** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal -** file. See comments above function writeJournalHdr() for a description of -** the journal header format. -** -** If the header is read successfully, *nRec is set to the number of -** page records following this header and *dbSize is set to the size of the -** database before the transaction began, in pages. Also, pPager->cksumInit -** is set to the value read from the journal header. SQLITE_OK is returned -** in this case. -** -** If the journal header file appears to be corrupted, SQLITE_DONE is -** returned and *nRec and *dbSize are not set. If JOURNAL_HDR_SZ bytes -** cannot be read from the journal file an error code is returned. -*/ -static int readJournalHdr( - Pager *pPager, - i64 journalSize, - u32 *pNRec, - u32 *pDbSize -){ - int rc; - unsigned char aMagic[8]; /* A buffer to hold the magic header */ - i64 jrnlOff; - - seekJournalHdr(pPager); - if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ - return SQLITE_DONE; - } - jrnlOff = pPager->journalOff; - - rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), jrnlOff); - if( rc ) return rc; - jrnlOff += sizeof(aMagic); - - if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){ - return SQLITE_DONE; - } - - rc = read32bits(pPager->jfd, jrnlOff, pNRec); - if( rc ) return rc; - - rc = read32bits(pPager->jfd, jrnlOff+4, &pPager->cksumInit); - if( rc ) return rc; - - rc = read32bits(pPager->jfd, jrnlOff+8, pDbSize); - if( rc ) return rc; - - /* Update the assumed sector-size to match the value used by - ** the process that created this journal. If this journal was - ** created by a process other than this one, then this routine - ** is being called from within pager_playback(). The local value - ** of Pager.sectorSize is restored at the end of that routine. - */ - rc = read32bits(pPager->jfd, jrnlOff+12, (u32 *)&pPager->sectorSize); - if( rc ) return rc; - - pPager->journalOff += JOURNAL_HDR_SZ(pPager); - return SQLITE_OK; -} - - -/* -** Write the supplied master journal name into the journal file for pager -** pPager at the current location. The master journal name must be the last -** thing written to a journal file. If the pager is in full-sync mode, the -** journal file descriptor is advanced to the next sector boundary before -** anything is written. The format is: -** -** + 4 bytes: PAGER_MJ_PGNO. -** + N bytes: length of master journal name. -** + 4 bytes: N -** + 4 bytes: Master journal name checksum. -** + 8 bytes: aJournalMagic[]. -** -** The master journal page checksum is the sum of the bytes in the master -** journal name. -** -** If zMaster is a NULL pointer (occurs for a single database transaction), -** this call is a no-op. -*/ -static int writeMasterJournal(Pager *pPager, const char *zMaster){ - int rc; - int len; - int i; - i64 jrnlOff; - u32 cksum = 0; - char zBuf[sizeof(aJournalMagic)+2*4]; - - if( !zMaster || pPager->setMaster) return SQLITE_OK; - pPager->setMaster = 1; - - len = strlen(zMaster); - for(i=0; ifullSync ){ - seekJournalHdr(pPager); - } - jrnlOff = pPager->journalOff; - pPager->journalOff += (len+20); - - rc = write32bits(pPager->jfd, jrnlOff, PAGER_MJ_PGNO(pPager)); - if( rc!=SQLITE_OK ) return rc; - jrnlOff += 4; - - rc = sqlite3OsWrite(pPager->jfd, zMaster, len, jrnlOff); - if( rc!=SQLITE_OK ) return rc; - jrnlOff += len; - - put32bits(zBuf, len); - put32bits(&zBuf[4], cksum); - memcpy(&zBuf[8], aJournalMagic, sizeof(aJournalMagic)); - rc = sqlite3OsWrite(pPager->jfd, zBuf, 8+sizeof(aJournalMagic), jrnlOff); - pPager->needSync = !pPager->noSync; - return rc; -} - -/* -** Add or remove a page from the list of all pages that are in the -** statement journal. -** -** The Pager keeps a separate list of pages that are currently in -** the statement journal. This helps the sqlite3PagerStmtCommit() -** routine run MUCH faster for the common case where there are many -** pages in memory but only a few are in the statement journal. -*/ -static void page_add_to_stmt_list(PgHdr *pPg){ - Pager *pPager = pPg->pPager; - PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); - assert( MEMDB ); - if( !pHist->inStmt ){ - assert( pHist->pPrevStmt==0 && pHist->pNextStmt==0 ); - if( pPager->pStmt ){ - PGHDR_TO_HIST(pPager->pStmt, pPager)->pPrevStmt = pPg; - } - pHist->pNextStmt = pPager->pStmt; - pPager->pStmt = pPg; - pHist->inStmt = 1; - } -} - -/* -** Find a page in the hash table given its page number. Return -** a pointer to the page or NULL if not found. -*/ -static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){ - PgHdr *p; - if( pPager->aHash==0 ) return 0; - p = pPager->aHash[pgno & (pPager->nHash-1)]; - while( p && p->pgno!=pgno ){ - p = p->pNextHash; - } - return p; -} - -/* -** Clear the in-memory cache. This routine -** sets the state of the pager back to what it was when it was first -** opened. Any outstanding pages are invalidated and subsequent attempts -** to access those pages will likely result in a coredump. -*/ -static void pager_reset(Pager *pPager){ - PgHdr *pPg, *pNext; - if( pPager->errCode ) return; - for(pPg=pPager->pAll; pPg; pPg=pNext){ - IOTRACE(("PGFREE %p %d\n", pPager, pPg->pgno)); - PAGER_INCR(sqlite3_pager_pgfree_count); - pNext = pPg->pNextAll; - lruListRemove(pPg); - sqlite3_free(pPg->pData); - sqlite3_free(pPg); - } - assert(pPager->lru.pFirst==0); - assert(pPager->lru.pFirstSynced==0); - assert(pPager->lru.pLast==0); - pPager->pStmt = 0; - pPager->pAll = 0; - pPager->pDirty = 0; - pPager->nHash = 0; - sqlite3_free(pPager->aHash); - pPager->nPage = 0; - pPager->aHash = 0; - pPager->nRef = 0; -} - -/* -** Unlock the database file. -** -** If the pager is currently in error state, discard the contents of -** the cache and reset the Pager structure internal state. If there is -** an open journal-file, then the next time a shared-lock is obtained -** on the pager file (by this or any other process), it will be -** treated as a hot-journal and rolled back. -*/ -static void pager_unlock(Pager *pPager){ - if( !pPager->exclusiveMode ){ - if( !MEMDB ){ - if( pPager->fd->pMethods ){ - osUnlock(pPager->fd, NO_LOCK); - } - pPager->dbSize = -1; - IOTRACE(("UNLOCK %p\n", pPager)) - - /* If Pager.errCode is set, the contents of the pager cache cannot be - ** trusted. Now that the pager file is unlocked, the contents of the - ** cache can be discarded and the error code safely cleared. - */ - if( pPager->errCode ){ - pPager->errCode = SQLITE_OK; - pager_reset(pPager); - if( pPager->stmtOpen ){ - sqlite3OsClose(pPager->stfd); - sqlite3_free(pPager->aInStmt); - pPager->aInStmt = 0; - } - if( pPager->journalOpen ){ - sqlite3OsClose(pPager->jfd); - pPager->journalOpen = 0; - sqlite3_free(pPager->aInJournal); - pPager->aInJournal = 0; - } - pPager->stmtOpen = 0; - pPager->stmtInUse = 0; - pPager->journalOff = 0; - pPager->journalStarted = 0; - pPager->stmtAutoopen = 0; - pPager->origDbSize = 0; - } - } - - if( !MEMDB || pPager->errCode==SQLITE_OK ){ - pPager->state = PAGER_UNLOCK; - pPager->changeCountDone = 0; - } - } -} - -/* -** Execute a rollback if a transaction is active and unlock the -** database file. If the pager has already entered the error state, -** do not attempt the rollback. -*/ -static void pagerUnlockAndRollback(Pager *p){ - assert( p->state>=PAGER_RESERVED || p->journalOpen==0 ); - if( p->errCode==SQLITE_OK && p->state>=PAGER_RESERVED ){ - sqlite3PagerRollback(p); - } - pager_unlock(p); - assert( p->errCode || !p->journalOpen || (p->exclusiveMode&&!p->journalOff) ); - assert( p->errCode || !p->stmtOpen || p->exclusiveMode ); -} - -/* -** This routine ends a transaction. A transaction is ended by either -** a COMMIT or a ROLLBACK. -** -** When this routine is called, the pager has the journal file open and -** a RESERVED or EXCLUSIVE lock on the database. This routine will release -** the database lock and acquires a SHARED lock in its place if that is -** the appropriate thing to do. Release locks usually is appropriate, -** unless we are in exclusive access mode or unless this is a -** COMMIT AND BEGIN or ROLLBACK AND BEGIN operation. -** -** The journal file is either deleted or truncated. -** -** TODO: Consider keeping the journal file open for temporary databases. -** This might give a performance improvement on windows where opening -** a file is an expensive operation. -*/ -static int pager_end_transaction(Pager *pPager){ - PgHdr *pPg; - int rc = SQLITE_OK; - int rc2 = SQLITE_OK; - assert( !MEMDB ); - if( pPager->statestmtOpen && !pPager->exclusiveMode ){ - sqlite3OsClose(pPager->stfd); - pPager->stmtOpen = 0; - } - if( pPager->journalOpen ){ - if( pPager->exclusiveMode - && (rc = sqlite3OsTruncate(pPager->jfd, 0))==SQLITE_OK ){; - pPager->journalOff = 0; - pPager->journalStarted = 0; - }else{ - sqlite3OsClose(pPager->jfd); - pPager->journalOpen = 0; - if( rc==SQLITE_OK ){ - rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); - } - } - sqlite3_free( pPager->aInJournal ); - pPager->aInJournal = 0; - for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ - pPg->inJournal = 0; - pPg->dirty = 0; - pPg->needSync = 0; - pPg->alwaysRollback = 0; -#ifdef SQLITE_CHECK_PAGES - pPg->pageHash = pager_pagehash(pPg); -#endif - } - pPager->pDirty = 0; - pPager->dirtyCache = 0; - pPager->nRec = 0; - }else{ - assert( pPager->aInJournal==0 ); - assert( pPager->dirtyCache==0 || pPager->useJournal==0 ); - } - - if( !pPager->exclusiveMode ){ - rc2 = osUnlock(pPager->fd, SHARED_LOCK); - pPager->state = PAGER_SHARED; - }else if( pPager->state==PAGER_SYNCED ){ - pPager->state = PAGER_EXCLUSIVE; - } - pPager->origDbSize = 0; - pPager->setMaster = 0; - pPager->needSync = 0; - lruListSetFirstSynced(pPager); - pPager->dbSize = -1; - - return (rc==SQLITE_OK?rc2:rc); -} - -/* -** Compute and return a checksum for the page of data. -** -** This is not a real checksum. It is really just the sum of the -** random initial value and the page number. We experimented with -** a checksum of the entire data, but that was found to be too slow. -** -** Note that the page number is stored at the beginning of data and -** the checksum is stored at the end. This is important. If journal -** corruption occurs due to a power failure, the most likely scenario -** is that one end or the other of the record will be changed. It is -** much less likely that the two ends of the journal record will be -** correct and the middle be corrupt. Thus, this "checksum" scheme, -** though fast and simple, catches the mostly likely kind of corruption. -** -** FIX ME: Consider adding every 200th (or so) byte of the data to the -** checksum. That way if a single page spans 3 or more disk sectors and -** only the middle sector is corrupt, we will still have a reasonable -** chance of failing the checksum and thus detecting the problem. -*/ -static u32 pager_cksum(Pager *pPager, const u8 *aData){ - u32 cksum = pPager->cksumInit; - int i = pPager->pageSize-200; - while( i>0 ){ - cksum += aData[i]; - i -= 200; - } - return cksum; -} - -/* Forward declaration */ -static void makeClean(PgHdr*); - -/* -** Read a single page from the journal file opened on file descriptor -** jfd. Playback this one page. -** -** If useCksum==0 it means this journal does not use checksums. Checksums -** are not used in statement journals because statement journals do not -** need to survive power failures. -*/ -static int pager_playback_one_page( - Pager *pPager, - sqlite3_file *jfd, - i64 offset, - int useCksum -){ - int rc; - PgHdr *pPg; /* An existing page in the cache */ - Pgno pgno; /* The page number of a page in journal */ - u32 cksum; /* Checksum used for sanity checking */ - u8 *aData = (u8 *)pPager->pTmpSpace; /* Temp storage for a page */ - - /* useCksum should be true for the main journal and false for - ** statement journals. Verify that this is always the case - */ - assert( jfd == (useCksum ? pPager->jfd : pPager->stfd) ); - assert( aData ); - - rc = read32bits(jfd, offset, &pgno); - if( rc!=SQLITE_OK ) return rc; - rc = sqlite3OsRead(jfd, aData, pPager->pageSize, offset+4); - if( rc!=SQLITE_OK ) return rc; - pPager->journalOff += pPager->pageSize + 4; - - /* Sanity checking on the page. This is more important that I originally - ** thought. If a power failure occurs while the journal is being written, - ** it could cause invalid data to be written into the journal. We need to - ** detect this invalid data (with high probability) and ignore it. - */ - if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ - return SQLITE_DONE; - } - if( pgno>(unsigned)pPager->dbSize ){ - return SQLITE_OK; - } - if( useCksum ){ - rc = read32bits(jfd, offset+pPager->pageSize+4, &cksum); - if( rc ) return rc; - pPager->journalOff += 4; - if( pager_cksum(pPager, aData)!=cksum ){ - return SQLITE_DONE; - } - } - - assert( pPager->state==PAGER_RESERVED || pPager->state>=PAGER_EXCLUSIVE ); - - /* If the pager is in RESERVED state, then there must be a copy of this - ** page in the pager cache. In this case just update the pager cache, - ** not the database file. The page is left marked dirty in this case. - ** - ** An exception to the above rule: If the database is in no-sync mode - ** and a page is moved during an incremental vacuum then the page may - ** not be in the pager cache. Later: if a malloc() or IO error occurs - ** during a Movepage() call, then the page may not be in the cache - ** either. So the condition described in the above paragraph is not - ** assert()able. - ** - ** If in EXCLUSIVE state, then we update the pager cache if it exists - ** and the main file. The page is then marked not dirty. - ** - ** Ticket #1171: The statement journal might contain page content that is - ** different from the page content at the start of the transaction. - ** This occurs when a page is changed prior to the start of a statement - ** then changed again within the statement. When rolling back such a - ** statement we must not write to the original database unless we know - ** for certain that original page contents are synced into the main rollback - ** journal. Otherwise, a power loss might leave modified data in the - ** database file without an entry in the rollback journal that can - ** restore the database to its original form. Two conditions must be - ** met before writing to the database files. (1) the database must be - ** locked. (2) we know that the original page content is fully synced - ** in the main journal either because the page is not in cache or else - ** the page is marked as needSync==0. - */ - pPg = pager_lookup(pPager, pgno); - PAGERTRACE4("PLAYBACK %d page %d hash(%08x)\n", - PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, aData)); - if( pPager->state>=PAGER_EXCLUSIVE && (pPg==0 || pPg->needSync==0) ){ - i64 offset = (pgno-1)*(i64)pPager->pageSize; - rc = sqlite3OsWrite(pPager->fd, aData, pPager->pageSize, offset); - if( pPg ){ - makeClean(pPg); - } - } - if( pPg ){ - /* No page should ever be explicitly rolled back that is in use, except - ** for page 1 which is held in use in order to keep the lock on the - ** database active. However such a page may be rolled back as a result - ** of an internal error resulting in an automatic call to - ** sqlite3PagerRollback(). - */ - void *pData; - /* assert( pPg->nRef==0 || pPg->pgno==1 ); */ - pData = PGHDR_TO_DATA(pPg); - memcpy(pData, aData, pPager->pageSize); - if( pPager->xReiniter ){ - pPager->xReiniter(pPg, pPager->pageSize); - } -#ifdef SQLITE_CHECK_PAGES - pPg->pageHash = pager_pagehash(pPg); -#endif - /* If this was page 1, then restore the value of Pager.dbFileVers. - ** Do this before any decoding. */ - if( pgno==1 ){ - memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); - } - - /* Decode the page just read from disk */ - CODEC1(pPager, pData, pPg->pgno, 3); - } - return rc; -} - -/* -** Parameter zMaster is the name of a master journal file. A single journal -** file that referred to the master journal file has just been rolled back. -** This routine checks if it is possible to delete the master journal file, -** and does so if it is. -** -** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not -** available for use within this function. -** -** -** The master journal file contains the names of all child journals. -** To tell if a master journal can be deleted, check to each of the -** children. If all children are either missing or do not refer to -** a different master journal, then this master journal can be deleted. -*/ -static int pager_delmaster(Pager *pPager, const char *zMaster){ - sqlite3_vfs *pVfs = pPager->pVfs; - int rc; - int master_open = 0; - sqlite3_file *pMaster; - sqlite3_file *pJournal; - char *zMasterJournal = 0; /* Contents of master journal file */ - i64 nMasterJournal; /* Size of master journal file */ - - /* Open the master journal file exclusively in case some other process - ** is running this routine also. Not that it makes too much difference. - */ - pMaster = (sqlite3_file *)sqlite3_malloc(pVfs->szOsFile * 2); - pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile); - if( !pMaster ){ - rc = SQLITE_NOMEM; - }else{ - int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); - rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0); - } - if( rc!=SQLITE_OK ) goto delmaster_out; - master_open = 1; - - rc = sqlite3OsFileSize(pMaster, &nMasterJournal); - if( rc!=SQLITE_OK ) goto delmaster_out; - - if( nMasterJournal>0 ){ - char *zJournal; - char *zMasterPtr = 0; - int nMasterPtr = pPager->pVfs->mxPathname+1; - - /* Load the entire master journal file into space obtained from - ** sqlite3_malloc() and pointed to by zMasterJournal. - */ - zMasterJournal = (char *)sqlite3_malloc(nMasterJournal + nMasterPtr); - if( !zMasterJournal ){ - rc = SQLITE_NOMEM; - goto delmaster_out; - } - zMasterPtr = &zMasterJournal[nMasterJournal]; - rc = sqlite3OsRead(pMaster, zMasterJournal, nMasterJournal, 0); - if( rc!=SQLITE_OK ) goto delmaster_out; - - zJournal = zMasterJournal; - while( (zJournal-zMasterJournal)state>=PAGER_EXCLUSIVE && pPager->fd->pMethods ){ - rc = sqlite3OsTruncate(pPager->fd, pPager->pageSize*(i64)nPage); - } - if( rc==SQLITE_OK ){ - pPager->dbSize = nPage; - pager_truncate_cache(pPager); - } - return rc; -} - -/* -** Set the sectorSize for the given pager. -** -** The sector size is the larger of the sector size reported -** by sqlite3OsSectorSize() and the pageSize. -*/ -static void setSectorSize(Pager *pPager){ - assert(pPager->fd->pMethods||pPager->tempFile); - if( !pPager->tempFile ){ - /* Sector size doesn't matter for temporary files. Also, the file - ** may not have been opened yet, in whcih case the OsSectorSize() - ** call will segfault. - */ - pPager->sectorSize = sqlite3OsSectorSize(pPager->fd); - } - if( pPager->sectorSizepageSize ){ - pPager->sectorSize = pPager->pageSize; - } -} - -/* -** Playback the journal and thus restore the database file to -** the state it was in before we started making changes. -** -** The journal file format is as follows: -** -** (1) 8 byte prefix. A copy of aJournalMagic[]. -** (2) 4 byte big-endian integer which is the number of valid page records -** in the journal. If this value is 0xffffffff, then compute the -** number of page records from the journal size. -** (3) 4 byte big-endian integer which is the initial value for the -** sanity checksum. -** (4) 4 byte integer which is the number of pages to truncate the -** database to during a rollback. -** (5) 4 byte integer which is the number of bytes in the master journal -** name. The value may be zero (indicate that there is no master -** journal.) -** (6) N bytes of the master journal name. The name will be nul-terminated -** and might be shorter than the value read from (5). If the first byte -** of the name is \000 then there is no master journal. The master -** journal name is stored in UTF-8. -** (7) Zero or more pages instances, each as follows: -** + 4 byte page number. -** + pPager->pageSize bytes of data. -** + 4 byte checksum -** -** When we speak of the journal header, we mean the first 6 items above. -** Each entry in the journal is an instance of the 7th item. -** -** Call the value from the second bullet "nRec". nRec is the number of -** valid page entries in the journal. In most cases, you can compute the -** value of nRec from the size of the journal file. But if a power -** failure occurred while the journal was being written, it could be the -** case that the size of the journal file had already been increased but -** the extra entries had not yet made it safely to disk. In such a case, -** the value of nRec computed from the file size would be too large. For -** that reason, we always use the nRec value in the header. -** -** If the nRec value is 0xffffffff it means that nRec should be computed -** from the file size. This value is used when the user selects the -** no-sync option for the journal. A power failure could lead to corruption -** in this case. But for things like temporary table (which will be -** deleted when the power is restored) we don't care. -** -** If the file opened as the journal file is not a well-formed -** journal file then all pages up to the first corrupted page are rolled -** back (or no pages if the journal header is corrupted). The journal file -** is then deleted and SQLITE_OK returned, just as if no corruption had -** been encountered. -** -** If an I/O or malloc() error occurs, the journal-file is not deleted -** and an error code is returned. -*/ -static int pager_playback(Pager *pPager, int isHot){ - sqlite3_vfs *pVfs = pPager->pVfs; - i64 szJ; /* Size of the journal file in bytes */ - u32 nRec; /* Number of Records in the journal */ - int i; /* Loop counter */ - Pgno mxPg = 0; /* Size of the original file in pages */ - int rc; /* Result code of a subroutine */ - char *zMaster = 0; /* Name of master journal file if any */ - - /* Figure out how many records are in the journal. Abort early if - ** the journal is empty. - */ - assert( pPager->journalOpen ); - rc = sqlite3OsFileSize(pPager->jfd, &szJ); - if( rc!=SQLITE_OK || szJ==0 ){ - goto end_playback; - } - - /* Read the master journal name from the journal, if it is present. - ** If a master journal file name is specified, but the file is not - ** present on disk, then the journal is not hot and does not need to be - ** played back. - */ - zMaster = pPager->pTmpSpace; - rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); - assert( rc!=SQLITE_DONE ); - if( rc!=SQLITE_OK - || (zMaster[0] && !sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS)) - ){ - zMaster = 0; - if( rc==SQLITE_DONE ) rc = SQLITE_OK; - goto end_playback; - } - pPager->journalOff = 0; - zMaster = 0; - - /* This loop terminates either when the readJournalHdr() call returns - ** SQLITE_DONE or an IO error occurs. */ - while( 1 ){ - - /* Read the next journal header from the journal file. If there are - ** not enough bytes left in the journal file for a complete header, or - ** it is corrupted, then a process must of failed while writing it. - ** This indicates nothing more needs to be rolled back. - */ - rc = readJournalHdr(pPager, szJ, &nRec, &mxPg); - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_DONE ){ - rc = SQLITE_OK; - } - goto end_playback; - } - - /* If nRec is 0xffffffff, then this journal was created by a process - ** working in no-sync mode. This means that the rest of the journal - ** file consists of pages, there are no more journal headers. Compute - ** the value of nRec based on this assumption. - */ - if( nRec==0xffffffff ){ - assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ); - nRec = (szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager); - } - - /* If nRec is 0 and this rollback is of a transaction created by this - ** process and if this is the final header in the journal, then it means - ** that this part of the journal was being filled but has not yet been - ** synced to disk. Compute the number of pages based on the remaining - ** size of the file. - ** - ** The third term of the test was added to fix ticket #2565. - */ - if( nRec==0 && !isHot && - pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ - nRec = (szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager); - } - - /* If this is the first header read from the journal, truncate the - ** database file back to it's original size. - */ - if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){ - rc = pager_truncate(pPager, mxPg); - if( rc!=SQLITE_OK ){ - goto end_playback; - } - } - - /* Copy original pages out of the journal and back into the database file. - */ - for(i=0; ijfd, pPager->journalOff, 1); - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_DONE ){ - rc = SQLITE_OK; - pPager->journalOff = szJ; - break; - }else{ - goto end_playback; - } - } - } - } - /*NOTREACHED*/ - assert( 0 ); - -end_playback: - if( rc==SQLITE_OK ){ - zMaster = pPager->pTmpSpace; - rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); - } - if( rc==SQLITE_OK ){ - rc = pager_end_transaction(pPager); - } - if( rc==SQLITE_OK && zMaster[0] ){ - /* If there was a master journal and this routine will return success, - ** see if it is possible to delete the master journal. - */ - rc = pager_delmaster(pPager, zMaster); - } - - /* The Pager.sectorSize variable may have been updated while rolling - ** back a journal created by a process with a different sector size - ** value. Reset it to the correct value for this process. - */ - setSectorSize(pPager); - return rc; -} - -/* -** Playback the statement journal. -** -** This is similar to playing back the transaction journal but with -** a few extra twists. -** -** (1) The number of pages in the database file at the start of -** the statement is stored in pPager->stmtSize, not in the -** journal file itself. -** -** (2) In addition to playing back the statement journal, also -** playback all pages of the transaction journal beginning -** at offset pPager->stmtJSize. -*/ -static int pager_stmt_playback(Pager *pPager){ - i64 szJ; /* Size of the full journal */ - i64 hdrOff; - int nRec; /* Number of Records */ - int i; /* Loop counter */ - int rc; - - szJ = pPager->journalOff; -#ifndef NDEBUG - { - i64 os_szJ; - rc = sqlite3OsFileSize(pPager->jfd, &os_szJ); - if( rc!=SQLITE_OK ) return rc; - assert( szJ==os_szJ ); - } -#endif - - /* Set hdrOff to be the offset just after the end of the last journal - ** page written before the first journal-header for this statement - ** transaction was written, or the end of the file if no journal - ** header was written. - */ - hdrOff = pPager->stmtHdrOff; - assert( pPager->fullSync || !hdrOff ); - if( !hdrOff ){ - hdrOff = szJ; - } - - /* Truncate the database back to its original size. - */ - rc = pager_truncate(pPager, pPager->stmtSize); - assert( pPager->state>=PAGER_SHARED ); - - /* Figure out how many records are in the statement journal. - */ - assert( pPager->stmtInUse && pPager->journalOpen ); - nRec = pPager->stmtNRec; - - /* Copy original pages out of the statement journal and back into the - ** database file. Note that the statement journal omits checksums from - ** each record since power-failure recovery is not important to statement - ** journals. - */ - for(i=0; ipageSize); - rc = pager_playback_one_page(pPager, pPager->stfd, offset, 0); - assert( rc!=SQLITE_DONE ); - if( rc!=SQLITE_OK ) goto end_stmt_playback; - } - - /* Now roll some pages back from the transaction journal. Pager.stmtJSize - ** was the size of the journal file when this statement was started, so - ** everything after that needs to be rolled back, either into the - ** database, the memory cache, or both. - ** - ** If it is not zero, then Pager.stmtHdrOff is the offset to the start - ** of the first journal header written during this statement transaction. - */ - pPager->journalOff = pPager->stmtJSize; - pPager->cksumInit = pPager->stmtCksum; - while( pPager->journalOff < hdrOff ){ - rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1); - assert( rc!=SQLITE_DONE ); - if( rc!=SQLITE_OK ) goto end_stmt_playback; - } - - while( pPager->journalOff < szJ ){ - u32 nJRec; /* Number of Journal Records */ - u32 dummy; - rc = readJournalHdr(pPager, szJ, &nJRec, &dummy); - if( rc!=SQLITE_OK ){ - assert( rc!=SQLITE_DONE ); - goto end_stmt_playback; - } - if( nJRec==0 ){ - nJRec = (szJ - pPager->journalOff) / (pPager->pageSize+8); - } - for(i=nJRec-1; i>=0 && pPager->journalOff < szJ; i--){ - rc = pager_playback_one_page(pPager, pPager->jfd, pPager->journalOff, 1); - assert( rc!=SQLITE_DONE ); - if( rc!=SQLITE_OK ) goto end_stmt_playback; - } - } - - pPager->journalOff = szJ; - -end_stmt_playback: - if( rc==SQLITE_OK) { - pPager->journalOff = szJ; - /* pager_reload_cache(pPager); */ - } - return rc; -} - -/* -** Change the maximum number of in-memory pages that are allowed. -*/ -void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ - if( mxPage>10 ){ - pPager->mxPage = mxPage; - }else{ - pPager->mxPage = 10; - } -} - -/* -** Adjust the robustness of the database to damage due to OS crashes -** or power failures by changing the number of syncs()s when writing -** the rollback journal. There are three levels: -** -** OFF sqlite3OsSync() is never called. This is the default -** for temporary and transient files. -** -** NORMAL The journal is synced once before writes begin on the -** database. This is normally adequate protection, but -** it is theoretically possible, though very unlikely, -** that an inopertune power failure could leave the journal -** in a state which would cause damage to the database -** when it is rolled back. -** -** FULL The journal is synced twice before writes begin on the -** database (with some additional information - the nRec field -** of the journal header - being written in between the two -** syncs). If we assume that writing a -** single disk sector is atomic, then this mode provides -** assurance that the journal will not be corrupted to the -** point of causing damage to the database during rollback. -** -** Numeric values associated with these states are OFF==1, NORMAL=2, -** and FULL=3. -*/ -#ifndef SQLITE_OMIT_PAGER_PRAGMAS -void sqlite3PagerSetSafetyLevel(Pager *pPager, int level, int full_fsync){ - pPager->noSync = level==1 || pPager->tempFile; - pPager->fullSync = level==3 && !pPager->tempFile; - pPager->sync_flags = (full_fsync?SQLITE_SYNC_FULL:SQLITE_SYNC_NORMAL); - if( pPager->noSync ) pPager->needSync = 0; -} -#endif - -/* -** The following global variable is incremented whenever the library -** attempts to open a temporary file. This information is used for -** testing and analysis only. -*/ -#ifdef SQLITE_TEST -int sqlite3_opentemp_count = 0; -#endif - -/* -** Open a temporary file. -** -** Write the file descriptor into *fd. Return SQLITE_OK on success or some -** other error code if we fail. The OS will automatically delete the temporary -** file when it is closed. -*/ -static int sqlite3PagerOpentemp( - sqlite3_vfs *pVfs, /* The virtual file system layer */ - sqlite3_file *pFile, /* Write the file descriptor here */ - char *zFilename, /* Name of the file. Might be NULL */ - int vfsFlags /* Flags passed through to the VFS */ -){ - int rc; - assert( zFilename!=0 ); - -#ifdef SQLITE_TEST - sqlite3_opentemp_count++; /* Used for testing and analysis only */ -#endif - - vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | - SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; - rc = sqlite3OsOpen(pVfs, zFilename, pFile, vfsFlags, 0); - assert( rc!=SQLITE_OK || pFile->pMethods ); - return rc; -} - -/* -** Create a new page cache and put a pointer to the page cache in *ppPager. -** The file to be cached need not exist. The file is not locked until -** the first call to sqlite3PagerGet() and is only held open until the -** last page is released using sqlite3PagerUnref(). -** -** If zFilename is NULL then a randomly-named temporary file is created -** and used as the file to be cached. The file will be deleted -** automatically when it is closed. -** -** If zFilename is ":memory:" then all information is held in cache. -** It is never written to disk. This can be used to implement an -** in-memory database. -*/ -int sqlite3PagerOpen( - sqlite3_vfs *pVfs, /* The virtual file system to use */ - Pager **ppPager, /* Return the Pager structure here */ - const char *zFilename, /* Name of the database file to open */ - int nExtra, /* Extra bytes append to each in-memory page */ - int flags, /* flags controlling this file */ - int vfsFlags /* flags passed through to sqlite3_vfs.xOpen() */ -){ - u8 *pPtr; - Pager *pPager = 0; - int rc = SQLITE_OK; - int i; - int tempFile = 0; - int memDb = 0; - int readOnly = 0; - int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; - int noReadlock = (flags & PAGER_NO_READLOCK)!=0; - int journalFileSize = sqlite3JournalSize(pVfs); - int nDefaultPage = SQLITE_DEFAULT_PAGE_SIZE; - char *zPathname; - int nPathname; - - /* The default return is a NULL pointer */ - *ppPager = 0; - - /* Compute the full pathname */ - nPathname = pVfs->mxPathname+1; - zPathname = sqlite3_malloc(nPathname); - if( zPathname==0 ){ - return SQLITE_NOMEM; - } - if( zFilename && zFilename[0] ){ -#ifndef SQLITE_OMIT_MEMORYDB - if( strcmp(zFilename,":memory:")==0 ){ - memDb = 1; - zPathname[0] = 0; - }else -#endif - { - rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); - } - }else{ - rc = sqlite3OsGetTempname(pVfs, nPathname, zPathname); - } - if( rc!=SQLITE_OK ){ - sqlite3_free(zPathname); - return rc; - } - nPathname = strlen(zPathname); - - /* Allocate memory for the pager structure */ - pPager = sqlite3MallocZero( - sizeof(*pPager) + /* Pager structure */ - journalFileSize + /* The journal file structure */ - pVfs->szOsFile * 2 + /* The db and stmt journal files */ - 4*nPathname + 40 /* zFilename, zDirectory, zJournal, zStmtJrnl */ - ); - if( !pPager ){ - sqlite3_free(zPathname); - return SQLITE_NOMEM; - } - pPtr = (u8 *)&pPager[1]; - pPager->vfsFlags = vfsFlags; - pPager->fd = (sqlite3_file*)&pPtr[pVfs->szOsFile*0]; - pPager->stfd = (sqlite3_file*)&pPtr[pVfs->szOsFile*1]; - pPager->jfd = (sqlite3_file*)&pPtr[pVfs->szOsFile*2]; - pPager->zFilename = (char*)&pPtr[pVfs->szOsFile*2+journalFileSize]; - pPager->zDirectory = &pPager->zFilename[nPathname+1]; - pPager->zJournal = &pPager->zDirectory[nPathname+1]; - pPager->zStmtJrnl = &pPager->zJournal[nPathname+10]; - pPager->pVfs = pVfs; - memcpy(pPager->zFilename, zPathname, nPathname+1); - sqlite3_free(zPathname); - - /* Open the pager file. - */ - if( zFilename && zFilename[0] && !memDb ){ - if( nPathname>(pVfs->mxPathname - sizeof("-journal")) ){ - rc = SQLITE_CANTOPEN; - }else{ - int fout = 0; - rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, - pPager->vfsFlags, &fout); - readOnly = (fout&SQLITE_OPEN_READONLY); - - /* If the file was successfully opened for read/write access, - ** choose a default page size in case we have to create the - ** database file. The default page size is the maximum of: - ** - ** + SQLITE_DEFAULT_PAGE_SIZE, - ** + The value returned by sqlite3OsSectorSize() - ** + The largest page size that can be written atomically. - */ - if( rc==SQLITE_OK && !readOnly ){ - int iSectorSize = sqlite3OsSectorSize(pPager->fd); - if( nDefaultPagefd); - int ii; - assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); - assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); - assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); - for(ii=nDefaultPage; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ - if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ) nDefaultPage = ii; - } - } -#endif - if( nDefaultPage>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ - nDefaultPage = SQLITE_MAX_DEFAULT_PAGE_SIZE; - } - } - } - }else if( !memDb ){ - /* If a temporary file is requested, it is not opened immediately. - ** In this case we accept the default page size and delay actually - ** opening the file until the first call to OsWrite(). - */ - tempFile = 1; - pPager->state = PAGER_EXCLUSIVE; - } - - if( pPager && rc==SQLITE_OK ){ - pPager->pTmpSpace = (char *)sqlite3_malloc(nDefaultPage); - } - - /* If an error occured in either of the blocks above. - ** Free the Pager structure and close the file. - ** Since the pager is not allocated there is no need to set - ** any Pager.errMask variables. - */ - if( !pPager || !pPager->pTmpSpace ){ - sqlite3OsClose(pPager->fd); - sqlite3_free(pPager); - return ((rc==SQLITE_OK)?SQLITE_NOMEM:rc); - } - - PAGERTRACE3("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename); - IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) - - /* Fill in Pager.zDirectory[] */ - memcpy(pPager->zDirectory, pPager->zFilename, nPathname+1); - for(i=strlen(pPager->zDirectory); i>0 && pPager->zDirectory[i-1]!='/'; i--){} - if( i>0 ) pPager->zDirectory[i-1] = 0; - - /* Fill in Pager.zJournal[] and Pager.zStmtJrnl[] */ - memcpy(pPager->zJournal, pPager->zFilename, nPathname); - memcpy(&pPager->zJournal[nPathname], "-journal", 9); - memcpy(pPager->zStmtJrnl, pPager->zFilename, nPathname); - memcpy(&pPager->zStmtJrnl[nPathname], "-stmtjrnl", 10); - - /* pPager->journalOpen = 0; */ - pPager->useJournal = useJournal && !memDb; - pPager->noReadlock = noReadlock && readOnly; - /* pPager->stmtOpen = 0; */ - /* pPager->stmtInUse = 0; */ - /* pPager->nRef = 0; */ - pPager->dbSize = memDb-1; - pPager->pageSize = nDefaultPage; - /* pPager->stmtSize = 0; */ - /* pPager->stmtJSize = 0; */ - /* pPager->nPage = 0; */ - pPager->mxPage = 100; - pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; - /* pPager->state = PAGER_UNLOCK; */ - assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) ); - /* pPager->errMask = 0; */ - pPager->tempFile = tempFile; - assert( tempFile==PAGER_LOCKINGMODE_NORMAL - || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); - assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); - pPager->exclusiveMode = tempFile; - pPager->memDb = memDb; - pPager->readOnly = readOnly; - /* pPager->needSync = 0; */ - pPager->noSync = pPager->tempFile || !useJournal; - pPager->fullSync = (pPager->noSync?0:1); - pPager->sync_flags = SQLITE_SYNC_NORMAL; - /* pPager->pFirst = 0; */ - /* pPager->pFirstSynced = 0; */ - /* pPager->pLast = 0; */ - pPager->nExtra = FORCE_ALIGNMENT(nExtra); - assert(pPager->fd->pMethods||memDb||tempFile); - if( !memDb ){ - setSectorSize(pPager); - } - /* pPager->pBusyHandler = 0; */ - /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ - *ppPager = pPager; -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - pPager->iInUseMM = 0; - pPager->iInUseDB = 0; - if( !memDb ){ - sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); - sqlite3_mutex_enter(mutex); - pPager->pNext = sqlite3PagerList; - if( sqlite3PagerList ){ - assert( sqlite3PagerList->pPrev==0 ); - sqlite3PagerList->pPrev = pPager; - } - pPager->pPrev = 0; - sqlite3PagerList = pPager; - sqlite3_mutex_leave(mutex); - } -#endif - return SQLITE_OK; -} - -/* -** Set the busy handler function. -*/ -void sqlite3PagerSetBusyhandler(Pager *pPager, BusyHandler *pBusyHandler){ - pPager->pBusyHandler = pBusyHandler; -} - -/* -** Set the destructor for this pager. If not NULL, the destructor is called -** when the reference count on each page reaches zero. The destructor can -** be used to clean up information in the extra segment appended to each page. -** -** The destructor is not called as a result sqlite3PagerClose(). -** Destructors are only called by sqlite3PagerUnref(). -*/ -void sqlite3PagerSetDestructor(Pager *pPager, void (*xDesc)(DbPage*,int)){ - pPager->xDestructor = xDesc; -} - -/* -** Set the reinitializer for this pager. If not NULL, the reinitializer -** is called when the content of a page in cache is restored to its original -** value as a result of a rollback. The callback gives higher-level code -** an opportunity to restore the EXTRA section to agree with the restored -** page data. -*/ -void sqlite3PagerSetReiniter(Pager *pPager, void (*xReinit)(DbPage*,int)){ - pPager->xReiniter = xReinit; -} - -/* -** Set the page size to *pPageSize. If the suggest new page size is -** inappropriate, then an alternative page size is set to that -** value before returning. -*/ -int sqlite3PagerSetPagesize(Pager *pPager, u16 *pPageSize){ - int rc = SQLITE_OK; - u16 pageSize = *pPageSize; - assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) ); - if( pageSize && pageSize!=pPager->pageSize - && !pPager->memDb && pPager->nRef==0 - ){ - char *pNew = (char *)sqlite3_malloc(pageSize); - if( !pNew ){ - rc = SQLITE_NOMEM; - }else{ - pagerEnter(pPager); - pager_reset(pPager); - pPager->pageSize = pageSize; - setSectorSize(pPager); - sqlite3_free(pPager->pTmpSpace); - pPager->pTmpSpace = pNew; - pagerLeave(pPager); - } - } - *pPageSize = pPager->pageSize; - return rc; -} - -/* -** Attempt to set the maximum database page count if mxPage is positive. -** Make no changes if mxPage is zero or negative. And never reduce the -** maximum page count below the current size of the database. -** -** Regardless of mxPage, return the current maximum page count. -*/ -int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ - if( mxPage>0 ){ - pPager->mxPgno = mxPage; - } - sqlite3PagerPagecount(pPager); - return pPager->mxPgno; -} - -/* -** The following set of routines are used to disable the simulated -** I/O error mechanism. These routines are used to avoid simulated -** errors in places where we do not care about errors. -** -** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops -** and generate no code. -*/ -#ifdef SQLITE_TEST -extern int sqlite3_io_error_pending; -extern int sqlite3_io_error_hit; -static int saved_cnt; -void disable_simulated_io_errors(void){ - saved_cnt = sqlite3_io_error_pending; - sqlite3_io_error_pending = -1; -} -void enable_simulated_io_errors(void){ - sqlite3_io_error_pending = saved_cnt; -} -#else -# define disable_simulated_io_errors() -# define enable_simulated_io_errors() -#endif - -/* -** Read the first N bytes from the beginning of the file into memory -** that pDest points to. -** -** No error checking is done. The rational for this is that this function -** may be called even if the file does not exist or contain a header. In -** these cases sqlite3OsRead() will return an error, to which the correct -** response is to zero the memory at pDest and continue. A real IO error -** will presumably recur and be picked up later (Todo: Think about this). -*/ -int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){ - int rc = SQLITE_OK; - memset(pDest, 0, N); - assert(MEMDB||pPager->fd->pMethods||pPager->tempFile); - if( pPager->fd->pMethods ){ - IOTRACE(("DBHDR %p 0 %d\n", pPager, N)) - rc = sqlite3OsRead(pPager->fd, pDest, N, 0); - if( rc==SQLITE_IOERR_SHORT_READ ){ - rc = SQLITE_OK; - } - } - return rc; -} - -/* -** Return the total number of pages in the disk file associated with -** pPager. -** -** If the PENDING_BYTE lies on the page directly after the end of the -** file, then consider this page part of the file too. For example, if -** PENDING_BYTE is byte 4096 (the first byte of page 5) and the size of the -** file is 4096 bytes, 5 is returned instead of 4. -*/ -int sqlite3PagerPagecount(Pager *pPager){ - i64 n = 0; - int rc; - assert( pPager!=0 ); - if( pPager->errCode ){ - return 0; - } - if( pPager->dbSize>=0 ){ - n = pPager->dbSize; - } else { - assert(pPager->fd->pMethods||pPager->tempFile); - if( (pPager->fd->pMethods) - && (rc = sqlite3OsFileSize(pPager->fd, &n))!=SQLITE_OK ){ - pPager->nRef++; - pager_error(pPager, rc); - pPager->nRef--; - return 0; - } - if( n>0 && npageSize ){ - n = 1; - }else{ - n /= pPager->pageSize; - } - if( pPager->state!=PAGER_UNLOCK ){ - pPager->dbSize = n; - } - } - if( n==(PENDING_BYTE/pPager->pageSize) ){ - n++; - } - if( n>pPager->mxPgno ){ - pPager->mxPgno = n; - } - return n; -} - - -#ifndef SQLITE_OMIT_MEMORYDB -/* -** Clear a PgHistory block -*/ -static void clearHistory(PgHistory *pHist){ - sqlite3_free(pHist->pOrig); - sqlite3_free(pHist->pStmt); - pHist->pOrig = 0; - pHist->pStmt = 0; -} -#else -#define clearHistory(x) -#endif - -/* -** Forward declaration -*/ -static int syncJournal(Pager*); - -/* -** Unlink pPg from it's hash chain. Also set the page number to 0 to indicate -** that the page is not part of any hash chain. This is required because the -** sqlite3PagerMovepage() routine can leave a page in the -** pNextFree/pPrevFree list that is not a part of any hash-chain. -*/ -static void unlinkHashChain(Pager *pPager, PgHdr *pPg){ - if( pPg->pgno==0 ){ - assert( pPg->pNextHash==0 && pPg->pPrevHash==0 ); - return; - } - if( pPg->pNextHash ){ - pPg->pNextHash->pPrevHash = pPg->pPrevHash; - } - if( pPg->pPrevHash ){ - assert( pPager->aHash[pPg->pgno & (pPager->nHash-1)]!=pPg ); - pPg->pPrevHash->pNextHash = pPg->pNextHash; - }else{ - int h = pPg->pgno & (pPager->nHash-1); - pPager->aHash[h] = pPg->pNextHash; - } - if( MEMDB ){ - clearHistory(PGHDR_TO_HIST(pPg, pPager)); - } - pPg->pgno = 0; - pPg->pNextHash = pPg->pPrevHash = 0; -} - -/* -** Unlink a page from the free list (the list of all pages where nRef==0) -** and from its hash collision chain. -*/ -static void unlinkPage(PgHdr *pPg){ - Pager *pPager = pPg->pPager; - - /* Unlink from free page list */ - lruListRemove(pPg); - - /* Unlink from the pgno hash table */ - unlinkHashChain(pPager, pPg); -} - -/* -** This routine is used to truncate the cache when a database -** is truncated. Drop from the cache all pages whose pgno is -** larger than pPager->dbSize and is unreferenced. -** -** Referenced pages larger than pPager->dbSize are zeroed. -** -** Actually, at the point this routine is called, it would be -** an error to have a referenced page. But rather than delete -** that page and guarantee a subsequent segfault, it seems better -** to zero it and hope that we error out sanely. -*/ -static void pager_truncate_cache(Pager *pPager){ - PgHdr *pPg; - PgHdr **ppPg; - int dbSize = pPager->dbSize; - - ppPg = &pPager->pAll; - while( (pPg = *ppPg)!=0 ){ - if( pPg->pgno<=dbSize ){ - ppPg = &pPg->pNextAll; - }else if( pPg->nRef>0 ){ - memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize); - ppPg = &pPg->pNextAll; - }else{ - *ppPg = pPg->pNextAll; - IOTRACE(("PGFREE %p %d\n", pPager, pPg->pgno)); - PAGER_INCR(sqlite3_pager_pgfree_count); - unlinkPage(pPg); - makeClean(pPg); - sqlite3_free(pPg->pData); - sqlite3_free(pPg); - pPager->nPage--; - } - } -} - -/* -** Try to obtain a lock on a file. Invoke the busy callback if the lock -** is currently not available. Repeat until the busy callback returns -** false or until the lock succeeds. -** -** Return SQLITE_OK on success and an error code if we cannot obtain -** the lock. -*/ -static int pager_wait_on_lock(Pager *pPager, int locktype){ - int rc; - - /* The OS lock values must be the same as the Pager lock values */ - assert( PAGER_SHARED==SHARED_LOCK ); - assert( PAGER_RESERVED==RESERVED_LOCK ); - assert( PAGER_EXCLUSIVE==EXCLUSIVE_LOCK ); - - /* If the file is currently unlocked then the size must be unknown */ - assert( pPager->state>=PAGER_SHARED || pPager->dbSize<0 || MEMDB ); - - if( pPager->state>=locktype ){ - rc = SQLITE_OK; - }else{ - do { - rc = sqlite3OsLock(pPager->fd, locktype); - }while( rc==SQLITE_BUSY && sqlite3InvokeBusyHandler(pPager->pBusyHandler) ); - if( rc==SQLITE_OK ){ - pPager->state = locktype; - IOTRACE(("LOCK %p %d\n", pPager, locktype)) - } - } - return rc; -} - -/* -** Truncate the file to the number of pages specified. -*/ -int sqlite3PagerTruncate(Pager *pPager, Pgno nPage){ - int rc; - assert( pPager->state>=PAGER_SHARED || MEMDB ); - sqlite3PagerPagecount(pPager); - if( pPager->errCode ){ - rc = pPager->errCode; - return rc; - } - if( nPage>=(unsigned)pPager->dbSize ){ - return SQLITE_OK; - } - if( MEMDB ){ - pPager->dbSize = nPage; - pager_truncate_cache(pPager); - return SQLITE_OK; - } - pagerEnter(pPager); - rc = syncJournal(pPager); - pagerLeave(pPager); - if( rc!=SQLITE_OK ){ - return rc; - } - - /* Get an exclusive lock on the database before truncating. */ - pagerEnter(pPager); - rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); - pagerLeave(pPager); - if( rc!=SQLITE_OK ){ - return rc; - } - - rc = pager_truncate(pPager, nPage); - return rc; -} - -/* -** Shutdown the page cache. Free all memory and close all files. -** -** If a transaction was in progress when this routine is called, that -** transaction is rolled back. All outstanding pages are invalidated -** and their memory is freed. Any attempt to use a page associated -** with this page cache after this function returns will likely -** result in a coredump. -** -** This function always succeeds. If a transaction is active an attempt -** is made to roll it back. If an error occurs during the rollback -** a hot journal may be left in the filesystem but no error is returned -** to the caller. -*/ -int sqlite3PagerClose(Pager *pPager){ -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - if( !MEMDB ){ - sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); - sqlite3_mutex_enter(mutex); - if( pPager->pPrev ){ - pPager->pPrev->pNext = pPager->pNext; - }else{ - sqlite3PagerList = pPager->pNext; - } - if( pPager->pNext ){ - pPager->pNext->pPrev = pPager->pPrev; - } - sqlite3_mutex_leave(mutex); - } -#endif - - disable_simulated_io_errors(); - pPager->errCode = 0; - pPager->exclusiveMode = 0; - pager_reset(pPager); - pagerUnlockAndRollback(pPager); - enable_simulated_io_errors(); - PAGERTRACE2("CLOSE %d\n", PAGERID(pPager)); - IOTRACE(("CLOSE %p\n", pPager)) - assert( pPager->errCode || (pPager->journalOpen==0 && pPager->stmtOpen==0) ); - if( pPager->journalOpen ){ - sqlite3OsClose(pPager->jfd); - } - sqlite3_free(pPager->aInJournal); - if( pPager->stmtOpen ){ - sqlite3OsClose(pPager->stfd); - } - sqlite3OsClose(pPager->fd); - /* Temp files are automatically deleted by the OS - ** if( pPager->tempFile ){ - ** sqlite3OsDelete(pPager->zFilename); - ** } - */ - - sqlite3_free(pPager->aHash); - sqlite3_free(pPager->pTmpSpace); - sqlite3_free(pPager); - return SQLITE_OK; -} - -#if !defined(NDEBUG) || defined(SQLITE_TEST) -/* -** Return the page number for the given page data. -*/ -Pgno sqlite3PagerPagenumber(DbPage *p){ - return p->pgno; -} -#endif - -/* -** The page_ref() function increments the reference count for a page. -** If the page is currently on the freelist (the reference count is zero) then -** remove it from the freelist. -** -** For non-test systems, page_ref() is a macro that calls _page_ref() -** online of the reference count is zero. For test systems, page_ref() -** is a real function so that we can set breakpoints and trace it. -*/ -static void _page_ref(PgHdr *pPg){ - if( pPg->nRef==0 ){ - /* The page is currently on the freelist. Remove it. */ - lruListRemove(pPg); - pPg->pPager->nRef++; - } - pPg->nRef++; - REFINFO(pPg); -} -#ifdef SQLITE_DEBUG - static void page_ref(PgHdr *pPg){ - if( pPg->nRef==0 ){ - _page_ref(pPg); - }else{ - pPg->nRef++; - REFINFO(pPg); - } - } -#else -# define page_ref(P) ((P)->nRef==0?_page_ref(P):(void)(P)->nRef++) -#endif - -/* -** Increment the reference count for a page. The input pointer is -** a reference to the page data. -*/ -int sqlite3PagerRef(DbPage *pPg){ - pagerEnter(pPg->pPager); - page_ref(pPg); - pagerLeave(pPg->pPager); - return SQLITE_OK; -} - -/* -** Sync the journal. In other words, make sure all the pages that have -** been written to the journal have actually reached the surface of the -** disk. It is not safe to modify the original database file until after -** the journal has been synced. If the original database is modified before -** the journal is synced and a power failure occurs, the unsynced journal -** data would be lost and we would be unable to completely rollback the -** database changes. Database corruption would occur. -** -** This routine also updates the nRec field in the header of the journal. -** (See comments on the pager_playback() routine for additional information.) -** If the sync mode is FULL, two syncs will occur. First the whole journal -** is synced, then the nRec field is updated, then a second sync occurs. -** -** For temporary databases, we do not care if we are able to rollback -** after a power failure, so no sync occurs. -** -** If the IOCAP_SEQUENTIAL flag is set for the persistent media on which -** the database is stored, then OsSync() is never called on the journal -** file. In this case all that is required is to update the nRec field in -** the journal header. -** -** This routine clears the needSync field of every page current held in -** memory. -*/ -static int syncJournal(Pager *pPager){ - PgHdr *pPg; - int rc = SQLITE_OK; - - - /* Sync the journal before modifying the main database - ** (assuming there is a journal and it needs to be synced.) - */ - if( pPager->needSync ){ - if( !pPager->tempFile ){ - int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); - assert( pPager->journalOpen ); - - /* assert( !pPager->noSync ); // noSync might be set if synchronous - ** was turned off after the transaction was started. Ticket #615 */ -#ifndef NDEBUG - { - /* Make sure the pPager->nRec counter we are keeping agrees - ** with the nRec computed from the size of the journal file. - */ - i64 jSz; - rc = sqlite3OsFileSize(pPager->jfd, &jSz); - if( rc!=0 ) return rc; - assert( pPager->journalOff==jSz ); - } -#endif - if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ - /* Write the nRec value into the journal file header. If in - ** full-synchronous mode, sync the journal first. This ensures that - ** all data has really hit the disk before nRec is updated to mark - ** it as a candidate for rollback. - ** - ** This is not required if the persistent media supports the - ** SAFE_APPEND property. Because in this case it is not possible - ** for garbage data to be appended to the file, the nRec field - ** is populated with 0xFFFFFFFF when the journal header is written - ** and never needs to be updated. - */ - i64 jrnlOff; - if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ - PAGERTRACE2("SYNC journal of %d\n", PAGERID(pPager)); - IOTRACE(("JSYNC %p\n", pPager)) - rc = sqlite3OsSync(pPager->jfd, pPager->sync_flags); - if( rc!=0 ) return rc; - } - - jrnlOff = pPager->journalHdr + sizeof(aJournalMagic); - IOTRACE(("JHDR %p %lld %d\n", pPager, jrnlOff, 4)); - rc = write32bits(pPager->jfd, jrnlOff, pPager->nRec); - if( rc ) return rc; - } - if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ - PAGERTRACE2("SYNC journal of %d\n", PAGERID(pPager)); - IOTRACE(("JSYNC %p\n", pPager)) - rc = sqlite3OsSync(pPager->jfd, pPager->sync_flags| - (pPager->sync_flags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) - ); - if( rc!=0 ) return rc; - } - pPager->journalStarted = 1; - } - pPager->needSync = 0; - - /* Erase the needSync flag from every page. - */ - for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ - pPg->needSync = 0; - } - lruListSetFirstSynced(pPager); - } - -#ifndef NDEBUG - /* If the Pager.needSync flag is clear then the PgHdr.needSync - ** flag must also be clear for all pages. Verify that this - ** invariant is true. - */ - else{ - for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ - assert( pPg->needSync==0 ); - } - assert( pPager->lru.pFirstSynced==pPager->lru.pFirst ); - } -#endif - - return rc; -} - -/* -** Merge two lists of pages connected by pDirty and in pgno order. -** Do not both fixing the pPrevDirty pointers. -*/ -static PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB){ - PgHdr result, *pTail; - pTail = &result; - while( pA && pB ){ - if( pA->pgnopgno ){ - pTail->pDirty = pA; - pTail = pA; - pA = pA->pDirty; - }else{ - pTail->pDirty = pB; - pTail = pB; - pB = pB->pDirty; - } - } - if( pA ){ - pTail->pDirty = pA; - }else if( pB ){ - pTail->pDirty = pB; - }else{ - pTail->pDirty = 0; - } - return result.pDirty; -} - -/* -** Sort the list of pages in accending order by pgno. Pages are -** connected by pDirty pointers. The pPrevDirty pointers are -** corrupted by this sort. -*/ -#define N_SORT_BUCKET_ALLOC 25 -#define N_SORT_BUCKET 25 -#ifdef SQLITE_TEST - int sqlite3_pager_n_sort_bucket = 0; - #undef N_SORT_BUCKET - #define N_SORT_BUCKET \ - (sqlite3_pager_n_sort_bucket?sqlite3_pager_n_sort_bucket:N_SORT_BUCKET_ALLOC) -#endif -static PgHdr *sort_pagelist(PgHdr *pIn){ - PgHdr *a[N_SORT_BUCKET_ALLOC], *p; - int i; - memset(a, 0, sizeof(a)); - while( pIn ){ - p = pIn; - pIn = p->pDirty; - p->pDirty = 0; - for(i=0; ipPager; - - /* At this point there may be either a RESERVED or EXCLUSIVE lock on the - ** database file. If there is already an EXCLUSIVE lock, the following - ** calls to sqlite3OsLock() are no-ops. - ** - ** Moving the lock from RESERVED to EXCLUSIVE actually involves going - ** through an intermediate state PENDING. A PENDING lock prevents new - ** readers from attaching to the database but is unsufficient for us to - ** write. The idea of a PENDING lock is to prevent new readers from - ** coming in while we wait for existing readers to clear. - ** - ** While the pager is in the RESERVED state, the original database file - ** is unchanged and we can rollback without having to playback the - ** journal into the original database file. Once we transition to - ** EXCLUSIVE, it means the database file has been changed and any rollback - ** will require a journal playback. - */ - rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); - if( rc!=SQLITE_OK ){ - return rc; - } - - pList = sort_pagelist(pList); - for(p=pList; p; p=p->pDirty){ - assert( p->dirty ); - p->dirty = 0; - } - while( pList ){ - - /* If the file has not yet been opened, open it now. */ - if( !pPager->fd->pMethods ){ - assert(pPager->tempFile); - rc = sqlite3PagerOpentemp(pPager->pVfs, pPager->fd, pPager->zFilename, - pPager->vfsFlags); - if( rc ) return rc; - } - - /* If there are dirty pages in the page cache with page numbers greater - ** than Pager.dbSize, this means sqlite3PagerTruncate() was called to - ** make the file smaller (presumably by auto-vacuum code). Do not write - ** any such pages to the file. - */ - if( pList->pgno<=pPager->dbSize ){ - i64 offset = (pList->pgno-1)*(i64)pPager->pageSize; - char *pData = CODEC2(pPager, PGHDR_TO_DATA(pList), pList->pgno, 6); - PAGERTRACE4("STORE %d page %d hash(%08x)\n", - PAGERID(pPager), pList->pgno, pager_pagehash(pList)); - IOTRACE(("PGOUT %p %d\n", pPager, pList->pgno)); - rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); - PAGER_INCR(sqlite3_pager_writedb_count); - PAGER_INCR(pPager->nWrite); - if( pList->pgno==1 ){ - memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); - } - } -#ifndef NDEBUG - else{ - PAGERTRACE3("NOSTORE %d page %d\n", PAGERID(pPager), pList->pgno); - } -#endif - if( rc ) return rc; -#ifdef SQLITE_CHECK_PAGES - pList->pageHash = pager_pagehash(pList); -#endif - pList = pList->pDirty; - } - return SQLITE_OK; -} - -/* -** Collect every dirty page into a dirty list and -** return a pointer to the head of that list. All pages are -** collected even if they are still in use. -*/ -static PgHdr *pager_get_all_dirty_pages(Pager *pPager){ - return pPager->pDirty; -} - -/* -** Return TRUE if there is a hot journal on the given pager. -** A hot journal is one that needs to be played back. -** -** If the current size of the database file is 0 but a journal file -** exists, that is probably an old journal left over from a prior -** database with the same name. Just delete the journal. -*/ -static int hasHotJournal(Pager *pPager){ - sqlite3_vfs *pVfs = pPager->pVfs; - if( !pPager->useJournal ) return 0; - if( !sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS) ){ - return 0; - } - if( sqlite3OsCheckReservedLock(pPager->fd) ){ - return 0; - } - if( sqlite3PagerPagecount(pPager)==0 ){ - sqlite3OsDelete(pVfs, pPager->zJournal, 0); - return 0; - }else{ - return 1; - } -} - -/* -** Try to find a page in the cache that can be recycled. -** -** This routine may return SQLITE_IOERR, SQLITE_FULL or SQLITE_OK. It -** does not set the pPager->errCode variable. -*/ -static int pager_recycle(Pager *pPager, PgHdr **ppPg){ - PgHdr *pPg; - *ppPg = 0; - - /* It is illegal to call this function unless the pager object - ** pointed to by pPager has at least one free page (page with nRef==0). - */ - assert(!MEMDB); - assert(pPager->lru.pFirst); - - /* Find a page to recycle. Try to locate a page that does not - ** require us to do an fsync() on the journal. - */ - pPg = pPager->lru.pFirstSynced; - - /* If we could not find a page that does not require an fsync() - ** on the journal file then fsync the journal file. This is a - ** very slow operation, so we work hard to avoid it. But sometimes - ** it can't be helped. - */ - if( pPg==0 && pPager->lru.pFirst){ - int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); - int rc = syncJournal(pPager); - if( rc!=0 ){ - return rc; - } - if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ - /* If in full-sync mode, write a new journal header into the - ** journal file. This is done to avoid ever modifying a journal - ** header that is involved in the rollback of pages that have - ** already been written to the database (in case the header is - ** trashed when the nRec field is updated). - */ - pPager->nRec = 0; - assert( pPager->journalOff > 0 ); - assert( pPager->doNotSync==0 ); - rc = writeJournalHdr(pPager); - if( rc!=0 ){ - return rc; - } - } - pPg = pPager->lru.pFirst; - } - - assert( pPg->nRef==0 ); - - /* Write the page to the database file if it is dirty. - */ - if( pPg->dirty ){ - int rc; - assert( pPg->needSync==0 ); - makeClean(pPg); - pPg->dirty = 1; - pPg->pDirty = 0; - rc = pager_write_pagelist( pPg ); - pPg->dirty = 0; - if( rc!=SQLITE_OK ){ - return rc; - } - } - assert( pPg->dirty==0 ); - - /* If the page we are recycling is marked as alwaysRollback, then - ** set the global alwaysRollback flag, thus disabling the - ** sqlite3PagerDontRollback() optimization for the rest of this transaction. - ** It is necessary to do this because the page marked alwaysRollback - ** might be reloaded at a later time but at that point we won't remember - ** that is was marked alwaysRollback. This means that all pages must - ** be marked as alwaysRollback from here on out. - */ - if( pPg->alwaysRollback ){ - IOTRACE(("ALWAYS_ROLLBACK %p\n", pPager)) - pPager->alwaysRollback = 1; - } - - /* Unlink the old page from the free list and the hash table - */ - unlinkPage(pPg); - assert( pPg->pgno==0 ); - - *ppPg = pPg; - return SQLITE_OK; -} - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -/* -** This function is called to free superfluous dynamically allocated memory -** held by the pager system. Memory in use by any SQLite pager allocated -** by the current thread may be sqlite3_free()ed. -** -** nReq is the number of bytes of memory required. Once this much has -** been released, the function returns. The return value is the total number -** of bytes of memory released. -*/ -int sqlite3PagerReleaseMemory(int nReq){ - int nReleased = 0; /* Bytes of memory released so far */ - sqlite3_mutex *mutex; /* The MEM2 mutex */ - Pager *pPager; /* For looping over pagers */ - int rc = SQLITE_OK; - - /* Acquire the memory-management mutex - */ - mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM2); - sqlite3_mutex_enter(mutex); - - /* Signal all database connections that memory management wants - ** to have access to the pagers. - */ - for(pPager=sqlite3PagerList; pPager; pPager=pPager->pNext){ - pPager->iInUseMM = 1; - } - - while( rc==SQLITE_OK && (nReq<0 || nReleasedneedSync || pPg->pPager->iInUseDB) ){ - pPg = pPg->gfree.pNext; - } - if( !pPg ){ - pPg = sqlite3LruPageList.pFirst; - while( pPg && pPg->pPager->iInUseDB ){ - pPg = pPg->gfree.pNext; - } - } - sqlite3_mutex_leave(sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU)); - - /* If pPg==0, then the block above has failed to find a page to - ** recycle. In this case return early - no further memory will - ** be released. - */ - if( !pPg ) break; - - pPager = pPg->pPager; - assert(!pPg->needSync || pPg==pPager->lru.pFirst); - assert(pPg->needSync || pPg==pPager->lru.pFirstSynced); - - rc = pager_recycle(pPager, &pRecycled); - assert(pRecycled==pPg || rc!=SQLITE_OK); - if( rc==SQLITE_OK ){ - /* We've found a page to free. At this point the page has been - ** removed from the page hash-table, free-list and synced-list - ** (pFirstSynced). It is still in the all pages (pAll) list. - ** Remove it from this list before freeing. - ** - ** Todo: Check the Pager.pStmt list to make sure this is Ok. It - ** probably is though. - */ - PgHdr *pTmp; - assert( pPg ); - if( pPg==pPager->pAll ){ - pPager->pAll = pPg->pNextAll; - }else{ - for( pTmp=pPager->pAll; pTmp->pNextAll!=pPg; pTmp=pTmp->pNextAll ){} - pTmp->pNextAll = pPg->pNextAll; - } - nReleased += ( - sizeof(*pPg) + pPager->pageSize - + sizeof(u32) + pPager->nExtra - + MEMDB*sizeof(PgHistory) - ); - IOTRACE(("PGFREE %p %d *\n", pPager, pPg->pgno)); - PAGER_INCR(sqlite3_pager_pgfree_count); - sqlite3_free(pPg->pData); - sqlite3_free(pPg); - pPager->nPage--; - }else{ - /* An error occured whilst writing to the database file or - ** journal in pager_recycle(). The error is not returned to the - ** caller of this function. Instead, set the Pager.errCode variable. - ** The error will be returned to the user (or users, in the case - ** of a shared pager cache) of the pager for which the error occured. - */ - assert( - (rc&0xff)==SQLITE_IOERR || - rc==SQLITE_FULL || - rc==SQLITE_BUSY - ); - assert( pPager->state>=PAGER_RESERVED ); - pager_error(pPager, rc); - } - } - - /* Clear the memory management flags and release the mutex - */ - for(pPager=sqlite3PagerList; pPager; pPager=pPager->pNext){ - pPager->iInUseMM = 0; - } - sqlite3_mutex_leave(mutex); - - /* Return the number of bytes released - */ - return nReleased; -} -#endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */ - -/* -** Read the content of page pPg out of the database file. -*/ -static int readDbPage(Pager *pPager, PgHdr *pPg, Pgno pgno){ - int rc; - i64 offset; - assert( MEMDB==0 ); - assert(pPager->fd->pMethods||pPager->tempFile); - if( !pPager->fd->pMethods ){ - return SQLITE_IOERR_SHORT_READ; - } - offset = (pgno-1)*(i64)pPager->pageSize; - rc = sqlite3OsRead(pPager->fd, PGHDR_TO_DATA(pPg), pPager->pageSize, offset); - PAGER_INCR(sqlite3_pager_readdb_count); - PAGER_INCR(pPager->nRead); - IOTRACE(("PGIN %p %d\n", pPager, pgno)); - if( pgno==1 ){ - memcpy(&pPager->dbFileVers, &((u8*)PGHDR_TO_DATA(pPg))[24], - sizeof(pPager->dbFileVers)); - } - CODEC1(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); - PAGERTRACE4("FETCH %d page %d hash(%08x)\n", - PAGERID(pPager), pPg->pgno, pager_pagehash(pPg)); - return rc; -} - - -/* -** This function is called to obtain the shared lock required before -** data may be read from the pager cache. If the shared lock has already -** been obtained, this function is a no-op. -** -** Immediately after obtaining the shared lock (if required), this function -** checks for a hot-journal file. If one is found, an emergency rollback -** is performed immediately. -*/ -static int pagerSharedLock(Pager *pPager){ - int rc = SQLITE_OK; - int isHot = 0; - - /* If this database is opened for exclusive access, has no outstanding - ** page references and is in an error-state, now is the chance to clear - ** the error. Discard the contents of the pager-cache and treat any - ** open journal file as a hot-journal. - */ - if( !MEMDB && pPager->exclusiveMode && pPager->nRef==0 && pPager->errCode ){ - if( pPager->journalOpen ){ - isHot = 1; - } - pager_reset(pPager); - pPager->errCode = SQLITE_OK; - } - - /* If the pager is still in an error state, do not proceed. The error - ** state will be cleared at some point in the future when all page - ** references are dropped and the cache can be discarded. - */ - if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){ - return pPager->errCode; - } - - if( pPager->state==PAGER_UNLOCK || isHot ){ - sqlite3_vfs *pVfs = pPager->pVfs; - if( !MEMDB ){ - assert( pPager->nRef==0 ); - if( !pPager->noReadlock ){ - rc = pager_wait_on_lock(pPager, SHARED_LOCK); - if( rc!=SQLITE_OK ){ - return pager_error(pPager, rc); - } - assert( pPager->state>=SHARED_LOCK ); - } - - /* If a journal file exists, and there is no RESERVED lock on the - ** database file, then it either needs to be played back or deleted. - */ - if( hasHotJournal(pPager) || isHot ){ - /* Get an EXCLUSIVE lock on the database file. At this point it is - ** important that a RESERVED lock is not obtained on the way to the - ** EXCLUSIVE lock. If it were, another process might open the - ** database file, detect the RESERVED lock, and conclude that the - ** database is safe to read while this process is still rolling it - ** back. - ** - ** Because the intermediate RESERVED lock is not requested, the - ** second process will get to this point in the code and fail to - ** obtain it's own EXCLUSIVE lock on the database file. - */ - if( pPager->statefd, EXCLUSIVE_LOCK); - if( rc!=SQLITE_OK ){ - pager_unlock(pPager); - return pager_error(pPager, rc); - } - pPager->state = PAGER_EXCLUSIVE; - } - - /* Open the journal for reading only. Return SQLITE_BUSY if - ** we are unable to open the journal file. - ** - ** The journal file does not need to be locked itself. The - ** journal file is never open unless the main database file holds - ** a write lock, so there is never any chance of two or more - ** processes opening the journal at the same time. - ** - ** Open the journal for read/write access. This is because in - ** exclusive-access mode the file descriptor will be kept open and - ** possibly used for a transaction later on. On some systems, the - ** OsTruncate() call used in exclusive-access mode also requires - ** a read/write file handle. - */ - if( !isHot ){ - rc = SQLITE_BUSY; - if( sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS) ){ - int fout = 0; - int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL; - assert( !pPager->tempFile ); - rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout); - assert( rc!=SQLITE_OK || pPager->jfd->pMethods ); - if( fout&SQLITE_OPEN_READONLY ){ - rc = SQLITE_BUSY; - sqlite3OsClose(pPager->jfd); - } - } - } - if( rc!=SQLITE_OK ){ - pager_unlock(pPager); - return ((rc==SQLITE_NOMEM||rc==SQLITE_IOERR_NOMEM)?rc:SQLITE_BUSY); - } - pPager->journalOpen = 1; - pPager->journalStarted = 0; - pPager->journalOff = 0; - pPager->setMaster = 0; - pPager->journalHdr = 0; - - /* Playback and delete the journal. Drop the database write - ** lock and reacquire the read lock. - */ - rc = pager_playback(pPager, 1); - if( rc!=SQLITE_OK ){ - return pager_error(pPager, rc); - } - assert(pPager->state==PAGER_SHARED || - (pPager->exclusiveMode && pPager->state>PAGER_SHARED) - ); - } - - if( pPager->pAll ){ - /* The shared-lock has just been acquired on the database file - ** and there are already pages in the cache (from a previous - ** read or write transaction). Check to see if the database - ** has been modified. If the database has changed, flush the - ** cache. - ** - ** Database changes is detected by looking at 15 bytes beginning - ** at offset 24 into the file. The first 4 of these 16 bytes are - ** a 32-bit counter that is incremented with each change. The - ** other bytes change randomly with each file change when - ** a codec is in use. - ** - ** There is a vanishingly small chance that a change will not be - ** detected. The chance of an undetected change is so small that - ** it can be neglected. - */ - char dbFileVers[sizeof(pPager->dbFileVers)]; - sqlite3PagerPagecount(pPager); - - if( pPager->errCode ){ - return pPager->errCode; - } - - if( pPager->dbSize>0 ){ - IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); - rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); - if( rc!=SQLITE_OK ){ - return rc; - } - }else{ - memset(dbFileVers, 0, sizeof(dbFileVers)); - } - - if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ - pager_reset(pPager); - } - } - } - assert( pPager->exclusiveMode || pPager->state<=PAGER_SHARED ); - if( pPager->state==PAGER_UNLOCK ){ - pPager->state = PAGER_SHARED; - } - } - - return rc; -} - -/* -** Allocate a PgHdr object. Either create a new one or reuse -** an existing one that is not otherwise in use. -** -** A new PgHdr structure is created if any of the following are -** true: -** -** (1) We have not exceeded our maximum allocated cache size -** as set by the "PRAGMA cache_size" command. -** -** (2) There are no unused PgHdr objects available at this time. -** -** (3) This is an in-memory database. -** -** (4) There are no PgHdr objects that do not require a journal -** file sync and a sync of the journal file is currently -** prohibited. -** -** Otherwise, reuse an existing PgHdr. In other words, reuse an -** existing PgHdr if all of the following are true: -** -** (1) We have reached or exceeded the maximum cache size -** allowed by "PRAGMA cache_size". -** -** (2) There is a PgHdr available with PgHdr->nRef==0 -** -** (3) We are not in an in-memory database -** -** (4) Either there is an available PgHdr that does not need -** to be synced to disk or else disk syncing is currently -** allowed. -*/ -static int pagerAllocatePage(Pager *pPager, PgHdr **ppPg){ - int rc = SQLITE_OK; - PgHdr *pPg; - void *pData; - - /* Create a new PgHdr if any of the four conditions defined - ** above are met: */ - if( pPager->nPagemxPage - || pPager->lru.pFirst==0 - || MEMDB - || (pPager->lru.pFirstSynced==0 && pPager->doNotSync) - ){ - if( pPager->nPage>=pPager->nHash ){ - pager_resize_hash_table(pPager, - pPager->nHash<256 ? 256 : pPager->nHash*2); - if( pPager->nHash==0 ){ - rc = SQLITE_NOMEM; - goto pager_allocate_out; - } - } - pagerLeave(pPager); - pPg = sqlite3_malloc( sizeof(*pPg) + sizeof(u32) + pPager->nExtra - + MEMDB*sizeof(PgHistory) ); - if( pPg ){ - pData = sqlite3_malloc( pPager->pageSize ); - if( pData==0 ){ - sqlite3_free(pPg); - pPg = 0; - } - } - pagerEnter(pPager); - if( pPg==0 ){ - rc = SQLITE_NOMEM; - goto pager_allocate_out; - } - memset(pPg, 0, sizeof(*pPg)); - if( MEMDB ){ - memset(PGHDR_TO_HIST(pPg, pPager), 0, sizeof(PgHistory)); - } - pPg->pData = pData; - pPg->pPager = pPager; - pPg->pNextAll = pPager->pAll; - pPager->pAll = pPg; - pPager->nPage++; - }else{ - /* Recycle an existing page with a zero ref-count. */ - rc = pager_recycle(pPager, &pPg); - if( rc==SQLITE_BUSY ){ - rc = SQLITE_IOERR_BLOCKED; - } - if( rc!=SQLITE_OK ){ - goto pager_allocate_out; - } - assert( pPager->state>=SHARED_LOCK ); - assert(pPg); - } - *ppPg = pPg; - -pager_allocate_out: - return rc; -} - -/* -** Make sure we have the content for a page. If the page was -** previously acquired with noContent==1, then the content was -** just initialized to zeros instead of being read from disk. -** But now we need the real data off of disk. So make sure we -** have it. Read it in if we do not have it already. -*/ -static int pager_get_content(PgHdr *pPg){ - if( pPg->needRead ){ - int rc = readDbPage(pPg->pPager, pPg, pPg->pgno); - if( rc==SQLITE_OK ){ - pPg->needRead = 0; - }else{ - return rc; - } - } - return SQLITE_OK; -} - -/* -** Acquire a page. -** -** A read lock on the disk file is obtained when the first page is acquired. -** This read lock is dropped when the last page is released. -** -** This routine works for any page number greater than 0. If the database -** file is smaller than the requested page, then no actual disk -** read occurs and the memory image of the page is initialized to -** all zeros. The extra data appended to a page is always initialized -** to zeros the first time a page is loaded into memory. -** -** The acquisition might fail for several reasons. In all cases, -** an appropriate error code is returned and *ppPage is set to NULL. -** -** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt -** to find a page in the in-memory cache first. If the page is not already -** in memory, this routine goes to disk to read it in whereas Lookup() -** just returns 0. This routine acquires a read-lock the first time it -** has to go to disk, and could also playback an old journal if necessary. -** Since Lookup() never goes to disk, it never has to deal with locks -** or journal files. -** -** If noContent is false, the page contents are actually read from disk. -** If noContent is true, it means that we do not care about the contents -** of the page at this time, so do not do a disk read. Just fill in the -** page content with zeros. But mark the fact that we have not read the -** content by setting the PgHdr.needRead flag. Later on, if -** sqlite3PagerWrite() is called on this page or if this routine is -** called again with noContent==0, that means that the content is needed -** and the disk read should occur at that point. -*/ -static int pagerAcquire( - Pager *pPager, /* The pager open on the database file */ - Pgno pgno, /* Page number to fetch */ - DbPage **ppPage, /* Write a pointer to the page here */ - int noContent /* Do not bother reading content from disk if true */ -){ - PgHdr *pPg; - int rc; - - assert( pPager->state==PAGER_UNLOCK || pPager->nRef>0 || pgno==1 ); - - /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page - ** number greater than this, or zero, is requested. - */ - if( pgno>PAGER_MAX_PGNO || pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ - return SQLITE_CORRUPT_BKPT; - } - - /* Make sure we have not hit any critical errors. - */ - assert( pPager!=0 ); - *ppPage = 0; - - /* If this is the first page accessed, then get a SHARED lock - ** on the database file. pagerSharedLock() is a no-op if - ** a database lock is already held. - */ - rc = pagerSharedLock(pPager); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( pPager->state!=PAGER_UNLOCK ); - - pPg = pager_lookup(pPager, pgno); - if( pPg==0 ){ - /* The requested page is not in the page cache. */ - int nMax; - int h; - PAGER_INCR(pPager->nMiss); - rc = pagerAllocatePage(pPager, &pPg); - if( rc!=SQLITE_OK ){ - return rc; - } - - pPg->pgno = pgno; - assert( !MEMDB || pgno>pPager->stmtSize ); - if( pPager->aInJournal && (int)pgno<=pPager->origDbSize ){ -#if 0 - sqlite3CheckMemory(pPager->aInJournal, pgno/8); -#endif - assert( pPager->journalOpen ); - pPg->inJournal = (pPager->aInJournal[pgno/8] & (1<<(pgno&7)))!=0; - pPg->needSync = 0; - }else{ - pPg->inJournal = 0; - pPg->needSync = 0; - } - - makeClean(pPg); - pPg->nRef = 1; - REFINFO(pPg); - - pPager->nRef++; - if( pPager->nExtra>0 ){ - memset(PGHDR_TO_EXTRA(pPg, pPager), 0, pPager->nExtra); - } - nMax = sqlite3PagerPagecount(pPager); - if( pPager->errCode ){ - rc = pPager->errCode; - sqlite3PagerUnref(pPg); - return rc; - } - - /* Populate the page with data, either by reading from the database - ** file, or by setting the entire page to zero. - */ - if( nMax<(int)pgno || MEMDB || (noContent && !pPager->alwaysRollback) ){ - if( pgno>pPager->mxPgno ){ - sqlite3PagerUnref(pPg); - return SQLITE_FULL; - } - memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize); - pPg->needRead = noContent && !pPager->alwaysRollback; - IOTRACE(("ZERO %p %d\n", pPager, pgno)); - }else{ - rc = readDbPage(pPager, pPg, pgno); - if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ - pPg->pgno = 0; - sqlite3PagerUnref(pPg); - return rc; - } - pPg->needRead = 0; - } - - /* Link the page into the page hash table */ - h = pgno & (pPager->nHash-1); - assert( pgno!=0 ); - pPg->pNextHash = pPager->aHash[h]; - pPager->aHash[h] = pPg; - if( pPg->pNextHash ){ - assert( pPg->pNextHash->pPrevHash==0 ); - pPg->pNextHash->pPrevHash = pPg; - } - -#ifdef SQLITE_CHECK_PAGES - pPg->pageHash = pager_pagehash(pPg); -#endif - }else{ - /* The requested page is in the page cache. */ - assert(pPager->nRef>0 || pgno==1); - PAGER_INCR(pPager->nHit); - if( !noContent ){ - rc = pager_get_content(pPg); - if( rc ){ - return rc; - } - } - page_ref(pPg); - } - *ppPage = pPg; - return SQLITE_OK; -} -int sqlite3PagerAcquire( - Pager *pPager, /* The pager open on the database file */ - Pgno pgno, /* Page number to fetch */ - DbPage **ppPage, /* Write a pointer to the page here */ - int noContent /* Do not bother reading content from disk if true */ -){ - int rc; - pagerEnter(pPager); - rc = pagerAcquire(pPager, pgno, ppPage, noContent); - pagerLeave(pPager); - return rc; -} - - -/* -** Acquire a page if it is already in the in-memory cache. Do -** not read the page from disk. Return a pointer to the page, -** or 0 if the page is not in cache. -** -** See also sqlite3PagerGet(). The difference between this routine -** and sqlite3PagerGet() is that _get() will go to the disk and read -** in the page if the page is not already in cache. This routine -** returns NULL if the page is not in cache or if a disk I/O error -** has ever happened. -*/ -DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ - PgHdr *pPg = 0; - - assert( pPager!=0 ); - assert( pgno!=0 ); - - pagerEnter(pPager); - if( pPager->state==PAGER_UNLOCK ){ - assert( !pPager->pAll || pPager->exclusiveMode ); - }else if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){ - /* Do nothing */ - }else if( (pPg = pager_lookup(pPager, pgno))!=0 ){ - page_ref(pPg); - } - pagerLeave(pPager); - return pPg; -} - -/* -** Release a page. -** -** If the number of references to the page drop to zero, then the -** page is added to the LRU list. When all references to all pages -** are released, a rollback occurs and the lock on the database is -** removed. -*/ -int sqlite3PagerUnref(DbPage *pPg){ - Pager *pPager = pPg->pPager; - - /* Decrement the reference count for this page - */ - assert( pPg->nRef>0 ); - pagerEnter(pPg->pPager); - pPg->nRef--; - REFINFO(pPg); - - CHECK_PAGE(pPg); - - /* When the number of references to a page reach 0, call the - ** destructor and add the page to the freelist. - */ - if( pPg->nRef==0 ){ - - lruListAdd(pPg); - if( pPager->xDestructor ){ - pPager->xDestructor(pPg, pPager->pageSize); - } - - /* When all pages reach the freelist, drop the read lock from - ** the database file. - */ - pPager->nRef--; - assert( pPager->nRef>=0 ); - if( pPager->nRef==0 && (!pPager->exclusiveMode || pPager->journalOff>0) ){ - pagerUnlockAndRollback(pPager); - } - } - pagerLeave(pPager); - return SQLITE_OK; -} - -/* -** Create a journal file for pPager. There should already be a RESERVED -** or EXCLUSIVE lock on the database file when this routine is called. -** -** Return SQLITE_OK if everything. Return an error code and release the -** write lock if anything goes wrong. -*/ -static int pager_open_journal(Pager *pPager){ - sqlite3_vfs *pVfs = pPager->pVfs; - int flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_CREATE); - - int rc; - assert( !MEMDB ); - assert( pPager->state>=PAGER_RESERVED ); - assert( pPager->journalOpen==0 ); - assert( pPager->useJournal ); - assert( pPager->aInJournal==0 ); - sqlite3PagerPagecount(pPager); - pagerLeave(pPager); - pPager->aInJournal = sqlite3MallocZero( pPager->dbSize/8 + 1 ); - pagerEnter(pPager); - if( pPager->aInJournal==0 ){ - rc = SQLITE_NOMEM; - goto failed_to_open_journal; - } - - if( pPager->tempFile ){ - flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); - }else{ - flags |= (SQLITE_OPEN_MAIN_JOURNAL); - } -#ifdef SQLITE_ENABLE_ATOMIC_WRITE - rc = sqlite3JournalOpen( - pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) - ); -#else - rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); -#endif - assert( rc!=SQLITE_OK || pPager->jfd->pMethods ); - pPager->journalOff = 0; - pPager->setMaster = 0; - pPager->journalHdr = 0; - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_NOMEM ){ - sqlite3OsDelete(pVfs, pPager->zJournal, 0); - } - goto failed_to_open_journal; - } - pPager->journalOpen = 1; - pPager->journalStarted = 0; - pPager->needSync = 0; - pPager->alwaysRollback = 0; - pPager->nRec = 0; - if( pPager->errCode ){ - rc = pPager->errCode; - goto failed_to_open_journal; - } - pPager->origDbSize = pPager->dbSize; - - rc = writeJournalHdr(pPager); - - if( pPager->stmtAutoopen && rc==SQLITE_OK ){ - rc = sqlite3PagerStmtBegin(pPager); - } - if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && rc!=SQLITE_IOERR_NOMEM ){ - rc = pager_end_transaction(pPager); - if( rc==SQLITE_OK ){ - rc = SQLITE_FULL; - } - } - return rc; - -failed_to_open_journal: - sqlite3_free(pPager->aInJournal); - pPager->aInJournal = 0; - return rc; -} - -/* -** Acquire a write-lock on the database. The lock is removed when -** the any of the following happen: -** -** * sqlite3PagerCommitPhaseTwo() is called. -** * sqlite3PagerRollback() is called. -** * sqlite3PagerClose() is called. -** * sqlite3PagerUnref() is called to on every outstanding page. -** -** The first parameter to this routine is a pointer to any open page of the -** database file. Nothing changes about the page - it is used merely to -** acquire a pointer to the Pager structure and as proof that there is -** already a read-lock on the database. -** -** The second parameter indicates how much space in bytes to reserve for a -** master journal file-name at the start of the journal when it is created. -** -** A journal file is opened if this is not a temporary file. For temporary -** files, the opening of the journal file is deferred until there is an -** actual need to write to the journal. -** -** If the database is already reserved for writing, this routine is a no-op. -** -** If exFlag is true, go ahead and get an EXCLUSIVE lock on the file -** immediately instead of waiting until we try to flush the cache. The -** exFlag is ignored if a transaction is already active. -*/ -int sqlite3PagerBegin(DbPage *pPg, int exFlag){ - Pager *pPager = pPg->pPager; - int rc = SQLITE_OK; - pagerEnter(pPager); - assert( pPg->nRef>0 ); - assert( pPager->state!=PAGER_UNLOCK ); - if( pPager->state==PAGER_SHARED ){ - assert( pPager->aInJournal==0 ); - if( MEMDB ){ - pPager->state = PAGER_EXCLUSIVE; - pPager->origDbSize = pPager->dbSize; - }else{ - rc = sqlite3OsLock(pPager->fd, RESERVED_LOCK); - if( rc==SQLITE_OK ){ - pPager->state = PAGER_RESERVED; - if( exFlag ){ - rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); - } - } - if( rc!=SQLITE_OK ){ - pagerLeave(pPager); - return rc; - } - pPager->dirtyCache = 0; - PAGERTRACE2("TRANSACTION %d\n", PAGERID(pPager)); - if( pPager->useJournal && !pPager->tempFile ){ - rc = pager_open_journal(pPager); - } - } - }else if( pPager->journalOpen && pPager->journalOff==0 ){ - /* This happens when the pager was in exclusive-access mode last - ** time a (read or write) transaction was successfully concluded - ** by this connection. Instead of deleting the journal file it was - ** kept open and truncated to 0 bytes. - */ - assert( pPager->nRec==0 ); - assert( pPager->origDbSize==0 ); - assert( pPager->aInJournal==0 ); - sqlite3PagerPagecount(pPager); - pagerLeave(pPager); - pPager->aInJournal = sqlite3MallocZero( pPager->dbSize/8 + 1 ); - pagerEnter(pPager); - if( !pPager->aInJournal ){ - rc = SQLITE_NOMEM; - }else{ - pPager->origDbSize = pPager->dbSize; - rc = writeJournalHdr(pPager); - } - } - assert( !pPager->journalOpen || pPager->journalOff>0 || rc!=SQLITE_OK ); - pagerLeave(pPager); - return rc; -} - -/* -** Make a page dirty. Set its dirty flag and add it to the dirty -** page list. -*/ -static void makeDirty(PgHdr *pPg){ - if( pPg->dirty==0 ){ - Pager *pPager = pPg->pPager; - pPg->dirty = 1; - pPg->pDirty = pPager->pDirty; - if( pPager->pDirty ){ - pPager->pDirty->pPrevDirty = pPg; - } - pPg->pPrevDirty = 0; - pPager->pDirty = pPg; - } -} - -/* -** Make a page clean. Clear its dirty bit and remove it from the -** dirty page list. -*/ -static void makeClean(PgHdr *pPg){ - if( pPg->dirty ){ - pPg->dirty = 0; - if( pPg->pDirty ){ - assert( pPg->pDirty->pPrevDirty==pPg ); - pPg->pDirty->pPrevDirty = pPg->pPrevDirty; - } - if( pPg->pPrevDirty ){ - assert( pPg->pPrevDirty->pDirty==pPg ); - pPg->pPrevDirty->pDirty = pPg->pDirty; - }else{ - assert( pPg->pPager->pDirty==pPg ); - pPg->pPager->pDirty = pPg->pDirty; - } - } -} - - -/* -** Mark a data page as writeable. The page is written into the journal -** if it is not there already. This routine must be called before making -** changes to a page. -** -** The first time this routine is called, the pager creates a new -** journal and acquires a RESERVED lock on the database. If the RESERVED -** lock could not be acquired, this routine returns SQLITE_BUSY. The -** calling routine must check for that return value and be careful not to -** change any page data until this routine returns SQLITE_OK. -** -** If the journal file could not be written because the disk is full, -** then this routine returns SQLITE_FULL and does an immediate rollback. -** All subsequent write attempts also return SQLITE_FULL until there -** is a call to sqlite3PagerCommit() or sqlite3PagerRollback() to -** reset. -*/ -static int pager_write(PgHdr *pPg){ - void *pData = PGHDR_TO_DATA(pPg); - Pager *pPager = pPg->pPager; - int rc = SQLITE_OK; - - /* Check for errors - */ - if( pPager->errCode ){ - return pPager->errCode; - } - if( pPager->readOnly ){ - return SQLITE_PERM; - } - - assert( !pPager->setMaster ); - - CHECK_PAGE(pPg); - - /* If this page was previously acquired with noContent==1, that means - ** we didn't really read in the content of the page. This can happen - ** (for example) when the page is being moved to the freelist. But - ** now we are (perhaps) moving the page off of the freelist for - ** reuse and we need to know its original content so that content - ** can be stored in the rollback journal. So do the read at this - ** time. - */ - rc = pager_get_content(pPg); - if( rc ){ - return rc; - } - - /* Mark the page as dirty. If the page has already been written - ** to the journal then we can return right away. - */ - makeDirty(pPg); - if( pPg->inJournal && (pageInStatement(pPg) || pPager->stmtInUse==0) ){ - pPager->dirtyCache = 1; - }else{ - - /* If we get this far, it means that the page needs to be - ** written to the transaction journal or the ckeckpoint journal - ** or both. - ** - ** First check to see that the transaction journal exists and - ** create it if it does not. - */ - assert( pPager->state!=PAGER_UNLOCK ); - rc = sqlite3PagerBegin(pPg, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( pPager->state>=PAGER_RESERVED ); - if( !pPager->journalOpen && pPager->useJournal ){ - rc = pager_open_journal(pPager); - if( rc!=SQLITE_OK ) return rc; - } - assert( pPager->journalOpen || !pPager->useJournal ); - pPager->dirtyCache = 1; - - /* The transaction journal now exists and we have a RESERVED or an - ** EXCLUSIVE lock on the main database file. Write the current page to - ** the transaction journal if it is not there already. - */ - if( !pPg->inJournal && (pPager->useJournal || MEMDB) ){ - if( (int)pPg->pgno <= pPager->origDbSize ){ - if( MEMDB ){ - PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); - PAGERTRACE3("JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); - assert( pHist->pOrig==0 ); - pHist->pOrig = sqlite3_malloc( pPager->pageSize ); - if( pHist->pOrig ){ - memcpy(pHist->pOrig, PGHDR_TO_DATA(pPg), pPager->pageSize); - } - }else{ - u32 cksum; - char *pData2; - - /* We should never write to the journal file the page that - ** contains the database locks. The following assert verifies - ** that we do not. */ - assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); - pData2 = CODEC2(pPager, pData, pPg->pgno, 7); - cksum = pager_cksum(pPager, (u8*)pData2); - rc = write32bits(pPager->jfd, pPager->journalOff, pPg->pgno); - if( rc==SQLITE_OK ){ - rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, - pPager->journalOff + 4); - pPager->journalOff += pPager->pageSize+4; - } - if( rc==SQLITE_OK ){ - rc = write32bits(pPager->jfd, pPager->journalOff, cksum); - pPager->journalOff += 4; - } - IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, - pPager->journalOff, pPager->pageSize)); - PAGER_INCR(sqlite3_pager_writej_count); - PAGERTRACE5("JOURNAL %d page %d needSync=%d hash(%08x)\n", - PAGERID(pPager), pPg->pgno, pPg->needSync, pager_pagehash(pPg)); - - /* An error has occured writing to the journal file. The - ** transaction will be rolled back by the layer above. - */ - if( rc!=SQLITE_OK ){ - return rc; - } - - pPager->nRec++; - assert( pPager->aInJournal!=0 ); - pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7); - pPg->needSync = !pPager->noSync; - if( pPager->stmtInUse ){ - pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); - } - } - }else{ - pPg->needSync = !pPager->journalStarted && !pPager->noSync; - PAGERTRACE4("APPEND %d page %d needSync=%d\n", - PAGERID(pPager), pPg->pgno, pPg->needSync); - } - if( pPg->needSync ){ - pPager->needSync = 1; - } - pPg->inJournal = 1; - } - - /* If the statement journal is open and the page is not in it, - ** then write the current page to the statement journal. Note that - ** the statement journal format differs from the standard journal format - ** in that it omits the checksums and the header. - */ - if( pPager->stmtInUse - && !pageInStatement(pPg) - && (int)pPg->pgno<=pPager->stmtSize - ){ - assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize ); - if( MEMDB ){ - PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); - assert( pHist->pStmt==0 ); - pHist->pStmt = sqlite3_malloc( pPager->pageSize ); - if( pHist->pStmt ){ - memcpy(pHist->pStmt, PGHDR_TO_DATA(pPg), pPager->pageSize); - } - PAGERTRACE3("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); - page_add_to_stmt_list(pPg); - }else{ - i64 offset = pPager->stmtNRec*(4+pPager->pageSize); - char *pData2 = CODEC2(pPager, pData, pPg->pgno, 7); - rc = write32bits(pPager->stfd, offset, pPg->pgno); - if( rc==SQLITE_OK ){ - rc = sqlite3OsWrite(pPager->stfd, pData2, pPager->pageSize, offset+4); - } - PAGERTRACE3("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno); - if( rc!=SQLITE_OK ){ - return rc; - } - pPager->stmtNRec++; - assert( pPager->aInStmt!=0 ); - pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); - } - } - } - - /* Update the database size and return. - */ - assert( pPager->state>=PAGER_SHARED ); - if( pPager->dbSize<(int)pPg->pgno ){ - pPager->dbSize = pPg->pgno; - if( !MEMDB && pPager->dbSize==PENDING_BYTE/pPager->pageSize ){ - pPager->dbSize++; - } - } - return rc; -} - -/* -** This function is used to mark a data-page as writable. It uses -** pager_write() to open a journal file (if it is not already open) -** and write the page *pData to the journal. -** -** The difference between this function and pager_write() is that this -** function also deals with the special case where 2 or more pages -** fit on a single disk sector. In this case all co-resident pages -** must have been written to the journal file before returning. -*/ -int sqlite3PagerWrite(DbPage *pDbPage){ - int rc = SQLITE_OK; - - PgHdr *pPg = pDbPage; - Pager *pPager = pPg->pPager; - Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); - - pagerEnter(pPager); - if( !MEMDB && nPagePerSector>1 ){ - Pgno nPageCount; /* Total number of pages in database file */ - Pgno pg1; /* First page of the sector pPg is located on. */ - int nPage; /* Number of pages starting at pg1 to journal */ - int ii; - int needSync = 0; - - /* Set the doNotSync flag to 1. This is because we cannot allow a journal - ** header to be written between the pages journaled by this function. - */ - assert( pPager->doNotSync==0 ); - pPager->doNotSync = 1; - - /* This trick assumes that both the page-size and sector-size are - ** an integer power of 2. It sets variable pg1 to the identifier - ** of the first page of the sector pPg is located on. - */ - pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; - - nPageCount = sqlite3PagerPagecount(pPager); - if( pPg->pgno>nPageCount ){ - nPage = (pPg->pgno - pg1)+1; - }else if( (pg1+nPagePerSector-1)>nPageCount ){ - nPage = nPageCount+1-pg1; - }else{ - nPage = nPagePerSector; - } - assert(nPage>0); - assert(pg1<=pPg->pgno); - assert((pg1+nPage)>pPg->pgno); - - for(ii=0; iiaInJournal || pg==pPg->pgno || - pg>pPager->origDbSize || !(pPager->aInJournal[pg/8]&(1<<(pg&7))) - ) { - if( pg!=PAGER_MJ_PGNO(pPager) ){ - rc = sqlite3PagerGet(pPager, pg, &pPage); - if( rc==SQLITE_OK ){ - rc = pager_write(pPage); - if( pPage->needSync ){ - needSync = 1; - } - sqlite3PagerUnref(pPage); - } - } - }else if( (pPage = pager_lookup(pPager, pg)) ){ - if( pPage->needSync ){ - needSync = 1; - } - } - } - - /* If the PgHdr.needSync flag is set for any of the nPage pages - ** starting at pg1, then it needs to be set for all of them. Because - ** writing to any of these nPage pages may damage the others, the - ** journal file must contain sync()ed copies of all of them - ** before any of them can be written out to the database file. - */ - if( needSync ){ - for(ii=0; iineedSync = 1; - } - assert(pPager->needSync); - } - - assert( pPager->doNotSync==1 ); - pPager->doNotSync = 0; - }else{ - rc = pager_write(pDbPage); - } - pagerLeave(pPager); - return rc; -} - -/* -** Return TRUE if the page given in the argument was previously passed -** to sqlite3PagerWrite(). In other words, return TRUE if it is ok -** to change the content of the page. -*/ -#ifndef NDEBUG -int sqlite3PagerIswriteable(DbPage *pPg){ - return pPg->dirty; -} -#endif - -#ifndef SQLITE_OMIT_VACUUM -/* -** Replace the content of a single page with the information in the third -** argument. -*/ -int sqlite3PagerOverwrite(Pager *pPager, Pgno pgno, void *pData){ - PgHdr *pPg; - int rc; - - pagerEnter(pPager); - rc = sqlite3PagerGet(pPager, pgno, &pPg); - if( rc==SQLITE_OK ){ - rc = sqlite3PagerWrite(pPg); - if( rc==SQLITE_OK ){ - memcpy(sqlite3PagerGetData(pPg), pData, pPager->pageSize); - } - sqlite3PagerUnref(pPg); - } - pagerLeave(pPager); - return rc; -} -#endif - -/* -** A call to this routine tells the pager that it is not necessary to -** write the information on page pPg back to the disk, even though -** that page might be marked as dirty. -** -** The overlying software layer calls this routine when all of the data -** on the given page is unused. The pager marks the page as clean so -** that it does not get written to disk. -** -** Tests show that this optimization, together with the -** sqlite3PagerDontRollback() below, more than double the speed -** of large INSERT operations and quadruple the speed of large DELETEs. -** -** When this routine is called, set the alwaysRollback flag to true. -** Subsequent calls to sqlite3PagerDontRollback() for the same page -** will thereafter be ignored. This is necessary to avoid a problem -** where a page with data is added to the freelist during one part of -** a transaction then removed from the freelist during a later part -** of the same transaction and reused for some other purpose. When it -** is first added to the freelist, this routine is called. When reused, -** the sqlite3PagerDontRollback() routine is called. But because the -** page contains critical data, we still need to be sure it gets -** rolled back in spite of the sqlite3PagerDontRollback() call. -*/ -void sqlite3PagerDontWrite(DbPage *pDbPage){ - PgHdr *pPg = pDbPage; - Pager *pPager = pPg->pPager; - - if( MEMDB ) return; - pagerEnter(pPager); - pPg->alwaysRollback = 1; - if( pPg->dirty && !pPager->stmtInUse ){ - assert( pPager->state>=PAGER_SHARED ); - if( pPager->dbSize==(int)pPg->pgno && pPager->origDbSizedbSize ){ - /* If this pages is the last page in the file and the file has grown - ** during the current transaction, then do NOT mark the page as clean. - ** When the database file grows, we must make sure that the last page - ** gets written at least once so that the disk file will be the correct - ** size. If you do not write this page and the size of the file - ** on the disk ends up being too small, that can lead to database - ** corruption during the next transaction. - */ - }else{ - PAGERTRACE3("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager)); - IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) - makeClean(pPg); -#ifdef SQLITE_CHECK_PAGES - pPg->pageHash = pager_pagehash(pPg); -#endif - } - } - pagerLeave(pPager); -} - -/* -** A call to this routine tells the pager that if a rollback occurs, -** it is not necessary to restore the data on the given page. This -** means that the pager does not have to record the given page in the -** rollback journal. -** -** If we have not yet actually read the content of this page (if -** the PgHdr.needRead flag is set) then this routine acts as a promise -** that we will never need to read the page content in the future. -** so the needRead flag can be cleared at this point. -*/ -void sqlite3PagerDontRollback(DbPage *pPg){ - Pager *pPager = pPg->pPager; - - pagerEnter(pPager); - assert( pPager->state>=PAGER_RESERVED ); - if( pPager->journalOpen==0 ) return; - if( pPg->alwaysRollback || pPager->alwaysRollback || MEMDB ) return; - if( !pPg->inJournal && (int)pPg->pgno <= pPager->origDbSize ){ - assert( pPager->aInJournal!=0 ); - pPager->aInJournal[pPg->pgno/8] |= 1<<(pPg->pgno&7); - pPg->inJournal = 1; - pPg->needRead = 0; - if( pPager->stmtInUse ){ - pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); - } - PAGERTRACE3("DONT_ROLLBACK page %d of %d\n", pPg->pgno, PAGERID(pPager)); - IOTRACE(("GARBAGE %p %d\n", pPager, pPg->pgno)) - } - if( pPager->stmtInUse - && !pageInStatement(pPg) - && (int)pPg->pgno<=pPager->stmtSize - ){ - assert( pPg->inJournal || (int)pPg->pgno>pPager->origDbSize ); - assert( pPager->aInStmt!=0 ); - pPager->aInStmt[pPg->pgno/8] |= 1<<(pPg->pgno&7); - } - pagerLeave(pPager); -} - - -/* -** This routine is called to increment the database file change-counter, -** stored at byte 24 of the pager file. -*/ -static int pager_incr_changecounter(Pager *pPager, int isDirect){ - PgHdr *pPgHdr; - u32 change_counter; - int rc = SQLITE_OK; - - if( !pPager->changeCountDone ){ - /* Open page 1 of the file for writing. */ - rc = sqlite3PagerGet(pPager, 1, &pPgHdr); - if( rc!=SQLITE_OK ) return rc; - - if( !isDirect ){ - rc = sqlite3PagerWrite(pPgHdr); - if( rc!=SQLITE_OK ){ - sqlite3PagerUnref(pPgHdr); - return rc; - } - } - - /* Increment the value just read and write it back to byte 24. */ - change_counter = sqlite3Get4byte((u8*)pPager->dbFileVers); - change_counter++; - put32bits(((char*)PGHDR_TO_DATA(pPgHdr))+24, change_counter); - - if( isDirect && pPager->fd->pMethods ){ - const void *zBuf = PGHDR_TO_DATA(pPgHdr); - rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); - } - - /* Release the page reference. */ - sqlite3PagerUnref(pPgHdr); - pPager->changeCountDone = 1; - } - return rc; -} - -/* -** Sync the database file for the pager pPager. zMaster points to the name -** of a master journal file that should be written into the individual -** journal file. zMaster may be NULL, which is interpreted as no master -** journal (a single database transaction). -** -** This routine ensures that the journal is synced, all dirty pages written -** to the database file and the database file synced. The only thing that -** remains to commit the transaction is to delete the journal file (or -** master journal file if specified). -** -** Note that if zMaster==NULL, this does not overwrite a previous value -** passed to an sqlite3PagerCommitPhaseOne() call. -** -** If parameter nTrunc is non-zero, then the pager file is truncated to -** nTrunc pages (this is used by auto-vacuum databases). -*/ -int sqlite3PagerCommitPhaseOne(Pager *pPager, const char *zMaster, Pgno nTrunc){ - int rc = SQLITE_OK; - - PAGERTRACE4("DATABASE SYNC: File=%s zMaster=%s nTrunc=%d\n", - pPager->zFilename, zMaster, nTrunc); - pagerEnter(pPager); - - /* If this is an in-memory db, or no pages have been written to, or this - ** function has already been called, it is a no-op. - */ - if( pPager->state!=PAGER_SYNCED && !MEMDB && pPager->dirtyCache ){ - PgHdr *pPg; - -#ifdef SQLITE_ENABLE_ATOMIC_WRITE - /* The atomic-write optimization can be used if all of the - ** following are true: - ** - ** + The file-system supports the atomic-write property for - ** blocks of size page-size, and - ** + This commit is not part of a multi-file transaction, and - ** + Exactly one page has been modified and store in the journal file. - ** - ** If the optimization can be used, then the journal file will never - ** be created for this transaction. - */ - int useAtomicWrite = ( - !zMaster && - pPager->journalOff==jrnlBufferSize(pPager) && - nTrunc==0 && - (0==pPager->pDirty || 0==pPager->pDirty->pDirty) - ); - if( useAtomicWrite ){ - /* Update the nRec field in the journal file. */ - int offset = pPager->journalHdr + sizeof(aJournalMagic); - assert(pPager->nRec==1); - rc = write32bits(pPager->jfd, offset, pPager->nRec); - - /* Update the db file change counter. The following call will modify - ** the in-memory representation of page 1 to include the updated - ** change counter and then write page 1 directly to the database - ** file. Because of the atomic-write property of the host file-system, - ** this is safe. - */ - if( rc==SQLITE_OK ){ - rc = pager_incr_changecounter(pPager, 1); - } - }else{ - rc = sqlite3JournalCreate(pPager->jfd); - } - - if( !useAtomicWrite && rc==SQLITE_OK ) -#endif - - /* If a master journal file name has already been written to the - ** journal file, then no sync is required. This happens when it is - ** written, then the process fails to upgrade from a RESERVED to an - ** EXCLUSIVE lock. The next time the process tries to commit the - ** transaction the m-j name will have already been written. - */ - if( !pPager->setMaster ){ - assert( pPager->journalOpen ); - rc = pager_incr_changecounter(pPager, 0); - if( rc!=SQLITE_OK ) goto sync_exit; -#ifndef SQLITE_OMIT_AUTOVACUUM - if( nTrunc!=0 ){ - /* If this transaction has made the database smaller, then all pages - ** being discarded by the truncation must be written to the journal - ** file. - */ - Pgno i; - int iSkip = PAGER_MJ_PGNO(pPager); - for( i=nTrunc+1; i<=pPager->origDbSize; i++ ){ - if( !(pPager->aInJournal[i/8] & (1<<(i&7))) && i!=iSkip ){ - rc = sqlite3PagerGet(pPager, i, &pPg); - if( rc!=SQLITE_OK ) goto sync_exit; - rc = sqlite3PagerWrite(pPg); - sqlite3PagerUnref(pPg); - if( rc!=SQLITE_OK ) goto sync_exit; - } - } - } -#endif - rc = writeMasterJournal(pPager, zMaster); - if( rc!=SQLITE_OK ) goto sync_exit; - rc = syncJournal(pPager); - } - if( rc!=SQLITE_OK ) goto sync_exit; - -#ifndef SQLITE_OMIT_AUTOVACUUM - if( nTrunc!=0 ){ - rc = sqlite3PagerTruncate(pPager, nTrunc); - if( rc!=SQLITE_OK ) goto sync_exit; - } -#endif - - /* Write all dirty pages to the database file */ - pPg = pager_get_all_dirty_pages(pPager); - rc = pager_write_pagelist(pPg); - if( rc!=SQLITE_OK ){ - while( pPg && !pPg->dirty ){ pPg = pPg->pDirty; } - pPager->pDirty = pPg; - goto sync_exit; - } - pPager->pDirty = 0; - - /* Sync the database file. */ - if( !pPager->noSync ){ - rc = sqlite3OsSync(pPager->fd, pPager->sync_flags); - } - IOTRACE(("DBSYNC %p\n", pPager)) - - pPager->state = PAGER_SYNCED; - }else if( MEMDB && nTrunc!=0 ){ - rc = sqlite3PagerTruncate(pPager, nTrunc); - } - -sync_exit: - if( rc==SQLITE_IOERR_BLOCKED ){ - /* pager_incr_changecounter() may attempt to obtain an exclusive - * lock to spill the cache and return IOERR_BLOCKED. But since - * there is no chance the cache is inconsistent, it's - * better to return SQLITE_BUSY. - */ - rc = SQLITE_BUSY; - } - pagerLeave(pPager); - return rc; -} - - -/* -** Commit all changes to the database and release the write lock. -** -** If the commit fails for any reason, a rollback attempt is made -** and an error code is returned. If the commit worked, SQLITE_OK -** is returned. -*/ -int sqlite3PagerCommitPhaseTwo(Pager *pPager){ - int rc; - PgHdr *pPg; - - if( pPager->errCode ){ - return pPager->errCode; - } - if( pPager->statedirty = 0; - pPg->inJournal = 0; - pHist->inStmt = 0; - pPg->needSync = 0; - pHist->pPrevStmt = pHist->pNextStmt = 0; - pPg = pPg->pDirty; - } - pPager->pDirty = 0; -#ifndef NDEBUG - for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ - PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); - assert( !pPg->alwaysRollback ); - assert( !pHist->pOrig ); - assert( !pHist->pStmt ); - } -#endif - pPager->pStmt = 0; - pPager->state = PAGER_SHARED; - return SQLITE_OK; - } - assert( pPager->journalOpen || !pPager->dirtyCache ); - assert( pPager->state==PAGER_SYNCED || !pPager->dirtyCache ); - rc = pager_end_transaction(pPager); - rc = pager_error(pPager, rc); - pagerLeave(pPager); - return rc; -} - -/* -** Rollback all changes. The database falls back to PAGER_SHARED mode. -** All in-memory cache pages revert to their original data contents. -** The journal is deleted. -** -** This routine cannot fail unless some other process is not following -** the correct locking protocol or unless some other -** process is writing trash into the journal file (SQLITE_CORRUPT) or -** unless a prior malloc() failed (SQLITE_NOMEM). Appropriate error -** codes are returned for all these occasions. Otherwise, -** SQLITE_OK is returned. -*/ -int sqlite3PagerRollback(Pager *pPager){ - int rc; - PAGERTRACE2("ROLLBACK %d\n", PAGERID(pPager)); - if( MEMDB ){ - PgHdr *p; - for(p=pPager->pAll; p; p=p->pNextAll){ - PgHistory *pHist; - assert( !p->alwaysRollback ); - if( !p->dirty ){ - assert( !((PgHistory *)PGHDR_TO_HIST(p, pPager))->pOrig ); - assert( !((PgHistory *)PGHDR_TO_HIST(p, pPager))->pStmt ); - continue; - } - - pHist = PGHDR_TO_HIST(p, pPager); - if( pHist->pOrig ){ - memcpy(PGHDR_TO_DATA(p), pHist->pOrig, pPager->pageSize); - PAGERTRACE3("ROLLBACK-PAGE %d of %d\n", p->pgno, PAGERID(pPager)); - }else{ - PAGERTRACE3("PAGE %d is clean on %d\n", p->pgno, PAGERID(pPager)); - } - clearHistory(pHist); - p->dirty = 0; - p->inJournal = 0; - pHist->inStmt = 0; - pHist->pPrevStmt = pHist->pNextStmt = 0; - if( pPager->xReiniter ){ - pPager->xReiniter(p, pPager->pageSize); - } - } - pPager->pDirty = 0; - pPager->pStmt = 0; - pPager->dbSize = pPager->origDbSize; - pager_truncate_cache(pPager); - pPager->stmtInUse = 0; - pPager->state = PAGER_SHARED; - return SQLITE_OK; - } - - pagerEnter(pPager); - if( !pPager->dirtyCache || !pPager->journalOpen ){ - rc = pager_end_transaction(pPager); - pagerLeave(pPager); - return rc; - } - - if( pPager->errCode && pPager->errCode!=SQLITE_FULL ){ - if( pPager->state>=PAGER_EXCLUSIVE ){ - pager_playback(pPager, 0); - } - pagerLeave(pPager); - return pPager->errCode; - } - if( pPager->state==PAGER_RESERVED ){ - int rc2; - rc = pager_playback(pPager, 0); - rc2 = pager_end_transaction(pPager); - if( rc==SQLITE_OK ){ - rc = rc2; - } - }else{ - rc = pager_playback(pPager, 0); - } - /* pager_reset(pPager); */ - pPager->dbSize = -1; - - /* If an error occurs during a ROLLBACK, we can no longer trust the pager - ** cache. So call pager_error() on the way out to make any error - ** persistent. - */ - rc = pager_error(pPager, rc); - pagerLeave(pPager); - return rc; -} - -/* -** Return TRUE if the database file is opened read-only. Return FALSE -** if the database is (in theory) writable. -*/ -int sqlite3PagerIsreadonly(Pager *pPager){ - return pPager->readOnly; -} - -/* -** Return the number of references to the pager. -*/ -int sqlite3PagerRefcount(Pager *pPager){ - return pPager->nRef; -} - -#ifdef SQLITE_TEST -/* -** This routine is used for testing and analysis only. -*/ -int *sqlite3PagerStats(Pager *pPager){ - static int a[11]; - a[0] = pPager->nRef; - a[1] = pPager->nPage; - a[2] = pPager->mxPage; - a[3] = pPager->dbSize; - a[4] = pPager->state; - a[5] = pPager->errCode; - a[6] = pPager->nHit; - a[7] = pPager->nMiss; - a[8] = 0; /* Used to be pPager->nOvfl */ - a[9] = pPager->nRead; - a[10] = pPager->nWrite; - return a; -} -#endif - -/* -** Set the statement rollback point. -** -** This routine should be called with the transaction journal already -** open. A new statement journal is created that can be used to rollback -** changes of a single SQL command within a larger transaction. -*/ -static int pagerStmtBegin(Pager *pPager){ - int rc; - assert( !pPager->stmtInUse ); - assert( pPager->state>=PAGER_SHARED ); - assert( pPager->dbSize>=0 ); - PAGERTRACE2("STMT-BEGIN %d\n", PAGERID(pPager)); - if( MEMDB ){ - pPager->stmtInUse = 1; - pPager->stmtSize = pPager->dbSize; - return SQLITE_OK; - } - if( !pPager->journalOpen ){ - pPager->stmtAutoopen = 1; - return SQLITE_OK; - } - assert( pPager->journalOpen ); - pagerLeave(pPager); - assert( pPager->aInStmt==0 ); - pPager->aInStmt = sqlite3MallocZero( pPager->dbSize/8 + 1 ); - pagerEnter(pPager); - if( pPager->aInStmt==0 ){ - /* sqlite3OsLock(pPager->fd, SHARED_LOCK); */ - return SQLITE_NOMEM; - } -#ifndef NDEBUG - rc = sqlite3OsFileSize(pPager->jfd, &pPager->stmtJSize); - if( rc ) goto stmt_begin_failed; - assert( pPager->stmtJSize == pPager->journalOff ); -#endif - pPager->stmtJSize = pPager->journalOff; - pPager->stmtSize = pPager->dbSize; - pPager->stmtHdrOff = 0; - pPager->stmtCksum = pPager->cksumInit; - if( !pPager->stmtOpen ){ - rc = sqlite3PagerOpentemp(pPager->pVfs, pPager->stfd, pPager->zStmtJrnl, - SQLITE_OPEN_SUBJOURNAL); - if( rc ){ - goto stmt_begin_failed; - } - pPager->stmtOpen = 1; - pPager->stmtNRec = 0; - } - pPager->stmtInUse = 1; - return SQLITE_OK; - -stmt_begin_failed: - if( pPager->aInStmt ){ - sqlite3_free(pPager->aInStmt); - pPager->aInStmt = 0; - } - return rc; -} -int sqlite3PagerStmtBegin(Pager *pPager){ - int rc; - pagerEnter(pPager); - rc = pagerStmtBegin(pPager); - pagerLeave(pPager); - return rc; -} - -/* -** Commit a statement. -*/ -int sqlite3PagerStmtCommit(Pager *pPager){ - pagerEnter(pPager); - if( pPager->stmtInUse ){ - PgHdr *pPg, *pNext; - PAGERTRACE2("STMT-COMMIT %d\n", PAGERID(pPager)); - if( !MEMDB ){ - /* sqlite3OsTruncate(pPager->stfd, 0); */ - sqlite3_free( pPager->aInStmt ); - pPager->aInStmt = 0; - }else{ - for(pPg=pPager->pStmt; pPg; pPg=pNext){ - PgHistory *pHist = PGHDR_TO_HIST(pPg, pPager); - pNext = pHist->pNextStmt; - assert( pHist->inStmt ); - pHist->inStmt = 0; - pHist->pPrevStmt = pHist->pNextStmt = 0; - sqlite3_free(pHist->pStmt); - pHist->pStmt = 0; - } - } - pPager->stmtNRec = 0; - pPager->stmtInUse = 0; - pPager->pStmt = 0; - } - pPager->stmtAutoopen = 0; - pagerLeave(pPager); - return SQLITE_OK; -} - -/* -** Rollback a statement. -*/ -int sqlite3PagerStmtRollback(Pager *pPager){ - int rc; - pagerEnter(pPager); - if( pPager->stmtInUse ){ - PAGERTRACE2("STMT-ROLLBACK %d\n", PAGERID(pPager)); - if( MEMDB ){ - PgHdr *pPg; - PgHistory *pHist; - for(pPg=pPager->pStmt; pPg; pPg=pHist->pNextStmt){ - pHist = PGHDR_TO_HIST(pPg, pPager); - if( pHist->pStmt ){ - memcpy(PGHDR_TO_DATA(pPg), pHist->pStmt, pPager->pageSize); - sqlite3_free(pHist->pStmt); - pHist->pStmt = 0; - } - } - pPager->dbSize = pPager->stmtSize; - pager_truncate_cache(pPager); - rc = SQLITE_OK; - }else{ - rc = pager_stmt_playback(pPager); - } - sqlite3PagerStmtCommit(pPager); - }else{ - rc = SQLITE_OK; - } - pPager->stmtAutoopen = 0; - pagerLeave(pPager); - return rc; -} - -/* -** Return the full pathname of the database file. -*/ -const char *sqlite3PagerFilename(Pager *pPager){ - return pPager->zFilename; -} - -/* -** Return the VFS structure for the pager. -*/ -const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ - return pPager->pVfs; -} - -/* -** Return the file handle for the database file associated -** with the pager. This might return NULL if the file has -** not yet been opened. -*/ -sqlite3_file *sqlite3PagerFile(Pager *pPager){ - return pPager->fd; -} - -/* -** Return the directory of the database file. -*/ -const char *sqlite3PagerDirname(Pager *pPager){ - return pPager->zDirectory; -} - -/* -** Return the full pathname of the journal file. -*/ -const char *sqlite3PagerJournalname(Pager *pPager){ - return pPager->zJournal; -} - -/* -** Return true if fsync() calls are disabled for this pager. Return FALSE -** if fsync()s are executed normally. -*/ -int sqlite3PagerNosync(Pager *pPager){ - return pPager->noSync; -} - -#ifdef SQLITE_HAS_CODEC -/* -** Set the codec for this pager -*/ -void sqlite3PagerSetCodec( - Pager *pPager, - void *(*xCodec)(void*,void*,Pgno,int), - void *pCodecArg -){ - pPager->xCodec = xCodec; - pPager->pCodecArg = pCodecArg; -} -#endif - -#ifndef SQLITE_OMIT_AUTOVACUUM -/* -** Move the page pPg to location pgno in the file. -** -** There must be no references to the page previously located at -** pgno (which we call pPgOld) though that page is allowed to be -** in cache. If the page previous located at pgno is not already -** in the rollback journal, it is not put there by by this routine. -** -** References to the page pPg remain valid. Updating any -** meta-data associated with pPg (i.e. data stored in the nExtra bytes -** allocated along with the page) is the responsibility of the caller. -** -** A transaction must be active when this routine is called. It used to be -** required that a statement transaction was not active, but this restriction -** has been removed (CREATE INDEX needs to move a page when a statement -** transaction is active). -*/ -int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno){ - PgHdr *pPgOld; /* The page being overwritten. */ - int h; - Pgno needSyncPgno = 0; - - pagerEnter(pPager); - assert( pPg->nRef>0 ); - - PAGERTRACE5("MOVE %d page %d (needSync=%d) moves to %d\n", - PAGERID(pPager), pPg->pgno, pPg->needSync, pgno); - IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) - - pager_get_content(pPg); - if( pPg->needSync ){ - needSyncPgno = pPg->pgno; - assert( pPg->inJournal || (int)pgno>pPager->origDbSize ); - assert( pPg->dirty ); - assert( pPager->needSync ); - } - - /* Unlink pPg from it's hash-chain */ - unlinkHashChain(pPager, pPg); - - /* If the cache contains a page with page-number pgno, remove it - ** from it's hash chain. Also, if the PgHdr.needSync was set for - ** page pgno before the 'move' operation, it needs to be retained - ** for the page moved there. - */ - pPg->needSync = 0; - pPgOld = pager_lookup(pPager, pgno); - if( pPgOld ){ - assert( pPgOld->nRef==0 ); - unlinkHashChain(pPager, pPgOld); - makeClean(pPgOld); - pPg->needSync = pPgOld->needSync; - }else{ - pPg->needSync = 0; - } - if( pPager->aInJournal && (int)pgno<=pPager->origDbSize ){ - pPg->inJournal = (pPager->aInJournal[pgno/8] & (1<<(pgno&7)))!=0; - }else{ - pPg->inJournal = 0; - assert( pPg->needSync==0 || (int)pgno>pPager->origDbSize ); - } - - /* Change the page number for pPg and insert it into the new hash-chain. */ - assert( pgno!=0 ); - pPg->pgno = pgno; - h = pgno & (pPager->nHash-1); - if( pPager->aHash[h] ){ - assert( pPager->aHash[h]->pPrevHash==0 ); - pPager->aHash[h]->pPrevHash = pPg; - } - pPg->pNextHash = pPager->aHash[h]; - pPager->aHash[h] = pPg; - pPg->pPrevHash = 0; - - makeDirty(pPg); - pPager->dirtyCache = 1; - - if( needSyncPgno ){ - /* If needSyncPgno is non-zero, then the journal file needs to be - ** sync()ed before any data is written to database file page needSyncPgno. - ** Currently, no such page exists in the page-cache and the - ** Pager.aInJournal bit has been set. This needs to be remedied by loading - ** the page into the pager-cache and setting the PgHdr.needSync flag. - ** - ** The sqlite3PagerGet() call may cause the journal to sync. So make - ** sure the Pager.needSync flag is set too. - */ - int rc; - PgHdr *pPgHdr; - assert( pPager->needSync ); - rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr); - if( rc!=SQLITE_OK ) return rc; - pPager->needSync = 1; - pPgHdr->needSync = 1; - pPgHdr->inJournal = 1; - makeDirty(pPgHdr); - sqlite3PagerUnref(pPgHdr); - } - - pagerLeave(pPager); - return SQLITE_OK; -} -#endif - -/* -** Return a pointer to the data for the specified page. -*/ -void *sqlite3PagerGetData(DbPage *pPg){ - return PGHDR_TO_DATA(pPg); -} - -/* -** Return a pointer to the Pager.nExtra bytes of "extra" space -** allocated along with the specified page. -*/ -void *sqlite3PagerGetExtra(DbPage *pPg){ - Pager *pPager = pPg->pPager; - return (pPager?PGHDR_TO_EXTRA(pPg, pPager):0); -} - -/* -** Get/set the locking-mode for this pager. Parameter eMode must be one -** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or -** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then -** the locking-mode is set to the value specified. -** -** The returned value is either PAGER_LOCKINGMODE_NORMAL or -** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated) -** locking-mode. -*/ -int sqlite3PagerLockingMode(Pager *pPager, int eMode){ - assert( eMode==PAGER_LOCKINGMODE_QUERY - || eMode==PAGER_LOCKINGMODE_NORMAL - || eMode==PAGER_LOCKINGMODE_EXCLUSIVE ); - assert( PAGER_LOCKINGMODE_QUERY<0 ); - assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 ); - if( eMode>=0 && !pPager->tempFile ){ - pPager->exclusiveMode = eMode; - } - return (int)pPager->exclusiveMode; -} - -#ifdef SQLITE_DEBUG -/* -** Print a listing of all referenced pages and their ref count. -*/ -void sqlite3PagerRefdump(Pager *pPager){ - PgHdr *pPg; - for(pPg=pPager->pAll; pPg; pPg=pPg->pNextAll){ - if( pPg->nRef<=0 ) continue; - sqlite3DebugPrintf("PAGE %3d addr=%p nRef=%d\n", - pPg->pgno, PGHDR_TO_DATA(pPg), pPg->nRef); - } -} -#endif - -#endif /* SQLITE_OMIT_DISKIO */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/pager.h b/libraries/sqlite/unix/sqlite-3.5.1/src/pager.h deleted file mode 100644 index cf05b11bee..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/pager.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. The page cache subsystem reads and writes a file a page -** at a time and provides a journal for rollback. -** -** @(#) $Id: pager.h,v 1.67 2007/09/03 15:19:35 drh Exp $ -*/ - -#ifndef _PAGER_H_ -#define _PAGER_H_ - -/* -** The type used to represent a page number. The first page in a file -** is called page 1. 0 is used to represent "not a page". -*/ -typedef unsigned int Pgno; - -/* -** Each open file is managed by a separate instance of the "Pager" structure. -*/ -typedef struct Pager Pager; - -/* -** Handle type for pages. -*/ -typedef struct PgHdr DbPage; - -/* -** Allowed values for the flags parameter to sqlite3PagerOpen(). -** -** NOTE: This values must match the corresponding BTREE_ values in btree.h. -*/ -#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ -#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */ - -/* -** Valid values for the second argument to sqlite3PagerLockingMode(). -*/ -#define PAGER_LOCKINGMODE_QUERY -1 -#define PAGER_LOCKINGMODE_NORMAL 0 -#define PAGER_LOCKINGMODE_EXCLUSIVE 1 - -/* -** See source code comments for a detailed description of the following -** routines: -*/ -int sqlite3PagerOpen(sqlite3_vfs *, Pager **ppPager, const char*, int,int,int); -void sqlite3PagerSetBusyhandler(Pager*, BusyHandler *pBusyHandler); -void sqlite3PagerSetDestructor(Pager*, void(*)(DbPage*,int)); -void sqlite3PagerSetReiniter(Pager*, void(*)(DbPage*,int)); -int sqlite3PagerSetPagesize(Pager*, u16*); -int sqlite3PagerMaxPageCount(Pager*, int); -int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); -void sqlite3PagerSetCachesize(Pager*, int); -int sqlite3PagerClose(Pager *pPager); -int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); -#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) -DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); -int sqlite3PagerRef(DbPage*); -int sqlite3PagerUnref(DbPage*); -int sqlite3PagerWrite(DbPage*); -int sqlite3PagerOverwrite(Pager *pPager, Pgno pgno, void*); -int sqlite3PagerPagecount(Pager*); -int sqlite3PagerTruncate(Pager*,Pgno); -int sqlite3PagerBegin(DbPage*, int exFlag); -int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, Pgno); -int sqlite3PagerCommitPhaseTwo(Pager*); -int sqlite3PagerRollback(Pager*); -int sqlite3PagerIsreadonly(Pager*); -int sqlite3PagerStmtBegin(Pager*); -int sqlite3PagerStmtCommit(Pager*); -int sqlite3PagerStmtRollback(Pager*); -void sqlite3PagerDontRollback(DbPage*); -void sqlite3PagerDontWrite(DbPage*); -int sqlite3PagerRefcount(Pager*); -void sqlite3PagerSetSafetyLevel(Pager*,int,int); -const char *sqlite3PagerFilename(Pager*); -const sqlite3_vfs *sqlite3PagerVfs(Pager*); -sqlite3_file *sqlite3PagerFile(Pager*); -const char *sqlite3PagerDirname(Pager*); -const char *sqlite3PagerJournalname(Pager*); -int sqlite3PagerNosync(Pager*); -int sqlite3PagerMovepage(Pager*,DbPage*,Pgno); -void *sqlite3PagerGetData(DbPage *); -void *sqlite3PagerGetExtra(DbPage *); -int sqlite3PagerLockingMode(Pager *, int); - -#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) && !defined(SQLITE_OMIT_DISKIO) - int sqlite3PagerReleaseMemory(int); -#endif - -#ifdef SQLITE_HAS_CODEC - void sqlite3PagerSetCodec(Pager*,void*(*)(void*,void*,Pgno,int),void*); -#endif - -#if !defined(NDEBUG) || defined(SQLITE_TEST) - Pgno sqlite3PagerPagenumber(DbPage*); - int sqlite3PagerIswriteable(DbPage*); -#endif - -#ifdef SQLITE_TEST - int *sqlite3PagerStats(Pager*); - void sqlite3PagerRefdump(Pager*); - int pager3_refinfo_enable; -#endif - -#ifdef SQLITE_TEST -void disable_simulated_io_errors(void); -void enable_simulated_io_errors(void); -#else -# define disable_simulated_io_errors() -# define enable_simulated_io_errors() -#endif - -#endif /* _PAGER_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/parse.y b/libraries/sqlite/unix/sqlite-3.5.1/src/parse.y deleted file mode 100644 index 5077daf31b..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/parse.y +++ /dev/null @@ -1,1114 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains SQLite's grammar for SQL. Process this file -** using the lemon parser generator to generate C code that runs -** the parser. Lemon will also generate a header file containing -** numeric codes for all of the tokens. -** -** @(#) $Id: parse.y,v 1.234 2007/08/21 10:44:16 drh Exp $ -*/ - -// All token codes are small integers with #defines that begin with "TK_" -%token_prefix TK_ - -// The type of the data attached to each token is Token. This is also the -// default type for non-terminals. -// -%token_type {Token} -%default_type {Token} - -// The generated parser function takes a 4th argument as follows: -%extra_argument {Parse *pParse} - -// This code runs whenever there is a syntax error -// -%syntax_error { - if( !pParse->parseError ){ - if( TOKEN.z[0] ){ - sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); - }else{ - sqlite3ErrorMsg(pParse, "incomplete SQL statement"); - } - pParse->parseError = 1; - } -} -%stack_overflow { - sqlite3ErrorMsg(pParse, "parser stack overflow"); - pParse->parseError = 1; -} - -// The name of the generated procedure that implements the parser -// is as follows: -%name sqlite3Parser - -// The following text is included near the beginning of the C source -// code file that implements the parser. -// -%include { -#include "sqliteInt.h" - -/* -** An instance of this structure holds information about the -** LIMIT clause of a SELECT statement. -*/ -struct LimitVal { - Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ - Expr *pOffset; /* The OFFSET expression. NULL if there is none */ -}; - -/* -** An instance of this structure is used to store the LIKE, -** GLOB, NOT LIKE, and NOT GLOB operators. -*/ -struct LikeOp { - Token eOperator; /* "like" or "glob" or "regexp" */ - int not; /* True if the NOT keyword is present */ -}; - -/* -** An instance of the following structure describes the event of a -** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, -** TK_DELETE, or TK_INSTEAD. If the event is of the form -** -** UPDATE ON (a,b,c) -** -** Then the "b" IdList records the list "a,b,c". -*/ -struct TrigEvent { int a; IdList * b; }; - -/* -** An instance of this structure holds the ATTACH key and the key type. -*/ -struct AttachKey { int type; Token key; }; - -} // end %include - -// Input is a single SQL command -input ::= cmdlist. -cmdlist ::= cmdlist ecmd. -cmdlist ::= ecmd. -cmdx ::= cmd. { sqlite3FinishCoding(pParse); } -ecmd ::= SEMI. -ecmd ::= explain cmdx SEMI. -explain ::= . { sqlite3BeginParse(pParse, 0); } -%ifndef SQLITE_OMIT_EXPLAIN -explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } -explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } -%endif SQLITE_OMIT_EXPLAIN - -///////////////////// Begin and end transactions. //////////////////////////// -// - -cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} -trans_opt ::= . -trans_opt ::= TRANSACTION. -trans_opt ::= TRANSACTION nm. -%type transtype {int} -transtype(A) ::= . {A = TK_DEFERRED;} -transtype(A) ::= DEFERRED(X). {A = @X;} -transtype(A) ::= IMMEDIATE(X). {A = @X;} -transtype(A) ::= EXCLUSIVE(X). {A = @X;} -cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} -cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} -cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} - -///////////////////// The CREATE TABLE statement //////////////////////////// -// -cmd ::= create_table create_table_args. -create_table ::= CREATE temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { - sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); -} -%type ifnotexists {int} -ifnotexists(A) ::= . {A = 0;} -ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} -%type temp {int} -%ifndef SQLITE_OMIT_TEMPDB -temp(A) ::= TEMP. {A = 1;} -%endif SQLITE_OMIT_TEMPDB -temp(A) ::= . {A = 0;} -create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { - sqlite3EndTable(pParse,&X,&Y,0); -} -create_table_args ::= AS select(S). { - sqlite3EndTable(pParse,0,0,S); - sqlite3SelectDelete(S); -} -columnlist ::= columnlist COMMA column. -columnlist ::= column. - -// A "column" is a complete description of a single column in a -// CREATE TABLE statement. This includes the column name, its -// datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, -// NOT NULL and so forth. -// -column(A) ::= columnid(X) type carglist. { - A.z = X.z; - A.n = (pParse->sLastToken.z-X.z) + pParse->sLastToken.n; -} -columnid(A) ::= nm(X). { - sqlite3AddColumn(pParse,&X); - A = X; -} - - -// An IDENTIFIER can be a generic identifier, or one of several -// keywords. Any non-standard keyword can also be an identifier. -// -%type id {Token} -id(A) ::= ID(X). {A = X;} - -// The following directive causes tokens ABORT, AFTER, ASC, etc. to -// fallback to ID if they will not parse as their original value. -// This obviates the need for the "id" nonterminal. -// -%fallback ID - ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN CASCADE CAST CONFLICT - DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR - IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN - QUERY KEY OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW - TEMP TRIGGER VACUUM VIEW VIRTUAL -%ifdef SQLITE_OMIT_COMPOUND_SELECT - EXCEPT INTERSECT UNION -%endif SQLITE_OMIT_COMPOUND_SELECT - REINDEX RENAME CTIME_KW IF - . -%wildcard ANY. - -// Define operator precedence early so that this is the first occurance -// of the operator tokens in the grammer. Keeping the operators together -// causes them to be assigned integer values that are close together, -// which keeps parser tables smaller. -// -// The token values assigned to these symbols is determined by the order -// in which lemon first sees them. It must be the case that ISNULL/NOTNULL, -// NE/EQ, GT/LE, and GE/LT are separated by only a single value. See -// the sqlite3ExprIfFalse() routine for additional information on this -// constraint. -// -%left OR. -%left AND. -%right NOT. -%left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. -%left GT LE LT GE. -%right ESCAPE. -%left BITAND BITOR LSHIFT RSHIFT. -%left PLUS MINUS. -%left STAR SLASH REM. -%left CONCAT. -%left COLLATE. -%right UMINUS UPLUS BITNOT. - -// And "ids" is an identifer-or-string. -// -%type ids {Token} -ids(A) ::= ID|STRING(X). {A = X;} - -// The name of a column or table can be any of the following: -// -%type nm {Token} -nm(A) ::= ID(X). {A = X;} -nm(A) ::= STRING(X). {A = X;} -nm(A) ::= JOIN_KW(X). {A = X;} - -// A typetoken is really one or more tokens that form a type name such -// as can be found after the column name in a CREATE TABLE statement. -// Multiple tokens are concatenated to form the value of the typetoken. -// -%type typetoken {Token} -type ::= . -type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} -typetoken(A) ::= typename(X). {A = X;} -typetoken(A) ::= typename(X) LP signed RP(Y). { - A.z = X.z; - A.n = &Y.z[Y.n] - X.z; -} -typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { - A.z = X.z; - A.n = &Y.z[Y.n] - X.z; -} -%type typename {Token} -typename(A) ::= ids(X). {A = X;} -typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} -signed ::= plus_num. -signed ::= minus_num. - -// "carglist" is a list of additional constraints that come after the -// column name and column type in a CREATE TABLE statement. -// -carglist ::= carglist carg. -carglist ::= . -carg ::= CONSTRAINT nm ccons. -carg ::= ccons. -ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,X);} -ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,X);} -ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,X);} -ccons ::= DEFAULT MINUS term(X). { - Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0); - sqlite3AddDefaultValue(pParse,p); -} -ccons ::= DEFAULT id(X). { - Expr *p = sqlite3PExpr(pParse, TK_STRING, 0, 0, &X); - sqlite3AddDefaultValue(pParse,p); -} - -// In addition to the type name, we also care about the primary key and -// UNIQUE constraints. -// -ccons ::= NULL onconf. -ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} -ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). - {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} -ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} -ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} -ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). - {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} -ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} -ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, (char*)C.z, C.n);} - -// The optional AUTOINCREMENT keyword -%type autoinc {int} -autoinc(X) ::= . {X = 0;} -autoinc(X) ::= AUTOINCR. {X = 1;} - -// The next group of rules parses the arguments to a REFERENCES clause -// that determine if the referential integrity checking is deferred or -// or immediate and which determine what action to take if a ref-integ -// check fails. -// -%type refargs {int} -refargs(A) ::= . { A = OE_Restrict * 0x010101; } -refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } -%type refarg {struct {int value; int mask;}} -refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } -refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } -refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } -refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } -%type refact {int} -refact(A) ::= SET NULL. { A = OE_SetNull; } -refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } -refact(A) ::= CASCADE. { A = OE_Cascade; } -refact(A) ::= RESTRICT. { A = OE_Restrict; } -%type defer_subclause {int} -defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} -defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} -%type init_deferred_pred_opt {int} -init_deferred_pred_opt(A) ::= . {A = 0;} -init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} -init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} - -// For the time being, the only constraint we care about is the primary -// key and UNIQUE. Both create indices. -// -conslist_opt(A) ::= . {A.n = 0; A.z = 0;} -conslist_opt(A) ::= COMMA(X) conslist. {A = X;} -conslist ::= conslist COMMA tcons. -conslist ::= conslist tcons. -conslist ::= tcons. -tcons ::= CONSTRAINT nm. -tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). - {sqlite3AddPrimaryKey(pParse,X,R,I,0);} -tcons ::= UNIQUE LP idxlist(X) RP onconf(R). - {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} -tcons ::= CHECK LP expr(E) RP onconf. {sqlite3AddCheckConstraint(pParse,E);} -tcons ::= FOREIGN KEY LP idxlist(FA) RP - REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { - sqlite3CreateForeignKey(pParse, FA, &T, TA, R); - sqlite3DeferForeignKey(pParse, D); -} -%type defer_subclause_opt {int} -defer_subclause_opt(A) ::= . {A = 0;} -defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} - -// The following is a non-standard extension that allows us to declare the -// default behavior when there is a constraint conflict. -// -%type onconf {int} -%type orconf {int} -%type resolvetype {int} -onconf(A) ::= . {A = OE_Default;} -onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} -orconf(A) ::= . {A = OE_Default;} -orconf(A) ::= OR resolvetype(X). {A = X;} -resolvetype(A) ::= raisetype(X). {A = X;} -resolvetype(A) ::= IGNORE. {A = OE_Ignore;} -resolvetype(A) ::= REPLACE. {A = OE_Replace;} - -////////////////////////// The DROP TABLE ///////////////////////////////////// -// -cmd ::= DROP TABLE ifexists(E) fullname(X). { - sqlite3DropTable(pParse, X, 0, E); -} -%type ifexists {int} -ifexists(A) ::= IF EXISTS. {A = 1;} -ifexists(A) ::= . {A = 0;} - -///////////////////// The CREATE VIEW statement ///////////////////////////// -// -%ifndef SQLITE_OMIT_VIEW -cmd ::= CREATE(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { - sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); -} -cmd ::= DROP VIEW ifexists(E) fullname(X). { - sqlite3DropTable(pParse, X, 1, E); -} -%endif SQLITE_OMIT_VIEW - -//////////////////////// The SELECT statement ///////////////////////////////// -// -cmd ::= select(X). { - sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); - sqlite3SelectDelete(X); -} - -%type select {Select*} -%destructor select {sqlite3SelectDelete($$);} -%type oneselect {Select*} -%destructor oneselect {sqlite3SelectDelete($$);} - -select(A) ::= oneselect(X). {A = X;} -%ifndef SQLITE_OMIT_COMPOUND_SELECT -select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { - if( Z ){ - Z->op = Y; - Z->pPrior = X; - }else{ - sqlite3SelectDelete(X); - } - A = Z; -} -%type multiselect_op {int} -multiselect_op(A) ::= UNION(OP). {A = @OP;} -multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} -multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} -%endif SQLITE_OMIT_COMPOUND_SELECT -oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) - groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { - A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); -} - -// The "distinct" nonterminal is true (1) if the DISTINCT keyword is -// present and false (0) if it is not. -// -%type distinct {int} -distinct(A) ::= DISTINCT. {A = 1;} -distinct(A) ::= ALL. {A = 0;} -distinct(A) ::= . {A = 0;} - -// selcollist is a list of expressions that are to become the return -// values of the SELECT statement. The "*" in statements like -// "SELECT * FROM ..." is encoded as a special expression with an -// opcode of TK_ALL. -// -%type selcollist {ExprList*} -%destructor selcollist {sqlite3ExprListDelete($$);} -%type sclp {ExprList*} -%destructor sclp {sqlite3ExprListDelete($$);} -sclp(A) ::= selcollist(X) COMMA. {A = X;} -sclp(A) ::= . {A = 0;} -selcollist(A) ::= sclp(P) expr(X) as(Y). { - A = sqlite3ExprListAppend(pParse,P,X,Y.n?&Y:0); -} -selcollist(A) ::= sclp(P) STAR. { - Expr *p = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0); - A = sqlite3ExprListAppend(pParse, P, p, 0); -} -selcollist(A) ::= sclp(P) nm(X) DOT STAR. { - Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0); - Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); - Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); - A = sqlite3ExprListAppend(pParse,P, pDot, 0); -} - -// An option "AS " phrase that can follow one of the expressions that -// define the result set, or one of the tables in the FROM clause. -// -%type as {Token} -as(X) ::= AS nm(Y). {X = Y;} -as(X) ::= ids(Y). {X = Y;} -as(X) ::= . {X.n = 0;} - - -%type seltablist {SrcList*} -%destructor seltablist {sqlite3SrcListDelete($$);} -%type stl_prefix {SrcList*} -%destructor stl_prefix {sqlite3SrcListDelete($$);} -%type from {SrcList*} -%destructor from {sqlite3SrcListDelete($$);} - -// A complete FROM clause. -// -from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} -from(A) ::= FROM seltablist(X). { - A = X; - sqlite3SrcListShiftJoinType(A); -} - -// "seltablist" is a "Select Table List" - the content of the FROM clause -// in a SELECT statement. "stl_prefix" is a prefix of this list. -// -stl_prefix(A) ::= seltablist(X) joinop(Y). { - A = X; - if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; -} -stl_prefix(A) ::= . {A = 0;} -seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { - A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); -} -%ifndef SQLITE_OMIT_SUBQUERY - seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP - as(Z) on_opt(N) using_opt(U). { - A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); - } - - // A seltablist_paren nonterminal represents anything in a FROM that - // is contained inside parentheses. This can be either a subquery or - // a grouping of table and subqueries. - // - %type seltablist_paren {Select*} - %destructor seltablist_paren {sqlite3SelectDelete($$);} - seltablist_paren(A) ::= select(S). {A = S;} - seltablist_paren(A) ::= seltablist(F). { - sqlite3SrcListShiftJoinType(F); - A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); - } -%endif SQLITE_OMIT_SUBQUERY - -%type dbnm {Token} -dbnm(A) ::= . {A.z=0; A.n=0;} -dbnm(A) ::= DOT nm(X). {A = X;} - -%type fullname {SrcList*} -%destructor fullname {sqlite3SrcListDelete($$);} -fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} - -%type joinop {int} -%type joinop2 {int} -joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } -joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } -joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } -joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. - { X = sqlite3JoinType(pParse,&A,&B,&C); } - -%type on_opt {Expr*} -%destructor on_opt {sqlite3ExprDelete($$);} -on_opt(N) ::= ON expr(E). {N = E;} -on_opt(N) ::= . {N = 0;} - -%type using_opt {IdList*} -%destructor using_opt {sqlite3IdListDelete($$);} -using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} -using_opt(U) ::= . {U = 0;} - - -%type orderby_opt {ExprList*} -%destructor orderby_opt {sqlite3ExprListDelete($$);} -%type sortlist {ExprList*} -%destructor sortlist {sqlite3ExprListDelete($$);} -%type sortitem {Expr*} -%destructor sortitem {sqlite3ExprDelete($$);} - -orderby_opt(A) ::= . {A = 0;} -orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} -sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { - A = sqlite3ExprListAppend(pParse,X,Y,0); - if( A ) A->a[A->nExpr-1].sortOrder = Z; -} -sortlist(A) ::= sortitem(Y) sortorder(Z). { - A = sqlite3ExprListAppend(pParse,0,Y,0); - if( A && A->a ) A->a[0].sortOrder = Z; -} -sortitem(A) ::= expr(X). {A = X;} - -%type sortorder {int} - -sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} -sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} -sortorder(A) ::= . {A = SQLITE_SO_ASC;} - -%type groupby_opt {ExprList*} -%destructor groupby_opt {sqlite3ExprListDelete($$);} -groupby_opt(A) ::= . {A = 0;} -groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} - -%type having_opt {Expr*} -%destructor having_opt {sqlite3ExprDelete($$);} -having_opt(A) ::= . {A = 0;} -having_opt(A) ::= HAVING expr(X). {A = X;} - -%type limit_opt {struct LimitVal} - -// The destructor for limit_opt will never fire in the current grammar. -// The limit_opt non-terminal only occurs at the end of a single production -// rule for SELECT statements. As soon as the rule that create the -// limit_opt non-terminal reduces, the SELECT statement rule will also -// reduce. So there is never a limit_opt non-terminal on the stack -// except as a transient. So there is never anything to destroy. -// -//%destructor limit_opt { -// sqlite3ExprDelete($$.pLimit); -// sqlite3ExprDelete($$.pOffset); -//} -limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} -limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X; A.pOffset = 0;} -limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). - {A.pLimit = X; A.pOffset = Y;} -limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). - {A.pOffset = X; A.pLimit = Y;} - -/////////////////////////// The DELETE statement ///////////////////////////// -// -cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);} - -%type where_opt {Expr*} -%destructor where_opt {sqlite3ExprDelete($$);} - -where_opt(A) ::= . {A = 0;} -where_opt(A) ::= WHERE expr(X). {A = X;} - -////////////////////////// The UPDATE command //////////////////////////////// -// -cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). { - sqlite3ExprListCheckLength(pParse,Y,SQLITE_MAX_COLUMN,"set list"); - sqlite3Update(pParse,X,Y,Z,R); -} - -%type setlist {ExprList*} -%destructor setlist {sqlite3ExprListDelete($$);} - -setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). - {A = sqlite3ExprListAppend(pParse,Z,Y,&X);} -setlist(A) ::= nm(X) EQ expr(Y). - {A = sqlite3ExprListAppend(pParse,0,Y,&X);} - -////////////////////////// The INSERT command ///////////////////////////////// -// -cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) - VALUES LP itemlist(Y) RP. - {sqlite3Insert(pParse, X, Y, 0, F, R);} -cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). - {sqlite3Insert(pParse, X, 0, S, F, R);} -cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. - {sqlite3Insert(pParse, X, 0, 0, F, R);} - -%type insert_cmd {int} -insert_cmd(A) ::= INSERT orconf(R). {A = R;} -insert_cmd(A) ::= REPLACE. {A = OE_Replace;} - - -%type itemlist {ExprList*} -%destructor itemlist {sqlite3ExprListDelete($$);} - -itemlist(A) ::= itemlist(X) COMMA expr(Y). - {A = sqlite3ExprListAppend(pParse,X,Y,0);} -itemlist(A) ::= expr(X). - {A = sqlite3ExprListAppend(pParse,0,X,0);} - -%type inscollist_opt {IdList*} -%destructor inscollist_opt {sqlite3IdListDelete($$);} -%type inscollist {IdList*} -%destructor inscollist {sqlite3IdListDelete($$);} - -inscollist_opt(A) ::= . {A = 0;} -inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} -inscollist(A) ::= inscollist(X) COMMA nm(Y). - {A = sqlite3IdListAppend(pParse->db,X,&Y);} -inscollist(A) ::= nm(Y). - {A = sqlite3IdListAppend(pParse->db,0,&Y);} - -/////////////////////////// Expression Processing ///////////////////////////// -// - -%type expr {Expr*} -%destructor expr {sqlite3ExprDelete($$);} -%type term {Expr*} -%destructor term {sqlite3ExprDelete($$);} - -expr(A) ::= term(X). {A = X;} -expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } -term(A) ::= NULL(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} -expr(A) ::= ID(X). {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);} -expr(A) ::= JOIN_KW(X). {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);} -expr(A) ::= nm(X) DOT nm(Y). { - Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); - Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); - A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); -} -expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { - Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); - Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); - Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); - Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); - A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); -} -term(A) ::= INTEGER|FLOAT|BLOB(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} -term(A) ::= STRING(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} -expr(A) ::= REGISTER(X). {A = sqlite3RegisterExpr(pParse, &X);} -expr(A) ::= VARIABLE(X). { - Token *pToken = &X; - Expr *pExpr = A = sqlite3PExpr(pParse, TK_VARIABLE, 0, 0, pToken); - sqlite3ExprAssignVarNumber(pParse, pExpr); -} -expr(A) ::= expr(E) COLLATE id(C). { - A = sqlite3ExprSetColl(pParse, E, &C); -} -%ifndef SQLITE_OMIT_CAST -expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { - A = sqlite3PExpr(pParse, TK_CAST, E, 0, &T); - sqlite3ExprSpan(A,&X,&Y); -} -%endif SQLITE_OMIT_CAST -expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { - if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){ - sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); - } - A = sqlite3ExprFunction(pParse, Y, &X); - sqlite3ExprSpan(A,&X,&E); - if( D && A ){ - A->flags |= EP_Distinct; - } -} -expr(A) ::= ID(X) LP STAR RP(E). { - A = sqlite3ExprFunction(pParse, 0, &X); - sqlite3ExprSpan(A,&X,&E); -} -term(A) ::= CTIME_KW(OP). { - /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are - ** treated as functions that return constants */ - A = sqlite3ExprFunction(pParse, 0,&OP); - if( A ){ - A->op = TK_CONST_FUNC; - A->span = OP; - } -} -expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). - {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). - {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).{A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). - {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} -%type likeop {struct LikeOp} -likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} -likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} -likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} -likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} -%type escape {Expr*} -%destructor escape {sqlite3ExprDelete($$);} -escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} -escape(X) ::= . [ESCAPE] {X = 0;} -expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { - ExprList *pList; - pList = sqlite3ExprListAppend(pParse,0, Y, 0); - pList = sqlite3ExprListAppend(pParse,pList, X, 0); - if( E ){ - pList = sqlite3ExprListAppend(pParse,pList, E, 0); - } - A = sqlite3ExprFunction(pParse, pList, &OP.eOperator); - if( OP.not ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); - sqlite3ExprSpan(A, &X->span, &Y->span); - if( A ) A->flags |= EP_InfixFunc; -} - -expr(A) ::= expr(X) ISNULL|NOTNULL(E). { - A = sqlite3PExpr(pParse, @E, X, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); -} -expr(A) ::= expr(X) IS NULL(E). { - A = sqlite3PExpr(pParse, TK_ISNULL, X, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); -} -expr(A) ::= expr(X) NOT NULL(E). { - A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); -} -expr(A) ::= expr(X) IS NOT NULL(E). { - A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); -} -expr(A) ::= NOT|BITNOT(B) expr(X). { - A = sqlite3PExpr(pParse, @B, X, 0, 0); - sqlite3ExprSpan(A,&B,&X->span); -} -expr(A) ::= MINUS(B) expr(X). [UMINUS] { - A = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0); - sqlite3ExprSpan(A,&B,&X->span); -} -expr(A) ::= PLUS(B) expr(X). [UPLUS] { - A = sqlite3PExpr(pParse, TK_UPLUS, X, 0, 0); - sqlite3ExprSpan(A,&B,&X->span); -} -%type between_op {int} -between_op(A) ::= BETWEEN. {A = 0;} -between_op(A) ::= NOT BETWEEN. {A = 1;} -expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { - ExprList *pList = sqlite3ExprListAppend(pParse,0, X, 0); - pList = sqlite3ExprListAppend(pParse,pList, Y, 0); - A = sqlite3PExpr(pParse, TK_BETWEEN, W, 0, 0); - if( A ){ - A->pList = pList; - }else{ - sqlite3ExprListDelete(pList); - } - if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&W->span,&Y->span); -} -%ifndef SQLITE_OMIT_SUBQUERY - %type in_op {int} - in_op(A) ::= IN. {A = 0;} - in_op(A) ::= NOT IN. {A = 1;} - expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { - A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); - if( A ){ - A->pList = Y; - sqlite3ExprSetHeight(A); - }else{ - sqlite3ExprListDelete(Y); - } - if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); - } - expr(A) ::= LP(B) select(X) RP(E). { - A = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); - if( A ){ - A->pSelect = X; - sqlite3ExprSetHeight(A); - }else{ - sqlite3SelectDelete(X); - } - sqlite3ExprSpan(A,&B,&E); - } - expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { - A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); - if( A ){ - A->pSelect = Y; - sqlite3ExprSetHeight(A); - }else{ - sqlite3SelectDelete(Y); - } - if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); - } - expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); - A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); - if( A ){ - A->pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); - sqlite3ExprSetHeight(A); - }else{ - sqlite3SrcListDelete(pSrc); - } - if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); - } - expr(A) ::= EXISTS(B) LP select(Y) RP(E). { - Expr *p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); - if( p ){ - p->pSelect = Y; - sqlite3ExprSpan(p,&B,&E); - sqlite3ExprSetHeight(A); - }else{ - sqlite3SelectDelete(Y); - } - } -%endif SQLITE_OMIT_SUBQUERY - -/* CASE expressions */ -expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { - A = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); - if( A ){ - A->pList = Y; - sqlite3ExprSetHeight(A); - }else{ - sqlite3ExprListDelete(Y); - } - sqlite3ExprSpan(A, &C, &E); -} -%type case_exprlist {ExprList*} -%destructor case_exprlist {sqlite3ExprListDelete($$);} -case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { - A = sqlite3ExprListAppend(pParse,X, Y, 0); - A = sqlite3ExprListAppend(pParse,A, Z, 0); -} -case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { - A = sqlite3ExprListAppend(pParse,0, Y, 0); - A = sqlite3ExprListAppend(pParse,A, Z, 0); -} -%type case_else {Expr*} -%destructor case_else {sqlite3ExprDelete($$);} -case_else(A) ::= ELSE expr(X). {A = X;} -case_else(A) ::= . {A = 0;} -%type case_operand {Expr*} -%destructor case_operand {sqlite3ExprDelete($$);} -case_operand(A) ::= expr(X). {A = X;} -case_operand(A) ::= . {A = 0;} - -%type exprlist {ExprList*} -%destructor exprlist {sqlite3ExprListDelete($$);} -%type nexprlist {ExprList*} -%destructor nexprlist {sqlite3ExprListDelete($$);} - -exprlist(A) ::= nexprlist(X). {A = X;} -exprlist(A) ::= . {A = 0;} -nexprlist(A) ::= nexprlist(X) COMMA expr(Y). - {A = sqlite3ExprListAppend(pParse,X,Y,0);} -nexprlist(A) ::= expr(Y). - {A = sqlite3ExprListAppend(pParse,0,Y,0);} - - -///////////////////////////// The CREATE INDEX command /////////////////////// -// -cmd ::= CREATE(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) - ON nm(Y) LP idxlist(Z) RP(E). { - sqlite3CreateIndex(pParse, &X, &D, - sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, - &S, &E, SQLITE_SO_ASC, NE); -} - -%type uniqueflag {int} -uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} -uniqueflag(A) ::= . {A = OE_None;} - -%type idxlist {ExprList*} -%destructor idxlist {sqlite3ExprListDelete($$);} -%type idxlist_opt {ExprList*} -%destructor idxlist_opt {sqlite3ExprListDelete($$);} -%type idxitem {Token} - -idxlist_opt(A) ::= . {A = 0;} -idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} -idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). { - Expr *p = 0; - if( C.n>0 ){ - p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); - if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); - } - A = sqlite3ExprListAppend(pParse,X, p, &Y); - sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index"); - if( A ) A->a[A->nExpr-1].sortOrder = Z; -} -idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). { - Expr *p = 0; - if( C.n>0 ){ - p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); - if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); - } - A = sqlite3ExprListAppend(pParse,0, p, &Y); - sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index"); - if( A ) A->a[A->nExpr-1].sortOrder = Z; -} -idxitem(A) ::= nm(X). {A = X;} - -%type collate {Token} -collate(C) ::= . {C.z = 0; C.n = 0;} -collate(C) ::= COLLATE id(X). {C = X;} - - -///////////////////////////// The DROP INDEX command ///////////////////////// -// -cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} - -///////////////////////////// The VACUUM command ///////////////////////////// -// -%ifndef SQLITE_OMIT_VACUUM -%ifndef SQLITE_OMIT_ATTACH -cmd ::= VACUUM. {sqlite3Vacuum(pParse);} -cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} -%endif SQLITE_OMIT_ATTACH -%endif SQLITE_OMIT_VACUUM - -///////////////////////////// The PRAGMA command ///////////////////////////// -// -%ifndef SQLITE_OMIT_PRAGMA -cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} -cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} -cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { - sqlite3Pragma(pParse,&X,&Z,&Y,1); -} -cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} -cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} -nmnum(A) ::= plus_num(X). {A = X;} -nmnum(A) ::= nm(X). {A = X;} -%endif SQLITE_OMIT_PRAGMA -plus_num(A) ::= plus_opt number(X). {A = X;} -minus_num(A) ::= MINUS number(X). {A = X;} -number(A) ::= INTEGER|FLOAT(X). {A = X;} -plus_opt ::= PLUS. -plus_opt ::= . - -//////////////////////////// The CREATE TRIGGER command ///////////////////// - -%ifndef SQLITE_OMIT_TRIGGER - -cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { - Token all; - all.z = A.z; - all.n = (Z.z - A.z) + Z.n; - sqlite3FinishTrigger(pParse, S, &all); -} - -trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) - trigger_time(C) trigger_event(D) - ON fullname(E) foreach_clause when_clause(G). { - sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); - A = (Z.n==0?B:Z); -} - -%type trigger_time {int} -trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } -trigger_time(A) ::= AFTER. { A = TK_AFTER; } -trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} -trigger_time(A) ::= . { A = TK_BEFORE; } - -%type trigger_event {struct TrigEvent} -%destructor trigger_event {sqlite3IdListDelete($$.b);} -trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} -trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} -trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} - -foreach_clause ::= . -foreach_clause ::= FOR EACH ROW. - -%type when_clause {Expr*} -%destructor when_clause {sqlite3ExprDelete($$);} -when_clause(A) ::= . { A = 0; } -when_clause(A) ::= WHEN expr(X). { A = X; } - -%type trigger_cmd_list {TriggerStep*} -%destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} -trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { - if( Y ){ - Y->pLast->pNext = X; - }else{ - Y = X; - } - Y->pLast = X; - A = Y; -} -trigger_cmd_list(A) ::= . { A = 0; } - -%type trigger_cmd {TriggerStep*} -%destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} -// UPDATE -trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). - { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } - -// INSERT -trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) - VALUES LP itemlist(Y) RP. - {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);} - -trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). - {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} - -// DELETE -trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). - {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} - -// SELECT -trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } - -// The special RAISE expression that may occur in trigger programs -expr(A) ::= RAISE(X) LP IGNORE RP(Y). { - A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); - if( A ){ - A->iColumn = OE_Ignore; - sqlite3ExprSpan(A, &X, &Y); - } -} -expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { - A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); - if( A ) { - A->iColumn = T; - sqlite3ExprSpan(A, &X, &Y); - } -} -%endif !SQLITE_OMIT_TRIGGER - -%type raisetype {int} -raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} -raisetype(A) ::= ABORT. {A = OE_Abort;} -raisetype(A) ::= FAIL. {A = OE_Fail;} - - -//////////////////////// DROP TRIGGER statement ////////////////////////////// -%ifndef SQLITE_OMIT_TRIGGER -cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { - sqlite3DropTrigger(pParse,X,NOERR); -} -%endif !SQLITE_OMIT_TRIGGER - -//////////////////////// ATTACH DATABASE file AS name ///////////////////////// -%ifndef SQLITE_OMIT_ATTACH -cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { - sqlite3Attach(pParse, F, D, K); -} -cmd ::= DETACH database_kw_opt expr(D). { - sqlite3Detach(pParse, D); -} - -%type key_opt {Expr *} -%destructor key_opt {sqlite3ExprDelete($$);} -key_opt(A) ::= . { A = 0; } -key_opt(A) ::= KEY expr(X). { A = X; } - -database_kw_opt ::= DATABASE. -database_kw_opt ::= . -%endif SQLITE_OMIT_ATTACH - -////////////////////////// REINDEX collation ////////////////////////////////// -%ifndef SQLITE_OMIT_REINDEX -cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} -cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} -%endif SQLITE_OMIT_REINDEX - -/////////////////////////////////// ANALYZE /////////////////////////////////// -%ifndef SQLITE_OMIT_ANALYZE -cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} -cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} -%endif - -//////////////////////// ALTER TABLE table ... //////////////////////////////// -%ifndef SQLITE_OMIT_ALTERTABLE -cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { - sqlite3AlterRenameTable(pParse,X,&Z); -} -cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { - sqlite3AlterFinishAddColumn(pParse, &Y); -} -add_column_fullname ::= fullname(X). { - sqlite3AlterBeginAddColumn(pParse, X); -} -kwcolumn_opt ::= . -kwcolumn_opt ::= COLUMNKW. -%endif SQLITE_OMIT_ALTERTABLE - -//////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// -%ifndef SQLITE_OMIT_VIRTUALTABLE -cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} -cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} -create_vtab ::= CREATE VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { - sqlite3VtabBeginParse(pParse, &X, &Y, &Z); -} -vtabarglist ::= vtabarg. -vtabarglist ::= vtabarglist COMMA vtabarg. -vtabarg ::= . {sqlite3VtabArgInit(pParse);} -vtabarg ::= vtabarg vtabargtoken. -vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} -vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} -lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} -anylist ::= . -anylist ::= anylist ANY(X). {sqlite3VtabArgExtend(pParse,&X);} -%endif SQLITE_OMIT_VIRTUALTABLE diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c b/libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c deleted file mode 100644 index b4d9774c1a..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/pragma.c +++ /dev/null @@ -1,1186 +0,0 @@ -/* -** 2003 April 6 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code used to implement the PRAGMA command. -** -** $Id: pragma.c,v 1.149 2007/08/31 18:34:59 drh Exp $ -*/ -#include "sqliteInt.h" -#include - -/* Ignore this whole file if pragmas are disabled -*/ -#if !defined(SQLITE_OMIT_PRAGMA) && !defined(SQLITE_OMIT_PARSER) - -/* -** Interpret the given string as a safety level. Return 0 for OFF, -** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or -** unrecognized string argument. -** -** Note that the values returned are one less that the values that -** should be passed into sqlite3BtreeSetSafetyLevel(). The is done -** to support legacy SQL code. The safety level used to be boolean -** and older scripts may have used numbers 0 for OFF and 1 for ON. -*/ -static int getSafetyLevel(const char *z){ - /* 123456789 123456789 */ - static const char zText[] = "onoffalseyestruefull"; - static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16}; - static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4}; - static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2}; - int i, n; - if( isdigit(*z) ){ - return atoi(z); - } - n = strlen(z); - for(i=0; i=0&&i<=2)?i:0); -} -#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ - -#ifndef SQLITE_OMIT_PAGER_PRAGMAS -/* -** Interpret the given string as a temp db location. Return 1 for file -** backed temporary databases, 2 for the Red-Black tree in memory database -** and 0 to use the compile-time default. -*/ -static int getTempStore(const char *z){ - if( z[0]>='0' && z[0]<='2' ){ - return z[0] - '0'; - }else if( sqlite3StrICmp(z, "file")==0 ){ - return 1; - }else if( sqlite3StrICmp(z, "memory")==0 ){ - return 2; - }else{ - return 0; - } -} -#endif /* SQLITE_PAGER_PRAGMAS */ - -#ifndef SQLITE_OMIT_PAGER_PRAGMAS -/* -** Invalidate temp storage, either when the temp storage is changed -** from default, or when 'file' and the temp_store_directory has changed -*/ -static int invalidateTempStorage(Parse *pParse){ - sqlite3 *db = pParse->db; - if( db->aDb[1].pBt!=0 ){ - if( !db->autoCommit ){ - sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " - "from within a transaction"); - return SQLITE_ERROR; - } - sqlite3BtreeClose(db->aDb[1].pBt); - db->aDb[1].pBt = 0; - sqlite3ResetInternalSchema(db, 0); - } - return SQLITE_OK; -} -#endif /* SQLITE_PAGER_PRAGMAS */ - -#ifndef SQLITE_OMIT_PAGER_PRAGMAS -/* -** If the TEMP database is open, close it and mark the database schema -** as needing reloading. This must be done when using the TEMP_STORE -** or DEFAULT_TEMP_STORE pragmas. -*/ -static int changeTempStorage(Parse *pParse, const char *zStorageType){ - int ts = getTempStore(zStorageType); - sqlite3 *db = pParse->db; - if( db->temp_store==ts ) return SQLITE_OK; - if( invalidateTempStorage( pParse ) != SQLITE_OK ){ - return SQLITE_ERROR; - } - db->temp_store = ts; - return SQLITE_OK; -} -#endif /* SQLITE_PAGER_PRAGMAS */ - -/* -** Generate code to return a single integer value. -*/ -static void returnSingleInt(Parse *pParse, const char *zLabel, int value){ - Vdbe *v = sqlite3GetVdbe(pParse); - sqlite3VdbeAddOp(v, OP_Integer, value, 0); - if( pParse->explain==0 ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, P3_STATIC); - } - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); -} - -#ifndef SQLITE_OMIT_FLAG_PRAGMAS -/* -** Check to see if zRight and zLeft refer to a pragma that queries -** or changes one of the flags in db->flags. Return 1 if so and 0 if not. -** Also, implement the pragma. -*/ -static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){ - static const struct sPragmaType { - const char *zName; /* Name of the pragma */ - int mask; /* Mask for the db->flags value */ - } aPragma[] = { - { "full_column_names", SQLITE_FullColNames }, - { "short_column_names", SQLITE_ShortColNames }, - { "count_changes", SQLITE_CountRows }, - { "empty_result_callbacks", SQLITE_NullCallback }, - { "legacy_file_format", SQLITE_LegacyFileFmt }, - { "fullfsync", SQLITE_FullFSync }, -#ifdef SQLITE_DEBUG - { "sql_trace", SQLITE_SqlTrace }, - { "vdbe_listing", SQLITE_VdbeListing }, - { "vdbe_trace", SQLITE_VdbeTrace }, -#endif -#ifndef SQLITE_OMIT_CHECK - { "ignore_check_constraints", SQLITE_IgnoreChecks }, -#endif - /* The following is VERY experimental */ - { "writable_schema", SQLITE_WriteSchema|SQLITE_RecoveryMode }, - { "omit_readlock", SQLITE_NoReadlock }, - - /* TODO: Maybe it shouldn't be possible to change the ReadUncommitted - ** flag if there are any active statements. */ - { "read_uncommitted", SQLITE_ReadUncommitted }, - }; - int i; - const struct sPragmaType *p; - for(i=0, p=aPragma; izName)==0 ){ - sqlite3 *db = pParse->db; - Vdbe *v; - v = sqlite3GetVdbe(pParse); - if( v ){ - if( zRight==0 ){ - returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 ); - }else{ - if( getBoolean(zRight) ){ - db->flags |= p->mask; - }else{ - db->flags &= ~p->mask; - } - } - } - return 1; - } - } - return 0; -} -#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ - -/* -** Process a pragma statement. -** -** Pragmas are of this form: -** -** PRAGMA [database.]id [= value] -** -** The identifier might also be a string. The value is a string, and -** identifier, or a number. If minusFlag is true, then the value is -** a number that was preceded by a minus sign. -** -** If the left side is "database.id" then pId1 is the database name -** and pId2 is the id. If the left side is just "id" then pId1 is the -** id and pId2 is any empty string. -*/ -void sqlite3Pragma( - Parse *pParse, - Token *pId1, /* First part of [database.]id field */ - Token *pId2, /* Second part of [database.]id field, or NULL */ - Token *pValue, /* Token for , or NULL */ - int minusFlag /* True if a '-' sign preceded */ -){ - char *zLeft = 0; /* Nul-terminated UTF-8 string */ - char *zRight = 0; /* Nul-terminated UTF-8 string , or NULL */ - const char *zDb = 0; /* The database name */ - Token *pId; /* Pointer to token */ - int iDb; /* Database index for */ - sqlite3 *db = pParse->db; - Db *pDb; - Vdbe *v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - - /* Interpret the [database.] part of the pragma statement. iDb is the - ** index of the database this pragma is being applied to in db.aDb[]. */ - iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); - if( iDb<0 ) return; - pDb = &db->aDb[iDb]; - - /* If the temp database has been explicitly named as part of the - ** pragma, make sure it is open. - */ - if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ - return; - } - - zLeft = sqlite3NameFromToken(db, pId); - if( !zLeft ) return; - if( minusFlag ){ - zRight = sqlite3MPrintf(db, "-%T", pValue); - }else{ - zRight = sqlite3NameFromToken(db, pValue); - } - - zDb = ((iDb>0)?pDb->zName:0); - if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ - goto pragma_out; - } - -#ifndef SQLITE_OMIT_PAGER_PRAGMAS - /* - ** PRAGMA [database.]default_cache_size - ** PRAGMA [database.]default_cache_size=N - ** - ** The first form reports the current persistent setting for the - ** page cache size. The value returned is the maximum number of - ** pages in the page cache. The second form sets both the current - ** page cache size value and the persistent page cache size value - ** stored in the database file. - ** - ** The default cache size is stored in meta-value 2 of page 1 of the - ** database file. The cache size is actually the absolute value of - ** this memory location. The sign of meta-value 2 determines the - ** synchronous setting. A negative value means synchronous is off - ** and a positive value means synchronous is on. - */ - if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){ - static const VdbeOpList getCacheSize[] = { - { OP_ReadCookie, 0, 2, 0}, /* 0 */ - { OP_AbsValue, 0, 0, 0}, - { OP_Dup, 0, 0, 0}, - { OP_Integer, 0, 0, 0}, - { OP_Ne, 0, 6, 0}, - { OP_Integer, 0, 0, 0}, /* 5 */ - { OP_Callback, 1, 0, 0}, - }; - int addr; - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - sqlite3VdbeUsesBtree(v, iDb); - if( !zRight ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", P3_STATIC); - addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); - sqlite3VdbeChangeP1(v, addr, iDb); - sqlite3VdbeChangeP1(v, addr+5, SQLITE_DEFAULT_CACHE_SIZE); - }else{ - int size = atoi(zRight); - if( size<0 ) size = -size; - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3VdbeAddOp(v, OP_Integer, size, 0); - sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 2); - addr = sqlite3VdbeAddOp(v, OP_Integer, 0, 0); - sqlite3VdbeAddOp(v, OP_Ge, 0, addr+3); - sqlite3VdbeAddOp(v, OP_Negative, 0, 0); - sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 2); - pDb->pSchema->cache_size = size; - sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); - } - }else - - /* - ** PRAGMA [database.]page_size - ** PRAGMA [database.]page_size=N - ** - ** The first form reports the current setting for the - ** database page size in bytes. The second form sets the - ** database page size value. The value can only be set if - ** the database has not yet been created. - */ - if( sqlite3StrICmp(zLeft,"page_size")==0 ){ - Btree *pBt = pDb->pBt; - if( !zRight ){ - int size = pBt ? sqlite3BtreeGetPageSize(pBt) : 0; - returnSingleInt(pParse, "page_size", size); - }else{ - /* Malloc may fail when setting the page-size, as there is an internal - ** buffer that the pager module resizes using sqlite3_realloc(). - */ - if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, atoi(zRight), -1) ){ - db->mallocFailed = 1; - } - } - }else - - /* - ** PRAGMA [database.]max_page_count - ** PRAGMA [database.]max_page_count=N - ** - ** The first form reports the current setting for the - ** maximum number of pages in the database file. The - ** second form attempts to change this setting. Both - ** forms return the current setting. - */ - if( sqlite3StrICmp(zLeft,"max_page_count")==0 ){ - Btree *pBt = pDb->pBt; - int newMax = 0; - if( zRight ){ - newMax = atoi(zRight); - } - if( pBt ){ - newMax = sqlite3BtreeMaxPageCount(pBt, newMax); - } - returnSingleInt(pParse, "max_page_count", newMax); - }else - - /* - ** PRAGMA [database.]locking_mode - ** PRAGMA [database.]locking_mode = (normal|exclusive) - */ - if( sqlite3StrICmp(zLeft,"locking_mode")==0 ){ - const char *zRet = "normal"; - int eMode = getLockingMode(zRight); - - if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){ - /* Simple "PRAGMA locking_mode;" statement. This is a query for - ** the current default locking mode (which may be different to - ** the locking-mode of the main database). - */ - eMode = db->dfltLockMode; - }else{ - Pager *pPager; - if( pId2->n==0 ){ - /* This indicates that no database name was specified as part - ** of the PRAGMA command. In this case the locking-mode must be - ** set on all attached databases, as well as the main db file. - ** - ** Also, the sqlite3.dfltLockMode variable is set so that - ** any subsequently attached databases also use the specified - ** locking mode. - */ - int ii; - assert(pDb==&db->aDb[0]); - for(ii=2; iinDb; ii++){ - pPager = sqlite3BtreePager(db->aDb[ii].pBt); - sqlite3PagerLockingMode(pPager, eMode); - } - db->dfltLockMode = eMode; - } - pPager = sqlite3BtreePager(pDb->pBt); - eMode = sqlite3PagerLockingMode(pPager, eMode); - } - - assert(eMode==PAGER_LOCKINGMODE_NORMAL||eMode==PAGER_LOCKINGMODE_EXCLUSIVE); - if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ - zRet = "exclusive"; - } - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", P3_STATIC); - sqlite3VdbeOp3(v, OP_String8, 0, 0, zRet, 0); - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); - }else -#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ - - /* - ** PRAGMA [database.]auto_vacuum - ** PRAGMA [database.]auto_vacuum=N - ** - ** Get or set the (boolean) value of the database 'auto-vacuum' parameter. - */ -#ifndef SQLITE_OMIT_AUTOVACUUM - if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){ - Btree *pBt = pDb->pBt; - if( sqlite3ReadSchema(pParse) ){ - goto pragma_out; - } - if( !zRight ){ - int auto_vacuum = - pBt ? sqlite3BtreeGetAutoVacuum(pBt) : SQLITE_DEFAULT_AUTOVACUUM; - returnSingleInt(pParse, "auto_vacuum", auto_vacuum); - }else{ - int eAuto = getAutoVacuum(zRight); - if( eAuto>=0 ){ - /* Call SetAutoVacuum() to set initialize the internal auto and - ** incr-vacuum flags. This is required in case this connection - ** creates the database file. It is important that it is created - ** as an auto-vacuum capable db. - */ - int rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); - if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ - /* When setting the auto_vacuum mode to either "full" or - ** "incremental", write the value of meta[6] in the database - ** file. Before writing to meta[6], check that meta[3] indicates - ** that this really is an auto-vacuum capable database. - */ - static const VdbeOpList setMeta6[] = { - { OP_Transaction, 0, 1, 0}, /* 0 */ - { OP_ReadCookie, 0, 3, 0}, /* 1 */ - { OP_If, 0, 0, 0}, /* 2 */ - { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ - { OP_Integer, 0, 0, 0}, /* 4 */ - { OP_SetCookie, 0, 6, 0}, /* 5 */ - }; - int iAddr; - iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6); - sqlite3VdbeChangeP1(v, iAddr, iDb); - sqlite3VdbeChangeP1(v, iAddr+1, iDb); - sqlite3VdbeChangeP2(v, iAddr+2, iAddr+4); - sqlite3VdbeChangeP1(v, iAddr+4, eAuto-1); - sqlite3VdbeChangeP1(v, iAddr+5, iDb); - sqlite3VdbeUsesBtree(v, iDb); - } - } - } - }else -#endif - - /* - ** PRAGMA [database.]incremental_vacuum(N) - ** - ** Do N steps of incremental vacuuming on a database. - */ -#ifndef SQLITE_OMIT_AUTOVACUUM - if( sqlite3StrICmp(zLeft,"incremental_vacuum")==0 ){ - int iLimit, addr; - if( sqlite3ReadSchema(pParse) ){ - goto pragma_out; - } - if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ - iLimit = 0x7fffffff; - } - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3VdbeAddOp(v, OP_MemInt, iLimit, 0); - addr = sqlite3VdbeAddOp(v, OP_IncrVacuum, iDb, 0); - sqlite3VdbeAddOp(v, OP_Callback, 0, 0); - sqlite3VdbeAddOp(v, OP_MemIncr, -1, 0); - sqlite3VdbeAddOp(v, OP_IfMemPos, 0, addr); - sqlite3VdbeJumpHere(v, addr); - }else -#endif - -#ifndef SQLITE_OMIT_PAGER_PRAGMAS - /* - ** PRAGMA [database.]cache_size - ** PRAGMA [database.]cache_size=N - ** - ** The first form reports the current local setting for the - ** page cache size. The local setting can be different from - ** the persistent cache size value that is stored in the database - ** file itself. The value returned is the maximum number of - ** pages in the page cache. The second form sets the local - ** page cache size value. It does not change the persistent - ** cache size stored on the disk so the cache size will revert - ** to its default value when the database is closed and reopened. - ** N should be a positive integer. - */ - if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - if( !zRight ){ - returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); - }else{ - int size = atoi(zRight); - if( size<0 ) size = -size; - pDb->pSchema->cache_size = size; - sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); - } - }else - - /* - ** PRAGMA temp_store - ** PRAGMA temp_store = "default"|"memory"|"file" - ** - ** Return or set the local value of the temp_store flag. Changing - ** the local value does not make changes to the disk file and the default - ** value will be restored the next time the database is opened. - ** - ** Note that it is possible for the library compile-time options to - ** override this setting - */ - if( sqlite3StrICmp(zLeft, "temp_store")==0 ){ - if( !zRight ){ - returnSingleInt(pParse, "temp_store", db->temp_store); - }else{ - changeTempStorage(pParse, zRight); - } - }else - - /* - ** PRAGMA temp_store_directory - ** PRAGMA temp_store_directory = ""|"directory_name" - ** - ** Return or set the local value of the temp_store_directory flag. Changing - ** the value sets a specific directory to be used for temporary files. - ** Setting to a null string reverts to the default temporary directory search. - ** If temporary directory is changed, then invalidateTempStorage. - ** - */ - if( sqlite3StrICmp(zLeft, "temp_store_directory")==0 ){ - if( !zRight ){ - if( sqlite3_temp_directory ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, - "temp_store_directory", P3_STATIC); - sqlite3VdbeOp3(v, OP_String8, 0, 0, sqlite3_temp_directory, 0); - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); - } - }else{ - if( zRight[0] - && !sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE) - ){ - sqlite3ErrorMsg(pParse, "not a writable directory"); - goto pragma_out; - } - if( TEMP_STORE==0 - || (TEMP_STORE==1 && db->temp_store<=1) - || (TEMP_STORE==2 && db->temp_store==1) - ){ - invalidateTempStorage(pParse); - } - sqlite3_free(sqlite3_temp_directory); - if( zRight[0] ){ - sqlite3_temp_directory = zRight; - zRight = 0; - }else{ - sqlite3_temp_directory = 0; - } - } - }else - - /* - ** PRAGMA [database.]synchronous - ** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL - ** - ** Return or set the local value of the synchronous flag. Changing - ** the local value does not make changes to the disk file and the - ** default value will be restored the next time the database is - ** opened. - */ - if( sqlite3StrICmp(zLeft,"synchronous")==0 ){ - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - if( !zRight ){ - returnSingleInt(pParse, "synchronous", pDb->safety_level-1); - }else{ - if( !db->autoCommit ){ - sqlite3ErrorMsg(pParse, - "Safety level may not be changed inside a transaction"); - }else{ - pDb->safety_level = getSafetyLevel(zRight)+1; - } - } - }else -#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ - -#ifndef SQLITE_OMIT_FLAG_PRAGMAS - if( flagPragma(pParse, zLeft, zRight) ){ - /* The flagPragma() subroutine also generates any necessary code - ** there is nothing more to do here */ - }else -#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ - -#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS - /* - ** PRAGMA table_info(
    ) - ** - ** Return a single row for each column of the named table. The columns of - ** the returned data set are: - ** - ** cid: Column id (numbered from left to right, starting at 0) - ** name: Column name - ** type: Column declaration type. - ** notnull: True if 'NOT NULL' is part of column declaration - ** dflt_value: The default value for the column, if any. - */ - if( sqlite3StrICmp(zLeft, "table_info")==0 && zRight ){ - Table *pTab; - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - pTab = sqlite3FindTable(db, zRight, zDb); - if( pTab ){ - int i; - int nHidden = 0; - Column *pCol; - sqlite3VdbeSetNumCols(v, 6); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", P3_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", P3_STATIC); - sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", P3_STATIC); - sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", P3_STATIC); - sqlite3ViewGetColumnNames(pParse, pTab); - for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ - const Token *pDflt; - if( IsHiddenColumn(pCol) ){ - nHidden++; - continue; - } - sqlite3VdbeAddOp(v, OP_Integer, i-nHidden, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pCol->zName, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, - pCol->zType ? pCol->zType : "", 0); - sqlite3VdbeAddOp(v, OP_Integer, pCol->notNull, 0); - if( pCol->pDflt && (pDflt = &pCol->pDflt->span)->z ){ - sqlite3VdbeOp3(v, OP_String8, 0, 0, (char*)pDflt->z, pDflt->n); - }else{ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - } - sqlite3VdbeAddOp(v, OP_Integer, pCol->isPrimKey, 0); - sqlite3VdbeAddOp(v, OP_Callback, 6, 0); - } - } - }else - - if( sqlite3StrICmp(zLeft, "index_info")==0 && zRight ){ - Index *pIdx; - Table *pTab; - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - pIdx = sqlite3FindIndex(db, zRight, zDb); - if( pIdx ){ - int i; - pTab = pIdx->pTable; - sqlite3VdbeSetNumCols(v, 3); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", P3_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", P3_STATIC); - for(i=0; inColumn; i++){ - int cnum = pIdx->aiColumn[i]; - sqlite3VdbeAddOp(v, OP_Integer, i, 0); - sqlite3VdbeAddOp(v, OP_Integer, cnum, 0); - assert( pTab->nCol>cnum ); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pTab->aCol[cnum].zName, 0); - sqlite3VdbeAddOp(v, OP_Callback, 3, 0); - } - } - }else - - if( sqlite3StrICmp(zLeft, "index_list")==0 && zRight ){ - Index *pIdx; - Table *pTab; - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - pTab = sqlite3FindTable(db, zRight, zDb); - if( pTab ){ - v = sqlite3GetVdbe(pParse); - pIdx = pTab->pIndex; - if( pIdx ){ - int i = 0; - sqlite3VdbeSetNumCols(v, 3); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", P3_STATIC); - while(pIdx){ - sqlite3VdbeAddOp(v, OP_Integer, i, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pIdx->zName, 0); - sqlite3VdbeAddOp(v, OP_Integer, pIdx->onError!=OE_None, 0); - sqlite3VdbeAddOp(v, OP_Callback, 3, 0); - ++i; - pIdx = pIdx->pNext; - } - } - } - }else - - if( sqlite3StrICmp(zLeft, "database_list")==0 ){ - int i; - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - sqlite3VdbeSetNumCols(v, 3); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", P3_STATIC); - for(i=0; inDb; i++){ - if( db->aDb[i].pBt==0 ) continue; - assert( db->aDb[i].zName!=0 ); - sqlite3VdbeAddOp(v, OP_Integer, i, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, db->aDb[i].zName, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, - sqlite3BtreeGetFilename(db->aDb[i].pBt), 0); - sqlite3VdbeAddOp(v, OP_Callback, 3, 0); - } - }else - - if( sqlite3StrICmp(zLeft, "collation_list")==0 ){ - int i = 0; - HashElem *p; - sqlite3VdbeSetNumCols(v, 2); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P3_STATIC); - for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ - CollSeq *pColl = (CollSeq *)sqliteHashData(p); - sqlite3VdbeAddOp(v, OP_Integer, i++, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pColl->zName, 0); - sqlite3VdbeAddOp(v, OP_Callback, 2, 0); - } - }else -#endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */ - -#ifndef SQLITE_OMIT_FOREIGN_KEY - if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 && zRight ){ - FKey *pFK; - Table *pTab; - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - pTab = sqlite3FindTable(db, zRight, zDb); - if( pTab ){ - v = sqlite3GetVdbe(pParse); - pFK = pTab->pFKey; - if( pFK ){ - int i = 0; - sqlite3VdbeSetNumCols(v, 5); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", P3_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", P3_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", P3_STATIC); - sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", P3_STATIC); - while(pFK){ - int j; - for(j=0; jnCol; j++){ - char *zCol = pFK->aCol[j].zCol; - sqlite3VdbeAddOp(v, OP_Integer, i, 0); - sqlite3VdbeAddOp(v, OP_Integer, j, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, pFK->zTo, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, - pTab->aCol[pFK->aCol[j].iFrom].zName, 0); - sqlite3VdbeOp3(v, zCol ? OP_String8 : OP_Null, 0, 0, zCol, 0); - sqlite3VdbeAddOp(v, OP_Callback, 5, 0); - } - ++i; - pFK = pFK->pNextFrom; - } - } - } - }else -#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ - -#ifndef NDEBUG - if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){ - if( zRight ){ - if( getBoolean(zRight) ){ - sqlite3ParserTrace(stderr, "parser: "); - }else{ - sqlite3ParserTrace(0, 0); - } - } - }else -#endif - - /* Reinstall the LIKE and GLOB functions. The variant of LIKE - ** used will be case sensitive or not depending on the RHS. - */ - if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){ - if( zRight ){ - sqlite3RegisterLikeFunctions(db, getBoolean(zRight)); - } - }else - -#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX -# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 -#endif - -#ifndef SQLITE_OMIT_INTEGRITY_CHECK - if( sqlite3StrICmp(zLeft, "integrity_check")==0 ){ - int i, j, addr, mxErr; - - /* Code that appears at the end of the integrity check. If no error - ** messages have been generated, output OK. Otherwise output the - ** error message - */ - static const VdbeOpList endCode[] = { - { OP_MemLoad, 0, 0, 0}, - { OP_Integer, 0, 0, 0}, - { OP_Ne, 0, 0, 0}, /* 2 */ - { OP_String8, 0, 0, "ok"}, - { OP_Callback, 1, 0, 0}, - }; - - /* Initialize the VDBE program */ - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", P3_STATIC); - - /* Set the maximum error count */ - mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; - if( zRight ){ - mxErr = atoi(zRight); - if( mxErr<=0 ){ - mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; - } - } - sqlite3VdbeAddOp(v, OP_MemInt, mxErr, 0); - - /* Do an integrity check on each database file */ - for(i=0; inDb; i++){ - HashElem *x; - Hash *pTbls; - int cnt = 0; - - if( OMIT_TEMPDB && i==1 ) continue; - - sqlite3CodeVerifySchema(pParse, i); - addr = sqlite3VdbeAddOp(v, OP_IfMemPos, 0, 0); - sqlite3VdbeAddOp(v, OP_Halt, 0, 0); - sqlite3VdbeJumpHere(v, addr); - - /* Do an integrity check of the B-Tree - */ - pTbls = &db->aDb[i].pSchema->tblHash; - for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ - Table *pTab = sqliteHashData(x); - Index *pIdx; - sqlite3VdbeAddOp(v, OP_Integer, pTab->tnum, 0); - cnt++; - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - sqlite3VdbeAddOp(v, OP_Integer, pIdx->tnum, 0); - cnt++; - } - } - if( cnt==0 ) continue; - sqlite3VdbeAddOp(v, OP_IntegrityCk, 0, i); - addr = sqlite3VdbeAddOp(v, OP_IsNull, -1, 0); - sqlite3VdbeOp3(v, OP_String8, 0, 0, - sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName), - P3_DYNAMIC); - sqlite3VdbeAddOp(v, OP_Pull, 1, 0); - sqlite3VdbeAddOp(v, OP_Concat, 0, 0); - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); - sqlite3VdbeJumpHere(v, addr); - - /* Make sure all the indices are constructed correctly. - */ - for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ - Table *pTab = sqliteHashData(x); - Index *pIdx; - int loopTop; - - if( pTab->pIndex==0 ) continue; - addr = sqlite3VdbeAddOp(v, OP_IfMemPos, 0, 0); - sqlite3VdbeAddOp(v, OP_Halt, 0, 0); - sqlite3VdbeJumpHere(v, addr); - sqlite3OpenTableAndIndices(pParse, pTab, 1, OP_OpenRead); - sqlite3VdbeAddOp(v, OP_MemInt, 0, 1); - loopTop = sqlite3VdbeAddOp(v, OP_Rewind, 1, 0); - sqlite3VdbeAddOp(v, OP_MemIncr, 1, 1); - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - int jmp2; - static const VdbeOpList idxErr[] = { - { OP_MemIncr, -1, 0, 0}, - { OP_String8, 0, 0, "rowid "}, - { OP_Rowid, 1, 0, 0}, - { OP_String8, 0, 0, " missing from index "}, - { OP_String8, 0, 0, 0}, /* 4 */ - { OP_Concat, 2, 0, 0}, - { OP_Callback, 1, 0, 0}, - }; - sqlite3GenerateIndexKey(v, pIdx, 1); - jmp2 = sqlite3VdbeAddOp(v, OP_Found, j+2, 0); - addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); - sqlite3VdbeChangeP3(v, addr+4, pIdx->zName, P3_STATIC); - sqlite3VdbeJumpHere(v, jmp2); - } - sqlite3VdbeAddOp(v, OP_Next, 1, loopTop+1); - sqlite3VdbeJumpHere(v, loopTop); - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - static const VdbeOpList cntIdx[] = { - { OP_MemInt, 0, 2, 0}, - { OP_Rewind, 0, 0, 0}, /* 1 */ - { OP_MemIncr, 1, 2, 0}, - { OP_Next, 0, 0, 0}, /* 3 */ - { OP_MemLoad, 1, 0, 0}, - { OP_MemLoad, 2, 0, 0}, - { OP_Eq, 0, 0, 0}, /* 6 */ - { OP_MemIncr, -1, 0, 0}, - { OP_String8, 0, 0, "wrong # of entries in index "}, - { OP_String8, 0, 0, 0}, /* 9 */ - { OP_Concat, 0, 0, 0}, - { OP_Callback, 1, 0, 0}, - }; - if( pIdx->tnum==0 ) continue; - addr = sqlite3VdbeAddOp(v, OP_IfMemPos, 0, 0); - sqlite3VdbeAddOp(v, OP_Halt, 0, 0); - sqlite3VdbeJumpHere(v, addr); - addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx); - sqlite3VdbeChangeP1(v, addr+1, j+2); - sqlite3VdbeChangeP2(v, addr+1, addr+4); - sqlite3VdbeChangeP1(v, addr+3, j+2); - sqlite3VdbeChangeP2(v, addr+3, addr+2); - sqlite3VdbeJumpHere(v, addr+6); - sqlite3VdbeChangeP3(v, addr+9, pIdx->zName, P3_STATIC); - } - } - } - addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode); - sqlite3VdbeChangeP1(v, addr+1, mxErr); - sqlite3VdbeJumpHere(v, addr+2); - }else -#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ - -#ifndef SQLITE_OMIT_UTF16 - /* - ** PRAGMA encoding - ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be" - ** - ** In it's first form, this pragma returns the encoding of the main - ** database. If the database is not initialized, it is initialized now. - ** - ** The second form of this pragma is a no-op if the main database file - ** has not already been initialized. In this case it sets the default - ** encoding that will be used for the main database file if a new file - ** is created. If an existing main database file is opened, then the - ** default text encoding for the existing database is used. - ** - ** In all cases new databases created using the ATTACH command are - ** created to use the same default text encoding as the main database. If - ** the main database has not been initialized and/or created when ATTACH - ** is executed, this is done before the ATTACH operation. - ** - ** In the second form this pragma sets the text encoding to be used in - ** new database files created using this database handle. It is only - ** useful if invoked immediately after the main database i - */ - if( sqlite3StrICmp(zLeft, "encoding")==0 ){ - static const struct EncName { - char *zName; - u8 enc; - } encnames[] = { - { "UTF-8", SQLITE_UTF8 }, - { "UTF8", SQLITE_UTF8 }, - { "UTF-16le", SQLITE_UTF16LE }, - { "UTF16le", SQLITE_UTF16LE }, - { "UTF-16be", SQLITE_UTF16BE }, - { "UTF16be", SQLITE_UTF16BE }, - { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */ - { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */ - { 0, 0 } - }; - const struct EncName *pEnc; - if( !zRight ){ /* "PRAGMA encoding" */ - if( sqlite3ReadSchema(pParse) ) goto pragma_out; - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", P3_STATIC); - sqlite3VdbeAddOp(v, OP_String8, 0, 0); - for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ - if( pEnc->enc==ENC(pParse->db) ){ - sqlite3VdbeChangeP3(v, -1, pEnc->zName, P3_STATIC); - break; - } - } - sqlite3VdbeAddOp(v, OP_Callback, 1, 0); - }else{ /* "PRAGMA encoding = XXX" */ - /* Only change the value of sqlite.enc if the database handle is not - ** initialized. If the main database exists, the new sqlite.enc value - ** will be overwritten when the schema is next loaded. If it does not - ** already exists, it will be created to use the new encoding value. - */ - if( - !(DbHasProperty(db, 0, DB_SchemaLoaded)) || - DbHasProperty(db, 0, DB_Empty) - ){ - for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ - if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ - ENC(pParse->db) = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; - break; - } - } - if( !pEnc->zName ){ - sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); - } - } - } - }else -#endif /* SQLITE_OMIT_UTF16 */ - -#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS - /* - ** PRAGMA [database.]schema_version - ** PRAGMA [database.]schema_version = - ** - ** PRAGMA [database.]user_version - ** PRAGMA [database.]user_version = - ** - ** The pragma's schema_version and user_version are used to set or get - ** the value of the schema-version and user-version, respectively. Both - ** the schema-version and the user-version are 32-bit signed integers - ** stored in the database header. - ** - ** The schema-cookie is usually only manipulated internally by SQLite. It - ** is incremented by SQLite whenever the database schema is modified (by - ** creating or dropping a table or index). The schema version is used by - ** SQLite each time a query is executed to ensure that the internal cache - ** of the schema used when compiling the SQL query matches the schema of - ** the database against which the compiled query is actually executed. - ** Subverting this mechanism by using "PRAGMA schema_version" to modify - ** the schema-version is potentially dangerous and may lead to program - ** crashes or database corruption. Use with caution! - ** - ** The user-version is not used internally by SQLite. It may be used by - ** applications for any purpose. - */ - if( sqlite3StrICmp(zLeft, "schema_version")==0 - || sqlite3StrICmp(zLeft, "user_version")==0 - || sqlite3StrICmp(zLeft, "freelist_count")==0 - ){ - - int iCookie; /* Cookie index. 0 for schema-cookie, 6 for user-cookie. */ - sqlite3VdbeUsesBtree(v, iDb); - switch( zLeft[0] ){ - case 's': case 'S': - iCookie = 0; - break; - case 'f': case 'F': - iCookie = 1; - iDb = (-1*(iDb+1)); - assert(iDb<=0); - break; - default: - iCookie = 5; - break; - } - - if( zRight && iDb>=0 ){ - /* Write the specified cookie value */ - static const VdbeOpList setCookie[] = { - { OP_Transaction, 0, 1, 0}, /* 0 */ - { OP_Integer, 0, 0, 0}, /* 1 */ - { OP_SetCookie, 0, 0, 0}, /* 2 */ - }; - int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie); - sqlite3VdbeChangeP1(v, addr, iDb); - sqlite3VdbeChangeP1(v, addr+1, atoi(zRight)); - sqlite3VdbeChangeP1(v, addr+2, iDb); - sqlite3VdbeChangeP2(v, addr+2, iCookie); - }else{ - /* Read the specified cookie value */ - static const VdbeOpList readCookie[] = { - { OP_ReadCookie, 0, 0, 0}, /* 0 */ - { OP_Callback, 1, 0, 0} - }; - int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie); - sqlite3VdbeChangeP1(v, addr, iDb); - sqlite3VdbeChangeP2(v, addr, iCookie); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, P3_TRANSIENT); - } - }else -#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ - -#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) - /* - ** Report the current state of file logs for all databases - */ - if( sqlite3StrICmp(zLeft, "lock_status")==0 ){ - static const char *const azLockName[] = { - "unlocked", "shared", "reserved", "pending", "exclusive" - }; - int i; - Vdbe *v = sqlite3GetVdbe(pParse); - sqlite3VdbeSetNumCols(v, 2); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", P3_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", P3_STATIC); - for(i=0; inDb; i++){ - Btree *pBt; - Pager *pPager; - const char *zState = "unknown"; - int j; - if( db->aDb[i].zName==0 ) continue; - sqlite3VdbeOp3(v, OP_String8, 0, 0, db->aDb[i].zName, P3_STATIC); - pBt = db->aDb[i].pBt; - if( pBt==0 || (pPager = sqlite3BtreePager(pBt))==0 ){ - zState = "closed"; - }else if( sqlite3_file_control(db, db->aDb[i].zName, - SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ - zState = azLockName[j]; - } - sqlite3VdbeOp3(v, OP_String8, 0, 0, zState, P3_STATIC); - sqlite3VdbeAddOp(v, OP_Callback, 2, 0); - } - }else -#endif - -#ifdef SQLITE_SSE - /* - ** Check to see if the sqlite_statements table exists. Create it - ** if it does not. - */ - if( sqlite3StrICmp(zLeft, "create_sqlite_statement_table")==0 ){ - extern int sqlite3CreateStatementsTable(Parse*); - sqlite3CreateStatementsTable(pParse); - }else -#endif - -#if SQLITE_HAS_CODEC - if( sqlite3StrICmp(zLeft, "key")==0 ){ - sqlite3_key(db, zRight, strlen(zRight)); - }else -#endif -#if SQLITE_HAS_CODEC || defined(SQLITE_ENABLE_CEROD) - if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){ -#if SQLITE_HAS_CODEC - if( sqlite3StrNICmp(zRight, "see-", 4)==0 ){ - extern void sqlite3_activate_see(const char*); - sqlite3_activate_see(&zRight[4]); - } -#endif -#ifdef SQLITE_ENABLE_CEROD - if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ - extern void sqlite3_activate_cerod(const char*); - sqlite3_activate_cerod(&zRight[6]); - } -#endif - } -#endif - - {} - - if( v ){ - /* Code an OP_Expire at the end of each PRAGMA program to cause - ** the VDBE implementing the pragma to expire. Most (all?) pragmas - ** are only valid for a single execution. - */ - sqlite3VdbeAddOp(v, OP_Expire, 1, 0); - - /* - ** Reset the safety level, in case the fullfsync flag or synchronous - ** setting changed. - */ -#ifndef SQLITE_OMIT_PAGER_PRAGMAS - if( db->autoCommit ){ - sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level, - (db->flags&SQLITE_FullFSync)!=0); - } -#endif - } -pragma_out: - sqlite3_free(zLeft); - sqlite3_free(zRight); -} - -#endif /* SQLITE_OMIT_PRAGMA || SQLITE_OMIT_PARSER */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c b/libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c deleted file mode 100644 index a1a0a40537..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/prepare.c +++ /dev/null @@ -1,742 +0,0 @@ -/* -** 2005 May 25 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains the implementation of the sqlite3_prepare() -** interface, and routines that contribute to loading the database schema -** from disk. -** -** $Id: prepare.c,v 1.61 2007/10/03 08:46:45 danielk1977 Exp $ -*/ -#include "sqliteInt.h" -#include - -/* -** Fill the InitData structure with an error message that indicates -** that the database is corrupt. -*/ -static void corruptSchema(InitData *pData, const char *zExtra){ - if( !pData->db->mallocFailed ){ - sqlite3SetString(pData->pzErrMsg, "malformed database schema", - zExtra!=0 && zExtra[0]!=0 ? " - " : (char*)0, zExtra, (char*)0); - } - pData->rc = SQLITE_CORRUPT; -} - -/* -** This is the callback routine for the code that initializes the -** database. See sqlite3Init() below for additional information. -** This routine is also called from the OP_ParseSchema opcode of the VDBE. -** -** Each callback contains the following information: -** -** argv[0] = name of thing being created -** argv[1] = root page number for table or index. 0 for trigger or view. -** argv[2] = SQL text for the CREATE statement. -** -*/ -int sqlite3InitCallback(void *pInit, int argc, char **argv, char **azColName){ - InitData *pData = (InitData*)pInit; - sqlite3 *db = pData->db; - int iDb = pData->iDb; - - assert( sqlite3_mutex_held(db->mutex) ); - pData->rc = SQLITE_OK; - DbClearProperty(db, iDb, DB_Empty); - if( db->mallocFailed ){ - corruptSchema(pData, 0); - return SQLITE_NOMEM; - } - - assert( argc==3 ); - if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ - if( argv[1]==0 ){ - corruptSchema(pData, 0); - return 1; - } - assert( iDb>=0 && iDbnDb ); - if( argv[2] && argv[2][0] ){ - /* Call the parser to process a CREATE TABLE, INDEX or VIEW. - ** But because db->init.busy is set to 1, no VDBE code is generated - ** or executed. All the parser does is build the internal data - ** structures that describe the table, index, or view. - */ - char *zErr; - int rc; - assert( db->init.busy ); - db->init.iDb = iDb; - db->init.newTnum = atoi(argv[1]); - rc = sqlite3_exec(db, argv[2], 0, 0, &zErr); - db->init.iDb = 0; - assert( rc!=SQLITE_OK || zErr==0 ); - if( SQLITE_OK!=rc ){ - pData->rc = rc; - if( rc==SQLITE_NOMEM ){ - db->mallocFailed = 1; - }else if( rc!=SQLITE_INTERRUPT ){ - corruptSchema(pData, zErr); - } - sqlite3_free(zErr); - return 1; - } - }else{ - /* If the SQL column is blank it means this is an index that - ** was created to be the PRIMARY KEY or to fulfill a UNIQUE - ** constraint for a CREATE TABLE. The index should have already - ** been created when we processed the CREATE TABLE. All we have - ** to do here is record the root page number for that index. - */ - Index *pIndex; - pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zName); - if( pIndex==0 || pIndex->tnum!=0 ){ - /* This can occur if there exists an index on a TEMP table which - ** has the same name as another index on a permanent index. Since - ** the permanent table is hidden by the TEMP table, we can also - ** safely ignore the index on the permanent table. - */ - /* Do Nothing */; - }else{ - pIndex->tnum = atoi(argv[1]); - } - } - return 0; -} - -/* -** Attempt to read the database schema and initialize internal -** data structures for a single database file. The index of the -** database file is given by iDb. iDb==0 is used for the main -** database. iDb==1 should never be used. iDb>=2 is used for -** auxiliary databases. Return one of the SQLITE_ error codes to -** indicate success or failure. -*/ -static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ - int rc; - BtCursor *curMain; - int size; - Table *pTab; - Db *pDb; - char const *azArg[4]; - int meta[10]; - InitData initData; - char const *zMasterSchema; - char const *zMasterName = SCHEMA_TABLE(iDb); - - /* - ** The master database table has a structure like this - */ - static const char master_schema[] = - "CREATE TABLE sqlite_master(\n" - " type text,\n" - " name text,\n" - " tbl_name text,\n" - " rootpage integer,\n" - " sql text\n" - ")" - ; -#ifndef SQLITE_OMIT_TEMPDB - static const char temp_master_schema[] = - "CREATE TEMP TABLE sqlite_temp_master(\n" - " type text,\n" - " name text,\n" - " tbl_name text,\n" - " rootpage integer,\n" - " sql text\n" - ")" - ; -#else - #define temp_master_schema 0 -#endif - - assert( iDb>=0 && iDbnDb ); - assert( db->aDb[iDb].pSchema ); - assert( sqlite3_mutex_held(db->mutex) ); - - /* zMasterSchema and zInitScript are set to point at the master schema - ** and initialisation script appropriate for the database being - ** initialised. zMasterName is the name of the master table. - */ - if( !OMIT_TEMPDB && iDb==1 ){ - zMasterSchema = temp_master_schema; - }else{ - zMasterSchema = master_schema; - } - zMasterName = SCHEMA_TABLE(iDb); - - /* Construct the schema tables. */ - sqlite3SafetyOff(db); - azArg[0] = zMasterName; - azArg[1] = "1"; - azArg[2] = zMasterSchema; - azArg[3] = 0; - initData.db = db; - initData.iDb = iDb; - initData.pzErrMsg = pzErrMsg; - rc = sqlite3InitCallback(&initData, 3, (char **)azArg, 0); - if( rc ){ - sqlite3SafetyOn(db); - rc = initData.rc; - goto error_out; - } - pTab = sqlite3FindTable(db, zMasterName, db->aDb[iDb].zName); - if( pTab ){ - pTab->readOnly = 1; - } - sqlite3SafetyOn(db); - - /* Create a cursor to hold the database open - */ - pDb = &db->aDb[iDb]; - if( pDb->pBt==0 ){ - if( !OMIT_TEMPDB && iDb==1 ){ - DbSetProperty(db, 1, DB_SchemaLoaded); - } - return SQLITE_OK; - } - sqlite3BtreeEnter(pDb->pBt); - rc = sqlite3BtreeCursor(pDb->pBt, MASTER_ROOT, 0, 0, 0, &curMain); - if( rc!=SQLITE_OK && rc!=SQLITE_EMPTY ){ - sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0); - sqlite3BtreeLeave(pDb->pBt); - goto error_out; - } - - /* Get the database meta information. - ** - ** Meta values are as follows: - ** meta[0] Schema cookie. Changes with each schema change. - ** meta[1] File format of schema layer. - ** meta[2] Size of the page cache. - ** meta[3] Use freelist if 0. Autovacuum if greater than zero. - ** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE - ** meta[5] The user cookie. Used by the application. - ** meta[6] Incremental-vacuum flag. - ** meta[7] - ** meta[8] - ** meta[9] - ** - ** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to - ** the possible values of meta[4]. - */ - if( rc==SQLITE_OK ){ - int i; - for(i=0; rc==SQLITE_OK && ipBt, i+1, (u32 *)&meta[i]); - } - if( rc ){ - sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0); - sqlite3BtreeCloseCursor(curMain); - sqlite3BtreeLeave(pDb->pBt); - goto error_out; - } - }else{ - memset(meta, 0, sizeof(meta)); - } - pDb->pSchema->schema_cookie = meta[0]; - - /* If opening a non-empty database, check the text encoding. For the - ** main database, set sqlite3.enc to the encoding of the main database. - ** For an attached db, it is an error if the encoding is not the same - ** as sqlite3.enc. - */ - if( meta[4] ){ /* text encoding */ - if( iDb==0 ){ - /* If opening the main database, set ENC(db). */ - ENC(db) = (u8)meta[4]; - db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0); - }else{ - /* If opening an attached database, the encoding much match ENC(db) */ - if( meta[4]!=ENC(db) ){ - sqlite3BtreeCloseCursor(curMain); - sqlite3SetString(pzErrMsg, "attached databases must use the same" - " text encoding as main database", (char*)0); - sqlite3BtreeLeave(pDb->pBt); - return SQLITE_ERROR; - } - } - }else{ - DbSetProperty(db, iDb, DB_Empty); - } - pDb->pSchema->enc = ENC(db); - - size = meta[2]; - if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } - pDb->pSchema->cache_size = size; - sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); - - /* - ** file_format==1 Version 3.0.0. - ** file_format==2 Version 3.1.3. // ALTER TABLE ADD COLUMN - ** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults - ** file_format==4 Version 3.3.0. // DESC indices. Boolean constants - */ - pDb->pSchema->file_format = meta[1]; - if( pDb->pSchema->file_format==0 ){ - pDb->pSchema->file_format = 1; - } - if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){ - sqlite3BtreeCloseCursor(curMain); - sqlite3SetString(pzErrMsg, "unsupported file format", (char*)0); - sqlite3BtreeLeave(pDb->pBt); - return SQLITE_ERROR; - } - - - /* Read the schema information out of the schema tables - */ - assert( db->init.busy ); - if( rc==SQLITE_EMPTY ){ - /* For an empty database, there is nothing to read */ - rc = SQLITE_OK; - }else{ - char *zSql; - zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM '%q'.%s", - db->aDb[iDb].zName, zMasterName); - sqlite3SafetyOff(db); - rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); - if( rc==SQLITE_ABORT ) rc = initData.rc; - sqlite3SafetyOn(db); - sqlite3_free(zSql); -#ifndef SQLITE_OMIT_ANALYZE - if( rc==SQLITE_OK ){ - sqlite3AnalysisLoad(db, iDb); - } -#endif - sqlite3BtreeCloseCursor(curMain); - } - if( db->mallocFailed ){ - /* sqlite3SetString(pzErrMsg, "out of memory", (char*)0); */ - rc = SQLITE_NOMEM; - sqlite3ResetInternalSchema(db, 0); - } - if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){ - /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider - ** the schema loaded, even if errors occured. In this situation the - ** current sqlite3_prepare() operation will fail, but the following one - ** will attempt to compile the supplied statement against whatever subset - ** of the schema was loaded before the error occured. The primary - ** purpose of this is to allow access to the sqlite_master table - ** even when it's contents have been corrupted. - */ - DbSetProperty(db, iDb, DB_SchemaLoaded); - rc = SQLITE_OK; - } - sqlite3BtreeLeave(pDb->pBt); - -error_out: - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ - db->mallocFailed = 1; - } - return rc; -} - -/* -** Initialize all database files - the main database file, the file -** used to store temporary tables, and any additional database files -** created using ATTACH statements. Return a success code. If an -** error occurs, write an error message into *pzErrMsg. -** -** After a database is initialized, the DB_SchemaLoaded bit is set -** bit is set in the flags field of the Db structure. If the database -** file was of zero-length, then the DB_Empty flag is also set. -*/ -int sqlite3Init(sqlite3 *db, char **pzErrMsg){ - int i, rc; - int commit_internal = !(db->flags&SQLITE_InternChanges); - - assert( sqlite3_mutex_held(db->mutex) ); - if( db->init.busy ) return SQLITE_OK; - rc = SQLITE_OK; - db->init.busy = 1; - for(i=0; rc==SQLITE_OK && inDb; i++){ - if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue; - rc = sqlite3InitOne(db, i, pzErrMsg); - if( rc ){ - sqlite3ResetInternalSchema(db, i); - } - } - - /* Once all the other databases have been initialised, load the schema - ** for the TEMP database. This is loaded last, as the TEMP database - ** schema may contain references to objects in other databases. - */ -#ifndef SQLITE_OMIT_TEMPDB - if( rc==SQLITE_OK && db->nDb>1 && !DbHasProperty(db, 1, DB_SchemaLoaded) ){ - rc = sqlite3InitOne(db, 1, pzErrMsg); - if( rc ){ - sqlite3ResetInternalSchema(db, 1); - } - } -#endif - - db->init.busy = 0; - if( rc==SQLITE_OK && commit_internal ){ - sqlite3CommitInternalChanges(db); - } - - return rc; -} - -/* -** This routine is a no-op if the database schema is already initialised. -** Otherwise, the schema is loaded. An error code is returned. -*/ -int sqlite3ReadSchema(Parse *pParse){ - int rc = SQLITE_OK; - sqlite3 *db = pParse->db; - assert( sqlite3_mutex_held(db->mutex) ); - if( !db->init.busy ){ - rc = sqlite3Init(db, &pParse->zErrMsg); - } - if( rc!=SQLITE_OK ){ - pParse->rc = rc; - pParse->nErr++; - } - return rc; -} - - -/* -** Check schema cookies in all databases. If any cookie is out -** of date, return 0. If all schema cookies are current, return 1. -*/ -static int schemaIsValid(sqlite3 *db){ - int iDb; - int rc; - BtCursor *curTemp; - int cookie; - int allOk = 1; - - assert( sqlite3_mutex_held(db->mutex) ); - for(iDb=0; allOk && iDbnDb; iDb++){ - Btree *pBt; - pBt = db->aDb[iDb].pBt; - if( pBt==0 ) continue; - rc = sqlite3BtreeCursor(pBt, MASTER_ROOT, 0, 0, 0, &curTemp); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeGetMeta(pBt, 1, (u32 *)&cookie); - if( rc==SQLITE_OK && cookie!=db->aDb[iDb].pSchema->schema_cookie ){ - allOk = 0; - } - sqlite3BtreeCloseCursor(curTemp); - } - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ - db->mallocFailed = 1; - } - } - return allOk; -} - -/* -** Convert a schema pointer into the iDb index that indicates -** which database file in db->aDb[] the schema refers to. -** -** If the same database is attached more than once, the first -** attached database is returned. -*/ -int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ - int i = -1000000; - - /* If pSchema is NULL, then return -1000000. This happens when code in - ** expr.c is trying to resolve a reference to a transient table (i.e. one - ** created by a sub-select). In this case the return value of this - ** function should never be used. - ** - ** We return -1000000 instead of the more usual -1 simply because using - ** -1000000 as incorrectly using -1000000 index into db->aDb[] is much - ** more likely to cause a segfault than -1 (of course there are assert() - ** statements too, but it never hurts to play the odds). - */ - assert( sqlite3_mutex_held(db->mutex) ); - if( pSchema ){ - for(i=0; inDb; i++){ - if( db->aDb[i].pSchema==pSchema ){ - break; - } - } - assert( i>=0 &&i>=0 && inDb ); - } - return i; -} - -/* -** Compile the UTF-8 encoded SQL statement zSql into a statement handle. -*/ -int sqlite3Prepare( - sqlite3 *db, /* Database handle. */ - const char *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const char **pzTail /* OUT: End of parsed string */ -){ - Parse sParse; - char *zErrMsg = 0; - int rc = SQLITE_OK; - int i; - - assert( ppStmt ); - *ppStmt = 0; - if( sqlite3SafetyOn(db) ){ - return SQLITE_MISUSE; - } - assert( !db->mallocFailed ); - assert( sqlite3_mutex_held(db->mutex) ); - - /* If any attached database schemas are locked, do not proceed with - ** compilation. Instead return SQLITE_LOCKED immediately. - */ - for(i=0; inDb; i++) { - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - int rc; - rc = sqlite3BtreeSchemaLocked(pBt); - if( rc ){ - const char *zDb = db->aDb[i].zName; - sqlite3Error(db, SQLITE_LOCKED, "database schema is locked: %s", zDb); - sqlite3SafetyOff(db); - return SQLITE_LOCKED; - } - } - } - - memset(&sParse, 0, sizeof(sParse)); - sParse.db = db; - if( nBytes>=0 && zSql[nBytes]!=0 ){ - char *zSqlCopy; - if( nBytes>SQLITE_MAX_SQL_LENGTH ){ - return SQLITE_TOOBIG; - } - zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); - if( zSqlCopy ){ - sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg); - sqlite3_free(zSqlCopy); - } - sParse.zTail = &zSql[nBytes]; - }else{ - sqlite3RunParser(&sParse, zSql, &zErrMsg); - } - - if( db->mallocFailed ){ - sParse.rc = SQLITE_NOMEM; - } - if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; - if( sParse.checkSchema && !schemaIsValid(db) ){ - sParse.rc = SQLITE_SCHEMA; - } - if( sParse.rc==SQLITE_SCHEMA ){ - sqlite3ResetInternalSchema(db, 0); - } - if( db->mallocFailed ){ - sParse.rc = SQLITE_NOMEM; - } - if( pzTail ){ - *pzTail = sParse.zTail; - } - rc = sParse.rc; - -#ifndef SQLITE_OMIT_EXPLAIN - if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ - if( sParse.explain==2 ){ - sqlite3VdbeSetNumCols(sParse.pVdbe, 3); - sqlite3VdbeSetColName(sParse.pVdbe, 0, COLNAME_NAME, "order", P3_STATIC); - sqlite3VdbeSetColName(sParse.pVdbe, 1, COLNAME_NAME, "from", P3_STATIC); - sqlite3VdbeSetColName(sParse.pVdbe, 2, COLNAME_NAME, "detail", P3_STATIC); - }else{ - sqlite3VdbeSetNumCols(sParse.pVdbe, 5); - sqlite3VdbeSetColName(sParse.pVdbe, 0, COLNAME_NAME, "addr", P3_STATIC); - sqlite3VdbeSetColName(sParse.pVdbe, 1, COLNAME_NAME, "opcode", P3_STATIC); - sqlite3VdbeSetColName(sParse.pVdbe, 2, COLNAME_NAME, "p1", P3_STATIC); - sqlite3VdbeSetColName(sParse.pVdbe, 3, COLNAME_NAME, "p2", P3_STATIC); - sqlite3VdbeSetColName(sParse.pVdbe, 4, COLNAME_NAME, "p3", P3_STATIC); - } - } -#endif - - if( sqlite3SafetyOff(db) ){ - rc = SQLITE_MISUSE; - } - - if( saveSqlFlag ){ - sqlite3VdbeSetSql(sParse.pVdbe, zSql, sParse.zTail - zSql); - } - if( rc!=SQLITE_OK || db->mallocFailed ){ - sqlite3_finalize((sqlite3_stmt*)sParse.pVdbe); - assert(!(*ppStmt)); - }else{ - *ppStmt = (sqlite3_stmt*)sParse.pVdbe; - } - - if( zErrMsg ){ - sqlite3Error(db, rc, "%s", zErrMsg); - sqlite3_free(zErrMsg); - }else{ - sqlite3Error(db, rc, 0); - } - - rc = sqlite3ApiExit(db, rc); - /* sqlite3ReleaseThreadData(); */ - assert( (rc&db->errMask)==rc ); - return rc; -} -static int sqlite3LockAndPrepare( - sqlite3 *db, /* Database handle. */ - const char *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const char **pzTail /* OUT: End of parsed string */ -){ - int rc; - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - sqlite3BtreeEnterAll(db); - rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, ppStmt, pzTail); - sqlite3BtreeLeaveAll(db); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -/* -** Rerun the compilation of a statement after a schema change. -** Return true if the statement was recompiled successfully. -** Return false if there is an error of some kind. -*/ -int sqlite3Reprepare(Vdbe *p){ - int rc; - sqlite3_stmt *pNew; - const char *zSql; - sqlite3 *db; - - assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) ); - zSql = sqlite3VdbeGetSql(p); - if( zSql==0 ){ - return 0; - } - db = sqlite3VdbeDb(p); - assert( sqlite3_mutex_held(db->mutex) ); - rc = sqlite3LockAndPrepare(db, zSql, -1, 0, &pNew, 0); - if( rc ){ - assert( pNew==0 ); - return 0; - }else{ - assert( pNew!=0 ); - } - sqlite3VdbeSwap((Vdbe*)pNew, p); - sqlite3_transfer_bindings(pNew, (sqlite3_stmt*)p); - sqlite3VdbeResetStepResult((Vdbe*)pNew); - sqlite3VdbeFinalize((Vdbe*)pNew); - return 1; -} - - -/* -** Two versions of the official API. Legacy and new use. In the legacy -** version, the original SQL text is not saved in the prepared statement -** and so if a schema change occurs, SQLITE_SCHEMA is returned by -** sqlite3_step(). In the new version, the original SQL text is retained -** and the statement is automatically recompiled if an schema change -** occurs. -*/ -int sqlite3_prepare( - sqlite3 *db, /* Database handle. */ - const char *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const char **pzTail /* OUT: End of parsed string */ -){ - return sqlite3LockAndPrepare(db,zSql,nBytes,0,ppStmt,pzTail); -} -int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle. */ - const char *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const char **pzTail /* OUT: End of parsed string */ -){ - return sqlite3LockAndPrepare(db,zSql,nBytes,1,ppStmt,pzTail); -} - - -#ifndef SQLITE_OMIT_UTF16 -/* -** Compile the UTF-16 encoded SQL statement zSql into a statement handle. -*/ -static int sqlite3Prepare16( - sqlite3 *db, /* Database handle. */ - const void *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - int saveSqlFlag, /* True to save SQL text into the sqlite3_stmt */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const void **pzTail /* OUT: End of parsed string */ -){ - /* This function currently works by first transforming the UTF-16 - ** encoded string to UTF-8, then invoking sqlite3_prepare(). The - ** tricky bit is figuring out the pointer to return in *pzTail. - */ - char *zSql8; - const char *zTail8 = 0; - int rc = SQLITE_OK; - - if( sqlite3SafetyCheck(db) ){ - return SQLITE_MISUSE; - } - sqlite3_mutex_enter(db->mutex); - zSql8 = sqlite3Utf16to8(db, zSql, nBytes); - if( zSql8 ){ - rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, ppStmt, &zTail8); - } - - if( zTail8 && pzTail ){ - /* If sqlite3_prepare returns a tail pointer, we calculate the - ** equivalent pointer into the UTF-16 string by counting the unicode - ** characters between zSql8 and zTail8, and then returning a pointer - ** the same number of characters into the UTF-16 string. - */ - int chars_parsed = sqlite3Utf8CharLen(zSql8, zTail8-zSql8); - *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); - } - sqlite3_free(zSql8); - rc = sqlite3ApiExit(db, rc); - sqlite3_mutex_leave(db->mutex); - return rc; -} - -/* -** Two versions of the official API. Legacy and new use. In the legacy -** version, the original SQL text is not saved in the prepared statement -** and so if a schema change occurs, SQLITE_SCHEMA is returned by -** sqlite3_step(). In the new version, the original SQL text is retained -** and the statement is automatically recompiled if an schema change -** occurs. -*/ -int sqlite3_prepare16( - sqlite3 *db, /* Database handle. */ - const void *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const void **pzTail /* OUT: End of parsed string */ -){ - return sqlite3Prepare16(db,zSql,nBytes,0,ppStmt,pzTail); -} -int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle. */ - const void *zSql, /* UTF-8 encoded SQL statement. */ - int nBytes, /* Length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ - const void **pzTail /* OUT: End of parsed string */ -){ - return sqlite3Prepare16(db,zSql,nBytes,1,ppStmt,pzTail); -} - -#endif /* SQLITE_OMIT_UTF16 */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/printf.c b/libraries/sqlite/unix/sqlite-3.5.1/src/printf.c deleted file mode 100644 index bea91e211d..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/printf.c +++ /dev/null @@ -1,907 +0,0 @@ -/* -** The "printf" code that follows dates from the 1980's. It is in -** the public domain. The original comments are included here for -** completeness. They are very out-of-date but might be useful as -** an historical reference. Most of the "enhancements" have been backed -** out so that the functionality is now the same as standard printf(). -** -************************************************************************** -** -** The following modules is an enhanced replacement for the "printf" subroutines -** found in the standard C library. The following enhancements are -** supported: -** -** + Additional functions. The standard set of "printf" functions -** includes printf, fprintf, sprintf, vprintf, vfprintf, and -** vsprintf. This module adds the following: -** -** * snprintf -- Works like sprintf, but has an extra argument -** which is the size of the buffer written to. -** -** * mprintf -- Similar to sprintf. Writes output to memory -** obtained from malloc. -** -** * xprintf -- Calls a function to dispose of output. -** -** * nprintf -- No output, but returns the number of characters -** that would have been output by printf. -** -** * A v- version (ex: vsnprintf) of every function is also -** supplied. -** -** + A few extensions to the formatting notation are supported: -** -** * The "=" flag (similar to "-") causes the output to be -** be centered in the appropriately sized field. -** -** * The %b field outputs an integer in binary notation. -** -** * The %c field now accepts a precision. The character output -** is repeated by the number of times the precision specifies. -** -** * The %' field works like %c, but takes as its character the -** next character of the format string, instead of the next -** argument. For example, printf("%.78'-") prints 78 minus -** signs, the same as printf("%.78c",'-'). -** -** + When compiled using GCC on a SPARC, this version of printf is -** faster than the library printf for SUN OS 4.1. -** -** + All functions are fully reentrant. -** -*/ -#include "sqliteInt.h" -#include - -/* -** Conversion types fall into various categories as defined by the -** following enumeration. -*/ -#define etRADIX 1 /* Integer types. %d, %x, %o, and so forth */ -#define etFLOAT 2 /* Floating point. %f */ -#define etEXP 3 /* Exponentional notation. %e and %E */ -#define etGENERIC 4 /* Floating or exponential, depending on exponent. %g */ -#define etSIZE 5 /* Return number of characters processed so far. %n */ -#define etSTRING 6 /* Strings. %s */ -#define etDYNSTRING 7 /* Dynamically allocated strings. %z */ -#define etPERCENT 8 /* Percent symbol. %% */ -#define etCHARX 9 /* Characters. %c */ -/* The rest are extensions, not normally found in printf() */ -#define etCHARLIT 10 /* Literal characters. %' */ -#define etSQLESCAPE 11 /* Strings with '\'' doubled. %q */ -#define etSQLESCAPE2 12 /* Strings with '\'' doubled and enclosed in '', - NULL pointers replaced by SQL NULL. %Q */ -#define etTOKEN 13 /* a pointer to a Token structure */ -#define etSRCLIST 14 /* a pointer to a SrcList */ -#define etPOINTER 15 /* The %p conversion */ -#define etSQLESCAPE3 16 /* %w -> Strings with '\"' doubled */ - - -/* -** An "etByte" is an 8-bit unsigned value. -*/ -typedef unsigned char etByte; - -/* -** Each builtin conversion character (ex: the 'd' in "%d") is described -** by an instance of the following structure -*/ -typedef struct et_info { /* Information about each format field */ - char fmttype; /* The format field code letter */ - etByte base; /* The base for radix conversion */ - etByte flags; /* One or more of FLAG_ constants below */ - etByte type; /* Conversion paradigm */ - etByte charset; /* Offset into aDigits[] of the digits string */ - etByte prefix; /* Offset into aPrefix[] of the prefix string */ -} et_info; - -/* -** Allowed values for et_info.flags -*/ -#define FLAG_SIGNED 1 /* True if the value to convert is signed */ -#define FLAG_INTERN 2 /* True if for internal use only */ -#define FLAG_STRING 4 /* Allow infinity precision */ - - -/* -** The following table is searched linearly, so it is good to put the -** most frequently used conversion types first. -*/ -static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; -static const char aPrefix[] = "-x0\000X0"; -static const et_info fmtinfo[] = { - { 'd', 10, 1, etRADIX, 0, 0 }, - { 's', 0, 4, etSTRING, 0, 0 }, - { 'g', 0, 1, etGENERIC, 30, 0 }, - { 'z', 0, 4, etDYNSTRING, 0, 0 }, - { 'q', 0, 4, etSQLESCAPE, 0, 0 }, - { 'Q', 0, 4, etSQLESCAPE2, 0, 0 }, - { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, - { 'c', 0, 0, etCHARX, 0, 0 }, - { 'o', 8, 0, etRADIX, 0, 2 }, - { 'u', 10, 0, etRADIX, 0, 0 }, - { 'x', 16, 0, etRADIX, 16, 1 }, - { 'X', 16, 0, etRADIX, 0, 4 }, -#ifndef SQLITE_OMIT_FLOATING_POINT - { 'f', 0, 1, etFLOAT, 0, 0 }, - { 'e', 0, 1, etEXP, 30, 0 }, - { 'E', 0, 1, etEXP, 14, 0 }, - { 'G', 0, 1, etGENERIC, 14, 0 }, -#endif - { 'i', 10, 1, etRADIX, 0, 0 }, - { 'n', 0, 0, etSIZE, 0, 0 }, - { '%', 0, 0, etPERCENT, 0, 0 }, - { 'p', 16, 0, etPOINTER, 0, 1 }, - { 'T', 0, 2, etTOKEN, 0, 0 }, - { 'S', 0, 2, etSRCLIST, 0, 0 }, -}; -#define etNINFO (sizeof(fmtinfo)/sizeof(fmtinfo[0])) - -/* -** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point -** conversions will work. -*/ -#ifndef SQLITE_OMIT_FLOATING_POINT -/* -** "*val" is a double such that 0.1 <= *val < 10.0 -** Return the ascii code for the leading digit of *val, then -** multiply "*val" by 10.0 to renormalize. -** -** Example: -** input: *val = 3.14159 -** output: *val = 1.4159 function return = '3' -** -** The counter *cnt is incremented each time. After counter exceeds -** 16 (the number of significant digits in a 64-bit float) '0' is -** always returned. -*/ -static int et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ - int digit; - LONGDOUBLE_TYPE d; - if( (*cnt)++ >= 16 ) return '0'; - digit = (int)*val; - d = digit; - digit += '0'; - *val = (*val - d)*10.0; - return digit; -} -#endif /* SQLITE_OMIT_FLOATING_POINT */ - -/* -** On machines with a small stack size, you can redefine the -** SQLITE_PRINT_BUF_SIZE to be less than 350. But beware - for -** smaller values some %f conversions may go into an infinite loop. -*/ -#ifndef SQLITE_PRINT_BUF_SIZE -# define SQLITE_PRINT_BUF_SIZE 350 -#endif -#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ - -/* -** The root program. All variations call this core. -** -** INPUTS: -** func This is a pointer to a function taking three arguments -** 1. A pointer to anything. Same as the "arg" parameter. -** 2. A pointer to the list of characters to be output -** (Note, this list is NOT null terminated.) -** 3. An integer number of characters to be output. -** (Note: This number might be zero.) -** -** arg This is the pointer to anything which will be passed as the -** first argument to "func". Use it for whatever you like. -** -** fmt This is the format string, as in the usual print. -** -** ap This is a pointer to a list of arguments. Same as in -** vfprint. -** -** OUTPUTS: -** The return value is the total number of characters sent to -** the function "func". Returns -1 on a error. -** -** Note that the order in which automatic variables are declared below -** seems to make a big difference in determining how fast this beast -** will run. -*/ -static int vxprintf( - void (*func)(void*,const char*,int), /* Consumer of text */ - void *arg, /* First argument to the consumer */ - int useExtended, /* Allow extended %-conversions */ - const char *fmt, /* Format string */ - va_list ap /* arguments */ -){ - int c; /* Next character in the format string */ - char *bufpt; /* Pointer to the conversion buffer */ - int precision; /* Precision of the current field */ - int length; /* Length of the field */ - int idx; /* A general purpose loop counter */ - int count; /* Total number of characters output */ - int width; /* Width of the current field */ - etByte flag_leftjustify; /* True if "-" flag is present */ - etByte flag_plussign; /* True if "+" flag is present */ - etByte flag_blanksign; /* True if " " flag is present */ - etByte flag_alternateform; /* True if "#" flag is present */ - etByte flag_altform2; /* True if "!" flag is present */ - etByte flag_zeropad; /* True if field width constant starts with zero */ - etByte flag_long; /* True if "l" flag is present */ - etByte flag_longlong; /* True if the "ll" flag is present */ - etByte done; /* Loop termination flag */ - sqlite_uint64 longvalue; /* Value for integer types */ - LONGDOUBLE_TYPE realvalue; /* Value for real types */ - const et_info *infop; /* Pointer to the appropriate info structure */ - char buf[etBUFSIZE]; /* Conversion buffer */ - char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ - etByte errorflag = 0; /* True if an error is encountered */ - etByte xtype; /* Conversion paradigm */ - char *zExtra; /* Extra memory used for etTCLESCAPE conversions */ - static const char spaces[] = - " "; -#define etSPACESIZE (sizeof(spaces)-1) -#ifndef SQLITE_OMIT_FLOATING_POINT - int exp, e2; /* exponent of real numbers */ - double rounder; /* Used for rounding floating point values */ - etByte flag_dp; /* True if decimal point should be shown */ - etByte flag_rtz; /* True if trailing zeros should be removed */ - etByte flag_exp; /* True to force display of the exponent */ - int nsd; /* Number of significant digits returned */ -#endif - - func(arg,"",0); - count = length = 0; - bufpt = 0; - for(; (c=(*fmt))!=0; ++fmt){ - if( c!='%' ){ - int amt; - bufpt = (char *)fmt; - amt = 1; - while( (c=(*++fmt))!='%' && c!=0 ) amt++; - (*func)(arg,bufpt,amt); - count += amt; - if( c==0 ) break; - } - if( (c=(*++fmt))==0 ){ - errorflag = 1; - (*func)(arg,"%",1); - count++; - break; - } - /* Find out what flags are present */ - flag_leftjustify = flag_plussign = flag_blanksign = - flag_alternateform = flag_altform2 = flag_zeropad = 0; - done = 0; - do{ - switch( c ){ - case '-': flag_leftjustify = 1; break; - case '+': flag_plussign = 1; break; - case ' ': flag_blanksign = 1; break; - case '#': flag_alternateform = 1; break; - case '!': flag_altform2 = 1; break; - case '0': flag_zeropad = 1; break; - default: done = 1; break; - } - }while( !done && (c=(*++fmt))!=0 ); - /* Get the field width */ - width = 0; - if( c=='*' ){ - width = va_arg(ap,int); - if( width<0 ){ - flag_leftjustify = 1; - width = -width; - } - c = *++fmt; - }else{ - while( c>='0' && c<='9' ){ - width = width*10 + c - '0'; - c = *++fmt; - } - } - if( width > etBUFSIZE-10 ){ - width = etBUFSIZE-10; - } - /* Get the precision */ - if( c=='.' ){ - precision = 0; - c = *++fmt; - if( c=='*' ){ - precision = va_arg(ap,int); - if( precision<0 ) precision = -precision; - c = *++fmt; - }else{ - while( c>='0' && c<='9' ){ - precision = precision*10 + c - '0'; - c = *++fmt; - } - } - }else{ - precision = -1; - } - /* Get the conversion type modifier */ - if( c=='l' ){ - flag_long = 1; - c = *++fmt; - if( c=='l' ){ - flag_longlong = 1; - c = *++fmt; - }else{ - flag_longlong = 0; - } - }else{ - flag_long = flag_longlong = 0; - } - /* Fetch the info entry for the field */ - infop = 0; - for(idx=0; idxflags & FLAG_INTERN)==0 ){ - xtype = infop->type; - }else{ - return -1; - } - break; - } - } - zExtra = 0; - if( infop==0 ){ - return -1; - } - - - /* Limit the precision to prevent overflowing buf[] during conversion */ - if( precision>etBUFSIZE-40 && (infop->flags & FLAG_STRING)==0 ){ - precision = etBUFSIZE-40; - } - - /* - ** At this point, variables are initialized as follows: - ** - ** flag_alternateform TRUE if a '#' is present. - ** flag_altform2 TRUE if a '!' is present. - ** flag_plussign TRUE if a '+' is present. - ** flag_leftjustify TRUE if a '-' is present or if the - ** field width was negative. - ** flag_zeropad TRUE if the width began with 0. - ** flag_long TRUE if the letter 'l' (ell) prefixed - ** the conversion character. - ** flag_longlong TRUE if the letter 'll' (ell ell) prefixed - ** the conversion character. - ** flag_blanksign TRUE if a ' ' is present. - ** width The specified field width. This is - ** always non-negative. Zero is the default. - ** precision The specified precision. The default - ** is -1. - ** xtype The class of the conversion. - ** infop Pointer to the appropriate info struct. - */ - switch( xtype ){ - case etPOINTER: - flag_longlong = sizeof(char*)==sizeof(i64); - flag_long = sizeof(char*)==sizeof(long int); - /* Fall through into the next case */ - case etRADIX: - if( infop->flags & FLAG_SIGNED ){ - i64 v; - if( flag_longlong ) v = va_arg(ap,i64); - else if( flag_long ) v = va_arg(ap,long int); - else v = va_arg(ap,int); - if( v<0 ){ - longvalue = -v; - prefix = '-'; - }else{ - longvalue = v; - if( flag_plussign ) prefix = '+'; - else if( flag_blanksign ) prefix = ' '; - else prefix = 0; - } - }else{ - if( flag_longlong ) longvalue = va_arg(ap,u64); - else if( flag_long ) longvalue = va_arg(ap,unsigned long int); - else longvalue = va_arg(ap,unsigned int); - prefix = 0; - } - if( longvalue==0 ) flag_alternateform = 0; - if( flag_zeropad && precisioncharset]; - base = infop->base; - do{ /* Convert to ascii */ - *(--bufpt) = cset[longvalue%base]; - longvalue = longvalue/base; - }while( longvalue>0 ); - } - length = &buf[etBUFSIZE-1]-bufpt; - for(idx=precision-length; idx>0; idx--){ - *(--bufpt) = '0'; /* Zero pad */ - } - if( prefix ) *(--bufpt) = prefix; /* Add sign */ - if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ - const char *pre; - char x; - pre = &aPrefix[infop->prefix]; - if( *bufpt!=pre[0] ){ - for(; (x=(*pre))!=0; pre++) *(--bufpt) = x; - } - } - length = &buf[etBUFSIZE-1]-bufpt; - break; - case etFLOAT: - case etEXP: - case etGENERIC: - realvalue = va_arg(ap,double); -#ifndef SQLITE_OMIT_FLOATING_POINT - if( precision<0 ) precision = 6; /* Set default precision */ - if( precision>etBUFSIZE/2-10 ) precision = etBUFSIZE/2-10; - if( realvalue<0.0 ){ - realvalue = -realvalue; - prefix = '-'; - }else{ - if( flag_plussign ) prefix = '+'; - else if( flag_blanksign ) prefix = ' '; - else prefix = 0; - } - if( xtype==etGENERIC && precision>0 ) precision--; -#if 0 - /* Rounding works like BSD when the constant 0.4999 is used. Wierd! */ - for(idx=precision, rounder=0.4999; idx>0; idx--, rounder*=0.1); -#else - /* It makes more sense to use 0.5 */ - for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){} -#endif - if( xtype==etFLOAT ) realvalue += rounder; - /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ - exp = 0; - if( sqlite3_isnan(realvalue) ){ - bufpt = "NaN"; - length = 3; - break; - } - if( realvalue>0.0 ){ - while( realvalue>=1e32 && exp<=350 ){ realvalue *= 1e-32; exp+=32; } - while( realvalue>=1e8 && exp<=350 ){ realvalue *= 1e-8; exp+=8; } - while( realvalue>=10.0 && exp<=350 ){ realvalue *= 0.1; exp++; } - while( realvalue<1e-8 && exp>=-350 ){ realvalue *= 1e8; exp-=8; } - while( realvalue<1.0 && exp>=-350 ){ realvalue *= 10.0; exp--; } - if( exp>350 || exp<-350 ){ - if( prefix=='-' ){ - bufpt = "-Inf"; - }else if( prefix=='+' ){ - bufpt = "+Inf"; - }else{ - bufpt = "Inf"; - } - length = strlen(bufpt); - break; - } - } - bufpt = buf; - /* - ** If the field type is etGENERIC, then convert to either etEXP - ** or etFLOAT, as appropriate. - */ - flag_exp = xtype==etEXP; - if( xtype!=etFLOAT ){ - realvalue += rounder; - if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } - } - if( xtype==etGENERIC ){ - flag_rtz = !flag_alternateform; - if( exp<-4 || exp>precision ){ - xtype = etEXP; - }else{ - precision = precision - exp; - xtype = etFLOAT; - } - }else{ - flag_rtz = 0; - } - if( xtype==etEXP ){ - e2 = 0; - }else{ - e2 = exp; - } - nsd = 0; - flag_dp = (precision>0) | flag_alternateform | flag_altform2; - /* The sign in front of the number */ - if( prefix ){ - *(bufpt++) = prefix; - } - /* Digits prior to the decimal point */ - if( e2<0 ){ - *(bufpt++) = '0'; - }else{ - for(; e2>=0; e2--){ - *(bufpt++) = et_getdigit(&realvalue,&nsd); - } - } - /* The decimal point */ - if( flag_dp ){ - *(bufpt++) = '.'; - } - /* "0" digits after the decimal point but before the first - ** significant digit of the number */ - for(e2++; e2<0 && precision>0; precision--, e2++){ - *(bufpt++) = '0'; - } - /* Significant digits after the decimal point */ - while( (precision--)>0 ){ - *(bufpt++) = et_getdigit(&realvalue,&nsd); - } - /* Remove trailing zeros and the "." if no digits follow the "." */ - if( flag_rtz && flag_dp ){ - while( bufpt[-1]=='0' ) *(--bufpt) = 0; - assert( bufpt>buf ); - if( bufpt[-1]=='.' ){ - if( flag_altform2 ){ - *(bufpt++) = '0'; - }else{ - *(--bufpt) = 0; - } - } - } - /* Add the "eNNN" suffix */ - if( flag_exp || (xtype==etEXP && exp) ){ - *(bufpt++) = aDigits[infop->charset]; - if( exp<0 ){ - *(bufpt++) = '-'; exp = -exp; - }else{ - *(bufpt++) = '+'; - } - if( exp>=100 ){ - *(bufpt++) = (exp/100)+'0'; /* 100's digit */ - exp %= 100; - } - *(bufpt++) = exp/10+'0'; /* 10's digit */ - *(bufpt++) = exp%10+'0'; /* 1's digit */ - } - *bufpt = 0; - - /* The converted number is in buf[] and zero terminated. Output it. - ** Note that the number is in the usual order, not reversed as with - ** integer conversions. */ - length = bufpt-buf; - bufpt = buf; - - /* Special case: Add leading zeros if the flag_zeropad flag is - ** set and we are not left justified */ - if( flag_zeropad && !flag_leftjustify && length < width){ - int i; - int nPad = width - length; - for(i=width; i>=nPad; i--){ - bufpt[i] = bufpt[i-nPad]; - } - i = prefix!=0; - while( nPad-- ) bufpt[i++] = '0'; - length = width; - } -#endif - break; - case etSIZE: - *(va_arg(ap,int*)) = count; - length = width = 0; - break; - case etPERCENT: - buf[0] = '%'; - bufpt = buf; - length = 1; - break; - case etCHARLIT: - case etCHARX: - c = buf[0] = (xtype==etCHARX ? va_arg(ap,int) : *++fmt); - if( precision>=0 ){ - for(idx=1; idx=0 && precisionetBUFSIZE ){ - bufpt = zExtra = sqlite3_malloc( n ); - if( bufpt==0 ) return -1; - }else{ - bufpt = buf; - } - j = 0; - if( needQuote ) bufpt[j++] = q; - for(i=0; (ch=escarg[i])!=0; i++){ - bufpt[j++] = ch; - if( ch==q ) bufpt[j++] = ch; - } - if( needQuote ) bufpt[j++] = q; - bufpt[j] = 0; - length = j; - /* The precision is ignored on %q and %Q */ - /* if( precision>=0 && precisionz ){ - (*func)(arg, (char*)pToken->z, pToken->n); - } - length = width = 0; - break; - } - case etSRCLIST: { - SrcList *pSrc = va_arg(ap, SrcList*); - int k = va_arg(ap, int); - struct SrcList_item *pItem = &pSrc->a[k]; - assert( k>=0 && knSrc ); - if( pItem->zDatabase && pItem->zDatabase[0] ){ - (*func)(arg, pItem->zDatabase, strlen(pItem->zDatabase)); - (*func)(arg, ".", 1); - } - (*func)(arg, pItem->zName, strlen(pItem->zName)); - length = width = 0; - break; - } - }/* End switch over the format type */ - /* - ** The text of the conversion is pointed to by "bufpt" and is - ** "length" characters long. The field width is "width". Do - ** the output. - */ - if( !flag_leftjustify ){ - register int nspace; - nspace = width-length; - if( nspace>0 ){ - count += nspace; - while( nspace>=etSPACESIZE ){ - (*func)(arg,spaces,etSPACESIZE); - nspace -= etSPACESIZE; - } - if( nspace>0 ) (*func)(arg,spaces,nspace); - } - } - if( length>0 ){ - (*func)(arg,bufpt,length); - count += length; - } - if( flag_leftjustify ){ - register int nspace; - nspace = width-length; - if( nspace>0 ){ - count += nspace; - while( nspace>=etSPACESIZE ){ - (*func)(arg,spaces,etSPACESIZE); - nspace -= etSPACESIZE; - } - if( nspace>0 ) (*func)(arg,spaces,nspace); - } - } - if( zExtra ){ - sqlite3_free(zExtra); - } - }/* End for loop over the format string */ - return errorflag ? -1 : count; -} /* End of function */ - - -/* This structure is used to store state information about the -** write to memory that is currently in progress. -*/ -struct sgMprintf { - char *zBase; /* A base allocation */ - char *zText; /* The string collected so far */ - int nChar; /* Length of the string so far */ - int nTotal; /* Output size if unconstrained */ - int nAlloc; /* Amount of space allocated in zText */ - void *(*xRealloc)(void*,int); /* Function used to realloc memory */ - int iMallocFailed; /* True if xRealloc() has failed */ -}; - -/* -** This function implements the callback from vxprintf. -** -** This routine add nNewChar characters of text in zNewText to -** the sgMprintf structure pointed to by "arg". -*/ -static void mout(void *arg, const char *zNewText, int nNewChar){ - struct sgMprintf *pM = (struct sgMprintf*)arg; - if( pM->iMallocFailed ) return; - pM->nTotal += nNewChar; - if( pM->zText ){ - if( pM->nChar + nNewChar + 1 > pM->nAlloc ){ - if( pM->xRealloc==0 ){ - nNewChar = pM->nAlloc - pM->nChar - 1; - }else{ - int nAlloc = pM->nChar + nNewChar*2 + 1; - if( pM->zText==pM->zBase ){ - pM->zText = pM->xRealloc(0, nAlloc); - if( pM->zText==0 ){ - pM->nAlloc = 0; - pM->iMallocFailed = 1; - return; - }else if( pM->nChar ){ - memcpy(pM->zText, pM->zBase, pM->nChar); - } - }else{ - char *zNew; - zNew = pM->xRealloc(pM->zText, nAlloc); - if( zNew ){ - pM->zText = zNew; - }else{ - pM->iMallocFailed = 1; - pM->xRealloc(pM->zText, 0); - pM->zText = 0; - pM->nAlloc = 0; - return; - } - } - pM->nAlloc = nAlloc; - } - } - if( nNewChar>0 ){ - memcpy(&pM->zText[pM->nChar], zNewText, nNewChar); - pM->nChar += nNewChar; - } - pM->zText[pM->nChar] = 0; - } -} - -/* -** This routine is a wrapper around xprintf() that invokes mout() as -** the consumer. -*/ -static char *base_vprintf( - void *(*xRealloc)(void*, int), /* realloc() function. May be NULL */ - int useInternal, /* Use internal %-conversions if true */ - char *zInitBuf, /* Initially write here, before mallocing */ - int nInitBuf, /* Size of zInitBuf[] */ - const char *zFormat, /* format string */ - va_list ap /* arguments */ -){ - struct sgMprintf sM; - sM.zBase = sM.zText = zInitBuf; - sM.nChar = sM.nTotal = 0; - sM.nAlloc = nInitBuf; - sM.xRealloc = xRealloc; - sM.iMallocFailed = 0; - vxprintf(mout, &sM, useInternal, zFormat, ap); - assert(sM.iMallocFailed==0 || sM.zText==0); - if( xRealloc && !sM.iMallocFailed ){ - if( sM.zText==sM.zBase ){ - sM.zText = xRealloc(0, sM.nChar+1); - if( sM.zText ){ - memcpy(sM.zText, sM.zBase, sM.nChar+1); - } - }else if( sM.nAlloc>sM.nChar+10 ){ - char *zNew; - sqlite3MallocBenignFailure(1); - zNew = xRealloc(sM.zText, sM.nChar+1); - if( zNew ){ - sM.zText = zNew; - } - } - } - return sM.zText; -} - -/* -** Realloc that is a real function, not a macro. -*/ -static void *printf_realloc(void *old, int size){ - return sqlite3_realloc(old, size); -} - -/* -** Print into memory obtained from sqliteMalloc(). Use the internal -** %-conversion extensions. -*/ -char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ - char *z; - char zBase[SQLITE_PRINT_BUF_SIZE]; - z = base_vprintf(printf_realloc, 1, zBase, sizeof(zBase), zFormat, ap); - if( z==0 && db!=0 ){ - db->mallocFailed = 1; - } - return z; -} - -/* -** Print into memory obtained from sqliteMalloc(). Use the internal -** %-conversion extensions. -*/ -char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ - va_list ap; - char *z; - char zBase[SQLITE_PRINT_BUF_SIZE]; - va_start(ap, zFormat); - z = base_vprintf(printf_realloc, 1, zBase, sizeof(zBase), zFormat, ap); - va_end(ap); - if( z==0 && db!=0 ){ - db->mallocFailed = 1; - } - return z; -} - -/* -** Print into memory obtained from sqlite3_malloc(). Omit the internal -** %-conversion extensions. -*/ -char *sqlite3_vmprintf(const char *zFormat, va_list ap){ - char zBase[SQLITE_PRINT_BUF_SIZE]; - return base_vprintf(sqlite3_realloc, 0, zBase, sizeof(zBase), zFormat, ap); -} - -/* -** Print into memory obtained from sqlite3_malloc()(). Omit the internal -** %-conversion extensions. -*/ -char *sqlite3_mprintf(const char *zFormat, ...){ - va_list ap; - char *z; - va_start(ap, zFormat); - z = sqlite3_vmprintf(zFormat, ap); - va_end(ap); - return z; -} - -/* -** sqlite3_snprintf() works like snprintf() except that it ignores the -** current locale settings. This is important for SQLite because we -** are not able to use a "," as the decimal point in place of "." as -** specified by some locales. -*/ -char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ - char *z; - va_list ap; - - if( n<=0 ){ - return zBuf; - } - zBuf[0] = 0; - va_start(ap,zFormat); - z = base_vprintf(0, 0, zBuf, n, zFormat, ap); - va_end(ap); - return z; -} - -#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) || defined(SQLITE_MEMDEBUG) -/* -** A version of printf() that understands %lld. Used for debugging. -** The printf() built into some versions of windows does not understand %lld -** and segfaults if you give it a long long int. -*/ -void sqlite3DebugPrintf(const char *zFormat, ...){ - extern int getpid(void); - va_list ap; - char zBuf[500]; - va_start(ap, zFormat); - base_vprintf(0, 0, zBuf, sizeof(zBuf), zFormat, ap); - va_end(ap); - fprintf(stdout,"%s", zBuf); - fflush(stdout); -} -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/random.c b/libraries/sqlite/unix/sqlite-3.5.1/src/random.c deleted file mode 100644 index 19b284f94f..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/random.c +++ /dev/null @@ -1,103 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code to implement a pseudo-random number -** generator (PRNG) for SQLite. -** -** Random numbers are used by some of the database backends in order -** to generate random integer keys for tables or random filenames. -** -** $Id: random.c,v 1.20 2007/08/21 13:51:23 drh Exp $ -*/ -#include "sqliteInt.h" - - -/* -** Get a single 8-bit random value from the RC4 PRNG. The Mutex -** must be held while executing this routine. -** -** Why not just use a library random generator like lrand48() for this? -** Because the OP_NewRowid opcode in the VDBE depends on having a very -** good source of random numbers. The lrand48() library function may -** well be good enough. But maybe not. Or maybe lrand48() has some -** subtle problems on some systems that could cause problems. It is hard -** to know. To minimize the risk of problems due to bad lrand48() -** implementations, SQLite uses this random number generator based -** on RC4, which we know works very well. -** -** (Later): Actually, OP_NewRowid does not depend on a good source of -** randomness any more. But we will leave this code in all the same. -*/ -static int randomByte(void){ - unsigned char t; - - /* All threads share a single random number generator. - ** This structure is the current state of the generator. - */ - static struct { - unsigned char isInit; /* True if initialized */ - unsigned char i, j; /* State variables */ - unsigned char s[256]; /* State variables */ - } prng; - - /* Initialize the state of the random number generator once, - ** the first time this routine is called. The seed value does - ** not need to contain a lot of randomness since we are not - ** trying to do secure encryption or anything like that... - ** - ** Nothing in this file or anywhere else in SQLite does any kind of - ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random - ** number generator) not as an encryption device. - */ - if( !prng.isInit ){ - int i; - char k[256]; - prng.j = 0; - prng.i = 0; - sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k); - for(i=0; i<256; i++){ - prng.s[i] = i; - } - for(i=0; i<256; i++){ - prng.j += prng.s[i] + k[i]; - t = prng.s[prng.j]; - prng.s[prng.j] = prng.s[i]; - prng.s[i] = t; - } - prng.isInit = 1; - } - - /* Generate and return single random byte - */ - prng.i++; - t = prng.s[prng.i]; - prng.j += t; - prng.s[prng.i] = prng.s[prng.j]; - prng.s[prng.j] = t; - t += prng.s[prng.i]; - return prng.s[t]; -} - -/* -** Return N random bytes. -*/ -void sqlite3Randomness(int N, void *pBuf){ - unsigned char *zBuf = pBuf; - static sqlite3_mutex *mutex = 0; - if( mutex==0 ){ - mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PRNG); - } - sqlite3_mutex_enter(mutex); - while( N-- ){ - *(zBuf++) = randomByte(); - } - sqlite3_mutex_leave(mutex); -} diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/select.c b/libraries/sqlite/unix/sqlite-3.5.1/src/select.c deleted file mode 100644 index fbe1b066db..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/select.c +++ /dev/null @@ -1,3539 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains C code routines that are called by the parser -** to handle SELECT statements in SQLite. -** -** $Id: select.c,v 1.359 2007/08/31 17:42:48 danielk1977 Exp $ -*/ -#include "sqliteInt.h" - - -/* -** Delete all the content of a Select structure but do not deallocate -** the select structure itself. -*/ -static void clearSelect(Select *p){ - sqlite3ExprListDelete(p->pEList); - sqlite3SrcListDelete(p->pSrc); - sqlite3ExprDelete(p->pWhere); - sqlite3ExprListDelete(p->pGroupBy); - sqlite3ExprDelete(p->pHaving); - sqlite3ExprListDelete(p->pOrderBy); - sqlite3SelectDelete(p->pPrior); - sqlite3ExprDelete(p->pLimit); - sqlite3ExprDelete(p->pOffset); -} - - -/* -** Allocate a new Select structure and return a pointer to that -** structure. -*/ -Select *sqlite3SelectNew( - Parse *pParse, /* Parsing context */ - ExprList *pEList, /* which columns to include in the result */ - SrcList *pSrc, /* the FROM clause -- which tables to scan */ - Expr *pWhere, /* the WHERE clause */ - ExprList *pGroupBy, /* the GROUP BY clause */ - Expr *pHaving, /* the HAVING clause */ - ExprList *pOrderBy, /* the ORDER BY clause */ - int isDistinct, /* true if the DISTINCT keyword is present */ - Expr *pLimit, /* LIMIT value. NULL means not used */ - Expr *pOffset /* OFFSET value. NULL means no offset */ -){ - Select *pNew; - Select standin; - sqlite3 *db = pParse->db; - pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); - assert( !pOffset || pLimit ); /* Can't have OFFSET without LIMIT. */ - if( pNew==0 ){ - pNew = &standin; - memset(pNew, 0, sizeof(*pNew)); - } - if( pEList==0 ){ - pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0,0,0), 0); - } - pNew->pEList = pEList; - pNew->pSrc = pSrc; - pNew->pWhere = pWhere; - pNew->pGroupBy = pGroupBy; - pNew->pHaving = pHaving; - pNew->pOrderBy = pOrderBy; - pNew->isDistinct = isDistinct; - pNew->op = TK_SELECT; - assert( pOffset==0 || pLimit!=0 ); - pNew->pLimit = pLimit; - pNew->pOffset = pOffset; - pNew->iLimit = -1; - pNew->iOffset = -1; - pNew->addrOpenEphm[0] = -1; - pNew->addrOpenEphm[1] = -1; - pNew->addrOpenEphm[2] = -1; - if( pNew==&standin) { - clearSelect(pNew); - pNew = 0; - } - return pNew; -} - -/* -** Delete the given Select structure and all of its substructures. -*/ -void sqlite3SelectDelete(Select *p){ - if( p ){ - clearSelect(p); - sqlite3_free(p); - } -} - -/* -** Given 1 to 3 identifiers preceeding the JOIN keyword, determine the -** type of join. Return an integer constant that expresses that type -** in terms of the following bit values: -** -** JT_INNER -** JT_CROSS -** JT_OUTER -** JT_NATURAL -** JT_LEFT -** JT_RIGHT -** -** A full outer join is the combination of JT_LEFT and JT_RIGHT. -** -** If an illegal or unsupported join type is seen, then still return -** a join type, but put an error in the pParse structure. -*/ -int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ - int jointype = 0; - Token *apAll[3]; - Token *p; - static const struct { - const char zKeyword[8]; - u8 nChar; - u8 code; - } keywords[] = { - { "natural", 7, JT_NATURAL }, - { "left", 4, JT_LEFT|JT_OUTER }, - { "right", 5, JT_RIGHT|JT_OUTER }, - { "full", 4, JT_LEFT|JT_RIGHT|JT_OUTER }, - { "outer", 5, JT_OUTER }, - { "inner", 5, JT_INNER }, - { "cross", 5, JT_INNER|JT_CROSS }, - }; - int i, j; - apAll[0] = pA; - apAll[1] = pB; - apAll[2] = pC; - for(i=0; i<3 && apAll[i]; i++){ - p = apAll[i]; - for(j=0; jn==keywords[j].nChar - && sqlite3StrNICmp((char*)p->z, keywords[j].zKeyword, p->n)==0 ){ - jointype |= keywords[j].code; - break; - } - } - if( j>=sizeof(keywords)/sizeof(keywords[0]) ){ - jointype |= JT_ERROR; - break; - } - } - if( - (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || - (jointype & JT_ERROR)!=0 - ){ - const char *zSp1 = " "; - const char *zSp2 = " "; - if( pB==0 ){ zSp1++; } - if( pC==0 ){ zSp2++; } - sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " - "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC); - jointype = JT_INNER; - }else if( jointype & JT_RIGHT ){ - sqlite3ErrorMsg(pParse, - "RIGHT and FULL OUTER JOINs are not currently supported"); - jointype = JT_INNER; - } - return jointype; -} - -/* -** Return the index of a column in a table. Return -1 if the column -** is not contained in the table. -*/ -static int columnIndex(Table *pTab, const char *zCol){ - int i; - for(i=0; inCol; i++){ - if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i; - } - return -1; -} - -/* -** Set the value of a token to a '\000'-terminated string. -*/ -static void setToken(Token *p, const char *z){ - p->z = (u8*)z; - p->n = z ? strlen(z) : 0; - p->dyn = 0; -} - -/* -** Set the token to the double-quoted and escaped version of the string pointed -** to by z. For example; -** -** {a"bc} -> {"a""bc"} -*/ -static void setQuotedToken(Parse *pParse, Token *p, const char *z){ - p->z = (u8 *)sqlite3MPrintf(0, "\"%w\"", z); - p->dyn = 1; - if( p->z ){ - p->n = strlen((char *)p->z); - }else{ - pParse->db->mallocFailed = 1; - } -} - -/* -** Create an expression node for an identifier with the name of zName -*/ -Expr *sqlite3CreateIdExpr(Parse *pParse, const char *zName){ - Token dummy; - setToken(&dummy, zName); - return sqlite3PExpr(pParse, TK_ID, 0, 0, &dummy); -} - - -/* -** Add a term to the WHERE expression in *ppExpr that requires the -** zCol column to be equal in the two tables pTab1 and pTab2. -*/ -static void addWhereTerm( - Parse *pParse, /* Parsing context */ - const char *zCol, /* Name of the column */ - const Table *pTab1, /* First table */ - const char *zAlias1, /* Alias for first table. May be NULL */ - const Table *pTab2, /* Second table */ - const char *zAlias2, /* Alias for second table. May be NULL */ - int iRightJoinTable, /* VDBE cursor for the right table */ - Expr **ppExpr /* Add the equality term to this expression */ -){ - Expr *pE1a, *pE1b, *pE1c; - Expr *pE2a, *pE2b, *pE2c; - Expr *pE; - - pE1a = sqlite3CreateIdExpr(pParse, zCol); - pE2a = sqlite3CreateIdExpr(pParse, zCol); - if( zAlias1==0 ){ - zAlias1 = pTab1->zName; - } - pE1b = sqlite3CreateIdExpr(pParse, zAlias1); - if( zAlias2==0 ){ - zAlias2 = pTab2->zName; - } - pE2b = sqlite3CreateIdExpr(pParse, zAlias2); - pE1c = sqlite3PExpr(pParse, TK_DOT, pE1b, pE1a, 0); - pE2c = sqlite3PExpr(pParse, TK_DOT, pE2b, pE2a, 0); - pE = sqlite3PExpr(pParse, TK_EQ, pE1c, pE2c, 0); - if( pE ){ - ExprSetProperty(pE, EP_FromJoin); - pE->iRightJoinTable = iRightJoinTable; - } - pE = sqlite3ExprAnd(pParse->db,*ppExpr, pE); - if( pE ){ - *ppExpr = pE; - } -} - -/* -** Set the EP_FromJoin property on all terms of the given expression. -** And set the Expr.iRightJoinTable to iTable for every term in the -** expression. -** -** The EP_FromJoin property is used on terms of an expression to tell -** the LEFT OUTER JOIN processing logic that this term is part of the -** join restriction specified in the ON or USING clause and not a part -** of the more general WHERE clause. These terms are moved over to the -** WHERE clause during join processing but we need to remember that they -** originated in the ON or USING clause. -** -** The Expr.iRightJoinTable tells the WHERE clause processing that the -** expression depends on table iRightJoinTable even if that table is not -** explicitly mentioned in the expression. That information is needed -** for cases like this: -** -** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 -** -** The where clause needs to defer the handling of the t1.x=5 -** term until after the t2 loop of the join. In that way, a -** NULL t2 row will be inserted whenever t1.x!=5. If we do not -** defer the handling of t1.x=5, it will be processed immediately -** after the t1 loop and rows with t1.x!=5 will never appear in -** the output, which is incorrect. -*/ -static void setJoinExpr(Expr *p, int iTable){ - while( p ){ - ExprSetProperty(p, EP_FromJoin); - p->iRightJoinTable = iTable; - setJoinExpr(p->pLeft, iTable); - p = p->pRight; - } -} - -/* -** This routine processes the join information for a SELECT statement. -** ON and USING clauses are converted into extra terms of the WHERE clause. -** NATURAL joins also create extra WHERE clause terms. -** -** The terms of a FROM clause are contained in the Select.pSrc structure. -** The left most table is the first entry in Select.pSrc. The right-most -** table is the last entry. The join operator is held in the entry to -** the left. Thus entry 0 contains the join operator for the join between -** entries 0 and 1. Any ON or USING clauses associated with the join are -** also attached to the left entry. -** -** This routine returns the number of errors encountered. -*/ -static int sqliteProcessJoin(Parse *pParse, Select *p){ - SrcList *pSrc; /* All tables in the FROM clause */ - int i, j; /* Loop counters */ - struct SrcList_item *pLeft; /* Left table being joined */ - struct SrcList_item *pRight; /* Right table being joined */ - - pSrc = p->pSrc; - pLeft = &pSrc->a[0]; - pRight = &pLeft[1]; - for(i=0; inSrc-1; i++, pRight++, pLeft++){ - Table *pLeftTab = pLeft->pTab; - Table *pRightTab = pRight->pTab; - - if( pLeftTab==0 || pRightTab==0 ) continue; - - /* When the NATURAL keyword is present, add WHERE clause terms for - ** every column that the two tables have in common. - */ - if( pRight->jointype & JT_NATURAL ){ - if( pRight->pOn || pRight->pUsing ){ - sqlite3ErrorMsg(pParse, "a NATURAL join may not have " - "an ON or USING clause", 0); - return 1; - } - for(j=0; jnCol; j++){ - char *zName = pLeftTab->aCol[j].zName; - if( columnIndex(pRightTab, zName)>=0 ){ - addWhereTerm(pParse, zName, pLeftTab, pLeft->zAlias, - pRightTab, pRight->zAlias, - pRight->iCursor, &p->pWhere); - - } - } - } - - /* Disallow both ON and USING clauses in the same join - */ - if( pRight->pOn && pRight->pUsing ){ - sqlite3ErrorMsg(pParse, "cannot have both ON and USING " - "clauses in the same join"); - return 1; - } - - /* Add the ON clause to the end of the WHERE clause, connected by - ** an AND operator. - */ - if( pRight->pOn ){ - setJoinExpr(pRight->pOn, pRight->iCursor); - p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn); - pRight->pOn = 0; - } - - /* Create extra terms on the WHERE clause for each column named - ** in the USING clause. Example: If the two tables to be joined are - ** A and B and the USING clause names X, Y, and Z, then add this - ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z - ** Report an error if any column mentioned in the USING clause is - ** not contained in both tables to be joined. - */ - if( pRight->pUsing ){ - IdList *pList = pRight->pUsing; - for(j=0; jnId; j++){ - char *zName = pList->a[j].zName; - if( columnIndex(pLeftTab, zName)<0 || columnIndex(pRightTab, zName)<0 ){ - sqlite3ErrorMsg(pParse, "cannot join using column %s - column " - "not present in both tables", zName); - return 1; - } - addWhereTerm(pParse, zName, pLeftTab, pLeft->zAlias, - pRightTab, pRight->zAlias, - pRight->iCursor, &p->pWhere); - } - } - } - return 0; -} - -/* -** Insert code into "v" that will push the record on the top of the -** stack into the sorter. -*/ -static void pushOntoSorter( - Parse *pParse, /* Parser context */ - ExprList *pOrderBy, /* The ORDER BY clause */ - Select *pSelect /* The whole SELECT statement */ -){ - Vdbe *v = pParse->pVdbe; - sqlite3ExprCodeExprList(pParse, pOrderBy); - sqlite3VdbeAddOp(v, OP_Sequence, pOrderBy->iECursor, 0); - sqlite3VdbeAddOp(v, OP_Pull, pOrderBy->nExpr + 1, 0); - sqlite3VdbeAddOp(v, OP_MakeRecord, pOrderBy->nExpr + 2, 0); - sqlite3VdbeAddOp(v, OP_IdxInsert, pOrderBy->iECursor, 0); - if( pSelect->iLimit>=0 ){ - int addr1, addr2; - addr1 = sqlite3VdbeAddOp(v, OP_IfMemZero, pSelect->iLimit+1, 0); - sqlite3VdbeAddOp(v, OP_MemIncr, -1, pSelect->iLimit+1); - addr2 = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); - sqlite3VdbeJumpHere(v, addr1); - sqlite3VdbeAddOp(v, OP_Last, pOrderBy->iECursor, 0); - sqlite3VdbeAddOp(v, OP_Delete, pOrderBy->iECursor, 0); - sqlite3VdbeJumpHere(v, addr2); - pSelect->iLimit = -1; - } -} - -/* -** Add code to implement the OFFSET -*/ -static void codeOffset( - Vdbe *v, /* Generate code into this VM */ - Select *p, /* The SELECT statement being coded */ - int iContinue, /* Jump here to skip the current record */ - int nPop /* Number of times to pop stack when jumping */ -){ - if( p->iOffset>=0 && iContinue!=0 ){ - int addr; - sqlite3VdbeAddOp(v, OP_MemIncr, -1, p->iOffset); - addr = sqlite3VdbeAddOp(v, OP_IfMemNeg, p->iOffset, 0); - if( nPop>0 ){ - sqlite3VdbeAddOp(v, OP_Pop, nPop, 0); - } - sqlite3VdbeAddOp(v, OP_Goto, 0, iContinue); - VdbeComment((v, "# skip OFFSET records")); - sqlite3VdbeJumpHere(v, addr); - } -} - -/* -** Add code that will check to make sure the top N elements of the -** stack are distinct. iTab is a sorting index that holds previously -** seen combinations of the N values. A new entry is made in iTab -** if the current N values are new. -** -** A jump to addrRepeat is made and the N+1 values are popped from the -** stack if the top N elements are not distinct. -*/ -static void codeDistinct( - Vdbe *v, /* Generate code into this VM */ - int iTab, /* A sorting index used to test for distinctness */ - int addrRepeat, /* Jump to here if not distinct */ - int N /* The top N elements of the stack must be distinct */ -){ - sqlite3VdbeAddOp(v, OP_MakeRecord, -N, 0); - sqlite3VdbeAddOp(v, OP_Distinct, iTab, sqlite3VdbeCurrentAddr(v)+3); - sqlite3VdbeAddOp(v, OP_Pop, N+1, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, addrRepeat); - VdbeComment((v, "# skip indistinct records")); - sqlite3VdbeAddOp(v, OP_IdxInsert, iTab, 0); -} - -/* -** Generate an error message when a SELECT is used within a subexpression -** (example: "a IN (SELECT * FROM table)") but it has more than 1 result -** column. We do this in a subroutine because the error occurs in multiple -** places. -*/ -static int checkForMultiColumnSelectError(Parse *pParse, int eDest, int nExpr){ - if( nExpr>1 && (eDest==SRT_Mem || eDest==SRT_Set) ){ - sqlite3ErrorMsg(pParse, "only a single result allowed for " - "a SELECT that is part of an expression"); - return 1; - }else{ - return 0; - } -} - -/* -** This routine generates the code for the inside of the inner loop -** of a SELECT. -** -** If srcTab and nColumn are both zero, then the pEList expressions -** are evaluated in order to get the data for this row. If nColumn>0 -** then data is pulled from srcTab and pEList is used only to get the -** datatypes for each column. -*/ -static int selectInnerLoop( - Parse *pParse, /* The parser context */ - Select *p, /* The complete select statement being coded */ - ExprList *pEList, /* List of values being extracted */ - int srcTab, /* Pull data from this table */ - int nColumn, /* Number of columns in the source table */ - ExprList *pOrderBy, /* If not NULL, sort results using this key */ - int distinct, /* If >=0, make sure results are distinct */ - int eDest, /* How to dispose of the results */ - int iParm, /* An argument to the disposal method */ - int iContinue, /* Jump here to continue with next row */ - int iBreak, /* Jump here to break out of the inner loop */ - char *aff /* affinity string if eDest is SRT_Union */ -){ - Vdbe *v = pParse->pVdbe; - int i; - int hasDistinct; /* True if the DISTINCT keyword is present */ - - if( v==0 ) return 0; - assert( pEList!=0 ); - - /* If there was a LIMIT clause on the SELECT statement, then do the check - ** to see if this row should be output. - */ - hasDistinct = distinct>=0 && pEList->nExpr>0; - if( pOrderBy==0 && !hasDistinct ){ - codeOffset(v, p, iContinue, 0); - } - - /* Pull the requested columns. - */ - if( nColumn>0 ){ - for(i=0; inExpr; - sqlite3ExprCodeExprList(pParse, pEList); - } - - /* If the DISTINCT keyword was present on the SELECT statement - ** and this row has been seen before, then do not make this row - ** part of the result. - */ - if( hasDistinct ){ - assert( pEList!=0 ); - assert( pEList->nExpr==nColumn ); - codeDistinct(v, distinct, iContinue, nColumn); - if( pOrderBy==0 ){ - codeOffset(v, p, iContinue, nColumn); - } - } - - if( checkForMultiColumnSelectError(pParse, eDest, pEList->nExpr) ){ - return 0; - } - - switch( eDest ){ - /* In this mode, write each query result to the key of the temporary - ** table iParm. - */ -#ifndef SQLITE_OMIT_COMPOUND_SELECT - case SRT_Union: { - sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); - if( aff ){ - sqlite3VdbeChangeP3(v, -1, aff, P3_STATIC); - } - sqlite3VdbeAddOp(v, OP_IdxInsert, iParm, 0); - break; - } - - /* Construct a record from the query result, but instead of - ** saving that record, use it as a key to delete elements from - ** the temporary table iParm. - */ - case SRT_Except: { - int addr; - addr = sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); - sqlite3VdbeChangeP3(v, -1, aff, P3_STATIC); - sqlite3VdbeAddOp(v, OP_NotFound, iParm, addr+3); - sqlite3VdbeAddOp(v, OP_Delete, iParm, 0); - break; - } -#endif - - /* Store the result as data using a unique key. - */ - case SRT_Table: - case SRT_EphemTab: { - sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); - if( pOrderBy ){ - pushOntoSorter(pParse, pOrderBy, p); - }else{ - sqlite3VdbeAddOp(v, OP_NewRowid, iParm, 0); - sqlite3VdbeAddOp(v, OP_Pull, 1, 0); - sqlite3VdbeAddOp(v, OP_Insert, iParm, OPFLAG_APPEND); - } - break; - } - -#ifndef SQLITE_OMIT_SUBQUERY - /* If we are creating a set for an "expr IN (SELECT ...)" construct, - ** then there should be a single item on the stack. Write this - ** item into the set table with bogus data. - */ - case SRT_Set: { - int addr1 = sqlite3VdbeCurrentAddr(v); - int addr2; - - assert( nColumn==1 ); - sqlite3VdbeAddOp(v, OP_NotNull, -1, addr1+3); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - addr2 = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); - p->affinity = sqlite3CompareAffinity(pEList->a[0].pExpr,(iParm>>16)&0xff); - if( pOrderBy ){ - /* At first glance you would think we could optimize out the - ** ORDER BY in this case since the order of entries in the set - ** does not matter. But there might be a LIMIT clause, in which - ** case the order does matter */ - pushOntoSorter(pParse, pOrderBy, p); - }else{ - sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &p->affinity, 1); - sqlite3VdbeAddOp(v, OP_IdxInsert, (iParm&0x0000FFFF), 0); - } - sqlite3VdbeJumpHere(v, addr2); - break; - } - - /* If any row exist in the result set, record that fact and abort. - */ - case SRT_Exists: { - sqlite3VdbeAddOp(v, OP_MemInt, 1, iParm); - sqlite3VdbeAddOp(v, OP_Pop, nColumn, 0); - /* The LIMIT clause will terminate the loop for us */ - break; - } - - /* If this is a scalar select that is part of an expression, then - ** store the results in the appropriate memory cell and break out - ** of the scan loop. - */ - case SRT_Mem: { - assert( nColumn==1 ); - if( pOrderBy ){ - pushOntoSorter(pParse, pOrderBy, p); - }else{ - sqlite3VdbeAddOp(v, OP_MemStore, iParm, 1); - /* The LIMIT clause will jump out of the loop for us */ - } - break; - } -#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ - - /* Send the data to the callback function or to a subroutine. In the - ** case of a subroutine, the subroutine itself is responsible for - ** popping the data from the stack. - */ - case SRT_Subroutine: - case SRT_Callback: { - if( pOrderBy ){ - sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0); - pushOntoSorter(pParse, pOrderBy, p); - }else if( eDest==SRT_Subroutine ){ - sqlite3VdbeAddOp(v, OP_Gosub, 0, iParm); - }else{ - sqlite3VdbeAddOp(v, OP_Callback, nColumn, 0); - } - break; - } - -#if !defined(SQLITE_OMIT_TRIGGER) - /* Discard the results. This is used for SELECT statements inside - ** the body of a TRIGGER. The purpose of such selects is to call - ** user-defined functions that have side effects. We do not care - ** about the actual results of the select. - */ - default: { - assert( eDest==SRT_Discard ); - sqlite3VdbeAddOp(v, OP_Pop, nColumn, 0); - break; - } -#endif - } - - /* Jump to the end of the loop if the LIMIT is reached. - */ - if( p->iLimit>=0 && pOrderBy==0 ){ - sqlite3VdbeAddOp(v, OP_MemIncr, -1, p->iLimit); - sqlite3VdbeAddOp(v, OP_IfMemZero, p->iLimit, iBreak); - } - return 0; -} - -/* -** Given an expression list, generate a KeyInfo structure that records -** the collating sequence for each expression in that expression list. -** -** If the ExprList is an ORDER BY or GROUP BY clause then the resulting -** KeyInfo structure is appropriate for initializing a virtual index to -** implement that clause. If the ExprList is the result set of a SELECT -** then the KeyInfo structure is appropriate for initializing a virtual -** index to implement a DISTINCT test. -** -** Space to hold the KeyInfo structure is obtain from malloc. The calling -** function is responsible for seeing that this structure is eventually -** freed. Add the KeyInfo structure to the P3 field of an opcode using -** P3_KEYINFO_HANDOFF is the usual way of dealing with this. -*/ -static KeyInfo *keyInfoFromExprList(Parse *pParse, ExprList *pList){ - sqlite3 *db = pParse->db; - int nExpr; - KeyInfo *pInfo; - struct ExprList_item *pItem; - int i; - - nExpr = pList->nExpr; - pInfo = sqlite3DbMallocZero(db, sizeof(*pInfo) + nExpr*(sizeof(CollSeq*)+1) ); - if( pInfo ){ - pInfo->aSortOrder = (u8*)&pInfo->aColl[nExpr]; - pInfo->nField = nExpr; - pInfo->enc = ENC(db); - for(i=0, pItem=pList->a; ipExpr); - if( !pColl ){ - pColl = db->pDfltColl; - } - pInfo->aColl[i] = pColl; - pInfo->aSortOrder[i] = pItem->sortOrder; - } - } - return pInfo; -} - - -/* -** If the inner loop was generated using a non-null pOrderBy argument, -** then the results were placed in a sorter. After the loop is terminated -** we need to run the sorter and output the results. The following -** routine generates the code needed to do that. -*/ -static void generateSortTail( - Parse *pParse, /* Parsing context */ - Select *p, /* The SELECT statement */ - Vdbe *v, /* Generate code into this VDBE */ - int nColumn, /* Number of columns of data */ - int eDest, /* Write the sorted results here */ - int iParm /* Optional parameter associated with eDest */ -){ - int brk = sqlite3VdbeMakeLabel(v); - int cont = sqlite3VdbeMakeLabel(v); - int addr; - int iTab; - int pseudoTab = 0; - ExprList *pOrderBy = p->pOrderBy; - - iTab = pOrderBy->iECursor; - if( eDest==SRT_Callback || eDest==SRT_Subroutine ){ - pseudoTab = pParse->nTab++; - sqlite3VdbeAddOp(v, OP_OpenPseudo, pseudoTab, 0); - sqlite3VdbeAddOp(v, OP_SetNumColumns, pseudoTab, nColumn); - } - addr = 1 + sqlite3VdbeAddOp(v, OP_Sort, iTab, brk); - codeOffset(v, p, cont, 0); - if( eDest==SRT_Callback || eDest==SRT_Subroutine ){ - sqlite3VdbeAddOp(v, OP_Integer, 1, 0); - } - sqlite3VdbeAddOp(v, OP_Column, iTab, pOrderBy->nExpr + 1); - switch( eDest ){ - case SRT_Table: - case SRT_EphemTab: { - sqlite3VdbeAddOp(v, OP_NewRowid, iParm, 0); - sqlite3VdbeAddOp(v, OP_Pull, 1, 0); - sqlite3VdbeAddOp(v, OP_Insert, iParm, OPFLAG_APPEND); - break; - } -#ifndef SQLITE_OMIT_SUBQUERY - case SRT_Set: { - assert( nColumn==1 ); - sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); - sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &p->affinity, 1); - sqlite3VdbeAddOp(v, OP_IdxInsert, (iParm&0x0000FFFF), 0); - break; - } - case SRT_Mem: { - assert( nColumn==1 ); - sqlite3VdbeAddOp(v, OP_MemStore, iParm, 1); - /* The LIMIT clause will terminate the loop for us */ - break; - } -#endif - case SRT_Callback: - case SRT_Subroutine: { - int i; - sqlite3VdbeAddOp(v, OP_Insert, pseudoTab, 0); - for(i=0; iiLimit>=0 ){ - sqlite3VdbeAddOp(v, OP_MemIncr, -1, p->iLimit); - sqlite3VdbeAddOp(v, OP_IfMemZero, p->iLimit, brk); - } - - /* The bottom of the loop - */ - sqlite3VdbeResolveLabel(v, cont); - sqlite3VdbeAddOp(v, OP_Next, iTab, addr); - sqlite3VdbeResolveLabel(v, brk); - if( eDest==SRT_Callback || eDest==SRT_Subroutine ){ - sqlite3VdbeAddOp(v, OP_Close, pseudoTab, 0); - } - -} - -/* -** Return a pointer to a string containing the 'declaration type' of the -** expression pExpr. The string may be treated as static by the caller. -** -** The declaration type is the exact datatype definition extracted from the -** original CREATE TABLE statement if the expression is a column. The -** declaration type for a ROWID field is INTEGER. Exactly when an expression -** is considered a column can be complex in the presence of subqueries. The -** result-set expression in all of the following SELECT statements is -** considered a column by this function. -** -** SELECT col FROM tbl; -** SELECT (SELECT col FROM tbl; -** SELECT (SELECT col FROM tbl); -** SELECT abc FROM (SELECT col AS abc FROM tbl); -** -** The declaration type for any expression other than a column is NULL. -*/ -static const char *columnType( - NameContext *pNC, - Expr *pExpr, - const char **pzOriginDb, - const char **pzOriginTab, - const char **pzOriginCol -){ - char const *zType = 0; - char const *zOriginDb = 0; - char const *zOriginTab = 0; - char const *zOriginCol = 0; - int j; - if( pExpr==0 || pNC->pSrcList==0 ) return 0; - - switch( pExpr->op ){ - case TK_AGG_COLUMN: - case TK_COLUMN: { - /* The expression is a column. Locate the table the column is being - ** extracted from in NameContext.pSrcList. This table may be real - ** database table or a subquery. - */ - Table *pTab = 0; /* Table structure column is extracted from */ - Select *pS = 0; /* Select the column is extracted from */ - int iCol = pExpr->iColumn; /* Index of column in pTab */ - while( pNC && !pTab ){ - SrcList *pTabList = pNC->pSrcList; - for(j=0;jnSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); - if( jnSrc ){ - pTab = pTabList->a[j].pTab; - pS = pTabList->a[j].pSelect; - }else{ - pNC = pNC->pNext; - } - } - - if( pTab==0 ){ - /* FIX ME: - ** This can occurs if you have something like "SELECT new.x;" inside - ** a trigger. In other words, if you reference the special "new" - ** table in the result set of a select. We do not have a good way - ** to find the actual table type, so call it "TEXT". This is really - ** something of a bug, but I do not know how to fix it. - ** - ** This code does not produce the correct answer - it just prevents - ** a segfault. See ticket #1229. - */ - zType = "TEXT"; - break; - } - - assert( pTab ); - if( pS ){ - /* The "table" is actually a sub-select or a view in the FROM clause - ** of the SELECT statement. Return the declaration type and origin - ** data for the result-set column of the sub-select. - */ - if( iCol>=0 && iColpEList->nExpr ){ - /* If iCol is less than zero, then the expression requests the - ** rowid of the sub-select or view. This expression is legal (see - ** test case misc2.2.2) - it always evaluates to NULL. - */ - NameContext sNC; - Expr *p = pS->pEList->a[iCol].pExpr; - sNC.pSrcList = pS->pSrc; - sNC.pNext = 0; - sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol); - } - }else if( pTab->pSchema ){ - /* A real table */ - assert( !pS ); - if( iCol<0 ) iCol = pTab->iPKey; - assert( iCol==-1 || (iCol>=0 && iColnCol) ); - if( iCol<0 ){ - zType = "INTEGER"; - zOriginCol = "rowid"; - }else{ - zType = pTab->aCol[iCol].zType; - zOriginCol = pTab->aCol[iCol].zName; - } - zOriginTab = pTab->zName; - if( pNC->pParse ){ - int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); - zOriginDb = pNC->pParse->db->aDb[iDb].zName; - } - } - break; - } -#ifndef SQLITE_OMIT_SUBQUERY - case TK_SELECT: { - /* The expression is a sub-select. Return the declaration type and - ** origin info for the single column in the result set of the SELECT - ** statement. - */ - NameContext sNC; - Select *pS = pExpr->pSelect; - Expr *p = pS->pEList->a[0].pExpr; - sNC.pSrcList = pS->pSrc; - sNC.pNext = pNC; - sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol); - break; - } -#endif - } - - if( pzOriginDb ){ - assert( pzOriginTab && pzOriginCol ); - *pzOriginDb = zOriginDb; - *pzOriginTab = zOriginTab; - *pzOriginCol = zOriginCol; - } - return zType; -} - -/* -** Generate code that will tell the VDBE the declaration types of columns -** in the result set. -*/ -static void generateColumnTypes( - Parse *pParse, /* Parser context */ - SrcList *pTabList, /* List of tables */ - ExprList *pEList /* Expressions defining the result set */ -){ - Vdbe *v = pParse->pVdbe; - int i; - NameContext sNC; - sNC.pSrcList = pTabList; - sNC.pParse = pParse; - for(i=0; inExpr; i++){ - Expr *p = pEList->a[i].pExpr; - const char *zOrigDb = 0; - const char *zOrigTab = 0; - const char *zOrigCol = 0; - const char *zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); - - /* The vdbe must make it's own copy of the column-type and other - ** column specific strings, in case the schema is reset before this - ** virtual machine is deleted. - */ - sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, P3_TRANSIENT); - sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, P3_TRANSIENT); - sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, P3_TRANSIENT); - sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, P3_TRANSIENT); - } -} - -/* -** Generate code that will tell the VDBE the names of columns -** in the result set. This information is used to provide the -** azCol[] values in the callback. -*/ -static void generateColumnNames( - Parse *pParse, /* Parser context */ - SrcList *pTabList, /* List of tables */ - ExprList *pEList /* Expressions defining the result set */ -){ - Vdbe *v = pParse->pVdbe; - int i, j; - sqlite3 *db = pParse->db; - int fullNames, shortNames; - -#ifndef SQLITE_OMIT_EXPLAIN - /* If this is an EXPLAIN, skip this step */ - if( pParse->explain ){ - return; - } -#endif - - assert( v!=0 ); - if( pParse->colNamesSet || v==0 || db->mallocFailed ) return; - pParse->colNamesSet = 1; - fullNames = (db->flags & SQLITE_FullColNames)!=0; - shortNames = (db->flags & SQLITE_ShortColNames)!=0; - sqlite3VdbeSetNumCols(v, pEList->nExpr); - for(i=0; inExpr; i++){ - Expr *p; - p = pEList->a[i].pExpr; - if( p==0 ) continue; - if( pEList->a[i].zName ){ - char *zName = pEList->a[i].zName; - sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, strlen(zName)); - continue; - } - if( p->op==TK_COLUMN && pTabList ){ - Table *pTab; - char *zCol; - int iCol = p->iColumn; - for(j=0; jnSrc && pTabList->a[j].iCursor!=p->iTable; j++){} - assert( jnSrc ); - pTab = pTabList->a[j].pTab; - if( iCol<0 ) iCol = pTab->iPKey; - assert( iCol==-1 || (iCol>=0 && iColnCol) ); - if( iCol<0 ){ - zCol = "rowid"; - }else{ - zCol = pTab->aCol[iCol].zName; - } - if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){ - sqlite3VdbeSetColName(v, i, COLNAME_NAME, (char*)p->span.z, p->span.n); - }else if( fullNames || (!shortNames && pTabList->nSrc>1) ){ - char *zName = 0; - char *zTab; - - zTab = pTabList->a[j].zAlias; - if( fullNames || zTab==0 ) zTab = pTab->zName; - sqlite3SetString(&zName, zTab, ".", zCol, (char*)0); - sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, P3_DYNAMIC); - }else{ - sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, strlen(zCol)); - } - }else if( p->span.z && p->span.z[0] ){ - sqlite3VdbeSetColName(v, i, COLNAME_NAME, (char*)p->span.z, p->span.n); - /* sqlite3VdbeCompressSpace(v, addr); */ - }else{ - char zName[30]; - assert( p->op!=TK_COLUMN || pTabList==0 ); - sqlite3_snprintf(sizeof(zName), zName, "column%d", i+1); - sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, 0); - } - } - generateColumnTypes(pParse, pTabList, pEList); -} - -#ifndef SQLITE_OMIT_COMPOUND_SELECT -/* -** Name of the connection operator, used for error messages. -*/ -static const char *selectOpName(int id){ - char *z; - switch( id ){ - case TK_ALL: z = "UNION ALL"; break; - case TK_INTERSECT: z = "INTERSECT"; break; - case TK_EXCEPT: z = "EXCEPT"; break; - default: z = "UNION"; break; - } - return z; -} -#endif /* SQLITE_OMIT_COMPOUND_SELECT */ - -/* -** Forward declaration -*/ -static int prepSelectStmt(Parse*, Select*); - -/* -** Given a SELECT statement, generate a Table structure that describes -** the result set of that SELECT. -*/ -Table *sqlite3ResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){ - Table *pTab; - int i, j; - ExprList *pEList; - Column *aCol, *pCol; - sqlite3 *db = pParse->db; - - while( pSelect->pPrior ) pSelect = pSelect->pPrior; - if( prepSelectStmt(pParse, pSelect) ){ - return 0; - } - if( sqlite3SelectResolve(pParse, pSelect, 0) ){ - return 0; - } - pTab = sqlite3DbMallocZero(db, sizeof(Table) ); - if( pTab==0 ){ - return 0; - } - pTab->nRef = 1; - pTab->zName = zTabName ? sqlite3DbStrDup(db, zTabName) : 0; - pEList = pSelect->pEList; - pTab->nCol = pEList->nExpr; - assert( pTab->nCol>0 ); - pTab->aCol = aCol = sqlite3DbMallocZero(db, sizeof(pTab->aCol[0])*pTab->nCol); - for(i=0, pCol=aCol; inCol; i++, pCol++){ - Expr *p, *pR; - char *zType; - char *zName; - int nName; - CollSeq *pColl; - int cnt; - NameContext sNC; - - /* Get an appropriate name for the column - */ - p = pEList->a[i].pExpr; - assert( p->pRight==0 || p->pRight->token.z==0 || p->pRight->token.z[0]!=0 ); - if( (zName = pEList->a[i].zName)!=0 ){ - /* If the column contains an "AS " phrase, use as the name */ - zName = sqlite3DbStrDup(db, zName); - }else if( p->op==TK_DOT - && (pR=p->pRight)!=0 && pR->token.z && pR->token.z[0] ){ - /* For columns of the from A.B use B as the name */ - zName = sqlite3MPrintf(db, "%T", &pR->token); - }else if( p->span.z && p->span.z[0] ){ - /* Use the original text of the column expression as its name */ - zName = sqlite3MPrintf(db, "%T", &p->span); - }else{ - /* If all else fails, make up a name */ - zName = sqlite3MPrintf(db, "column%d", i+1); - } - if( !zName || db->mallocFailed ){ - db->mallocFailed = 1; - sqlite3_free(zName); - sqlite3DeleteTable(pTab); - return 0; - } - sqlite3Dequote(zName); - - /* Make sure the column name is unique. If the name is not unique, - ** append a integer to the name so that it becomes unique. - */ - nName = strlen(zName); - for(j=cnt=0; jzName = zName; - - /* Get the typename, type affinity, and collating sequence for the - ** column. - */ - memset(&sNC, 0, sizeof(sNC)); - sNC.pSrcList = pSelect->pSrc; - zType = sqlite3DbStrDup(db, columnType(&sNC, p, 0, 0, 0)); - pCol->zType = zType; - pCol->affinity = sqlite3ExprAffinity(p); - pColl = sqlite3ExprCollSeq(pParse, p); - if( pColl ){ - pCol->zColl = sqlite3DbStrDup(db, pColl->zName); - } - } - pTab->iPKey = -1; - return pTab; -} - -/* -** Prepare a SELECT statement for processing by doing the following -** things: -** -** (1) Make sure VDBE cursor numbers have been assigned to every -** element of the FROM clause. -** -** (2) Fill in the pTabList->a[].pTab fields in the SrcList that -** defines FROM clause. When views appear in the FROM clause, -** fill pTabList->a[].pSelect with a copy of the SELECT statement -** that implements the view. A copy is made of the view's SELECT -** statement so that we can freely modify or delete that statement -** without worrying about messing up the presistent representation -** of the view. -** -** (3) Add terms to the WHERE clause to accomodate the NATURAL keyword -** on joins and the ON and USING clause of joins. -** -** (4) Scan the list of columns in the result set (pEList) looking -** for instances of the "*" operator or the TABLE.* operator. -** If found, expand each "*" to be every column in every table -** and TABLE.* to be every column in TABLE. -** -** Return 0 on success. If there are problems, leave an error message -** in pParse and return non-zero. -*/ -static int prepSelectStmt(Parse *pParse, Select *p){ - int i, j, k, rc; - SrcList *pTabList; - ExprList *pEList; - struct SrcList_item *pFrom; - sqlite3 *db = pParse->db; - - if( p==0 || p->pSrc==0 || db->mallocFailed ){ - return 1; - } - pTabList = p->pSrc; - pEList = p->pEList; - - /* Make sure cursor numbers have been assigned to all entries in - ** the FROM clause of the SELECT statement. - */ - sqlite3SrcListAssignCursors(pParse, p->pSrc); - - /* Look up every table named in the FROM clause of the select. If - ** an entry of the FROM clause is a subquery instead of a table or view, - ** then create a transient table structure to describe the subquery. - */ - for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab; - if( pFrom->pTab!=0 ){ - /* This statement has already been prepared. There is no need - ** to go further. */ - assert( i==0 ); - return 0; - } - if( pFrom->zName==0 ){ -#ifndef SQLITE_OMIT_SUBQUERY - /* A sub-query in the FROM clause of a SELECT */ - assert( pFrom->pSelect!=0 ); - if( pFrom->zAlias==0 ){ - pFrom->zAlias = - sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pFrom->pSelect); - } - assert( pFrom->pTab==0 ); - pFrom->pTab = pTab = - sqlite3ResultSetOfSelect(pParse, pFrom->zAlias, pFrom->pSelect); - if( pTab==0 ){ - return 1; - } - /* The isEphem flag indicates that the Table structure has been - ** dynamically allocated and may be freed at any time. In other words, - ** pTab is not pointing to a persistent table structure that defines - ** part of the schema. */ - pTab->isEphem = 1; -#endif - }else{ - /* An ordinary table or view name in the FROM clause */ - assert( pFrom->pTab==0 ); - pFrom->pTab = pTab = - sqlite3LocateTable(pParse,pFrom->zName,pFrom->zDatabase); - if( pTab==0 ){ - return 1; - } - pTab->nRef++; -#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) - if( pTab->pSelect || IsVirtual(pTab) ){ - /* We reach here if the named table is a really a view */ - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ - return 1; - } - /* If pFrom->pSelect!=0 it means we are dealing with a - ** view within a view. The SELECT structure has already been - ** copied by the outer view so we can skip the copy step here - ** in the inner view. - */ - if( pFrom->pSelect==0 ){ - pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect); - } - } -#endif - } - } - - /* Process NATURAL keywords, and ON and USING clauses of joins. - */ - if( sqliteProcessJoin(pParse, p) ) return 1; - - /* For every "*" that occurs in the column list, insert the names of - ** all columns in all tables. And for every TABLE.* insert the names - ** of all columns in TABLE. The parser inserted a special expression - ** with the TK_ALL operator for each "*" that it found in the column list. - ** The following code just has to locate the TK_ALL expressions and expand - ** each one to the list of all columns in all tables. - ** - ** The first loop just checks to see if there are any "*" operators - ** that need expanding. - */ - for(k=0; knExpr; k++){ - Expr *pE = pEList->a[k].pExpr; - if( pE->op==TK_ALL ) break; - if( pE->op==TK_DOT && pE->pRight && pE->pRight->op==TK_ALL - && pE->pLeft && pE->pLeft->op==TK_ID ) break; - } - rc = 0; - if( knExpr ){ - /* - ** If we get here it means the result set contains one or more "*" - ** operators that need to be expanded. Loop through each expression - ** in the result set and expand them one by one. - */ - struct ExprList_item *a = pEList->a; - ExprList *pNew = 0; - int flags = pParse->db->flags; - int longNames = (flags & SQLITE_FullColNames)!=0 && - (flags & SQLITE_ShortColNames)==0; - - for(k=0; knExpr; k++){ - Expr *pE = a[k].pExpr; - if( pE->op!=TK_ALL && - (pE->op!=TK_DOT || pE->pRight==0 || pE->pRight->op!=TK_ALL) ){ - /* This particular expression does not need to be expanded. - */ - pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr, 0); - if( pNew ){ - pNew->a[pNew->nExpr-1].zName = a[k].zName; - }else{ - rc = 1; - } - a[k].pExpr = 0; - a[k].zName = 0; - }else{ - /* This expression is a "*" or a "TABLE.*" and needs to be - ** expanded. */ - int tableSeen = 0; /* Set to 1 when TABLE matches */ - char *zTName; /* text of name of TABLE */ - if( pE->op==TK_DOT && pE->pLeft ){ - zTName = sqlite3NameFromToken(db, &pE->pLeft->token); - }else{ - zTName = 0; - } - for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; - char *zTabName = pFrom->zAlias; - if( zTabName==0 || zTabName[0]==0 ){ - zTabName = pTab->zName; - } - if( zTName && (zTabName==0 || zTabName[0]==0 || - sqlite3StrICmp(zTName, zTabName)!=0) ){ - continue; - } - tableSeen = 1; - for(j=0; jnCol; j++){ - Expr *pExpr, *pRight; - char *zName = pTab->aCol[j].zName; - - /* If a column is marked as 'hidden' (currently only possible - ** for virtual tables), do not include it in the expanded - ** result-set list. - */ - if( IsHiddenColumn(&pTab->aCol[j]) ){ - assert(IsVirtual(pTab)); - continue; - } - - if( i>0 ){ - struct SrcList_item *pLeft = &pTabList->a[i-1]; - if( (pLeft[1].jointype & JT_NATURAL)!=0 && - columnIndex(pLeft->pTab, zName)>=0 ){ - /* In a NATURAL join, omit the join columns from the - ** table on the right */ - continue; - } - if( sqlite3IdListIndex(pLeft[1].pUsing, zName)>=0 ){ - /* In a join with a USING clause, omit columns in the - ** using clause from the table on the right. */ - continue; - } - } - pRight = sqlite3PExpr(pParse, TK_ID, 0, 0, 0); - if( pRight==0 ) break; - setQuotedToken(pParse, &pRight->token, zName); - if( zTabName && (longNames || pTabList->nSrc>1) ){ - Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, 0); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); - if( pExpr==0 ) break; - setQuotedToken(pParse, &pLeft->token, zTabName); - setToken(&pExpr->span, - sqlite3MPrintf(db, "%s.%s", zTabName, zName)); - pExpr->span.dyn = 1; - pExpr->token.z = 0; - pExpr->token.n = 0; - pExpr->token.dyn = 0; - }else{ - pExpr = pRight; - pExpr->span = pExpr->token; - pExpr->span.dyn = 0; - } - if( longNames ){ - pNew = sqlite3ExprListAppend(pParse, pNew, pExpr, &pExpr->span); - }else{ - pNew = sqlite3ExprListAppend(pParse, pNew, pExpr, &pRight->token); - } - } - } - if( !tableSeen ){ - if( zTName ){ - sqlite3ErrorMsg(pParse, "no such table: %s", zTName); - }else{ - sqlite3ErrorMsg(pParse, "no tables specified"); - } - rc = 1; - } - sqlite3_free(zTName); - } - } - sqlite3ExprListDelete(pEList); - p->pEList = pNew; - } - if( p->pEList && p->pEList->nExpr>SQLITE_MAX_COLUMN ){ - sqlite3ErrorMsg(pParse, "too many columns in result set"); - rc = SQLITE_ERROR; - } - if( db->mallocFailed ){ - rc = SQLITE_NOMEM; - } - return rc; -} - -#ifndef SQLITE_OMIT_COMPOUND_SELECT -/* -** This routine associates entries in an ORDER BY expression list with -** columns in a result. For each ORDER BY expression, the opcode of -** the top-level node is changed to TK_COLUMN and the iColumn value of -** the top-level node is filled in with column number and the iTable -** value of the top-level node is filled with iTable parameter. -** -** If there are prior SELECT clauses, they are processed first. A match -** in an earlier SELECT takes precedence over a later SELECT. -** -** Any entry that does not match is flagged as an error. The number -** of errors is returned. -*/ -static int matchOrderbyToColumn( - Parse *pParse, /* A place to leave error messages */ - Select *pSelect, /* Match to result columns of this SELECT */ - ExprList *pOrderBy, /* The ORDER BY values to match against columns */ - int iTable, /* Insert this value in iTable */ - int mustComplete /* If TRUE all ORDER BYs must match */ -){ - int nErr = 0; - int i, j; - ExprList *pEList; - sqlite3 *db = pParse->db; - - if( pSelect==0 || pOrderBy==0 ) return 1; - if( mustComplete ){ - for(i=0; inExpr; i++){ pOrderBy->a[i].done = 0; } - } - if( prepSelectStmt(pParse, pSelect) ){ - return 1; - } - if( pSelect->pPrior ){ - if( matchOrderbyToColumn(pParse, pSelect->pPrior, pOrderBy, iTable, 0) ){ - return 1; - } - } - pEList = pSelect->pEList; - for(i=0; inExpr; i++){ - struct ExprList_item *pItem; - Expr *pE = pOrderBy->a[i].pExpr; - int iCol = -1; - char *zLabel; - - if( pOrderBy->a[i].done ) continue; - if( sqlite3ExprIsInteger(pE, &iCol) ){ - if( iCol<=0 || iCol>pEList->nExpr ){ - sqlite3ErrorMsg(pParse, - "ORDER BY position %d should be between 1 and %d", - iCol, pEList->nExpr); - nErr++; - break; - } - if( !mustComplete ) continue; - iCol--; - } - if( iCol<0 && (zLabel = sqlite3NameFromToken(db, &pE->token))!=0 ){ - for(j=0, pItem=pEList->a; jnExpr; j++, pItem++){ - char *zName; - int isMatch; - if( pItem->zName ){ - zName = sqlite3DbStrDup(db, pItem->zName); - }else{ - zName = sqlite3NameFromToken(db, &pItem->pExpr->token); - } - isMatch = zName && sqlite3StrICmp(zName, zLabel)==0; - sqlite3_free(zName); - if( isMatch ){ - iCol = j; - break; - } - } - sqlite3_free(zLabel); - } - if( iCol>=0 ){ - pE->op = TK_COLUMN; - pE->iColumn = iCol; - pE->iTable = iTable; - pE->iAgg = -1; - pOrderBy->a[i].done = 1; - }else if( mustComplete ){ - sqlite3ErrorMsg(pParse, - "ORDER BY term number %d does not match any result column", i+1); - nErr++; - break; - } - } - return nErr; -} -#endif /* #ifndef SQLITE_OMIT_COMPOUND_SELECT */ - -/* -** Get a VDBE for the given parser context. Create a new one if necessary. -** If an error occurs, return NULL and leave a message in pParse. -*/ -Vdbe *sqlite3GetVdbe(Parse *pParse){ - Vdbe *v = pParse->pVdbe; - if( v==0 ){ - v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db); - } - return v; -} - - -/* -** Compute the iLimit and iOffset fields of the SELECT based on the -** pLimit and pOffset expressions. pLimit and pOffset hold the expressions -** that appear in the original SQL statement after the LIMIT and OFFSET -** keywords. Or NULL if those keywords are omitted. iLimit and iOffset -** are the integer memory register numbers for counters used to compute -** the limit and offset. If there is no limit and/or offset, then -** iLimit and iOffset are negative. -** -** This routine changes the values of iLimit and iOffset only if -** a limit or offset is defined by pLimit and pOffset. iLimit and -** iOffset should have been preset to appropriate default values -** (usually but not always -1) prior to calling this routine. -** Only if pLimit!=0 or pOffset!=0 do the limit registers get -** redefined. The UNION ALL operator uses this property to force -** the reuse of the same limit and offset registers across multiple -** SELECT statements. -*/ -static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ - Vdbe *v = 0; - int iLimit = 0; - int iOffset; - int addr1, addr2; - - /* - ** "LIMIT -1" always shows all rows. There is some - ** contraversy about what the correct behavior should be. - ** The current implementation interprets "LIMIT 0" to mean - ** no rows. - */ - if( p->pLimit ){ - p->iLimit = iLimit = pParse->nMem; - pParse->nMem += 2; - v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - sqlite3ExprCode(pParse, p->pLimit); - sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); - sqlite3VdbeAddOp(v, OP_MemStore, iLimit, 1); - VdbeComment((v, "# LIMIT counter")); - sqlite3VdbeAddOp(v, OP_IfMemZero, iLimit, iBreak); - sqlite3VdbeAddOp(v, OP_MemLoad, iLimit, 0); - } - if( p->pOffset ){ - p->iOffset = iOffset = pParse->nMem++; - v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - sqlite3ExprCode(pParse, p->pOffset); - sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0); - sqlite3VdbeAddOp(v, OP_MemStore, iOffset, p->pLimit==0); - VdbeComment((v, "# OFFSET counter")); - addr1 = sqlite3VdbeAddOp(v, OP_IfMemPos, iOffset, 0); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_Integer, 0, 0); - sqlite3VdbeJumpHere(v, addr1); - if( p->pLimit ){ - sqlite3VdbeAddOp(v, OP_Add, 0, 0); - } - } - if( p->pLimit ){ - addr1 = sqlite3VdbeAddOp(v, OP_IfMemPos, iLimit, 0); - sqlite3VdbeAddOp(v, OP_Pop, 1, 0); - sqlite3VdbeAddOp(v, OP_MemInt, -1, iLimit+1); - addr2 = sqlite3VdbeAddOp(v, OP_Goto, 0, 0); - sqlite3VdbeJumpHere(v, addr1); - sqlite3VdbeAddOp(v, OP_MemStore, iLimit+1, 1); - VdbeComment((v, "# LIMIT+OFFSET")); - sqlite3VdbeJumpHere(v, addr2); - } -} - -/* -** Allocate a virtual index to use for sorting. -*/ -static void createSortingIndex(Parse *pParse, Select *p, ExprList *pOrderBy){ - if( pOrderBy ){ - int addr; - assert( pOrderBy->iECursor==0 ); - pOrderBy->iECursor = pParse->nTab++; - addr = sqlite3VdbeAddOp(pParse->pVdbe, OP_OpenEphemeral, - pOrderBy->iECursor, pOrderBy->nExpr+1); - assert( p->addrOpenEphm[2] == -1 ); - p->addrOpenEphm[2] = addr; - } -} - -#ifndef SQLITE_OMIT_COMPOUND_SELECT -/* -** Return the appropriate collating sequence for the iCol-th column of -** the result set for the compound-select statement "p". Return NULL if -** the column has no default collating sequence. -** -** The collating sequence for the compound select is taken from the -** left-most term of the select that has a collating sequence. -*/ -static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ - CollSeq *pRet; - if( p->pPrior ){ - pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); - }else{ - pRet = 0; - } - if( pRet==0 ){ - pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); - } - return pRet; -} -#endif /* SQLITE_OMIT_COMPOUND_SELECT */ - -#ifndef SQLITE_OMIT_COMPOUND_SELECT -/* -** This routine is called to process a query that is really the union -** or intersection of two or more separate queries. -** -** "p" points to the right-most of the two queries. the query on the -** left is p->pPrior. The left query could also be a compound query -** in which case this routine will be called recursively. -** -** The results of the total query are to be written into a destination -** of type eDest with parameter iParm. -** -** Example 1: Consider a three-way compound SQL statement. -** -** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3 -** -** This statement is parsed up as follows: -** -** SELECT c FROM t3 -** | -** `-----> SELECT b FROM t2 -** | -** `------> SELECT a FROM t1 -** -** The arrows in the diagram above represent the Select.pPrior pointer. -** So if this routine is called with p equal to the t3 query, then -** pPrior will be the t2 query. p->op will be TK_UNION in this case. -** -** Notice that because of the way SQLite parses compound SELECTs, the -** individual selects always group from left to right. -*/ -static int multiSelect( - Parse *pParse, /* Parsing context */ - Select *p, /* The right-most of SELECTs to be coded */ - int eDest, /* \___ Store query results as specified */ - int iParm, /* / by these two parameters. */ - char *aff /* If eDest is SRT_Union, the affinity string */ -){ - int rc = SQLITE_OK; /* Success code from a subroutine */ - Select *pPrior; /* Another SELECT immediately to our left */ - Vdbe *v; /* Generate code to this VDBE */ - int nCol; /* Number of columns in the result set */ - ExprList *pOrderBy; /* The ORDER BY clause on p */ - int aSetP2[2]; /* Set P2 value of these op to number of columns */ - int nSetP2 = 0; /* Number of slots in aSetP2[] used */ - - /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only - ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. - */ - if( p==0 || p->pPrior==0 ){ - rc = 1; - goto multi_select_end; - } - pPrior = p->pPrior; - assert( pPrior->pRightmost!=pPrior ); - assert( pPrior->pRightmost==p->pRightmost ); - if( pPrior->pOrderBy ){ - sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before", - selectOpName(p->op)); - rc = 1; - goto multi_select_end; - } - if( pPrior->pLimit ){ - sqlite3ErrorMsg(pParse,"LIMIT clause should come after %s not before", - selectOpName(p->op)); - rc = 1; - goto multi_select_end; - } - - /* Make sure we have a valid query engine. If not, create a new one. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ){ - rc = 1; - goto multi_select_end; - } - - /* Create the destination temporary table if necessary - */ - if( eDest==SRT_EphemTab ){ - assert( p->pEList ); - assert( nSetP2pOrderBy; - switch( p->op ){ - case TK_ALL: { - if( pOrderBy==0 ){ - int addr = 0; - assert( !pPrior->pLimit ); - pPrior->pLimit = p->pLimit; - pPrior->pOffset = p->pOffset; - rc = sqlite3Select(pParse, pPrior, eDest, iParm, 0, 0, 0, aff); - p->pLimit = 0; - p->pOffset = 0; - if( rc ){ - goto multi_select_end; - } - p->pPrior = 0; - p->iLimit = pPrior->iLimit; - p->iOffset = pPrior->iOffset; - if( p->iLimit>=0 ){ - addr = sqlite3VdbeAddOp(v, OP_IfMemZero, p->iLimit, 0); - VdbeComment((v, "# Jump ahead if LIMIT reached")); - } - rc = sqlite3Select(pParse, p, eDest, iParm, 0, 0, 0, aff); - p->pPrior = pPrior; - if( rc ){ - goto multi_select_end; - } - if( addr ){ - sqlite3VdbeJumpHere(v, addr); - } - break; - } - /* For UNION ALL ... ORDER BY fall through to the next case */ - } - case TK_EXCEPT: - case TK_UNION: { - int unionTab; /* Cursor number of the temporary table holding result */ - int op = 0; /* One of the SRT_ operations to apply to self */ - int priorOp; /* The SRT_ operation to apply to prior selects */ - Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */ - int addr; - - priorOp = p->op==TK_ALL ? SRT_Table : SRT_Union; - if( eDest==priorOp && pOrderBy==0 && !p->pLimit && !p->pOffset ){ - /* We can reuse a temporary table generated by a SELECT to our - ** right. - */ - unionTab = iParm; - }else{ - /* We will need to create our own temporary table to hold the - ** intermediate results. - */ - unionTab = pParse->nTab++; - if( pOrderBy && matchOrderbyToColumn(pParse, p, pOrderBy, unionTab,1) ){ - rc = 1; - goto multi_select_end; - } - addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, unionTab, 0); - if( priorOp==SRT_Table ){ - assert( nSetP2addrOpenEphm[0] == -1 ); - p->addrOpenEphm[0] = addr; - p->pRightmost->usesEphm = 1; - } - createSortingIndex(pParse, p, pOrderBy); - assert( p->pEList ); - } - - /* Code the SELECT statements to our left - */ - assert( !pPrior->pOrderBy ); - rc = sqlite3Select(pParse, pPrior, priorOp, unionTab, 0, 0, 0, aff); - if( rc ){ - goto multi_select_end; - } - - /* Code the current SELECT statement - */ - switch( p->op ){ - case TK_EXCEPT: op = SRT_Except; break; - case TK_UNION: op = SRT_Union; break; - case TK_ALL: op = SRT_Table; break; - } - p->pPrior = 0; - p->pOrderBy = 0; - p->disallowOrderBy = pOrderBy!=0; - pLimit = p->pLimit; - p->pLimit = 0; - pOffset = p->pOffset; - p->pOffset = 0; - rc = sqlite3Select(pParse, p, op, unionTab, 0, 0, 0, aff); - /* Query flattening in sqlite3Select() might refill p->pOrderBy. - ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ - sqlite3ExprListDelete(p->pOrderBy); - p->pPrior = pPrior; - p->pOrderBy = pOrderBy; - sqlite3ExprDelete(p->pLimit); - p->pLimit = pLimit; - p->pOffset = pOffset; - p->iLimit = -1; - p->iOffset = -1; - if( rc ){ - goto multi_select_end; - } - - - /* Convert the data in the temporary table into whatever form - ** it is that we currently need. - */ - if( eDest!=priorOp || unionTab!=iParm ){ - int iCont, iBreak, iStart; - assert( p->pEList ); - if( eDest==SRT_Callback ){ - Select *pFirst = p; - while( pFirst->pPrior ) pFirst = pFirst->pPrior; - generateColumnNames(pParse, 0, pFirst->pEList); - } - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); - computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp(v, OP_Rewind, unionTab, iBreak); - iStart = sqlite3VdbeCurrentAddr(v); - rc = selectInnerLoop(pParse, p, p->pEList, unionTab, p->pEList->nExpr, - pOrderBy, -1, eDest, iParm, - iCont, iBreak, 0); - if( rc ){ - rc = 1; - goto multi_select_end; - } - sqlite3VdbeResolveLabel(v, iCont); - sqlite3VdbeAddOp(v, OP_Next, unionTab, iStart); - sqlite3VdbeResolveLabel(v, iBreak); - sqlite3VdbeAddOp(v, OP_Close, unionTab, 0); - } - break; - } - case TK_INTERSECT: { - int tab1, tab2; - int iCont, iBreak, iStart; - Expr *pLimit, *pOffset; - int addr; - - /* INTERSECT is different from the others since it requires - ** two temporary tables. Hence it has its own case. Begin - ** by allocating the tables we will need. - */ - tab1 = pParse->nTab++; - tab2 = pParse->nTab++; - if( pOrderBy && matchOrderbyToColumn(pParse,p,pOrderBy,tab1,1) ){ - rc = 1; - goto multi_select_end; - } - createSortingIndex(pParse, p, pOrderBy); - - addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, tab1, 0); - assert( p->addrOpenEphm[0] == -1 ); - p->addrOpenEphm[0] = addr; - p->pRightmost->usesEphm = 1; - assert( p->pEList ); - - /* Code the SELECTs to our left into temporary table "tab1". - */ - rc = sqlite3Select(pParse, pPrior, SRT_Union, tab1, 0, 0, 0, aff); - if( rc ){ - goto multi_select_end; - } - - /* Code the current SELECT into temporary table "tab2" - */ - addr = sqlite3VdbeAddOp(v, OP_OpenEphemeral, tab2, 0); - assert( p->addrOpenEphm[1] == -1 ); - p->addrOpenEphm[1] = addr; - p->pPrior = 0; - pLimit = p->pLimit; - p->pLimit = 0; - pOffset = p->pOffset; - p->pOffset = 0; - rc = sqlite3Select(pParse, p, SRT_Union, tab2, 0, 0, 0, aff); - p->pPrior = pPrior; - sqlite3ExprDelete(p->pLimit); - p->pLimit = pLimit; - p->pOffset = pOffset; - if( rc ){ - goto multi_select_end; - } - - /* Generate code to take the intersection of the two temporary - ** tables. - */ - assert( p->pEList ); - if( eDest==SRT_Callback ){ - Select *pFirst = p; - while( pFirst->pPrior ) pFirst = pFirst->pPrior; - generateColumnNames(pParse, 0, pFirst->pEList); - } - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); - computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp(v, OP_Rewind, tab1, iBreak); - iStart = sqlite3VdbeAddOp(v, OP_RowKey, tab1, 0); - sqlite3VdbeAddOp(v, OP_NotFound, tab2, iCont); - rc = selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr, - pOrderBy, -1, eDest, iParm, - iCont, iBreak, 0); - if( rc ){ - rc = 1; - goto multi_select_end; - } - sqlite3VdbeResolveLabel(v, iCont); - sqlite3VdbeAddOp(v, OP_Next, tab1, iStart); - sqlite3VdbeResolveLabel(v, iBreak); - sqlite3VdbeAddOp(v, OP_Close, tab2, 0); - sqlite3VdbeAddOp(v, OP_Close, tab1, 0); - break; - } - } - - /* Make sure all SELECTs in the statement have the same number of elements - ** in their result sets. - */ - assert( p->pEList && pPrior->pEList ); - if( p->pEList->nExpr!=pPrior->pEList->nExpr ){ - sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" - " do not have the same number of result columns", selectOpName(p->op)); - rc = 1; - goto multi_select_end; - } - - /* Set the number of columns in temporary tables - */ - nCol = p->pEList->nExpr; - while( nSetP2 ){ - sqlite3VdbeChangeP2(v, aSetP2[--nSetP2], nCol); - } - - /* Compute collating sequences used by either the ORDER BY clause or - ** by any temporary tables needed to implement the compound select. - ** Attach the KeyInfo structure to all temporary tables. Invoke the - ** ORDER BY processing if there is an ORDER BY clause. - ** - ** This section is run by the right-most SELECT statement only. - ** SELECT statements to the left always skip this part. The right-most - ** SELECT might also skip this part if it has no ORDER BY clause and - ** no temp tables are required. - */ - if( pOrderBy || p->usesEphm ){ - int i; /* Loop counter */ - KeyInfo *pKeyInfo; /* Collating sequence for the result set */ - Select *pLoop; /* For looping through SELECT statements */ - int nKeyCol; /* Number of entries in pKeyInfo->aCol[] */ - CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ - CollSeq **aCopy; /* A copy of pKeyInfo->aColl[] */ - - assert( p->pRightmost==p ); - nKeyCol = nCol + (pOrderBy ? pOrderBy->nExpr : 0); - pKeyInfo = sqlite3DbMallocZero(pParse->db, - sizeof(*pKeyInfo)+nKeyCol*(sizeof(CollSeq*) + 1)); - if( !pKeyInfo ){ - rc = SQLITE_NOMEM; - goto multi_select_end; - } - - pKeyInfo->enc = ENC(pParse->db); - pKeyInfo->nField = nCol; - - for(i=0, apColl=pKeyInfo->aColl; idb->pDfltColl; - } - } - - for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ - for(i=0; i<2; i++){ - int addr = pLoop->addrOpenEphm[i]; - if( addr<0 ){ - /* If [0] is unused then [1] is also unused. So we can - ** always safely abort as soon as the first unused slot is found */ - assert( pLoop->addrOpenEphm[1]<0 ); - break; - } - sqlite3VdbeChangeP2(v, addr, nCol); - sqlite3VdbeChangeP3(v, addr, (char*)pKeyInfo, P3_KEYINFO); - pLoop->addrOpenEphm[i] = -1; - } - } - - if( pOrderBy ){ - struct ExprList_item *pOTerm = pOrderBy->a; - int nOrderByExpr = pOrderBy->nExpr; - int addr; - u8 *pSortOrder; - - /* Reuse the same pKeyInfo for the ORDER BY as was used above for - ** the compound select statements. Except we have to change out the - ** pKeyInfo->aColl[] values. Some of the aColl[] values will be - ** reused when constructing the pKeyInfo for the ORDER BY, so make - ** a copy. Sufficient space to hold both the nCol entries for - ** the compound select and the nOrderbyExpr entries for the ORDER BY - ** was allocated above. But we need to move the compound select - ** entries out of the way before constructing the ORDER BY entries. - ** Move the compound select entries into aCopy[] where they can be - ** accessed and reused when constructing the ORDER BY entries. - ** Because nCol might be greater than or less than nOrderByExpr - ** we have to use memmove() when doing the copy. - */ - aCopy = &pKeyInfo->aColl[nOrderByExpr]; - pSortOrder = pKeyInfo->aSortOrder = (u8*)&aCopy[nCol]; - memmove(aCopy, pKeyInfo->aColl, nCol*sizeof(CollSeq*)); - - apColl = pKeyInfo->aColl; - for(i=0; ipExpr; - if( (pExpr->flags & EP_ExpCollate) ){ - assert( pExpr->pColl!=0 ); - *apColl = pExpr->pColl; - }else{ - *apColl = aCopy[pExpr->iColumn]; - } - *pSortOrder = pOTerm->sortOrder; - } - assert( p->pRightmost==p ); - assert( p->addrOpenEphm[2]>=0 ); - addr = p->addrOpenEphm[2]; - sqlite3VdbeChangeP2(v, addr, p->pOrderBy->nExpr+2); - pKeyInfo->nField = nOrderByExpr; - sqlite3VdbeChangeP3(v, addr, (char*)pKeyInfo, P3_KEYINFO_HANDOFF); - pKeyInfo = 0; - generateSortTail(pParse, p, v, p->pEList->nExpr, eDest, iParm); - } - - sqlite3_free(pKeyInfo); - } - -multi_select_end: - return rc; -} -#endif /* SQLITE_OMIT_COMPOUND_SELECT */ - -#ifndef SQLITE_OMIT_VIEW -/* Forward Declarations */ -static void substExprList(sqlite3*, ExprList*, int, ExprList*); -static void substSelect(sqlite3*, Select *, int, ExprList *); - -/* -** Scan through the expression pExpr. Replace every reference to -** a column in table number iTable with a copy of the iColumn-th -** entry in pEList. (But leave references to the ROWID column -** unchanged.) -** -** This routine is part of the flattening procedure. A subquery -** whose result set is defined by pEList appears as entry in the -** FROM clause of a SELECT such that the VDBE cursor assigned to that -** FORM clause entry is iTable. This routine make the necessary -** changes to pExpr so that it refers directly to the source table -** of the subquery rather the result set of the subquery. -*/ -static void substExpr( - sqlite3 *db, /* Report malloc errors to this connection */ - Expr *pExpr, /* Expr in which substitution occurs */ - int iTable, /* Table to be substituted */ - ExprList *pEList /* Substitute expressions */ -){ - if( pExpr==0 ) return; - if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){ - if( pExpr->iColumn<0 ){ - pExpr->op = TK_NULL; - }else{ - Expr *pNew; - assert( pEList!=0 && pExpr->iColumnnExpr ); - assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 ); - pNew = pEList->a[pExpr->iColumn].pExpr; - assert( pNew!=0 ); - pExpr->op = pNew->op; - assert( pExpr->pLeft==0 ); - pExpr->pLeft = sqlite3ExprDup(db, pNew->pLeft); - assert( pExpr->pRight==0 ); - pExpr->pRight = sqlite3ExprDup(db, pNew->pRight); - assert( pExpr->pList==0 ); - pExpr->pList = sqlite3ExprListDup(db, pNew->pList); - pExpr->iTable = pNew->iTable; - pExpr->pTab = pNew->pTab; - pExpr->iColumn = pNew->iColumn; - pExpr->iAgg = pNew->iAgg; - sqlite3TokenCopy(db, &pExpr->token, &pNew->token); - sqlite3TokenCopy(db, &pExpr->span, &pNew->span); - pExpr->pSelect = sqlite3SelectDup(db, pNew->pSelect); - pExpr->flags = pNew->flags; - } - }else{ - substExpr(db, pExpr->pLeft, iTable, pEList); - substExpr(db, pExpr->pRight, iTable, pEList); - substSelect(db, pExpr->pSelect, iTable, pEList); - substExprList(db, pExpr->pList, iTable, pEList); - } -} -static void substExprList( - sqlite3 *db, /* Report malloc errors here */ - ExprList *pList, /* List to scan and in which to make substitutes */ - int iTable, /* Table to be substituted */ - ExprList *pEList /* Substitute values */ -){ - int i; - if( pList==0 ) return; - for(i=0; inExpr; i++){ - substExpr(db, pList->a[i].pExpr, iTable, pEList); - } -} -static void substSelect( - sqlite3 *db, /* Report malloc errors here */ - Select *p, /* SELECT statement in which to make substitutions */ - int iTable, /* Table to be replaced */ - ExprList *pEList /* Substitute values */ -){ - if( !p ) return; - substExprList(db, p->pEList, iTable, pEList); - substExprList(db, p->pGroupBy, iTable, pEList); - substExprList(db, p->pOrderBy, iTable, pEList); - substExpr(db, p->pHaving, iTable, pEList); - substExpr(db, p->pWhere, iTable, pEList); - substSelect(db, p->pPrior, iTable, pEList); -} -#endif /* !defined(SQLITE_OMIT_VIEW) */ - -#ifndef SQLITE_OMIT_VIEW -/* -** This routine attempts to flatten subqueries in order to speed -** execution. It returns 1 if it makes changes and 0 if no flattening -** occurs. -** -** To understand the concept of flattening, consider the following -** query: -** -** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 -** -** The default way of implementing this query is to execute the -** subquery first and store the results in a temporary table, then -** run the outer query on that temporary table. This requires two -** passes over the data. Furthermore, because the temporary table -** has no indices, the WHERE clause on the outer query cannot be -** optimized. -** -** This routine attempts to rewrite queries such as the above into -** a single flat select, like this: -** -** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 -** -** The code generated for this simpification gives the same result -** but only has to scan the data once. And because indices might -** exist on the table t1, a complete scan of the data might be -** avoided. -** -** Flattening is only attempted if all of the following are true: -** -** (1) The subquery and the outer query do not both use aggregates. -** -** (2) The subquery is not an aggregate or the outer query is not a join. -** -** (3) The subquery is not the right operand of a left outer join, or -** the subquery is not itself a join. (Ticket #306) -** -** (4) The subquery is not DISTINCT or the outer query is not a join. -** -** (5) The subquery is not DISTINCT or the outer query does not use -** aggregates. -** -** (6) The subquery does not use aggregates or the outer query is not -** DISTINCT. -** -** (7) The subquery has a FROM clause. -** -** (8) The subquery does not use LIMIT or the outer query is not a join. -** -** (9) The subquery does not use LIMIT or the outer query does not use -** aggregates. -** -** (10) The subquery does not use aggregates or the outer query does not -** use LIMIT. -** -** (11) The subquery and the outer query do not both have ORDER BY clauses. -** -** (12) The subquery is not the right term of a LEFT OUTER JOIN or the -** subquery has no WHERE clause. (added by ticket #350) -** -** (13) The subquery and outer query do not both use LIMIT -** -** (14) The subquery does not use OFFSET -** -** (15) The outer query is not part of a compound select or the -** subquery does not have both an ORDER BY and a LIMIT clause. -** (See ticket #2339) -** -** In this routine, the "p" parameter is a pointer to the outer query. -** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query -** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates. -** -** If flattening is not attempted, this routine is a no-op and returns 0. -** If flattening is attempted this routine returns 1. -** -** All of the expression analysis must occur on both the outer query and -** the subquery before this routine runs. -*/ -static int flattenSubquery( - sqlite3 *db, /* Database connection */ - Select *p, /* The parent or outer SELECT statement */ - int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ - int isAgg, /* True if outer SELECT uses aggregate functions */ - int subqueryIsAgg /* True if the subquery uses aggregate functions */ -){ - Select *pSub; /* The inner query or "subquery" */ - SrcList *pSrc; /* The FROM clause of the outer query */ - SrcList *pSubSrc; /* The FROM clause of the subquery */ - ExprList *pList; /* The result set of the outer query */ - int iParent; /* VDBE cursor number of the pSub result set temp table */ - int i; /* Loop counter */ - Expr *pWhere; /* The WHERE clause */ - struct SrcList_item *pSubitem; /* The subquery */ - - /* Check to see if flattening is permitted. Return 0 if not. - */ - if( p==0 ) return 0; - pSrc = p->pSrc; - assert( pSrc && iFrom>=0 && iFromnSrc ); - pSubitem = &pSrc->a[iFrom]; - pSub = pSubitem->pSelect; - assert( pSub!=0 ); - if( isAgg && subqueryIsAgg ) return 0; /* Restriction (1) */ - if( subqueryIsAgg && pSrc->nSrc>1 ) return 0; /* Restriction (2) */ - pSubSrc = pSub->pSrc; - assert( pSubSrc ); - /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, - ** not arbitrary expresssions, we allowed some combining of LIMIT and OFFSET - ** because they could be computed at compile-time. But when LIMIT and OFFSET - ** became arbitrary expressions, we were forced to add restrictions (13) - ** and (14). */ - if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ - if( pSub->pOffset ) return 0; /* Restriction (14) */ - if( p->pRightmost && pSub->pLimit && pSub->pOrderBy ){ - return 0; /* Restriction (15) */ - } - if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ - if( (pSub->isDistinct || pSub->pLimit) - && (pSrc->nSrc>1 || isAgg) ){ /* Restrictions (4)(5)(8)(9) */ - return 0; - } - if( p->isDistinct && subqueryIsAgg ) return 0; /* Restriction (6) */ - if( (p->disallowOrderBy || p->pOrderBy) && pSub->pOrderBy ){ - return 0; /* Restriction (11) */ - } - - /* Restriction 3: If the subquery is a join, make sure the subquery is - ** not used as the right operand of an outer join. Examples of why this - ** is not allowed: - ** - ** t1 LEFT OUTER JOIN (t2 JOIN t3) - ** - ** If we flatten the above, we would get - ** - ** (t1 LEFT OUTER JOIN t2) JOIN t3 - ** - ** which is not at all the same thing. - */ - if( pSubSrc->nSrc>1 && (pSubitem->jointype & JT_OUTER)!=0 ){ - return 0; - } - - /* Restriction 12: If the subquery is the right operand of a left outer - ** join, make sure the subquery has no WHERE clause. - ** An examples of why this is not allowed: - ** - ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0) - ** - ** If we flatten the above, we would get - ** - ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0 - ** - ** But the t2.x>0 test will always fail on a NULL row of t2, which - ** effectively converts the OUTER JOIN into an INNER JOIN. - */ - if( (pSubitem->jointype & JT_OUTER)!=0 && pSub->pWhere!=0 ){ - return 0; - } - - /* If we reach this point, it means flattening is permitted for the - ** iFrom-th entry of the FROM clause in the outer query. - */ - - /* Move all of the FROM elements of the subquery into the - ** the FROM clause of the outer query. Before doing this, remember - ** the cursor number for the original outer query FROM element in - ** iParent. The iParent cursor will never be used. Subsequent code - ** will scan expressions looking for iParent references and replace - ** those references with expressions that resolve to the subquery FROM - ** elements we are now copying in. - */ - iParent = pSubitem->iCursor; - { - int nSubSrc = pSubSrc->nSrc; - int jointype = pSubitem->jointype; - - sqlite3DeleteTable(pSubitem->pTab); - sqlite3_free(pSubitem->zDatabase); - sqlite3_free(pSubitem->zName); - sqlite3_free(pSubitem->zAlias); - if( nSubSrc>1 ){ - int extra = nSubSrc - 1; - for(i=1; ipSrc = pSrc; - for(i=pSrc->nSrc-1; i-extra>=iFrom; i--){ - pSrc->a[i] = pSrc->a[i-extra]; - } - } - for(i=0; ia[i+iFrom] = pSubSrc->a[i]; - memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); - } - pSrc->a[iFrom].jointype = jointype; - } - - /* Now begin substituting subquery result set expressions for - ** references to the iParent in the outer query. - ** - ** Example: - ** - ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; - ** \ \_____________ subquery __________/ / - ** \_____________________ outer query ______________________________/ - ** - ** We look at every expression in the outer query and every place we see - ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". - */ - pList = p->pEList; - for(i=0; inExpr; i++){ - Expr *pExpr; - if( pList->a[i].zName==0 && (pExpr = pList->a[i].pExpr)->span.z!=0 ){ - pList->a[i].zName = - sqlite3DbStrNDup(db, (char*)pExpr->span.z, pExpr->span.n); - } - } - substExprList(db, p->pEList, iParent, pSub->pEList); - if( isAgg ){ - substExprList(db, p->pGroupBy, iParent, pSub->pEList); - substExpr(db, p->pHaving, iParent, pSub->pEList); - } - if( pSub->pOrderBy ){ - assert( p->pOrderBy==0 ); - p->pOrderBy = pSub->pOrderBy; - pSub->pOrderBy = 0; - }else if( p->pOrderBy ){ - substExprList(db, p->pOrderBy, iParent, pSub->pEList); - } - if( pSub->pWhere ){ - pWhere = sqlite3ExprDup(db, pSub->pWhere); - }else{ - pWhere = 0; - } - if( subqueryIsAgg ){ - assert( p->pHaving==0 ); - p->pHaving = p->pWhere; - p->pWhere = pWhere; - substExpr(db, p->pHaving, iParent, pSub->pEList); - p->pHaving = sqlite3ExprAnd(db, p->pHaving, - sqlite3ExprDup(db, pSub->pHaving)); - assert( p->pGroupBy==0 ); - p->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy); - }else{ - substExpr(db, p->pWhere, iParent, pSub->pEList); - p->pWhere = sqlite3ExprAnd(db, p->pWhere, pWhere); - } - - /* The flattened query is distinct if either the inner or the - ** outer query is distinct. - */ - p->isDistinct = p->isDistinct || pSub->isDistinct; - - /* - ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; - ** - ** One is tempted to try to add a and b to combine the limits. But this - ** does not work if either limit is negative. - */ - if( pSub->pLimit ){ - p->pLimit = pSub->pLimit; - pSub->pLimit = 0; - } - - /* Finially, delete what is left of the subquery and return - ** success. - */ - sqlite3SelectDelete(pSub); - return 1; -} -#endif /* SQLITE_OMIT_VIEW */ - -/* -** Analyze the SELECT statement passed in as an argument to see if it -** is a simple min() or max() query. If it is and this query can be -** satisfied using a single seek to the beginning or end of an index, -** then generate the code for this SELECT and return 1. If this is not a -** simple min() or max() query, then return 0; -** -** A simply min() or max() query looks like this: -** -** SELECT min(a) FROM table; -** SELECT max(a) FROM table; -** -** The query may have only a single table in its FROM argument. There -** can be no GROUP BY or HAVING or WHERE clauses. The result set must -** be the min() or max() of a single column of the table. The column -** in the min() or max() function must be indexed. -** -** The parameters to this routine are the same as for sqlite3Select(). -** See the header comment on that routine for additional information. -*/ -static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){ - Expr *pExpr; - int iCol; - Table *pTab; - Index *pIdx; - int base; - Vdbe *v; - int seekOp; - ExprList *pEList, *pList, eList; - struct ExprList_item eListItem; - SrcList *pSrc; - int brk; - int iDb; - - /* Check to see if this query is a simple min() or max() query. Return - ** zero if it is not. - */ - if( p->pGroupBy || p->pHaving || p->pWhere ) return 0; - pSrc = p->pSrc; - if( pSrc->nSrc!=1 ) return 0; - pEList = p->pEList; - if( pEList->nExpr!=1 ) return 0; - pExpr = pEList->a[0].pExpr; - if( pExpr->op!=TK_AGG_FUNCTION ) return 0; - pList = pExpr->pList; - if( pList==0 || pList->nExpr!=1 ) return 0; - if( pExpr->token.n!=3 ) return 0; - if( sqlite3StrNICmp((char*)pExpr->token.z,"min",3)==0 ){ - seekOp = OP_Rewind; - }else if( sqlite3StrNICmp((char*)pExpr->token.z,"max",3)==0 ){ - seekOp = OP_Last; - }else{ - return 0; - } - pExpr = pList->a[0].pExpr; - if( pExpr->op!=TK_COLUMN ) return 0; - iCol = pExpr->iColumn; - pTab = pSrc->a[0].pTab; - - /* This optimization cannot be used with virtual tables. */ - if( IsVirtual(pTab) ) return 0; - - /* If we get to here, it means the query is of the correct form. - ** Check to make sure we have an index and make pIdx point to the - ** appropriate index. If the min() or max() is on an INTEGER PRIMARY - ** key column, no index is necessary so set pIdx to NULL. If no - ** usable index is found, return 0. - */ - if( iCol<0 ){ - pIdx = 0; - }else{ - CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr); - if( pColl==0 ) return 0; - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - assert( pIdx->nColumn>=1 ); - if( pIdx->aiColumn[0]==iCol && - 0==sqlite3StrICmp(pIdx->azColl[0], pColl->zName) ){ - break; - } - } - if( pIdx==0 ) return 0; - } - - /* Identify column types if we will be using the callback. This - ** step is skipped if the output is going to a table or a memory cell. - ** The column names have already been generated in the calling function. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) return 0; - - /* If the output is destined for a temporary table, open that table. - */ - if( eDest==SRT_EphemTab ){ - sqlite3VdbeAddOp(v, OP_OpenEphemeral, iParm, 1); - } - - /* Generating code to find the min or the max. Basically all we have - ** to do is find the first or the last entry in the chosen index. If - ** the min() or max() is on the INTEGER PRIMARY KEY, then find the first - ** or last entry in the main table. - */ - iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - assert( iDb>=0 || pTab->isEphem ); - sqlite3CodeVerifySchema(pParse, iDb); - sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); - base = pSrc->a[0].iCursor; - brk = sqlite3VdbeMakeLabel(v); - computeLimitRegisters(pParse, p, brk); - if( pSrc->a[0].pSelect==0 ){ - sqlite3OpenTable(pParse, base, iDb, pTab, OP_OpenRead); - } - if( pIdx==0 ){ - sqlite3VdbeAddOp(v, seekOp, base, 0); - }else{ - /* Even though the cursor used to open the index here is closed - ** as soon as a single value has been read from it, allocate it - ** using (pParse->nTab++) to prevent the cursor id from being - ** reused. This is important for statements of the form - ** "INSERT INTO x SELECT max() FROM x". - */ - int iIdx; - KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); - iIdx = pParse->nTab++; - assert( pIdx->pSchema==pTab->pSchema ); - sqlite3VdbeAddOp(v, OP_Integer, iDb, 0); - sqlite3VdbeOp3(v, OP_OpenRead, iIdx, pIdx->tnum, - (char*)pKey, P3_KEYINFO_HANDOFF); - if( seekOp==OP_Rewind ){ - sqlite3VdbeAddOp(v, OP_Null, 0, 0); - sqlite3VdbeAddOp(v, OP_MakeRecord, 1, 0); - seekOp = OP_MoveGt; - } - if( pIdx->aSortOrder[0]==SQLITE_SO_DESC ){ - /* Ticket #2514: invert the seek operator if we are using - ** a descending index. */ - if( seekOp==OP_Last ){ - seekOp = OP_Rewind; - }else{ - assert( seekOp==OP_MoveGt ); - seekOp = OP_MoveLt; - } - } - sqlite3VdbeAddOp(v, seekOp, iIdx, 0); - sqlite3VdbeAddOp(v, OP_IdxRowid, iIdx, 0); - sqlite3VdbeAddOp(v, OP_Close, iIdx, 0); - sqlite3VdbeAddOp(v, OP_MoveGe, base, 0); - } - eList.nExpr = 1; - memset(&eListItem, 0, sizeof(eListItem)); - eList.a = &eListItem; - eList.a[0].pExpr = pExpr; - selectInnerLoop(pParse, p, &eList, 0, 0, 0, -1, eDest, iParm, brk, brk, 0); - sqlite3VdbeResolveLabel(v, brk); - sqlite3VdbeAddOp(v, OP_Close, base, 0); - - return 1; -} - -/* -** Analyze and ORDER BY or GROUP BY clause in a SELECT statement. Return -** the number of errors seen. -** -** An ORDER BY or GROUP BY is a list of expressions. If any expression -** is an integer constant, then that expression is replaced by the -** corresponding entry in the result set. -*/ -static int processOrderGroupBy( - NameContext *pNC, /* Name context of the SELECT statement. */ - ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ - const char *zType /* Either "ORDER" or "GROUP", as appropriate */ -){ - int i; - ExprList *pEList = pNC->pEList; /* The result set of the SELECT */ - Parse *pParse = pNC->pParse; /* The result set of the SELECT */ - assert( pEList ); - - if( pOrderBy==0 ) return 0; - if( pOrderBy->nExpr>SQLITE_MAX_COLUMN ){ - sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); - return 1; - } - for(i=0; inExpr; i++){ - int iCol; - Expr *pE = pOrderBy->a[i].pExpr; - if( sqlite3ExprIsInteger(pE, &iCol) ){ - if( iCol>0 && iCol<=pEList->nExpr ){ - CollSeq *pColl = pE->pColl; - int flags = pE->flags & EP_ExpCollate; - sqlite3ExprDelete(pE); - pE = sqlite3ExprDup(pParse->db, pEList->a[iCol-1].pExpr); - pOrderBy->a[i].pExpr = pE; - if( pColl && flags ){ - pE->pColl = pColl; - pE->flags |= flags; - } - }else{ - sqlite3ErrorMsg(pParse, - "%s BY column number %d out of range - should be " - "between 1 and %d", zType, iCol, pEList->nExpr); - return 1; - } - } - if( sqlite3ExprResolveNames(pNC, pE) ){ - return 1; - } - } - return 0; -} - -/* -** This routine resolves any names used in the result set of the -** supplied SELECT statement. If the SELECT statement being resolved -** is a sub-select, then pOuterNC is a pointer to the NameContext -** of the parent SELECT. -*/ -int sqlite3SelectResolve( - Parse *pParse, /* The parser context */ - Select *p, /* The SELECT statement being coded. */ - NameContext *pOuterNC /* The outer name context. May be NULL. */ -){ - ExprList *pEList; /* Result set. */ - int i; /* For-loop variable used in multiple places */ - NameContext sNC; /* Local name-context */ - ExprList *pGroupBy; /* The group by clause */ - - /* If this routine has run before, return immediately. */ - if( p->isResolved ){ - assert( !pOuterNC ); - return SQLITE_OK; - } - p->isResolved = 1; - - /* If there have already been errors, do nothing. */ - if( pParse->nErr>0 ){ - return SQLITE_ERROR; - } - - /* Prepare the select statement. This call will allocate all cursors - ** required to handle the tables and subqueries in the FROM clause. - */ - if( prepSelectStmt(pParse, p) ){ - return SQLITE_ERROR; - } - - /* Resolve the expressions in the LIMIT and OFFSET clauses. These - ** are not allowed to refer to any names, so pass an empty NameContext. - */ - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - if( sqlite3ExprResolveNames(&sNC, p->pLimit) || - sqlite3ExprResolveNames(&sNC, p->pOffset) ){ - return SQLITE_ERROR; - } - - /* Set up the local name-context to pass to ExprResolveNames() to - ** resolve the expression-list. - */ - sNC.allowAgg = 1; - sNC.pSrcList = p->pSrc; - sNC.pNext = pOuterNC; - - /* Resolve names in the result set. */ - pEList = p->pEList; - if( !pEList ) return SQLITE_ERROR; - for(i=0; inExpr; i++){ - Expr *pX = pEList->a[i].pExpr; - if( sqlite3ExprResolveNames(&sNC, pX) ){ - return SQLITE_ERROR; - } - } - - /* If there are no aggregate functions in the result-set, and no GROUP BY - ** expression, do not allow aggregates in any of the other expressions. - */ - assert( !p->isAgg ); - pGroupBy = p->pGroupBy; - if( pGroupBy || sNC.hasAgg ){ - p->isAgg = 1; - }else{ - sNC.allowAgg = 0; - } - - /* If a HAVING clause is present, then there must be a GROUP BY clause. - */ - if( p->pHaving && !pGroupBy ){ - sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); - return SQLITE_ERROR; - } - - /* Add the expression list to the name-context before parsing the - ** other expressions in the SELECT statement. This is so that - ** expressions in the WHERE clause (etc.) can refer to expressions by - ** aliases in the result set. - ** - ** Minor point: If this is the case, then the expression will be - ** re-evaluated for each reference to it. - */ - sNC.pEList = p->pEList; - if( sqlite3ExprResolveNames(&sNC, p->pWhere) || - sqlite3ExprResolveNames(&sNC, p->pHaving) ){ - return SQLITE_ERROR; - } - if( p->pPrior==0 ){ - if( processOrderGroupBy(&sNC, p->pOrderBy, "ORDER") || - processOrderGroupBy(&sNC, pGroupBy, "GROUP") ){ - return SQLITE_ERROR; - } - } - - if( pParse->db->mallocFailed ){ - return SQLITE_NOMEM; - } - - /* Make sure the GROUP BY clause does not contain aggregate functions. - */ - if( pGroupBy ){ - struct ExprList_item *pItem; - - for(i=0, pItem=pGroupBy->a; inExpr; i++, pItem++){ - if( ExprHasProperty(pItem->pExpr, EP_Agg) ){ - sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " - "the GROUP BY clause"); - return SQLITE_ERROR; - } - } - } - - /* If this is one SELECT of a compound, be sure to resolve names - ** in the other SELECTs. - */ - if( p->pPrior ){ - return sqlite3SelectResolve(pParse, p->pPrior, pOuterNC); - }else{ - return SQLITE_OK; - } -} - -/* -** Reset the aggregate accumulator. -** -** The aggregate accumulator is a set of memory cells that hold -** intermediate results while calculating an aggregate. This -** routine simply stores NULLs in all of those memory cells. -*/ -static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ - Vdbe *v = pParse->pVdbe; - int i; - struct AggInfo_func *pFunc; - if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ - return; - } - for(i=0; inColumn; i++){ - sqlite3VdbeAddOp(v, OP_MemNull, pAggInfo->aCol[i].iMem, 0); - } - for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ - sqlite3VdbeAddOp(v, OP_MemNull, pFunc->iMem, 0); - if( pFunc->iDistinct>=0 ){ - Expr *pE = pFunc->pExpr; - if( pE->pList==0 || pE->pList->nExpr!=1 ){ - sqlite3ErrorMsg(pParse, "DISTINCT in aggregate must be followed " - "by an expression"); - pFunc->iDistinct = -1; - }else{ - KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->pList); - sqlite3VdbeOp3(v, OP_OpenEphemeral, pFunc->iDistinct, 0, - (char*)pKeyInfo, P3_KEYINFO_HANDOFF); - } - } - } -} - -/* -** Invoke the OP_AggFinalize opcode for every aggregate function -** in the AggInfo structure. -*/ -static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ - Vdbe *v = pParse->pVdbe; - int i; - struct AggInfo_func *pF; - for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ - ExprList *pList = pF->pExpr->pList; - sqlite3VdbeOp3(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, - (void*)pF->pFunc, P3_FUNCDEF); - } -} - -/* -** Update the accumulator memory cells for an aggregate based on -** the current cursor position. -*/ -static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ - Vdbe *v = pParse->pVdbe; - int i; - struct AggInfo_func *pF; - struct AggInfo_col *pC; - - pAggInfo->directMode = 1; - for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ - int nArg; - int addrNext = 0; - ExprList *pList = pF->pExpr->pList; - if( pList ){ - nArg = pList->nExpr; - sqlite3ExprCodeExprList(pParse, pList); - }else{ - nArg = 0; - } - if( pF->iDistinct>=0 ){ - addrNext = sqlite3VdbeMakeLabel(v); - assert( nArg==1 ); - codeDistinct(v, pF->iDistinct, addrNext, 1); - } - if( pF->pFunc->needCollSeq ){ - CollSeq *pColl = 0; - struct ExprList_item *pItem; - int j; - assert( pList!=0 ); /* pList!=0 if pF->pFunc->needCollSeq is true */ - for(j=0, pItem=pList->a; !pColl && jpExpr); - } - if( !pColl ){ - pColl = pParse->db->pDfltColl; - } - sqlite3VdbeOp3(v, OP_CollSeq, 0, 0, (char *)pColl, P3_COLLSEQ); - } - sqlite3VdbeOp3(v, OP_AggStep, pF->iMem, nArg, (void*)pF->pFunc, P3_FUNCDEF); - if( addrNext ){ - sqlite3VdbeResolveLabel(v, addrNext); - } - } - for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ - sqlite3ExprCode(pParse, pC->pExpr); - sqlite3VdbeAddOp(v, OP_MemStore, pC->iMem, 1); - } - pAggInfo->directMode = 0; -} - - -/* -** Generate code for the given SELECT statement. -** -** The results are distributed in various ways depending on the -** value of eDest and iParm. -** -** eDest Value Result -** ------------ ------------------------------------------- -** SRT_Callback Invoke the callback for each row of the result. -** -** SRT_Mem Store first result in memory cell iParm -** -** SRT_Set Store results as keys of table iParm. -** -** SRT_Union Store results as a key in a temporary table iParm -** -** SRT_Except Remove results from the temporary table iParm. -** -** SRT_Table Store results in temporary table iParm -** -** The table above is incomplete. Additional eDist value have be added -** since this comment was written. See the selectInnerLoop() function for -** a complete listing of the allowed values of eDest and their meanings. -** -** This routine returns the number of errors. If any errors are -** encountered, then an appropriate error message is left in -** pParse->zErrMsg. -** -** This routine does NOT free the Select structure passed in. The -** calling function needs to do that. -** -** The pParent, parentTab, and *pParentAgg fields are filled in if this -** SELECT is a subquery. This routine may try to combine this SELECT -** with its parent to form a single flat query. In so doing, it might -** change the parent query from a non-aggregate to an aggregate query. -** For that reason, the pParentAgg flag is passed as a pointer, so it -** can be changed. -** -** Example 1: The meaning of the pParent parameter. -** -** SELECT * FROM t1 JOIN (SELECT x, count(*) FROM t2) JOIN t3; -** \ \_______ subquery _______/ / -** \ / -** \____________________ outer query ___________________/ -** -** This routine is called for the outer query first. For that call, -** pParent will be NULL. During the processing of the outer query, this -** routine is called recursively to handle the subquery. For the recursive -** call, pParent will point to the outer query. Because the subquery is -** the second element in a three-way join, the parentTab parameter will -** be 1 (the 2nd value of a 0-indexed array.) -*/ -int sqlite3Select( - Parse *pParse, /* The parser context */ - Select *p, /* The SELECT statement being coded. */ - int eDest, /* How to dispose of the results */ - int iParm, /* A parameter used by the eDest disposal method */ - Select *pParent, /* Another SELECT for which this is a sub-query */ - int parentTab, /* Index in pParent->pSrc of this query */ - int *pParentAgg, /* True if pParent uses aggregate functions */ - char *aff /* If eDest is SRT_Union, the affinity string */ -){ - int i, j; /* Loop counters */ - WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ - Vdbe *v; /* The virtual machine under construction */ - int isAgg; /* True for select lists like "count(*)" */ - ExprList *pEList; /* List of columns to extract. */ - SrcList *pTabList; /* List of tables to select from */ - Expr *pWhere; /* The WHERE clause. May be NULL */ - ExprList *pOrderBy; /* The ORDER BY clause. May be NULL */ - ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ - Expr *pHaving; /* The HAVING clause. May be NULL */ - int isDistinct; /* True if the DISTINCT keyword is present */ - int distinct; /* Table to use for the distinct set */ - int rc = 1; /* Value to return from this function */ - int addrSortIndex; /* Address of an OP_OpenEphemeral instruction */ - AggInfo sAggInfo; /* Information used by aggregate queries */ - int iEnd; /* Address of the end of the query */ - sqlite3 *db; /* The database connection */ - - db = pParse->db; - if( p==0 || db->mallocFailed || pParse->nErr ){ - return 1; - } - if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; - memset(&sAggInfo, 0, sizeof(sAggInfo)); - -#ifndef SQLITE_OMIT_COMPOUND_SELECT - /* If there is are a sequence of queries, do the earlier ones first. - */ - if( p->pPrior ){ - if( p->pRightmost==0 ){ - Select *pLoop; - int cnt = 0; - for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){ - pLoop->pRightmost = p; - } - if( SQLITE_MAX_COMPOUND_SELECT>0 && cnt>SQLITE_MAX_COMPOUND_SELECT ){ - sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); - return 1; - } - } - return multiSelect(pParse, p, eDest, iParm, aff); - } -#endif - - pOrderBy = p->pOrderBy; - if( IgnorableOrderby(eDest) ){ - p->pOrderBy = 0; - } - if( sqlite3SelectResolve(pParse, p, 0) ){ - goto select_end; - } - p->pOrderBy = pOrderBy; - - /* Make local copies of the parameters for this query. - */ - pTabList = p->pSrc; - pWhere = p->pWhere; - pGroupBy = p->pGroupBy; - pHaving = p->pHaving; - isAgg = p->isAgg; - isDistinct = p->isDistinct; - pEList = p->pEList; - if( pEList==0 ) goto select_end; - - /* - ** Do not even attempt to generate any code if we have already seen - ** errors before this routine starts. - */ - if( pParse->nErr>0 ) goto select_end; - - /* If writing to memory or generating a set - ** only a single column may be output. - */ -#ifndef SQLITE_OMIT_SUBQUERY - if( checkForMultiColumnSelectError(pParse, eDest, pEList->nExpr) ){ - goto select_end; - } -#endif - - /* ORDER BY is ignored for some destinations. - */ - if( IgnorableOrderby(eDest) ){ - pOrderBy = 0; - } - - /* Begin generating code. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto select_end; - - /* Generate code for all sub-queries in the FROM clause - */ -#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) - for(i=0; inSrc; i++){ - const char *zSavedAuthContext = 0; - int needRestoreContext; - struct SrcList_item *pItem = &pTabList->a[i]; - - if( pItem->pSelect==0 || pItem->isPopulated ) continue; - if( pItem->zName!=0 ){ - zSavedAuthContext = pParse->zAuthContext; - pParse->zAuthContext = pItem->zName; - needRestoreContext = 1; - }else{ - needRestoreContext = 0; - } -#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 - /* Increment Parse.nHeight by the height of the largest expression - ** tree refered to by this, the parent select. The child select - ** may contain expression trees of at most - ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit - ** more conservative than necessary, but much easier than enforcing - ** an exact limit. - */ - pParse->nHeight += sqlite3SelectExprHeight(p); -#endif - sqlite3Select(pParse, pItem->pSelect, SRT_EphemTab, - pItem->iCursor, p, i, &isAgg, 0); -#if defined(SQLITE_TEST) || SQLITE_MAX_EXPR_DEPTH>0 - pParse->nHeight -= sqlite3SelectExprHeight(p); -#endif - if( needRestoreContext ){ - pParse->zAuthContext = zSavedAuthContext; - } - pTabList = p->pSrc; - pWhere = p->pWhere; - if( !IgnorableOrderby(eDest) ){ - pOrderBy = p->pOrderBy; - } - pGroupBy = p->pGroupBy; - pHaving = p->pHaving; - isDistinct = p->isDistinct; - } -#endif - - /* Check for the special case of a min() or max() function by itself - ** in the result set. - */ - if( simpleMinMaxQuery(pParse, p, eDest, iParm) ){ - rc = 0; - goto select_end; - } - - /* Check to see if this is a subquery that can be "flattened" into its parent. - ** If flattening is a possiblity, do so and return immediately. - */ -#ifndef SQLITE_OMIT_VIEW - if( pParent && pParentAgg && - flattenSubquery(db, pParent, parentTab, *pParentAgg, isAgg) ){ - if( isAgg ) *pParentAgg = 1; - goto select_end; - } -#endif - - /* If there is an ORDER BY clause, then this sorting - ** index might end up being unused if the data can be - ** extracted in pre-sorted order. If that is the case, then the - ** OP_OpenEphemeral instruction will be changed to an OP_Noop once - ** we figure out that the sorting index is not needed. The addrSortIndex - ** variable is used to facilitate that change. - */ - if( pOrderBy ){ - KeyInfo *pKeyInfo; - if( pParse->nErr ){ - goto select_end; - } - pKeyInfo = keyInfoFromExprList(pParse, pOrderBy); - pOrderBy->iECursor = pParse->nTab++; - p->addrOpenEphm[2] = addrSortIndex = - sqlite3VdbeOp3(v, OP_OpenEphemeral, pOrderBy->iECursor, pOrderBy->nExpr+2, (char*)pKeyInfo, P3_KEYINFO_HANDOFF); - }else{ - addrSortIndex = -1; - } - - /* If the output is destined for a temporary table, open that table. - */ - if( eDest==SRT_EphemTab ){ - sqlite3VdbeAddOp(v, OP_OpenEphemeral, iParm, pEList->nExpr); - } - - /* Set the limiter. - */ - iEnd = sqlite3VdbeMakeLabel(v); - computeLimitRegisters(pParse, p, iEnd); - - /* Open a virtual index to use for the distinct set. - */ - if( isDistinct ){ - KeyInfo *pKeyInfo; - distinct = pParse->nTab++; - pKeyInfo = keyInfoFromExprList(pParse, p->pEList); - sqlite3VdbeOp3(v, OP_OpenEphemeral, distinct, 0, - (char*)pKeyInfo, P3_KEYINFO_HANDOFF); - }else{ - distinct = -1; - } - - /* Aggregate and non-aggregate queries are handled differently */ - if( !isAgg && pGroupBy==0 ){ - /* This case is for non-aggregate queries - ** Begin the database scan - */ - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pOrderBy); - if( pWInfo==0 ) goto select_end; - - /* If sorting index that was created by a prior OP_OpenEphemeral - ** instruction ended up not being needed, then change the OP_OpenEphemeral - ** into an OP_Noop. - */ - if( addrSortIndex>=0 && pOrderBy==0 ){ - sqlite3VdbeChangeToNoop(v, addrSortIndex, 1); - p->addrOpenEphm[2] = -1; - } - - /* Use the standard inner loop - */ - if( selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, distinct, eDest, - iParm, pWInfo->iContinue, pWInfo->iBreak, aff) ){ - goto select_end; - } - - /* End the database scan loop. - */ - sqlite3WhereEnd(pWInfo); - }else{ - /* This is the processing for aggregate queries */ - NameContext sNC; /* Name context for processing aggregate information */ - int iAMem; /* First Mem address for storing current GROUP BY */ - int iBMem; /* First Mem address for previous GROUP BY */ - int iUseFlag; /* Mem address holding flag indicating that at least - ** one row of the input to the aggregator has been - ** processed */ - int iAbortFlag; /* Mem address which causes query abort if positive */ - int groupBySort; /* Rows come from source in GROUP BY order */ - - - /* The following variables hold addresses or labels for parts of the - ** virtual machine program we are putting together */ - int addrOutputRow; /* Start of subroutine that outputs a result row */ - int addrSetAbort; /* Set the abort flag and return */ - int addrInitializeLoop; /* Start of code that initializes the input loop */ - int addrTopOfLoop; /* Top of the input loop */ - int addrGroupByChange; /* Code that runs when any GROUP BY term changes */ - int addrProcessRow; /* Code to process a single input row */ - int addrEnd; /* End of all processing */ - int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */ - int addrReset; /* Subroutine for resetting the accumulator */ - - addrEnd = sqlite3VdbeMakeLabel(v); - - /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in - ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the - ** SELECT statement. - */ - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - sNC.pSrcList = pTabList; - sNC.pAggInfo = &sAggInfo; - sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; - sAggInfo.pGroupBy = pGroupBy; - if( sqlite3ExprAnalyzeAggList(&sNC, pEList) ){ - goto select_end; - } - if( sqlite3ExprAnalyzeAggList(&sNC, pOrderBy) ){ - goto select_end; - } - if( pHaving && sqlite3ExprAnalyzeAggregates(&sNC, pHaving) ){ - goto select_end; - } - sAggInfo.nAccumulator = sAggInfo.nColumn; - for(i=0; ipList) ){ - goto select_end; - } - } - if( db->mallocFailed ) goto select_end; - - /* Processing for aggregates with GROUP BY is very different and - ** much more complex tha aggregates without a GROUP BY. - */ - if( pGroupBy ){ - KeyInfo *pKeyInfo; /* Keying information for the group by clause */ - - /* Create labels that we will be needing - */ - - addrInitializeLoop = sqlite3VdbeMakeLabel(v); - addrGroupByChange = sqlite3VdbeMakeLabel(v); - addrProcessRow = sqlite3VdbeMakeLabel(v); - - /* If there is a GROUP BY clause we might need a sorting index to - ** implement it. Allocate that sorting index now. If it turns out - ** that we do not need it after all, the OpenEphemeral instruction - ** will be converted into a Noop. - */ - sAggInfo.sortingIdx = pParse->nTab++; - pKeyInfo = keyInfoFromExprList(pParse, pGroupBy); - addrSortingIdx = - sqlite3VdbeOp3(v, OP_OpenEphemeral, sAggInfo.sortingIdx, - sAggInfo.nSortingColumn, - (char*)pKeyInfo, P3_KEYINFO_HANDOFF); - - /* Initialize memory locations used by GROUP BY aggregate processing - */ - iUseFlag = pParse->nMem++; - iAbortFlag = pParse->nMem++; - iAMem = pParse->nMem; - pParse->nMem += pGroupBy->nExpr; - iBMem = pParse->nMem; - pParse->nMem += pGroupBy->nExpr; - sqlite3VdbeAddOp(v, OP_MemInt, 0, iAbortFlag); - VdbeComment((v, "# clear abort flag")); - sqlite3VdbeAddOp(v, OP_MemInt, 0, iUseFlag); - VdbeComment((v, "# indicate accumulator empty")); - sqlite3VdbeAddOp(v, OP_Goto, 0, addrInitializeLoop); - - /* Generate a subroutine that outputs a single row of the result - ** set. This subroutine first looks at the iUseFlag. If iUseFlag - ** is less than or equal to zero, the subroutine is a no-op. If - ** the processing calls for the query to abort, this subroutine - ** increments the iAbortFlag memory location before returning in - ** order to signal the caller to abort. - */ - addrSetAbort = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp(v, OP_MemInt, 1, iAbortFlag); - VdbeComment((v, "# set abort flag")); - sqlite3VdbeAddOp(v, OP_Return, 0, 0); - addrOutputRow = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp(v, OP_IfMemPos, iUseFlag, addrOutputRow+2); - VdbeComment((v, "# Groupby result generator entry point")); - sqlite3VdbeAddOp(v, OP_Return, 0, 0); - finalizeAggFunctions(pParse, &sAggInfo); - if( pHaving ){ - sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, 1); - } - rc = selectInnerLoop(pParse, p, p->pEList, 0, 0, pOrderBy, - distinct, eDest, iParm, - addrOutputRow+1, addrSetAbort, aff); - if( rc ){ - goto select_end; - } - sqlite3VdbeAddOp(v, OP_Return, 0, 0); - VdbeComment((v, "# end groupby result generator")); - - /* Generate a subroutine that will reset the group-by accumulator - */ - addrReset = sqlite3VdbeCurrentAddr(v); - resetAccumulator(pParse, &sAggInfo); - sqlite3VdbeAddOp(v, OP_Return, 0, 0); - - /* Begin a loop that will extract all source rows in GROUP BY order. - ** This might involve two separate loops with an OP_Sort in between, or - ** it might be a single loop that uses an index to extract information - ** in the right order to begin with. - */ - sqlite3VdbeResolveLabel(v, addrInitializeLoop); - sqlite3VdbeAddOp(v, OP_Gosub, 0, addrReset); - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pGroupBy); - if( pWInfo==0 ) goto select_end; - if( pGroupBy==0 ){ - /* The optimizer is able to deliver rows in group by order so - ** we do not have to sort. The OP_OpenEphemeral table will be - ** cancelled later because we still need to use the pKeyInfo - */ - pGroupBy = p->pGroupBy; - groupBySort = 0; - }else{ - /* Rows are coming out in undetermined order. We have to push - ** each row into a sorting index, terminate the first loop, - ** then loop over the sorting index in order to get the output - ** in sorted order - */ - groupBySort = 1; - sqlite3ExprCodeExprList(pParse, pGroupBy); - sqlite3VdbeAddOp(v, OP_Sequence, sAggInfo.sortingIdx, 0); - j = pGroupBy->nExpr+1; - for(i=0; iiSorterColumnpTab, pCol->iColumn, pCol->iTable); - j++; - } - sqlite3VdbeAddOp(v, OP_MakeRecord, j, 0); - sqlite3VdbeAddOp(v, OP_IdxInsert, sAggInfo.sortingIdx, 0); - sqlite3WhereEnd(pWInfo); - sqlite3VdbeAddOp(v, OP_Sort, sAggInfo.sortingIdx, addrEnd); - VdbeComment((v, "# GROUP BY sort")); - sAggInfo.useSortingIdx = 1; - } - - /* Evaluate the current GROUP BY terms and store in b0, b1, b2... - ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth) - ** Then compare the current GROUP BY terms against the GROUP BY terms - ** from the previous row currently stored in a0, a1, a2... - */ - addrTopOfLoop = sqlite3VdbeCurrentAddr(v); - for(j=0; jnExpr; j++){ - if( groupBySort ){ - sqlite3VdbeAddOp(v, OP_Column, sAggInfo.sortingIdx, j); - }else{ - sAggInfo.directMode = 1; - sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr); - } - sqlite3VdbeAddOp(v, OP_MemStore, iBMem+j, jnExpr-1); - } - for(j=pGroupBy->nExpr-1; j>=0; j--){ - if( jnExpr-1 ){ - sqlite3VdbeAddOp(v, OP_MemLoad, iBMem+j, 0); - } - sqlite3VdbeAddOp(v, OP_MemLoad, iAMem+j, 0); - if( j==0 ){ - sqlite3VdbeAddOp(v, OP_Eq, 0x200, addrProcessRow); - }else{ - sqlite3VdbeAddOp(v, OP_Ne, 0x200, addrGroupByChange); - } - sqlite3VdbeChangeP3(v, -1, (void*)pKeyInfo->aColl[j], P3_COLLSEQ); - } - - /* Generate code that runs whenever the GROUP BY changes. - ** Change in the GROUP BY are detected by the previous code - ** block. If there were no changes, this block is skipped. - ** - ** This code copies current group by terms in b0,b1,b2,... - ** over to a0,a1,a2. It then calls the output subroutine - ** and resets the aggregate accumulator registers in preparation - ** for the next GROUP BY batch. - */ - sqlite3VdbeResolveLabel(v, addrGroupByChange); - for(j=0; jnExpr; j++){ - sqlite3VdbeAddOp(v, OP_MemMove, iAMem+j, iBMem+j); - } - sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow); - VdbeComment((v, "# output one row")); - sqlite3VdbeAddOp(v, OP_IfMemPos, iAbortFlag, addrEnd); - VdbeComment((v, "# check abort flag")); - sqlite3VdbeAddOp(v, OP_Gosub, 0, addrReset); - VdbeComment((v, "# reset accumulator")); - - /* Update the aggregate accumulators based on the content of - ** the current row - */ - sqlite3VdbeResolveLabel(v, addrProcessRow); - updateAccumulator(pParse, &sAggInfo); - sqlite3VdbeAddOp(v, OP_MemInt, 1, iUseFlag); - VdbeComment((v, "# indicate data in accumulator")); - - /* End of the loop - */ - if( groupBySort ){ - sqlite3VdbeAddOp(v, OP_Next, sAggInfo.sortingIdx, addrTopOfLoop); - }else{ - sqlite3WhereEnd(pWInfo); - sqlite3VdbeChangeToNoop(v, addrSortingIdx, 1); - } - - /* Output the final row of result - */ - sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow); - VdbeComment((v, "# output final row")); - - } /* endif pGroupBy */ - else { - /* This case runs if the aggregate has no GROUP BY clause. The - ** processing is much simpler since there is only a single row - ** of output. - */ - resetAccumulator(pParse, &sAggInfo); - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0); - if( pWInfo==0 ) goto select_end; - updateAccumulator(pParse, &sAggInfo); - sqlite3WhereEnd(pWInfo); - finalizeAggFunctions(pParse, &sAggInfo); - pOrderBy = 0; - if( pHaving ){ - sqlite3ExprIfFalse(pParse, pHaving, addrEnd, 1); - } - selectInnerLoop(pParse, p, p->pEList, 0, 0, 0, -1, - eDest, iParm, addrEnd, addrEnd, aff); - } - sqlite3VdbeResolveLabel(v, addrEnd); - - } /* endif aggregate query */ - - /* If there is an ORDER BY clause, then we need to sort the results - ** and send them to the callback one by one. - */ - if( pOrderBy ){ - generateSortTail(pParse, p, v, pEList->nExpr, eDest, iParm); - } - -#ifndef SQLITE_OMIT_SUBQUERY - /* If this was a subquery, we have now converted the subquery into a - ** temporary table. So set the SrcList_item.isPopulated flag to prevent - ** this subquery from being evaluated again and to force the use of - ** the temporary table. - */ - if( pParent ){ - assert( pParent->pSrc->nSrc>parentTab ); - assert( pParent->pSrc->a[parentTab].pSelect==p ); - pParent->pSrc->a[parentTab].isPopulated = 1; - } -#endif - - /* Jump here to skip this query - */ - sqlite3VdbeResolveLabel(v, iEnd); - - /* The SELECT was successfully coded. Set the return code to 0 - ** to indicate no errors. - */ - rc = 0; - - /* Control jumps to here if an error is encountered above, or upon - ** successful coding of the SELECT. - */ -select_end: - - /* Identify column names if we will be using them in a callback. This - ** step is skipped if the output is going to some other destination. - */ - if( rc==SQLITE_OK && eDest==SRT_Callback ){ - generateColumnNames(pParse, pTabList, pEList); - } - - sqlite3_free(sAggInfo.aCol); - sqlite3_free(sAggInfo.aFunc); - return rc; -} - -#if defined(SQLITE_DEBUG) -/* -******************************************************************************* -** The following code is used for testing and debugging only. The code -** that follows does not appear in normal builds. -** -** These routines are used to print out the content of all or part of a -** parse structures such as Select or Expr. Such printouts are useful -** for helping to understand what is happening inside the code generator -** during the execution of complex SELECT statements. -** -** These routine are not called anywhere from within the normal -** code base. Then are intended to be called from within the debugger -** or from temporary "printf" statements inserted for debugging. -*/ -void sqlite3PrintExpr(Expr *p){ - if( p->token.z && p->token.n>0 ){ - sqlite3DebugPrintf("(%.*s", p->token.n, p->token.z); - }else{ - sqlite3DebugPrintf("(%d", p->op); - } - if( p->pLeft ){ - sqlite3DebugPrintf(" "); - sqlite3PrintExpr(p->pLeft); - } - if( p->pRight ){ - sqlite3DebugPrintf(" "); - sqlite3PrintExpr(p->pRight); - } - sqlite3DebugPrintf(")"); -} -void sqlite3PrintExprList(ExprList *pList){ - int i; - for(i=0; inExpr; i++){ - sqlite3PrintExpr(pList->a[i].pExpr); - if( inExpr-1 ){ - sqlite3DebugPrintf(", "); - } - } -} -void sqlite3PrintSelect(Select *p, int indent){ - sqlite3DebugPrintf("%*sSELECT(%p) ", indent, "", p); - sqlite3PrintExprList(p->pEList); - sqlite3DebugPrintf("\n"); - if( p->pSrc ){ - char *zPrefix; - int i; - zPrefix = "FROM"; - for(i=0; ipSrc->nSrc; i++){ - struct SrcList_item *pItem = &p->pSrc->a[i]; - sqlite3DebugPrintf("%*s ", indent+6, zPrefix); - zPrefix = ""; - if( pItem->pSelect ){ - sqlite3DebugPrintf("(\n"); - sqlite3PrintSelect(pItem->pSelect, indent+10); - sqlite3DebugPrintf("%*s)", indent+8, ""); - }else if( pItem->zName ){ - sqlite3DebugPrintf("%s", pItem->zName); - } - if( pItem->pTab ){ - sqlite3DebugPrintf("(table: %s)", pItem->pTab->zName); - } - if( pItem->zAlias ){ - sqlite3DebugPrintf(" AS %s", pItem->zAlias); - } - if( ipSrc->nSrc-1 ){ - sqlite3DebugPrintf(","); - } - sqlite3DebugPrintf("\n"); - } - } - if( p->pWhere ){ - sqlite3DebugPrintf("%*s WHERE ", indent, ""); - sqlite3PrintExpr(p->pWhere); - sqlite3DebugPrintf("\n"); - } - if( p->pGroupBy ){ - sqlite3DebugPrintf("%*s GROUP BY ", indent, ""); - sqlite3PrintExprList(p->pGroupBy); - sqlite3DebugPrintf("\n"); - } - if( p->pHaving ){ - sqlite3DebugPrintf("%*s HAVING ", indent, ""); - sqlite3PrintExpr(p->pHaving); - sqlite3DebugPrintf("\n"); - } - if( p->pOrderBy ){ - sqlite3DebugPrintf("%*s ORDER BY ", indent, ""); - sqlite3PrintExprList(p->pOrderBy); - sqlite3DebugPrintf("\n"); - } -} -/* End of the structure debug printing code -*****************************************************************************/ -#endif /* defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/shell.c b/libraries/sqlite/unix/sqlite-3.5.1/src/shell.c deleted file mode 100644 index bd5105e48c..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/shell.c +++ /dev/null @@ -1,2019 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This file contains code to implement the "sqlite" command line -** utility for accessing SQLite databases. -** -** $Id: shell.c,v 1.167 2007/09/07 01:12:32 drh Exp $ -*/ -#include -#include -#include -#include -#include "sqlite3.h" -#include -#include - -#if !defined(_WIN32) && !defined(WIN32) && !defined(__MACOS__) && !defined(__OS2__) -# include -# include -# include -# include -#endif - -#ifdef __MACOS__ -# include -# include -# include -# include -# include -# include -#endif - -#ifdef __OS2__ -# include -#endif - -#if defined(HAVE_READLINE) && HAVE_READLINE==1 -# include -# include -#else -# define readline(p) local_getline(p,stdin) -# define add_history(X) -# define read_history(X) -# define write_history(X) -# define stifle_history(X) -#endif - -#if defined(_WIN32) || defined(WIN32) -# include -#else -/* Make sure isatty() has a prototype. -*/ -extern int isatty(); -#endif - -/* -** If the following flag is set, then command execution stops -** at an error if we are not interactive. -*/ -static int bail_on_error = 0; - -/* -** Threat stdin as an interactive input if the following variable -** is true. Otherwise, assume stdin is connected to a file or pipe. -*/ -static int stdin_is_interactive = 1; - -/* -** The following is the open SQLite database. We make a pointer -** to this database a static variable so that it can be accessed -** by the SIGINT handler to interrupt database processing. -*/ -static sqlite3 *db = 0; - -/* -** True if an interrupt (Control-C) has been received. -*/ -static volatile int seenInterrupt = 0; - -/* -** This is the name of our program. It is set in main(), used -** in a number of other places, mostly for error messages. -*/ -static char *Argv0; - -/* -** Prompt strings. Initialized in main. Settable with -** .prompt main continue -*/ -static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ -static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ - -/* -** Write I/O traces to the following stream. -*/ -#ifdef SQLITE_ENABLE_IOTRACE -static FILE *iotrace = 0; -#endif - -/* -** This routine works like printf in that its first argument is a -** format string and subsequent arguments are values to be substituted -** in place of % fields. The result of formatting this string -** is written to iotrace. -*/ -#ifdef SQLITE_ENABLE_IOTRACE -static void iotracePrintf(const char *zFormat, ...){ - va_list ap; - char *z; - if( iotrace==0 ) return; - va_start(ap, zFormat); - z = sqlite3_vmprintf(zFormat, ap); - va_end(ap); - fprintf(iotrace, "%s", z); - sqlite3_free(z); -} -#endif - - -/* -** Determines if a string is a number of not. -*/ -static int isNumber(const char *z, int *realnum){ - if( *z=='-' || *z=='+' ) z++; - if( !isdigit(*z) ){ - return 0; - } - z++; - if( realnum ) *realnum = 0; - while( isdigit(*z) ){ z++; } - if( *z=='.' ){ - z++; - if( !isdigit(*z) ) return 0; - while( isdigit(*z) ){ z++; } - if( realnum ) *realnum = 1; - } - if( *z=='e' || *z=='E' ){ - z++; - if( *z=='+' || *z=='-' ) z++; - if( !isdigit(*z) ) return 0; - while( isdigit(*z) ){ z++; } - if( realnum ) *realnum = 1; - } - return *z==0; -} - -/* -** A global char* and an SQL function to access its current value -** from within an SQL statement. This program used to use the -** sqlite_exec_printf() API to substitue a string into an SQL statement. -** The correct way to do this with sqlite3 is to use the bind API, but -** since the shell is built around the callback paradigm it would be a lot -** of work. Instead just use this hack, which is quite harmless. -*/ -static const char *zShellStatic = 0; -static void shellstaticFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - assert( 0==argc ); - assert( zShellStatic ); - sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC); -} - - -/* -** This routine reads a line of text from FILE in, stores -** the text in memory obtained from malloc() and returns a pointer -** to the text. NULL is returned at end of file, or if malloc() -** fails. -** -** The interface is like "readline" but no command-line editing -** is done. -*/ -static char *local_getline(char *zPrompt, FILE *in){ - char *zLine; - int nLine; - int n; - int eol; - - if( zPrompt && *zPrompt ){ - printf("%s",zPrompt); - fflush(stdout); - } - nLine = 100; - zLine = malloc( nLine ); - if( zLine==0 ) return 0; - n = 0; - eol = 0; - while( !eol ){ - if( n+100>nLine ){ - nLine = nLine*2 + 100; - zLine = realloc(zLine, nLine); - if( zLine==0 ) return 0; - } - if( fgets(&zLine[n], nLine - n, in)==0 ){ - if( n==0 ){ - free(zLine); - return 0; - } - zLine[n] = 0; - eol = 1; - break; - } - while( zLine[n] ){ n++; } - if( n>0 && zLine[n-1]=='\n' ){ - n--; - zLine[n] = 0; - eol = 1; - } - } - zLine = realloc( zLine, n+1 ); - return zLine; -} - -/* -** Retrieve a single line of input text. -** -** zPrior is a string of prior text retrieved. If not the empty -** string, then issue a continuation prompt. -*/ -static char *one_input_line(const char *zPrior, FILE *in){ - char *zPrompt; - char *zResult; - if( in!=0 ){ - return local_getline(0, in); - } - if( zPrior && zPrior[0] ){ - zPrompt = continuePrompt; - }else{ - zPrompt = mainPrompt; - } - zResult = readline(zPrompt); -#if defined(HAVE_READLINE) && HAVE_READLINE==1 - if( zResult && *zResult ) add_history(zResult); -#endif - return zResult; -} - -struct previous_mode_data { - int valid; /* Is there legit data in here? */ - int mode; - int showHeader; - int colWidth[100]; -}; - -/* -** An pointer to an instance of this structure is passed from -** the main program to the callback. This is used to communicate -** state and mode information. -*/ -struct callback_data { - sqlite3 *db; /* The database */ - int echoOn; /* True to echo input commands */ - int cnt; /* Number of records displayed so far */ - FILE *out; /* Write results here */ - int mode; /* An output mode setting */ - int writableSchema; /* True if PRAGMA writable_schema=ON */ - int showHeader; /* True to show column names in List or Column mode */ - char *zDestTable; /* Name of destination table when MODE_Insert */ - char separator[20]; /* Separator character for MODE_List */ - int colWidth[100]; /* Requested width of each column when in column mode*/ - int actualWidth[100]; /* Actual width of each column */ - char nullvalue[20]; /* The text to print when a NULL comes back from - ** the database */ - struct previous_mode_data explainPrev; - /* Holds the mode information just before - ** .explain ON */ - char outfile[FILENAME_MAX]; /* Filename for *out */ - const char *zDbFilename; /* name of the database file */ -}; - -/* -** These are the allowed modes. -*/ -#define MODE_Line 0 /* One column per line. Blank line between records */ -#define MODE_Column 1 /* One record per line in neat columns */ -#define MODE_List 2 /* One record per line with a separator */ -#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ -#define MODE_Html 4 /* Generate an XHTML table */ -#define MODE_Insert 5 /* Generate SQL "insert" statements */ -#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */ -#define MODE_Csv 7 /* Quote strings, numbers are plain */ -#define MODE_NUM_OF 8 /* The number of modes (not a mode itself) */ - -static const char *modeDescr[MODE_NUM_OF] = { - "line", - "column", - "list", - "semi", - "html", - "insert", - "tcl", - "csv", -}; - -/* -** Number of elements in an array -*/ -#define ArraySize(X) (sizeof(X)/sizeof(X[0])) - -/* -** Output the given string as a quoted string using SQL quoting conventions. -*/ -static void output_quoted_string(FILE *out, const char *z){ - int i; - int nSingle = 0; - for(i=0; z[i]; i++){ - if( z[i]=='\'' ) nSingle++; - } - if( nSingle==0 ){ - fprintf(out,"'%s'",z); - }else{ - fprintf(out,"'"); - while( *z ){ - for(i=0; z[i] && z[i]!='\''; i++){} - if( i==0 ){ - fprintf(out,"''"); - z++; - }else if( z[i]=='\'' ){ - fprintf(out,"%.*s''",i,z); - z += i+1; - }else{ - fprintf(out,"%s",z); - break; - } - } - fprintf(out,"'"); - } -} - -/* -** Output the given string as a quoted according to C or TCL quoting rules. -*/ -static void output_c_string(FILE *out, const char *z){ - unsigned int c; - fputc('"', out); - while( (c = *(z++))!=0 ){ - if( c=='\\' ){ - fputc(c, out); - fputc(c, out); - }else if( c=='\t' ){ - fputc('\\', out); - fputc('t', out); - }else if( c=='\n' ){ - fputc('\\', out); - fputc('n', out); - }else if( c=='\r' ){ - fputc('\\', out); - fputc('r', out); - }else if( !isprint(c) ){ - fprintf(out, "\\%03o", c&0xff); - }else{ - fputc(c, out); - } - } - fputc('"', out); -} - -/* -** Output the given string with characters that are special to -** HTML escaped. -*/ -static void output_html_string(FILE *out, const char *z){ - int i; - while( *z ){ - for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){} - if( i>0 ){ - fprintf(out,"%.*s",i,z); - } - if( z[i]=='<' ){ - fprintf(out,"<"); - }else if( z[i]=='&' ){ - fprintf(out,"&"); - }else{ - break; - } - z += i + 1; - } -} - -/* -** If a field contains any character identified by a 1 in the following -** array, then the string must be quoted for CSV. -*/ -static const char needCsvQuote[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -/* -** Output a single term of CSV. Actually, p->separator is used for -** the separator, which may or may not be a comma. p->nullvalue is -** the null value. Strings are quoted using ANSI-C rules. Numbers -** appear outside of quotes. -*/ -static void output_csv(struct callback_data *p, const char *z, int bSep){ - FILE *out = p->out; - if( z==0 ){ - fprintf(out,"%s",p->nullvalue); - }else{ - int i; - for(i=0; z[i]; i++){ - if( needCsvQuote[((unsigned char*)z)[i]] ){ - i = 0; - break; - } - } - if( i==0 ){ - putc('"', out); - for(i=0; z[i]; i++){ - if( z[i]=='"' ) putc('"', out); - putc(z[i], out); - } - putc('"', out); - }else{ - fprintf(out, "%s", z); - } - } - if( bSep ){ - fprintf(p->out, p->separator); - } -} - -#ifdef SIGINT -/* -** This routine runs when the user presses Ctrl-C -*/ -static void interrupt_handler(int NotUsed){ - seenInterrupt = 1; - if( db ) sqlite3_interrupt(db); -} -#endif - -/* -** This is the callback routine that the SQLite library -** invokes for each row of a query result. -*/ -static int callback(void *pArg, int nArg, char **azArg, char **azCol){ - int i; - struct callback_data *p = (struct callback_data*)pArg; - switch( p->mode ){ - case MODE_Line: { - int w = 5; - if( azArg==0 ) break; - for(i=0; iw ) w = len; - } - if( p->cnt++>0 ) fprintf(p->out,"\n"); - for(i=0; iout,"%*s = %s\n", w, azCol[i], - azArg[i] ? azArg[i] : p->nullvalue); - } - break; - } - case MODE_Column: { - if( p->cnt++==0 ){ - for(i=0; icolWidth) ){ - w = p->colWidth[i]; - }else{ - w = 0; - } - if( w<=0 ){ - w = strlen(azCol[i] ? azCol[i] : ""); - if( w<10 ) w = 10; - n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue); - if( wactualWidth) ){ - p->actualWidth[i] = w; - } - if( p->showHeader ){ - fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " "); - } - } - if( p->showHeader ){ - for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - }else{ - w = 10; - } - fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------" - "----------------------------------------------------------", - i==nArg-1 ? "\n": " "); - } - } - } - if( azArg==0 ) break; - for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - }else{ - w = 10; - } - fprintf(p->out,"%-*.*s%s",w,w, - azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " "); - } - break; - } - case MODE_Semi: - case MODE_List: { - if( p->cnt++==0 && p->showHeader ){ - for(i=0; iout,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator); - } - } - if( azArg==0 ) break; - for(i=0; inullvalue; - fprintf(p->out, "%s", z); - if( iout, "%s", p->separator); - }else if( p->mode==MODE_Semi ){ - fprintf(p->out, ";\n"); - }else{ - fprintf(p->out, "\n"); - } - } - break; - } - case MODE_Html: { - if( p->cnt++==0 && p->showHeader ){ - fprintf(p->out,""); - for(i=0; iout,"",azCol[i]); - } - fprintf(p->out,"\n"); - } - if( azArg==0 ) break; - fprintf(p->out,""); - for(i=0; iout,"\n"); - } - fprintf(p->out,"\n"); - break; - } - case MODE_Tcl: { - if( p->cnt++==0 && p->showHeader ){ - for(i=0; iout,azCol[i] ? azCol[i] : ""); - fprintf(p->out, "%s", p->separator); - } - fprintf(p->out,"\n"); - } - if( azArg==0 ) break; - for(i=0; iout, azArg[i] ? azArg[i] : p->nullvalue); - fprintf(p->out, "%s", p->separator); - } - fprintf(p->out,"\n"); - break; - } - case MODE_Csv: { - if( p->cnt++==0 && p->showHeader ){ - for(i=0; iout,"\n"); - } - if( azArg==0 ) break; - for(i=0; iout,"\n"); - break; - } - case MODE_Insert: { - if( azArg==0 ) break; - fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); - for(i=0; i0 ? ",": ""; - if( azArg[i]==0 ){ - fprintf(p->out,"%sNULL",zSep); - }else if( isNumber(azArg[i], 0) ){ - fprintf(p->out,"%s%s",zSep, azArg[i]); - }else{ - if( zSep[0] ) fprintf(p->out,"%s",zSep); - output_quoted_string(p->out, azArg[i]); - } - } - fprintf(p->out,");\n"); - break; - } - } - return 0; -} - -/* -** Set the destination table field of the callback_data structure to -** the name of the table given. Escape any quote characters in the -** table name. -*/ -static void set_table_name(struct callback_data *p, const char *zName){ - int i, n; - int needQuote; - char *z; - - if( p->zDestTable ){ - free(p->zDestTable); - p->zDestTable = 0; - } - if( zName==0 ) return; - needQuote = !isalpha((unsigned char)*zName) && *zName!='_'; - for(i=n=0; zName[i]; i++, n++){ - if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){ - needQuote = 1; - if( zName[i]=='\'' ) n++; - } - } - if( needQuote ) n += 2; - z = p->zDestTable = malloc( n+1 ); - if( z==0 ){ - fprintf(stderr,"Out of memory!\n"); - exit(1); - } - n = 0; - if( needQuote ) z[n++] = '\''; - for(i=0; zName[i]; i++){ - z[n++] = zName[i]; - if( zName[i]=='\'' ) z[n++] = '\''; - } - if( needQuote ) z[n++] = '\''; - z[n] = 0; -} - -/* zIn is either a pointer to a NULL-terminated string in memory obtained -** from malloc(), or a NULL pointer. The string pointed to by zAppend is -** added to zIn, and the result returned in memory obtained from malloc(). -** zIn, if it was not NULL, is freed. -** -** If the third argument, quote, is not '\0', then it is used as a -** quote character for zAppend. -*/ -static char *appendText(char *zIn, char const *zAppend, char quote){ - int len; - int i; - int nAppend = strlen(zAppend); - int nIn = (zIn?strlen(zIn):0); - - len = nAppend+nIn+1; - if( quote ){ - len += 2; - for(i=0; iout, "DELETE FROM sqlite_sequence;\n"); - }else if( strcmp(zTable, "sqlite_stat1")==0 ){ - fprintf(p->out, "ANALYZE sqlite_master;\n"); - }else if( strncmp(zTable, "sqlite_", 7)==0 ){ - return 0; - }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ - char *zIns; - if( !p->writableSchema ){ - fprintf(p->out, "PRAGMA writable_schema=ON;\n"); - p->writableSchema = 1; - } - zIns = sqlite3_mprintf( - "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" - "VALUES('table','%q','%q',0,'%q');", - zTable, zTable, zSql); - fprintf(p->out, "%s\n", zIns); - sqlite3_free(zIns); - return 0; - }else{ - fprintf(p->out, "%s;\n", zSql); - } - - if( strcmp(zType, "table")==0 ){ - sqlite3_stmt *pTableInfo = 0; - char *zSelect = 0; - char *zTableInfo = 0; - char *zTmp = 0; - - zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0); - zTableInfo = appendText(zTableInfo, zTable, '"'); - zTableInfo = appendText(zTableInfo, ");", 0); - - rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0); - if( zTableInfo ) free(zTableInfo); - if( rc!=SQLITE_OK || !pTableInfo ){ - return 1; - } - - zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0); - zTmp = appendText(zTmp, zTable, '"'); - if( zTmp ){ - zSelect = appendText(zSelect, zTmp, '\''); - } - zSelect = appendText(zSelect, " || ' VALUES(' || ", 0); - rc = sqlite3_step(pTableInfo); - while( rc==SQLITE_ROW ){ - const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1); - zSelect = appendText(zSelect, "quote(", 0); - zSelect = appendText(zSelect, zText, '"'); - rc = sqlite3_step(pTableInfo); - if( rc==SQLITE_ROW ){ - zSelect = appendText(zSelect, ") || ',' || ", 0); - }else{ - zSelect = appendText(zSelect, ") ", 0); - } - } - rc = sqlite3_finalize(pTableInfo); - if( rc!=SQLITE_OK ){ - if( zSelect ) free(zSelect); - return 1; - } - zSelect = appendText(zSelect, "|| ')' FROM ", 0); - zSelect = appendText(zSelect, zTable, '"'); - - rc = run_table_dump_query(p->out, p->db, zSelect); - if( rc==SQLITE_CORRUPT ){ - zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0); - rc = run_table_dump_query(p->out, p->db, zSelect); - } - if( zSelect ) free(zSelect); - } - return 0; -} - -/* -** Run zQuery. Use dump_callback() as the callback routine so that -** the contents of the query are output as SQL statements. -** -** If we get a SQLITE_CORRUPT error, rerun the query after appending -** "ORDER BY rowid DESC" to the end. -*/ -static int run_schema_dump_query( - struct callback_data *p, - const char *zQuery, - char **pzErrMsg -){ - int rc; - rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg); - if( rc==SQLITE_CORRUPT ){ - char *zQ2; - int len = strlen(zQuery); - if( pzErrMsg ) sqlite3_free(*pzErrMsg); - zQ2 = malloc( len+100 ); - if( zQ2==0 ) return rc; - sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); - rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg); - free(zQ2); - } - return rc; -} - -/* -** Text of a help message -*/ -static char zHelp[] = - ".bail ON|OFF Stop after hitting an error. Default OFF\n" - ".databases List names and files of attached databases\n" - ".dump ?TABLE? ... Dump the database in an SQL text format\n" - ".echo ON|OFF Turn command echo on or off\n" - ".exit Exit this program\n" - ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n" - ".header(s) ON|OFF Turn display of headers on or off\n" - ".help Show this message\n" - ".import FILE TABLE Import data from FILE into TABLE\n" - ".indices TABLE Show names of all indices on TABLE\n" -#ifdef SQLITE_ENABLE_IOTRACE - ".iotrace FILE Enable I/O diagnostic logging to FILE\n" -#endif -#ifndef SQLITE_OMIT_LOAD_EXTENSION - ".load FILE ?ENTRY? Load an extension library\n" -#endif - ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" - " csv Comma-separated values\n" - " column Left-aligned columns. (See .width)\n" - " html HTML
    %s
    "); - output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); - fprintf(p->out,"
    code\n" - " insert SQL insert statements for TABLE\n" - " line One value per line\n" - " list Values delimited by .separator string\n" - " tabs Tab-separated values\n" - " tcl TCL list elements\n" - ".nullvalue STRING Print STRING in place of NULL values\n" - ".output FILENAME Send output to FILENAME\n" - ".output stdout Send output to the screen\n" - ".prompt MAIN CONTINUE Replace the standard prompts\n" - ".quit Exit this program\n" - ".read FILENAME Execute SQL in FILENAME\n" - ".schema ?TABLE? Show the CREATE statements\n" - ".separator STRING Change separator used by output mode and .import\n" - ".show Show the current values for various settings\n" - ".tables ?PATTERN? List names of tables matching a LIKE pattern\n" - ".timeout MS Try opening locked tables for MS milliseconds\n" - ".width NUM NUM ... Set column widths for \"column\" mode\n" -; - -/* Forward reference */ -static int process_input(struct callback_data *p, FILE *in); - -/* -** Make sure the database is open. If it is not, then open it. If -** the database fails to open, print an error message and exit. -*/ -static void open_db(struct callback_data *p){ - if( p->db==0 ){ - sqlite3_open(p->zDbFilename, &p->db); - db = p->db; - sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, - shellstaticFunc, 0, 0); - if( SQLITE_OK!=sqlite3_errcode(db) ){ - fprintf(stderr,"Unable to open database \"%s\": %s\n", - p->zDbFilename, sqlite3_errmsg(db)); - exit(1); - } -#ifndef SQLITE_OMIT_LOAD_EXTENSION - sqlite3_enable_load_extension(p->db, 1); -#endif - } -} - -/* -** Do C-language style dequoting. -** -** \t -> tab -** \n -> newline -** \r -> carriage return -** \NNN -> ascii character NNN in octal -** \\ -> backslash -*/ -static void resolve_backslashes(char *z){ - int i, j, c; - for(i=j=0; (c = z[i])!=0; i++, j++){ - if( c=='\\' ){ - c = z[++i]; - if( c=='n' ){ - c = '\n'; - }else if( c=='t' ){ - c = '\t'; - }else if( c=='r' ){ - c = '\r'; - }else if( c>='0' && c<='7' ){ - c -= '0'; - if( z[i+1]>='0' && z[i+1]<='7' ){ - i++; - c = (c<<3) + z[i] - '0'; - if( z[i+1]>='0' && z[i+1]<='7' ){ - i++; - c = (c<<3) + z[i] - '0'; - } - } - } - } - z[j] = c; - } - z[j] = 0; -} - -/* -** Interpret zArg as a boolean value. Return either 0 or 1. -*/ -static int booleanValue(char *zArg){ - int val = atoi(zArg); - int j; - for(j=0; zArg[j]; j++){ - zArg[j] = tolower(zArg[j]); - } - if( strcmp(zArg,"on")==0 ){ - val = 1; - }else if( strcmp(zArg,"yes")==0 ){ - val = 1; - } - return val; -} - -/* -** If an input line begins with "." then invoke this routine to -** process that line. -** -** Return 1 on error, 2 to exit, and 0 otherwise. -*/ -static int do_meta_command(char *zLine, struct callback_data *p){ - int i = 1; - int nArg = 0; - int n, c; - int rc = 0; - char *azArg[50]; - - /* Parse the input line into tokens. - */ - while( zLine[i] && nArg1 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){ - bail_on_error = booleanValue(azArg[1]); - }else - - if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ - struct callback_data data; - char *zErrMsg = 0; - open_db(p); - memcpy(&data, p, sizeof(data)); - data.showHeader = 1; - data.mode = MODE_Column; - data.colWidth[0] = 3; - data.colWidth[1] = 15; - data.colWidth[2] = 58; - data.cnt = 0; - sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); - if( zErrMsg ){ - fprintf(stderr,"Error: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - } - }else - - if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ - char *zErrMsg = 0; - open_db(p); - fprintf(p->out, "BEGIN TRANSACTION;\n"); - p->writableSchema = 0; - if( nArg==1 ){ - run_schema_dump_query(p, - "SELECT name, type, sql FROM sqlite_master " - "WHERE sql NOT NULL AND type=='table'", 0 - ); - run_table_dump_query(p->out, p->db, - "SELECT sql FROM sqlite_master " - "WHERE sql NOT NULL AND type IN ('index','trigger','view')" - ); - }else{ - int i; - for(i=1; iout, p->db, - "SELECT sql FROM sqlite_master " - "WHERE sql NOT NULL" - " AND type IN ('index','trigger','view')" - " AND tbl_name LIKE shellstatic()" - ); - zShellStatic = 0; - } - } - if( p->writableSchema ){ - fprintf(p->out, "PRAGMA writable_schema=OFF;\n"); - p->writableSchema = 0; - } - if( zErrMsg ){ - fprintf(stderr,"Error: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - }else{ - fprintf(p->out, "COMMIT;\n"); - } - }else - - if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){ - p->echoOn = booleanValue(azArg[1]); - }else - - if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ - rc = 2; - }else - - if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ - int val = nArg>=2 ? booleanValue(azArg[1]) : 1; - if(val == 1) { - if(!p->explainPrev.valid) { - p->explainPrev.valid = 1; - p->explainPrev.mode = p->mode; - p->explainPrev.showHeader = p->showHeader; - memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); - } - /* We could put this code under the !p->explainValid - ** condition so that it does not execute if we are already in - ** explain mode. However, always executing it allows us an easy - ** was to reset to explain mode in case the user previously - ** did an .explain followed by a .width, .mode or .header - ** command. - */ - p->mode = MODE_Column; - p->showHeader = 1; - memset(p->colWidth,0,ArraySize(p->colWidth)); - p->colWidth[0] = 4; - p->colWidth[1] = 14; - p->colWidth[2] = 10; - p->colWidth[3] = 10; - p->colWidth[4] = 33; - }else if (p->explainPrev.valid) { - p->explainPrev.valid = 0; - p->mode = p->explainPrev.mode; - p->showHeader = p->explainPrev.showHeader; - memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); - } - }else - - if( c=='h' && (strncmp(azArg[0], "header", n)==0 || - strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){ - p->showHeader = booleanValue(azArg[1]); - }else - - if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ - fprintf(stderr,zHelp); - }else - - if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){ - char *zTable = azArg[2]; /* Insert data into this table */ - char *zFile = azArg[1]; /* The file from which to extract data */ - sqlite3_stmt *pStmt; /* A statement */ - int rc; /* Result code */ - int nCol; /* Number of columns in the table */ - int nByte; /* Number of bytes in an SQL string */ - int i, j; /* Loop counters */ - int nSep; /* Number of bytes in p->separator[] */ - char *zSql; /* An SQL statement */ - char *zLine; /* A single line of input from the file */ - char **azCol; /* zLine[] broken up into columns */ - char *zCommit; /* How to commit changes */ - FILE *in; /* The input file */ - int lineno = 0; /* Line number of input file */ - - open_db(p); - nSep = strlen(p->separator); - if( nSep==0 ){ - fprintf(stderr, "non-null separator required for import\n"); - return 0; - } - zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable); - if( zSql==0 ) return 0; - nByte = strlen(zSql); - rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); - sqlite3_free(zSql); - if( rc ){ - fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); - nCol = 0; - rc = 1; - }else{ - nCol = sqlite3_column_count(pStmt); - } - sqlite3_finalize(pStmt); - if( nCol==0 ) return 0; - zSql = malloc( nByte + 20 + nCol*2 ); - if( zSql==0 ) return 0; - sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable); - j = strlen(zSql); - for(i=1; idb, zSql, -1, &pStmt, 0); - free(zSql); - if( rc ){ - fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); - sqlite3_finalize(pStmt); - return 1; - } - in = fopen(zFile, "rb"); - if( in==0 ){ - fprintf(stderr, "cannot open file: %s\n", zFile); - sqlite3_finalize(pStmt); - return 0; - } - azCol = malloc( sizeof(azCol[0])*(nCol+1) ); - if( azCol==0 ){ - fclose(in); - return 0; - } - sqlite3_exec(p->db, "BEGIN", 0, 0, 0); - zCommit = "COMMIT"; - while( (zLine = local_getline(0, in))!=0 ){ - char *z; - i = 0; - lineno++; - azCol[0] = zLine; - for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){ - if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){ - *z = 0; - i++; - if( idb, zCommit, 0, 0, 0); - }else - - if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){ - struct callback_data data; - char *zErrMsg = 0; - open_db(p); - memcpy(&data, p, sizeof(data)); - data.showHeader = 0; - data.mode = MODE_List; - zShellStatic = azArg[1]; - sqlite3_exec(p->db, - "SELECT name FROM sqlite_master " - "WHERE type='index' AND tbl_name LIKE shellstatic() " - "UNION ALL " - "SELECT name FROM sqlite_temp_master " - "WHERE type='index' AND tbl_name LIKE shellstatic() " - "ORDER BY 1", - callback, &data, &zErrMsg - ); - zShellStatic = 0; - if( zErrMsg ){ - fprintf(stderr,"Error: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - } - }else - -#ifdef SQLITE_ENABLE_IOTRACE - if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ - extern void (*sqlite3_io_trace)(const char*, ...); - if( iotrace && iotrace!=stdout ) fclose(iotrace); - iotrace = 0; - if( nArg<2 ){ - sqlite3_io_trace = 0; - }else if( strcmp(azArg[1], "-")==0 ){ - sqlite3_io_trace = iotracePrintf; - iotrace = stdout; - }else{ - iotrace = fopen(azArg[1], "w"); - if( iotrace==0 ){ - fprintf(stderr, "cannot open \"%s\"\n", azArg[1]); - sqlite3_io_trace = 0; - }else{ - sqlite3_io_trace = iotracePrintf; - } - } - }else -#endif - -#ifndef SQLITE_OMIT_LOAD_EXTENSION - if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ - const char *zFile, *zProc; - char *zErrMsg = 0; - int rc; - zFile = azArg[1]; - zProc = nArg>=3 ? azArg[2] : 0; - open_db(p); - rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); - if( rc!=SQLITE_OK ){ - fprintf(stderr, "%s\n", zErrMsg); - sqlite3_free(zErrMsg); - rc = 1; - } - }else -#endif - - if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){ - int n2 = strlen(azArg[1]); - if( strncmp(azArg[1],"line",n2)==0 - || - strncmp(azArg[1],"lines",n2)==0 ){ - p->mode = MODE_Line; - }else if( strncmp(azArg[1],"column",n2)==0 - || - strncmp(azArg[1],"columns",n2)==0 ){ - p->mode = MODE_Column; - }else if( strncmp(azArg[1],"list",n2)==0 ){ - p->mode = MODE_List; - }else if( strncmp(azArg[1],"html",n2)==0 ){ - p->mode = MODE_Html; - }else if( strncmp(azArg[1],"tcl",n2)==0 ){ - p->mode = MODE_Tcl; - }else if( strncmp(azArg[1],"csv",n2)==0 ){ - p->mode = MODE_Csv; - sqlite3_snprintf(sizeof(p->separator), p->separator, ","); - }else if( strncmp(azArg[1],"tabs",n2)==0 ){ - p->mode = MODE_List; - sqlite3_snprintf(sizeof(p->separator), p->separator, "\t"); - }else if( strncmp(azArg[1],"insert",n2)==0 ){ - p->mode = MODE_Insert; - if( nArg>=3 ){ - set_table_name(p, azArg[2]); - }else{ - set_table_name(p, "table"); - } - }else { - fprintf(stderr,"mode should be one of: " - "column csv html insert line list tabs tcl\n"); - } - }else - - if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { - sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue, - "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); - }else - - if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ - if( p->out!=stdout ){ - fclose(p->out); - } - if( strcmp(azArg[1],"stdout")==0 ){ - p->out = stdout; - sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout"); - }else{ - p->out = fopen(azArg[1], "wb"); - if( p->out==0 ){ - fprintf(stderr,"can't write to \"%s\"\n", azArg[1]); - p->out = stdout; - } else { - sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); - } - } - }else - - if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){ - if( nArg >= 2) { - strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); - } - if( nArg >= 3) { - strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); - } - }else - - if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ - rc = 2; - }else - - if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ - FILE *alt = fopen(azArg[1], "rb"); - if( alt==0 ){ - fprintf(stderr,"can't open \"%s\"\n", azArg[1]); - }else{ - process_input(p, alt); - fclose(alt); - } - }else - - if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ - struct callback_data data; - char *zErrMsg = 0; - open_db(p); - memcpy(&data, p, sizeof(data)); - data.showHeader = 0; - data.mode = MODE_Semi; - if( nArg>1 ){ - int i; - for(i=0; azArg[1][i]; i++) azArg[1][i] = tolower(azArg[1][i]); - if( strcmp(azArg[1],"sqlite_master")==0 ){ - char *new_argv[2], *new_colv[2]; - new_argv[0] = "CREATE TABLE sqlite_master (\n" - " type text,\n" - " name text,\n" - " tbl_name text,\n" - " rootpage integer,\n" - " sql text\n" - ")"; - new_argv[1] = 0; - new_colv[0] = "sql"; - new_colv[1] = 0; - callback(&data, 1, new_argv, new_colv); - }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){ - char *new_argv[2], *new_colv[2]; - new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n" - " type text,\n" - " name text,\n" - " tbl_name text,\n" - " rootpage integer,\n" - " sql text\n" - ")"; - new_argv[1] = 0; - new_colv[0] = "sql"; - new_colv[1] = 0; - callback(&data, 1, new_argv, new_colv); - }else{ - zShellStatic = azArg[1]; - sqlite3_exec(p->db, - "SELECT sql FROM " - " (SELECT * FROM sqlite_master UNION ALL" - " SELECT * FROM sqlite_temp_master) " - "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL " - "ORDER BY substr(type,2,1), name", - callback, &data, &zErrMsg); - zShellStatic = 0; - } - }else{ - sqlite3_exec(p->db, - "SELECT sql FROM " - " (SELECT * FROM sqlite_master UNION ALL" - " SELECT * FROM sqlite_temp_master) " - "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" - "ORDER BY substr(type,2,1), name", - callback, &data, &zErrMsg - ); - } - if( zErrMsg ){ - fprintf(stderr,"Error: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - } - }else - - if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ - sqlite3_snprintf(sizeof(p->separator), p->separator, - "%.*s", (int)sizeof(p->separator)-1, azArg[1]); - }else - - if( c=='s' && strncmp(azArg[0], "show", n)==0){ - int i; - fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); - fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); - fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); - fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); - fprintf(p->out,"%9.9s: ", "nullvalue"); - output_c_string(p->out, p->nullvalue); - fprintf(p->out, "\n"); - fprintf(p->out,"%9.9s: %s\n","output", - strlen(p->outfile) ? p->outfile : "stdout"); - fprintf(p->out,"%9.9s: ", "separator"); - output_c_string(p->out, p->separator); - fprintf(p->out, "\n"); - fprintf(p->out,"%9.9s: ","width"); - for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { - fprintf(p->out,"%d ",p->colWidth[i]); - } - fprintf(p->out,"\n"); - }else - - if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ - char **azResult; - int nRow, rc; - char *zErrMsg; - open_db(p); - if( nArg==1 ){ - rc = sqlite3_get_table(p->db, - "SELECT name FROM sqlite_master " - "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'" - "UNION ALL " - "SELECT name FROM sqlite_temp_master " - "WHERE type IN ('table','view') " - "ORDER BY 1", - &azResult, &nRow, 0, &zErrMsg - ); - }else{ - zShellStatic = azArg[1]; - rc = sqlite3_get_table(p->db, - "SELECT name FROM sqlite_master " - "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " - "UNION ALL " - "SELECT name FROM sqlite_temp_master " - "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " - "ORDER BY 1", - &azResult, &nRow, 0, &zErrMsg - ); - zShellStatic = 0; - } - if( zErrMsg ){ - fprintf(stderr,"Error: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - } - if( rc==SQLITE_OK ){ - int len, maxlen = 0; - int i, j; - int nPrintCol, nPrintRow; - for(i=1; i<=nRow; i++){ - if( azResult[i]==0 ) continue; - len = strlen(azResult[i]); - if( len>maxlen ) maxlen = len; - } - nPrintCol = 80/(maxlen+2); - if( nPrintCol<1 ) nPrintCol = 1; - nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; - for(i=0; i1 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){ - open_db(p); - sqlite3_busy_timeout(p->db, atoi(azArg[1])); - }else - - if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ - int j; - assert( nArg<=ArraySize(azArg) ); - for(j=1; jcolWidth); j++){ - p->colWidth[j-1] = atoi(azArg[j]); - } - }else - - { - fprintf(stderr, "unknown command or invalid arguments: " - " \"%s\". Enter \".help\" for help\n", azArg[0]); - } - - return rc; -} - -/* -** Return TRUE if a semicolon occurs anywhere in the first N characters -** of string z[]. -*/ -static int _contains_semicolon(const char *z, int N){ - int i; - for(i=0; iout); - free(zLine); - zLine = one_input_line(zSql, in); - if( zLine==0 ){ - break; /* We have reached EOF */ - } - if( seenInterrupt ){ - if( in!=0 ) break; - seenInterrupt = 0; - } - lineno++; - if( p->echoOn ) printf("%s\n", zLine); - if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue; - if( zLine && zLine[0]=='.' && nSql==0 ){ - rc = do_meta_command(zLine, p); - if( rc==2 ){ - break; - }else if( rc ){ - errCnt++; - } - continue; - } - if( _is_command_terminator(zLine) ){ - memcpy(zLine,";",2); - } - nSqlPrior = nSql; - if( zSql==0 ){ - int i; - for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){} - if( zLine[i]!=0 ){ - nSql = strlen(zLine); - zSql = malloc( nSql+1 ); - if( zSql==0 ){ - fprintf(stderr, "out of memory\n"); - exit(1); - } - memcpy(zSql, zLine, nSql+1); - startline = lineno; - } - }else{ - int len = strlen(zLine); - zSql = realloc( zSql, nSql + len + 2 ); - if( zSql==0 ){ - fprintf(stderr,"%s: out of memory!\n", Argv0); - exit(1); - } - zSql[nSql++] = '\n'; - memcpy(&zSql[nSql], zLine, len+1); - nSql += len; - } - if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) - && sqlite3_complete(zSql) ){ - p->cnt = 0; - open_db(p); - rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg); - if( rc || zErrMsg ){ - char zPrefix[100]; - if( in!=0 || !stdin_is_interactive ){ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, - "SQL error near line %d:", startline); - }else{ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:"); - } - if( zErrMsg!=0 ){ - printf("%s %s\n", zPrefix, zErrMsg); - sqlite3_free(zErrMsg); - zErrMsg = 0; - }else{ - printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db)); - } - errCnt++; - } - free(zSql); - zSql = 0; - nSql = 0; - } - } - if( zSql ){ - if( !_all_whitespace(zSql) ) printf("Incomplete SQL: %s\n", zSql); - free(zSql); - } - free(zLine); - return errCnt; -} - -/* -** Return a pathname which is the user's home directory. A -** 0 return indicates an error of some kind. Space to hold the -** resulting string is obtained from malloc(). The calling -** function should free the result. -*/ -static char *find_home_dir(void){ - char *home_dir = NULL; - -#if !defined(_WIN32) && !defined(WIN32) && !defined(__MACOS__) && !defined(__OS2__) - struct passwd *pwent; - uid_t uid = getuid(); - if( (pwent=getpwuid(uid)) != NULL) { - home_dir = pwent->pw_dir; - } -#endif - -#ifdef __MACOS__ - char home_path[_MAX_PATH+1]; - home_dir = getcwd(home_path, _MAX_PATH); -#endif - -#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) - if (!home_dir) { - home_dir = getenv("USERPROFILE"); - } -#endif - - if (!home_dir) { - home_dir = getenv("HOME"); - } - -#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) - if (!home_dir) { - char *zDrive, *zPath; - int n; - zDrive = getenv("HOMEDRIVE"); - zPath = getenv("HOMEPATH"); - if( zDrive && zPath ){ - n = strlen(zDrive) + strlen(zPath) + 1; - home_dir = malloc( n ); - if( home_dir==0 ) return 0; - sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); - return home_dir; - } - home_dir = "c:\\"; - } -#endif - - if( home_dir ){ - int n = strlen(home_dir) + 1; - char *z = malloc( n ); - if( z ) memcpy(z, home_dir, n); - home_dir = z; - } - - return home_dir; -} - -/* -** Read input from the file given by sqliterc_override. Or if that -** parameter is NULL, take input from ~/.sqliterc -*/ -static void process_sqliterc( - struct callback_data *p, /* Configuration data */ - const char *sqliterc_override /* Name of config file. NULL to use default */ -){ - char *home_dir = NULL; - const char *sqliterc = sqliterc_override; - char *zBuf = 0; - FILE *in = NULL; - int nBuf; - - if (sqliterc == NULL) { - home_dir = find_home_dir(); - if( home_dir==0 ){ - fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0); - return; - } - nBuf = strlen(home_dir) + 16; - zBuf = malloc( nBuf ); - if( zBuf==0 ){ - fprintf(stderr,"%s: out of memory!\n", Argv0); - exit(1); - } - sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir); - free(home_dir); - sqliterc = (const char*)zBuf; - } - in = fopen(sqliterc,"rb"); - if( in ){ - if( stdin_is_interactive ){ - printf("-- Loading resources from %s\n",sqliterc); - } - process_input(p,in); - fclose(in); - } - free(zBuf); - return; -} - -/* -** Show available command line options -*/ -static const char zOptions[] = - " -init filename read/process named file\n" - " -echo print commands before execution\n" - " -[no]header turn headers on or off\n" - " -bail stop after hitting an error\n" - " -interactive force interactive I/O\n" - " -batch force batch I/O\n" - " -column set output mode to 'column'\n" - " -csv set output mode to 'csv'\n" - " -html set output mode to HTML\n" - " -line set output mode to 'line'\n" - " -list set output mode to 'list'\n" - " -separator 'x' set output field separator (|)\n" - " -nullvalue 'text' set text string for NULL values\n" - " -version show SQLite version\n" -; -static void usage(int showDetail){ - fprintf(stderr, - "Usage: %s [OPTIONS] FILENAME [SQL]\n" - "FILENAME is the name of an SQLite database. A new database is created\n" - "if the file does not previously exist.\n", Argv0); - if( showDetail ){ - fprintf(stderr, "OPTIONS include:\n%s", zOptions); - }else{ - fprintf(stderr, "Use the -help option for additional information\n"); - } - exit(1); -} - -/* -** Initialize the state information in data -*/ -static void main_init(struct callback_data *data) { - memset(data, 0, sizeof(*data)); - data->mode = MODE_List; - memcpy(data->separator,"|", 2); - data->showHeader = 0; - sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); - sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); -} - -int main(int argc, char **argv){ - char *zErrMsg = 0; - struct callback_data data; - const char *zInitFile = 0; - char *zFirstCmd = 0; - int i; - int rc = 0; - -#ifdef __MACOS__ - argc = ccommand(&argv); -#endif - - Argv0 = argv[0]; - main_init(&data); - stdin_is_interactive = isatty(0); - - /* Make sure we have a valid signal handler early, before anything - ** else is done. - */ -#ifdef SIGINT - signal(SIGINT, interrupt_handler); -#endif - - /* Do an initial pass through the command-line argument to locate - ** the name of the database file, the name of the initialization file, - ** and the first command to execute. - */ - for(i=1; i /* Needed for the definition of va_list */ - -/* -** Make sure we can call this stuff from C++. -*/ -#ifdef __cplusplus -extern "C" { -#endif - - -/* -** Add the ability to override 'extern' -*/ -#ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern -#endif - -/* -** Make sure these symbols where not defined by some previous header -** file. -*/ -#ifdef SQLITE_VERSION -# undef SQLITE_VERSION -#endif -#ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER -#endif - -/* -** CAPI3REF: Compile-Time Library Version Numbers -** -** The version of the SQLite library is contained in the sqlite3.h -** header file in a #define named SQLITE_VERSION. The SQLITE_VERSION -** macro resolves to a string constant. -** -** The format of the version string is "X.Y.Z", where -** X is the major version number, Y is the minor version number and Z -** is the release number. The X.Y.Z might be followed by "alpha" or "beta". -** For example "3.1.1beta". -** -** The X value is always 3 in SQLite. The X value only changes when -** backwards compatibility is broken and we intend to never break -** backwards compatibility. The Y value only changes when -** there are major feature enhancements that are forwards compatible -** but not backwards compatible. The Z value is incremented with -** each release but resets back to 0 when Y is incremented. -** -** The SQLITE_VERSION_NUMBER is an integer with the value -** (X*1000000 + Y*1000 + Z). For example, for version "3.1.1beta", -** SQLITE_VERSION_NUMBER is set to 3001001. To detect if they are using -** version 3.1.1 or greater at compile time, programs may use the test -** (SQLITE_VERSION_NUMBER>=3001001). -** -** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. -*/ -#define SQLITE_VERSION "--VERS--" -#define SQLITE_VERSION_NUMBER --VERSION-NUMBER-- - -/* -** CAPI3REF: Run-Time Library Version Numbers -** -** These routines return values equivalent to the header constants -** [SQLITE_VERSION] and [SQLITE_VERSION_NUMBER]. The values returned -** by this routines should only be different from the header values -** if you compile your program using an sqlite3.h header from a -** different version of SQLite that the version of the library you -** link against. -** -** The sqlite3_version[] string constant contains the text of the -** [SQLITE_VERSION] string. The sqlite3_libversion() function returns -** a poiner to the sqlite3_version[] string constant. The function -** is provided for DLL users who can only access functions and not -** constants within the DLL. -*/ -SQLITE_EXTERN const char sqlite3_version[]; -const char *sqlite3_libversion(void); -int sqlite3_libversion_number(void); - -/* -** CAPI3REF: Test To See If The Library Is Threadsafe -** -** This routine returns TRUE (nonzero) if SQLite was compiled with -** all of its mutexes enabled and is thus threadsafe. It returns -** zero if the particular build is for single-threaded operation -** only. -** -** Really all this routine does is return true if SQLite was compiled -** with the -DSQLITE_THREADSAFE=1 option and false if -** compiled with -DSQLITE_THREADSAFE=0. If SQLite uses an -** application-defined mutex subsystem, malloc subsystem, collating -** sequence, VFS, SQL function, progress callback, commit hook, -** extension, or other accessories and these add-ons are not -** threadsafe, then clearly the combination will not be threadsafe -** either. Hence, this routine never reports that the library -** is guaranteed to be threadsafe, only when it is guaranteed not -** to be. -** -** This is an experimental API and may go away or change in future -** releases. -*/ -int sqlite3_threadsafe(void); - -/* -** CAPI3REF: Database Connection Handle -** -** Each open SQLite database is represented by pointer to an instance of the -** opaque structure named "sqlite3". It is useful to think of an sqlite3 -** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and -** [sqlite3_open_v2()] interfaces are its constructors -** and [sqlite3_close()] is its destructor. There are many other interfaces -** (such as [sqlite3_prepare_v2()], [sqlite3_create_function()], and -** [sqlite3_busy_timeout()] to name but three) that are methods on this -** object. -*/ -typedef struct sqlite3 sqlite3; - - -/* -** CAPI3REF: 64-Bit Integer Types -** -** Some compilers do not support the "long long" datatype. So we have -** to do compiler-specific typedefs for 64-bit signed and unsigned integers. -** -** Many SQLite interface functions require a 64-bit integer arguments. -** Those interfaces are declared using this typedef. -*/ -#ifdef SQLITE_INT64_TYPE - typedef SQLITE_INT64_TYPE sqlite_int64; - typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; -#elif defined(_MSC_VER) || defined(__BORLANDC__) - typedef __int64 sqlite_int64; - typedef unsigned __int64 sqlite_uint64; -#else - typedef long long int sqlite_int64; - typedef unsigned long long int sqlite_uint64; -#endif -typedef sqlite_int64 sqlite3_int64; -typedef sqlite_uint64 sqlite3_uint64; - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 -#endif - -/* -** CAPI3REF: Closing A Database Connection -** -** Call this function with a pointer to a structure that was previously -** returned from [sqlite3_open()], [sqlite3_open16()], or -** [sqlite3_open_v2()] and the corresponding database will by -** closed. -** -** All SQL statements prepared using [sqlite3_prepare_v2()] or -** [sqlite3_prepare16_v2()] must be destroyed using [sqlite3_finalize()] -** before this routine is called. Otherwise, SQLITE_BUSY is returned and the -** database connection remains open. -** -** Passing this routine a database connection that has already been -** closed results in undefined behavior. If other interfaces that -** reference the same database connection are pending (either in the -** same thread or in different threads) when this routine is called, -** then the behavior is undefined and is almost certainly undesirable. -*/ -int sqlite3_close(sqlite3 *); - -/* -** The type for a callback function. -** This is legacy and deprecated. It is included for historical -** compatibility and is not documented. -*/ -typedef int (*sqlite3_callback)(void*,int,char**, char**); - -/* -** CAPI3REF: One-Step Query Execution Interface -** -** This interface is used to do a one-time evaluatation of zero -** or more SQL statements. UTF-8 text of the SQL statements to -** be evaluted is passed in as the second parameter. The statements -** are prepared one by one using [sqlite3_prepare()], evaluated -** using [sqlite3_step()], then destroyed using [sqlite3_finalize()]. -** -** If one or more of the SQL statements are queries, then -** the callback function specified by the 3rd parameter is -** invoked once for each row of the query result. This callback -** should normally return 0. If the callback returns a non-zero -** value then the query is aborted, all subsequent SQL statements -** are skipped and the sqlite3_exec() function returns the [SQLITE_ABORT]. -** -** The 4th parameter to this interface is an arbitrary pointer that is -** passed through to the callback function as its first parameter. -** -** The 2nd parameter to the callback function is the number of -** columns in the query result. The 3rd parameter to the callback -** is an array of strings holding the values for each column -** as extracted using [sqlite3_column_text()]. -** The 4th parameter to the callback is an array of strings -** obtained using [sqlite3_column_name()] and holding -** the names of each column. -** -** The callback function may be NULL, even for queries. A NULL -** callback is not an error. It just means that no callback -** will be invoked. -** -** If an error occurs while parsing or evaluating the SQL (but -** not while executing the callback) then an appropriate error -** message is written into memory obtained from [sqlite3_malloc()] and -** *errmsg is made to point to that message. The calling function -** is responsible for freeing the memory using [sqlite3_free()]. -** If errmsg==NULL, then no error message is ever written. -** -** The return value is is SQLITE_OK if there are no errors and -** some other [SQLITE_OK | return code] if there is an error. -** The particular return value depends on the type of error. -** -*/ -int sqlite3_exec( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be evaluted */ - int (*callback)(void*,int,char**,char**), /* Callback function */ - void *, /* 1st argument to callback */ - char **errmsg /* Error msg written here */ -); - -/* -** CAPI3REF: Result Codes -** KEYWORDS: SQLITE_OK -** -** Many SQLite functions return an integer result code from the set shown -** above in order to indicates success or failure. -** -** The result codes above are the only ones returned by SQLite in its -** default configuration. However, the [sqlite3_extended_result_codes()] -** API can be used to set a database connectoin to return more detailed -** result codes. -** -** See also: [SQLITE_IOERR_READ | extended result codes] -** -*/ -#define SQLITE_OK 0 /* Successful result */ -/* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ -#define SQLITE_INTERNAL 2 /* NOT USED. Internal logic error in SQLite */ -#define SQLITE_PERM 3 /* Access permission denied */ -#define SQLITE_ABORT 4 /* Callback routine requested an abort */ -#define SQLITE_BUSY 5 /* The database file is locked */ -#define SQLITE_LOCKED 6 /* A table in the database is locked */ -#define SQLITE_NOMEM 7 /* A malloc() failed */ -#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ -#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ -#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ -#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ -#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */ -#define SQLITE_FULL 13 /* Insertion failed because database is full */ -#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ -#define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ -#define SQLITE_SCHEMA 17 /* The database schema changed */ -#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ -#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ -#define SQLITE_MISMATCH 20 /* Data type mismatch */ -#define SQLITE_MISUSE 21 /* Library used incorrectly */ -#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ -#define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ -#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ -#define SQLITE_NOTADB 26 /* File opened that is not a database file */ -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ -#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ -/* end-of-error-codes */ - -/* -** CAPI3REF: Extended Result Codes -** -** In its default configuration, SQLite API routines return one of 26 integer -** result codes described at result-codes. However, experience has shown that -** many of these result codes are too course-grained. They do not provide as -** much information about problems as users might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include -** support for additional result codes that provide more detailed information -** about errors. The extended result codes are enabled (or disabled) for -** each database -** connection using the [sqlite3_extended_result_codes()] API. -** -** Some of the available extended result codes are listed above. -** We expect the number of extended result codes will be expand -** over time. Software that uses extended result codes should expect -** to see new result codes in future releases of SQLite. -** -** The symbolic name for an extended result code always contains a related -** primary result code as a prefix. Primary result codes contain a single -** "_" character. Extended result codes contain two or more "_" characters. -** The numeric value of an extended result code can be converted to its -** corresponding primary result code by masking off the lower 8 bytes. -** -** The SQLITE_OK result code will never be extended. It will always -** be exactly zero. -*/ -#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) -#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) -#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) -#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) -#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) -#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) -#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) -#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) -#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) -#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) -#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) -#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) - -/* -** CAPI3REF: Flags For File Open Operations -** -** Combination of the following bit values are used as the -** third argument to the [sqlite3_open_v2()] interface and -** as fourth argument to the xOpen method of the -** [sqlite3_vfs] object. -** -*/ -#define SQLITE_OPEN_READONLY 0x00000001 -#define SQLITE_OPEN_READWRITE 0x00000002 -#define SQLITE_OPEN_CREATE 0x00000004 -#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 -#define SQLITE_OPEN_EXCLUSIVE 0x00000010 -#define SQLITE_OPEN_MAIN_DB 0x00000100 -#define SQLITE_OPEN_TEMP_DB 0x00000200 -#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 -#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 -#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 -#define SQLITE_OPEN_SUBJOURNAL 0x00002000 -#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 - -/* -** CAPI3REF: Device Characteristics -** -** The xDeviceCapabilities method of the [sqlite3_io_methods] -** object returns an integer which is a vector of the following -** bit values expressing I/O characteristics of the mass storage -** device that holds the file that the [sqlite3_io_methods] -** refers to. -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -*/ -#define SQLITE_IOCAP_ATOMIC 0x00000001 -#define SQLITE_IOCAP_ATOMIC512 0x00000002 -#define SQLITE_IOCAP_ATOMIC1K 0x00000004 -#define SQLITE_IOCAP_ATOMIC2K 0x00000008 -#define SQLITE_IOCAP_ATOMIC4K 0x00000010 -#define SQLITE_IOCAP_ATOMIC8K 0x00000020 -#define SQLITE_IOCAP_ATOMIC16K 0x00000040 -#define SQLITE_IOCAP_ATOMIC32K 0x00000080 -#define SQLITE_IOCAP_ATOMIC64K 0x00000100 -#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 -#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 - -/* -** CAPI3REF: File Locking Levels -** -** SQLite uses one of the following integer values as the second -** argument to calls it makes to the xLock() and xUnlock() methods -** of an [sqlite3_io_methods] object. -*/ -#define SQLITE_LOCK_NONE 0 -#define SQLITE_LOCK_SHARED 1 -#define SQLITE_LOCK_RESERVED 2 -#define SQLITE_LOCK_PENDING 3 -#define SQLITE_LOCK_EXCLUSIVE 4 - -/* -** CAPI3REF: Synchronization Type Flags -** -** When SQLite invokes the xSync() method of an [sqlite3_io_methods] -** object it uses a combination of the following integer values as -** the second argument. -** -** When the SQLITE_SYNC_DATAONLY flag is used, it means that the -** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. The SQLITE_SYNC_NORMAL means -** to use normal fsync() semantics. The SQLITE_SYNC_FULL flag means -** to use Mac OS-X style fullsync instead of fsync(). -*/ -#define SQLITE_SYNC_NORMAL 0x00002 -#define SQLITE_SYNC_FULL 0x00003 -#define SQLITE_SYNC_DATAONLY 0x00010 - - -/* -** CAPI3REF: OS Interface Open File Handle -** -** An [sqlite3_file] object represents an open file in the OS -** interface layer. Individual OS interface implementations will -** want to subclass this object by appending additional fields -** for their own use. The pMethods entry is a pointer to an -** [sqlite3_io_methods] object that defines methods for performing -** I/O operations on the open file. -*/ -typedef struct sqlite3_file sqlite3_file; -struct sqlite3_file { - const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ -}; - -/* -** CAPI3REF: OS Interface File Virtual Methods Object -** -** Every file opened by the [sqlite3_vfs] xOpen method contains a pointer to -** an instance of the this object. This object defines the -** methods used to perform various operations against the open file. -** -** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or -** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). -* The second choice is an -** OS-X style fullsync. The SQLITE_SYNC_DATA flag may be ORed in to -** indicate that only the data of the file and not its inode needs to be -** synced. -** -** The integer values to xLock() and xUnlock() are one of -**
      -**
    • [SQLITE_LOCK_NONE], -**
    • [SQLITE_LOCK_SHARED], -**
    • [SQLITE_LOCK_RESERVED], -**
    • [SQLITE_LOCK_PENDING], or -**
    • [SQLITE_LOCK_EXCLUSIVE]. -**
    -** xLock() increases the lock. xUnlock() decreases the lock. -** The xCheckReservedLock() method looks -** to see if any database connection, either in this -** process or in some other process, is holding an RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false if not. -** -** The xFileControl() method is a generic interface that allows custom -** VFS implementations to directly control an open file using the -** [sqlite3_file_control()] interface. The second "op" argument -** is an integer opcode. The third -** argument is a generic pointer which is intended to be a pointer -** to a structure that may contain arguments or space in which to -** write return values. Potential uses for xFileControl() might be -** functions to enable blocking locks with timeouts, to change the -** locking strategy (for example to use dot-file locks), to inquire -** about the status of a lock, or to break stale locks. The SQLite -** core reserves opcodes less than 100 for its own use. -** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. -** Applications that define a custom xFileControl method should use opcodes -** greater than 100 to avoid conflicts. -** -** The xSectorSize() method returns the sector size of the -** device that underlies the file. The sector size is the -** minimum write that can be performed without disturbing -** other bytes in the file. The xDeviceCharacteristics() -** method returns a bit vector describing behaviors of the -** underlying device: -** -**
      -**
    • [SQLITE_IOCAP_ATOMIC] -**
    • [SQLITE_IOCAP_ATOMIC512] -**
    • [SQLITE_IOCAP_ATOMIC1K] -**
    • [SQLITE_IOCAP_ATOMIC2K] -**
    • [SQLITE_IOCAP_ATOMIC4K] -**
    • [SQLITE_IOCAP_ATOMIC8K] -**
    • [SQLITE_IOCAP_ATOMIC16K] -**
    • [SQLITE_IOCAP_ATOMIC32K] -**
    • [SQLITE_IOCAP_ATOMIC64K] -**
    • [SQLITE_IOCAP_SAFE_APPEND] -**
    • [SQLITE_IOCAP_SEQUENTIAL] -**
    -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -*/ -typedef struct sqlite3_io_methods sqlite3_io_methods; -struct sqlite3_io_methods { - int iVersion; - int (*xClose)(sqlite3_file*); - int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); - int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); - int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); - int (*xSync)(sqlite3_file*, int flags); - int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); - int (*xLock)(sqlite3_file*, int); - int (*xUnlock)(sqlite3_file*, int); - int (*xCheckReservedLock)(sqlite3_file*); - int (*xFileControl)(sqlite3_file*, int op, void *pArg); - int (*xSectorSize)(sqlite3_file*); - int (*xDeviceCharacteristics)(sqlite3_file*); - /* Additional methods may be added in future releases */ -}; - -/* -** CAPI3REF: Standard File Control Opcodes -** -** These integer constants are opcodes for the xFileControl method -** of the [sqlite3_io_methods] object and to the [sqlite3_file_control()] -** interface. -** -** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This -** opcode cases the xFileControl method to write the current state of -** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], -** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) -** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -*/ -#define SQLITE_FCNTL_LOCKSTATE 1 - -/* -** CAPI3REF: Mutex Handle -** -** The mutex module within SQLite defines [sqlite3_mutex] to be an -** abstract type for a mutex object. The SQLite core never looks -** at the internal representation of an [sqlite3_mutex]. It only -** deals with pointers to the [sqlite3_mutex] object. -** -** Mutexes are created using [sqlite3_mutex_alloc()]. -*/ -typedef struct sqlite3_mutex sqlite3_mutex; - -/* -** CAPI3REF: OS Interface Object -** -** An instance of this object defines the interface between the -** SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". -** -** The iVersion field is initially 1 but may be larger for future -** versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. -** -** The szOsFile field is the size of the subclassed [sqlite3_file] -** structure used by this VFS. mxPathname is the maximum length of -** a pathname in this VFS. -** -** Registered vfs modules are kept on a linked list formed by -** the pNext pointer. The [sqlite3_vfs_register()] -** and [sqlite3_vfs_unregister()] interfaces manage this list -** in a thread-safe way. The [sqlite3_vfs_find()] interface -** searches the list. -** -** The pNext field is the only fields in the sqlite3_vfs -** structure that SQLite will ever modify. SQLite will only access -** or modify this field while holding a particular static mutex. -** The application should never modify anything within the sqlite3_vfs -** object once the object has been registered. -** -** The zName field holds the name of the VFS module. The name must -** be unique across all VFS modules. -** -** SQLite will guarantee that the zFilename string passed to -** xOpen() is a full pathname as generated by xFullPathname() and -** that the string will be valid and unchanged until xClose() is -** called. So the [sqlite3_file] can store a pointer to the -** filename if it needs to remember the filename for some reason. -** -** The flags argument to xOpen() is a copy of the flags argument -** to [sqlite3_open_v2()]. If [sqlite3_open()] or [sqlite3_open16()] -** is used, then flags is [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. -** If xOpen() opens a file read-only then it sets *pOutFlags to -** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be -** set. -** -** SQLite will also add one of the following flags to the xOpen() -** call, depending on the object being opened: -** -**
      -**
    • [SQLITE_OPEN_MAIN_DB] -**
    • [SQLITE_OPEN_MAIN_JOURNAL] -**
    • [SQLITE_OPEN_TEMP_DB] -**
    • [SQLITE_OPEN_TEMP_JOURNAL] -**
    • [SQLITE_OPEN_TRANSIENT_DB] -**
    • [SQLITE_OPEN_SUBJOURNAL] -**
    • [SQLITE_OPEN_MASTER_JOURNAL] -**
    -** -** The file I/O implementation can use the object type flags to -** changes the way it deals with files. For example, an application -** that does not care about crash recovery or rollback, might make -** the open of a journal file a no-op. Writes to this journal are -** also a no-op. Any attempt to read the journal return SQLITE_IOERR. -** Or the implementation might recognize the a database file will -** be doing page-aligned sector reads and writes in a random order -** and set up its I/O subsystem accordingly. -** -** SQLite might also add one of the following flags to the xOpen -** method: -** -**
      -**
    • [SQLITE_OPEN_DELETEONCLOSE] -**
    • [SQLITE_OPEN_EXCLUSIVE] -**
    -** -** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be -** deleted when it is closed. This will always be set for TEMP -** databases and journals and for subjournals. The -** [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened -** for exclusive access. This flag is set for all files except -** for the main database file. -** -** Space to hold the [sqlite3_file] structure passed as the third -** argument to xOpen is allocated by caller (the SQLite core). -** szOsFile bytes are allocated for this object. The xOpen method -** fills in the allocated space. -** -** The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] -** to test for the existance of a file, -** or [SQLITE_ACCESS_READWRITE] to test to see -** if a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test to see if a file is at least readable. The file can be a -** directory. -** -** SQLite will always allocate at least mxPathname+1 byte for -** the output buffers for xGetTempname and xFullPathname. The exact -** size of the output buffer is also passed as a parameter to both -** methods. If the output buffer is not large enough, SQLITE_CANTOPEN -** should be returned. As this is handled as a fatal error by SQLite, -** vfs implementations should endevour to prevent this by setting -** mxPathname to a sufficiently large value. -** -** The xRandomness(), xSleep(), and xCurrentTime() interfaces -** are not strictly a part of the filesystem, but they are -** included in the VFS structure for completeness. -** The xRandomness() function attempts to return nBytes bytes -** of good-quality randomness into zOut. The return value is -** the actual number of bytes of randomness obtained. The -** xSleep() method cause the calling thread to sleep for at -** least the number of microseconds given. The xCurrentTime() -** method returns a Julian Day Number for the current date and -** time. -*/ -typedef struct sqlite3_vfs sqlite3_vfs; -struct sqlite3_vfs { - int iVersion; /* Structure version number */ - int szOsFile; /* Size of subclassed sqlite3_file */ - int mxPathname; /* Maximum file pathname length */ - sqlite3_vfs *pNext; /* Next registered VFS */ - const char *zName; /* Name of this virtual file system */ - void *pAppData; /* Pointer to application-specific data */ - int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, - int flags, int *pOutFlags); - int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); - int (*xAccess)(sqlite3_vfs*, const char *zName, int flags); - int (*xGetTempname)(sqlite3_vfs*, int nOut, char *zOut); - int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); - void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); - void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); - void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol); - void (*xDlClose)(sqlite3_vfs*, void*); - int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); - int (*xSleep)(sqlite3_vfs*, int microseconds); - int (*xCurrentTime)(sqlite3_vfs*, double*); - /* New fields may be appended in figure versions. The iVersion - ** value will increment whenever this happens. */ -}; - -/* -** CAPI3REF: Flags for the xAccess VFS method -** -** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. They determine -** the kind of what kind of permissions the xAccess method is -** looking for. With SQLITE_ACCESS_EXISTS, the xAccess method -** simply checks to see if the file exists. With SQLITE_ACCESS_READWRITE, -** the xAccess method checks to see if the file is both readable -** and writable. With SQLITE_ACCESS_READ the xAccess method -** checks to see if the file is readable. -*/ -#define SQLITE_ACCESS_EXISTS 0 -#define SQLITE_ACCESS_READWRITE 1 -#define SQLITE_ACCESS_READ 2 - -/* -** CAPI3REF: Enable Or Disable Extended Result Codes -** -** This routine enables or disables the -** [SQLITE_IOERR_READ | extended result codes] feature. -** By default, SQLite API routines return one of only 26 integer -** [SQLITE_OK | result codes]. When extended result codes -** are enabled by this routine, the repetoire of result codes can be -** much larger and can (hopefully) provide more detailed information -** about the cause of an error. -** -** The second argument is a boolean value that turns extended result -** codes on and off. Extended result codes are off by default for -** backwards compatibility with older versions of SQLite. -*/ -int sqlite3_extended_result_codes(sqlite3*, int onoff); - -/* -** CAPI3REF: Last Insert Rowid -** -** Each entry in an SQLite table has a unique 64-bit signed integer key -** called the "rowid". The rowid is always available as an undeclared -** column named ROWID, OID, or _ROWID_. If the table has a column of -** type INTEGER PRIMARY KEY then that column is another an alias for the -** rowid. -** -** This routine returns the rowid of the most recent INSERT into -** the database from the database connection given in the first -** argument. If no inserts have ever occurred on this database -** connection, zero is returned. -** -** If an INSERT occurs within a trigger, then the rowid of the -** inserted row is returned by this routine as long as the trigger -** is running. But once the trigger terminates, the value returned -** by this routine reverts to the last value inserted before the -** trigger fired. -** -** If another thread does a new insert on the same database connection -** while this routine is running and thus changes the last insert rowid, -** then the return value of this routine is undefined. -*/ -sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); - -/* -** CAPI3REF: Count The Number Of Rows Modified -** -** This function returns the number of database rows that were changed -** (or inserted or deleted) by the most recent SQL statement. Only -** changes that are directly specified by the INSERT, UPDATE, or -** DELETE statement are counted. Auxiliary changes caused by -** triggers are not counted. Use the [sqlite3_total_changes()] function -** to find the total number of changes including changes caused by triggers. -** -** Within the body of a trigger, the sqlite3_changes() interface can be -** called to find the number of -** changes in the most recently completed INSERT, UPDATE, or DELETE -** statement within the body of the trigger. -** -** All changes are counted, even if they were later undone by a -** ROLLBACK or ABORT. Except, changes associated with creating and -** dropping tables are not counted. -** -** If a callback invokes [sqlite3_exec()] or [sqlite3_step()] recursively, -** then the changes in the inner, recursive call are counted together -** with the changes in the outer call. -** -** SQLite implements the command "DELETE FROM table" without a WHERE clause -** by dropping and recreating the table. (This is much faster than going -** through and deleting individual elements from the table.) Because of -** this optimization, the change count for "DELETE FROM table" will be -** zero regardless of the number of elements that were originally in the -** table. To get an accurate count of the number of rows deleted, use -** "DELETE FROM table WHERE 1" instead. -** -** If another thread makes changes on the same database connection -** while this routine is running then the return value of this routine -** is undefined. -*/ -int sqlite3_changes(sqlite3*); - -/* -** CAPI3REF: Total Number Of Rows Modified -*** -** This function returns the number of database rows that have been -** modified by INSERT, UPDATE or DELETE statements since the database handle -** was opened. This includes UPDATE, INSERT and DELETE statements executed -** as part of trigger programs. All changes are counted as soon as the -** statement that makes them is completed (when the statement handle is -** passed to [sqlite3_reset()] or [sqlite3_finalize()]). -** -** See also the [sqlite3_change()] interface. -** -** SQLite implements the command "DELETE FROM table" without a WHERE clause -** by dropping and recreating the table. (This is much faster than going -** through and deleting individual elements form the table.) Because of -** this optimization, the change count for "DELETE FROM table" will be -** zero regardless of the number of elements that were originally in the -** table. To get an accurate count of the number of rows deleted, use -** "DELETE FROM table WHERE 1" instead. -** -** If another thread makes changes on the same database connection -** while this routine is running then the return value of this routine -** is undefined. -*/ -int sqlite3_total_changes(sqlite3*); - -/* -** CAPI3REF: Interrupt A Long-Running Query -** -** This function causes any pending database operation to abort and -** return at its earliest opportunity. This routine is typically -** called in response to a user action such as pressing "Cancel" -** or Ctrl-C where the user wants a long query operation to halt -** immediately. -** -** It is safe to call this routine from a thread different from the -** thread that is currently running the database operation. But it -** is not safe to call this routine with a database connection that -** is closed or might close before sqlite3_interrupt() returns. -** -** The SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** If an interrupted operation was an update that is inside an -** explicit transaction, then the entire transaction will be rolled -** back automatically. -*/ -void sqlite3_interrupt(sqlite3*); - -/* -** CAPI3REF: Determine If An SQL Statement Is Complete -** -** These functions return true if the given input string comprises -** one or more complete SQL statements. For the sqlite3_complete() call, -** the parameter must be a nul-terminated UTF-8 string. For -** sqlite3_complete16(), a nul-terminated machine byte order UTF-16 string -** is required. -** -** These routines are useful for command-line input to determine if the -** currently entered text forms one or more complete SQL statements or -** if additional input is needed before sending the statements into -** SQLite for parsing. The algorithm is simple. If the -** last token other than spaces and comments is a semicolon, then return -** true. Actually, the algorithm is a little more complicated than that -** in order to deal with triggers, but the basic idea is the same: the -** statement is not complete unless it ends in a semicolon. -*/ -int sqlite3_complete(const char *sql); -int sqlite3_complete16(const void *sql); - -/* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors -** -** This routine identifies a callback function that might be invoked -** whenever an attempt is made to open a database table -** that another thread or process has locked. -** If the busy callback is NULL, then [SQLITE_BUSY] -** (or sometimes [SQLITE_IOERR_BLOCKED]) -** is returned immediately upon encountering the lock. -** If the busy callback is not NULL, then the -** callback will be invoked with two arguments. The -** first argument to the handler is a copy of the void* pointer which -** is the third argument to this routine. The second argument to -** the handler is the number of times that the busy handler has -** been invoked for this locking event. If the -** busy callback returns 0, then no additional attempts are made to -** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** If the callback returns non-zero, then another attempt is made to open the -** database for reading and the cycle repeats. -** -** The presence of a busy handler does not guarantee that -** it will be invoked when there is lock contention. -** If SQLite determines that invoking the busy handler could result in -** a deadlock, it will return [SQLITE_BUSY] instead. -** Consider a scenario where one process is holding a read lock that -** it is trying to promote to a reserved lock and -** a second process is holding a reserved lock that it is trying -** to promote to an exclusive lock. The first process cannot proceed -** because it is blocked by the second and the second process cannot -** proceed because it is blocked by the first. If both processes -** invoke the busy handlers, neither will make any progress. Therefore, -** SQLite returns [SQLITE_BUSY] for the first process, hoping that this -** will induce the first process to release its read lock and allow -** the second process to proceed. -** -** The default busy callback is NULL. -** -** The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] when -** SQLite is in the middle of a large transaction where all the -** changes will not fit into the in-memory cache. SQLite will -** already hold a RESERVED lock on the database file, but it needs -** to promote this lock to EXCLUSIVE so that it can spill cache -** pages into the database file without harm to concurrent -** readers. If it is unable to promote the lock, then the in-memory -** cache will be left in an inconsistent state and so the error -** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion -** forces an automatic rollback of the changes. See the -** -** CorruptionFollowingBusyError wiki page for a discussion of why -** this is important. -** -** Sqlite is re-entrant, so the busy handler may start a new query. -** (It is not clear why anyone would every want to do this, but it -** is allowed, in theory.) But the busy handler may not close the -** database. Closing the database from a busy handler will delete -** data structures out from under the executing query and will -** probably result in a segmentation fault or other runtime error. -** -** There can only be a single busy handler defined for each database -** connection. Setting a new busy handler clears any previous one. -** Note that calling [sqlite3_busy_timeout()] will also set or clear -** the busy handler. -** -** When operating in [sqlite3_enable_shared_cache | shared cache mode], -** only a single busy handler can be defined for each database file. -** So if two database connections share a single cache, then changing -** the busy handler on one connection will also change the busy -** handler in the other connection. The busy handler is invoked -** in the thread that was running when the SQLITE_BUSY was hit. -*/ -int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); - -/* -** CAPI3REF: Set A Busy Timeout -** -** This routine sets a busy handler that sleeps for a while when a -** table is locked. The handler will sleep multiple times until -** at least "ms" milliseconds of sleeping have been done. After -** "ms" milliseconds of sleeping, the handler returns 0 which -** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. -** -** Calling this routine with an argument less than or equal to zero -** turns off all busy handlers. -** -** There can only be a single busy handler for a particular database -** connection. If another busy handler was defined -** (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared. -*/ -int sqlite3_busy_timeout(sqlite3*, int ms); - -/* -** CAPI3REF: Convenience Routines For Running Queries -** -** This next routine is a convenience wrapper around [sqlite3_exec()]. -** Instead of invoking a user-supplied callback for each row of the -** result, this routine remembers each row of the result in memory -** obtained from [sqlite3_malloc()], then returns all of the result after the -** query has finished. -** -** As an example, suppose the query result where this table: -** -**
    -**        Name        | Age
    -**        -----------------------
    -**        Alice       | 43
    -**        Bob         | 28
    -**        Cindy       | 21
    -** 
    -** -** If the 3rd argument were &azResult then after the function returns -** azResult will contain the following data: -** -**
    -**        azResult[0] = "Name";
    -**        azResult[1] = "Age";
    -**        azResult[2] = "Alice";
    -**        azResult[3] = "43";
    -**        azResult[4] = "Bob";
    -**        azResult[5] = "28";
    -**        azResult[6] = "Cindy";
    -**        azResult[7] = "21";
    -** 
    -** -** Notice that there is an extra row of data containing the column -** headers. But the *nrow return value is still 3. *ncolumn is -** set to 2. In general, the number of values inserted into azResult -** will be ((*nrow) + 1)*(*ncolumn). -** -** After the calling function has finished using the result, it should -** pass the result data pointer to sqlite3_free_table() in order to -** release the memory that was malloc-ed. Because of the way the -** [sqlite3_malloc()] happens, the calling function must not try to call -** [sqlite3_free()] directly. Only [sqlite3_free_table()] is able to release -** the memory properly and safely. -** -** The return value of this routine is the same as from [sqlite3_exec()]. -*/ -int sqlite3_get_table( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be executed */ - char ***resultp, /* Result written to a char *[] that this points to */ - int *nrow, /* Number of result rows written here */ - int *ncolumn, /* Number of result columns written here */ - char **errmsg /* Error msg written here */ -); -void sqlite3_free_table(char **result); - -/* -** CAPI3REF: Formatted String Printing Functions -** -** These routines are workalikes of the "printf()" family of functions -** from the standard C library. -** -** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. -** The strings returned by these two routines should be -** released by [sqlite3_free()]. Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough -** memory to hold the resulting string. -** -** In sqlite3_snprintf() routine is similar to "snprintf()" from -** the standard C library. The result is written into the -** buffer supplied as the second parameter whose size is given by -** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf(). This is an -** historical accident that cannot be fixed without breaking -** backwards compatibility. Note also that sqlite3_snprintf() -** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer. We admit that -** the number of characters written would be a more useful return -** value but we cannot change the implementation of sqlite3_snprintf() -** now without breaking compatibility. -** -** As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. The first -** parameter "n" is the total size of the buffer, including space for -** the zero terminator. So the longest string that can be completely -** written will be n-1 characters. -** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** The %q option works like %s in that it substitutes a null-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal. By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, so some string variable contains text as follows: -** -**
    -**  char *zText = "It's a happy day!";
    -** 
    -** -** One can use this text in an SQL statement as follows: -** -**
    -**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
    -**  sqlite3_exec(db, zSQL, 0, 0, 0);
    -**  sqlite3_free(zSQL);
    -** 
    -** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -**
    -**  INSERT INTO table1 VALUES('It''s a happy day!')
    -** 
    -** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -**
    -**  INSERT INTO table1 VALUES('It's a happy day!');
    -** 
    -** -** This second example is an SQL syntax error. As a general rule you -** should always use %q instead of %s when inserting text into a string -** literal. -** -** The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Or if the parameter in the argument -** list is a NULL pointer, %Q substitutes the text "NULL" (without single -** quotes) in place of the %Q option. So, for example, one could say: -** -**
    -**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
    -**  sqlite3_exec(db, zSQL, 0, 0, 0);
    -**  sqlite3_free(zSQL);
    -** 
    -** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** The "%z" formatting option works exactly like "%s" with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string. -*/ -char *sqlite3_mprintf(const char*,...); -char *sqlite3_vmprintf(const char*, va_list); -char *sqlite3_snprintf(int,char*,const char*, ...); - -/* -** CAPI3REF: Memory Allocation Subsystem -** -** The SQLite core uses these three routines for all of its own -** internal memory allocation needs. (See the exception below.) -** The default implementation -** of the memory allocation subsystem uses the malloc(), realloc() -** and free() provided by the standard C library. However, if -** SQLite is compiled with the following C preprocessor macro -** -**
    SQLITE_OMIT_MEMORY_ALLOCATION
    -** -** then no implementation is provided for these routines by -** SQLite. The application that links against SQLite is -** expected to provide its own implementation. If the application -** does provide its own implementation for these routines, then -** it must also provide an implementations for -** [sqlite3_memory_alarm()], [sqlite3_memory_used()], and -** [sqlite3_memory_highwater()]. The alternative implementations -** for these last three routines need not actually work, but -** stub functions at least are needed to statisfy the linker. -** SQLite never calls [sqlite3_memory_highwater()] itself, but -** the symbol is included in a table as part of the -** [sqlite3_load_extension()] interface. The -** [sqlite3_memory_alarm()] and [sqlite3_memory_used()] interfaces -** are called by [sqlite3_soft_heap_limit()] and working implementations -** of both routines must be provided if [sqlite3_soft_heap_limit()] -** is to operate correctly. -** -** Exception: The windows OS interface layer calls -** the system malloc() and free() directly when converting -** filenames between the UTF-8 encoding used by SQLite -** and whatever filename encoding is used by the particular windows -** installation. Memory allocation errors are detected, but -** they are reported back as [SQLITE_CANTOPEN] or -** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. -*/ -void *sqlite3_malloc(int); -void *sqlite3_realloc(void*, int); -void sqlite3_free(void*); - -/* -** CAPI3REF: Memory Allocator Statistics -** -** In addition to the basic three allocation routines -** [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()], -** the memory allocation subsystem included with the SQLite -** sources provides the interfaces shown below. -** -** The first of these two routines returns the amount of memory -** currently outstanding (malloced but not freed). The second -** returns the largest instantaneous amount of outstanding -** memory. The highwater mark is reset if the argument is -** true. -** -** The implementation of these routines in the SQLite core -** is omitted if the application is compiled with the -** SQLITE_OMIT_MEMORY_ALLOCATION macro defined. In that case, -** the application that links SQLite must provide its own -** alternative implementation. See the documentation on -** [sqlite3_malloc()] for additional information. -*/ -sqlite3_int64 sqlite3_memory_used(void); -sqlite3_int64 sqlite3_memory_highwater(int resetFlag); - -/* -** CAPI3REF: Memory Allocation Alarms -** -** The [sqlite3_memory_alarm] routine is used to register -** a callback on memory allocation events. -** -** This routine registers or clears a callbacks that fires when -** the amount of memory allocated exceeds iThreshold. Only -** a single callback can be registered at a time. Each call -** to [sqlite3_memory_alarm()] overwrites the previous callback. -** The callback is disabled by setting xCallback to a NULL -** pointer. -** -** The parameters to the callback are the pArg value, the -** amount of memory currently in use, and the size of the -** allocation that provoked the callback. The callback will -** presumably invoke [sqlite3_free()] to free up memory space. -** The callback may invoke [sqlite3_malloc()] or [sqlite3_realloc()] -** but if it does, no additional callbacks will be invoked by -** the recursive calls. -** -** The [sqlite3_soft_heap_limit()] interface works by registering -** a memory alarm at the soft heap limit and invoking -** [sqlite3_release_memory()] in the alarm callback. Application -** programs should not attempt to use the [sqlite3_memory_alarm()] -** interface because doing so will interfere with the -** [sqlite3_soft_heap_limit()] module. This interface is exposed -** only so that applications can provide their own -** alternative implementation when the SQLite core is -** compiled with SQLITE_OMIT_MEMORY_ALLOCATION. -*/ -int sqlite3_memory_alarm( - void(*xCallback)(void *pArg, sqlite3_int64 used, int N), - void *pArg, - sqlite3_int64 iThreshold -); - - -/* -** CAPI3REF: Compile-Time Authorization Callbacks -*** -** This routine registers a authorizer callback with the SQLite library. -** The authorizer callback is invoked as SQL statements are being compiled -** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. At various -** points during the compilation process, as logic is being created -** to perform various actions, the authorizer callback is invoked to -** see if those actions are allowed. The authorizer callback should -** return SQLITE_OK to allow the action, [SQLITE_IGNORE] to disallow the -** specific action but allow the SQL statement to continue to be -** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be -** rejected with an error. -** -** Depending on the action, the [SQLITE_IGNORE] and [SQLITE_DENY] return -** codes might mean something different or they might mean the same -** thing. If the action is, for example, to perform a delete opertion, -** then [SQLITE_IGNORE] and [SQLITE_DENY] both cause the statement compilation -** to fail with an error. But if the action is to read a specific column -** from a specific table, then [SQLITE_DENY] will cause the entire -** statement to fail but [SQLITE_IGNORE] will cause a NULL value to be -** read instead of the actual column value. -** -** The first parameter to the authorizer callback is a copy of -** the third parameter to the sqlite3_set_authorizer() interface. -** The second parameter to the callback is an integer -** [SQLITE_COPY | action code] that specifies the particular action -** to be authorized. The available action codes are -** [SQLITE_COPY | documented separately]. The third through sixth -** parameters to the callback are strings that contain additional -** details about the action to be authorized. -** -** An authorizer is used when preparing SQL statements from an untrusted -** source, to ensure that the SQL statements do not try to access data -** that they are not allowed to see, or that they do not try to -** execute malicious statements that damage the database. For -** example, an application may allow a user to enter arbitrary -** SQL queries for evaluation by a database. But the application does -** not want the user to be able to make arbitrary changes to the -** database. An authorizer could then be put in place while the -** user-entered SQL is being prepared that disallows everything -** except SELECT statements. -** -** Only a single authorizer can be in place on a database connection -** at a time. Each call to sqlite3_set_authorizer overrides the -** previous call. A NULL authorizer means that no authorization -** callback is invoked. The default authorizer is NULL. -** -** Note that the authorizer callback is invoked only during -** [sqlite3_prepare()] or its variants. Authorization is not -** performed during statement evaluation in [sqlite3_step()]. -*/ -int sqlite3_set_authorizer( - sqlite3*, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pUserData -); - -/* -** CAPI3REF: Authorizer Return Codes -** -** The [sqlite3_set_authorizer | authorizer callback function] must -** return either [SQLITE_OK] or one of these two constants in order -** to signal SQLite whether or not the action is permitted. See the -** [sqlite3_set_authorizer | authorizer documentation] for additional -** information. -*/ -#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ -#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ - -/* -** CAPI3REF: Authorizer Action Codes -** -** The [sqlite3_set_authorizer()] interface registers a callback function -** that is invoked to authorizer certain SQL statement actions. The -** second parameter to the callback is an integer code that specifies -** what action is being authorized. These are the integer action codes that -** the authorizer callback may be passed. -** -** These action code values signify what kind of operation is to be -** authorized. The 3rd and 4th parameters to the authorization callback -** function will be parameters or NULL depending on which of these -** codes is used as the second parameter. The 5th parameter to the -** authorizer callback is the name of the database ("main", "temp", -** etc.) if applicable. The 6th parameter to the authorizer callback -** is the name of the inner-most trigger or view that is responsible for -** the access attempt or NULL if this access attempt is directly from -** top-level SQL code. -*/ -/******************************************* 3rd ************ 4th ***********/ -#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ -#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ -#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ -#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ -#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ -#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ -#define SQLITE_DELETE 9 /* Table Name NULL */ -#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ -#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ -#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ -#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ -#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ -#define SQLITE_DROP_VIEW 17 /* View Name NULL */ -#define SQLITE_INSERT 18 /* Table Name NULL */ -#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ -#define SQLITE_READ 20 /* Table Name Column Name */ -#define SQLITE_SELECT 21 /* NULL NULL */ -#define SQLITE_TRANSACTION 22 /* NULL NULL */ -#define SQLITE_UPDATE 23 /* Table Name Column Name */ -#define SQLITE_ATTACH 24 /* Filename NULL */ -#define SQLITE_DETACH 25 /* Database Name NULL */ -#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ -#define SQLITE_REINDEX 27 /* Index Name NULL */ -#define SQLITE_ANALYZE 28 /* Table Name NULL */ -#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ -#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ -#define SQLITE_FUNCTION 31 /* Function Name NULL */ -#define SQLITE_COPY 0 /* No longer used */ - -/* -** CAPI3REF: Tracing And Profiling Functions -** -** These routines register callback functions that can be used for -** tracing and profiling the execution of SQL statements. -** The callback function registered by sqlite3_trace() is invoked -** at the first [sqlite3_step()] for the evaluation of an SQL statement. -** The callback function registered by sqlite3_profile() is invoked -** as each SQL statement finishes and includes -** information on how long that statement ran. -** -** The sqlite3_profile() API is currently considered experimental and -** is subject to change. -*/ -void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -void *sqlite3_profile(sqlite3*, - void(*xProfile)(void*,const char*,sqlite3_uint64), void*); - -/* -** CAPI3REF: Query Progress Callbacks -** -** This routine configures a callback function - the progress callback - that -** is invoked periodically during long running calls to [sqlite3_exec()], -** [sqlite3_step()] and [sqlite3_get_table()]. An example use for this -** interface is to keep a GUI updated during a large query. -** -** The progress callback is invoked once for every N virtual machine opcodes, -** where N is the second argument to this function. The progress callback -** itself is identified by the third argument to this function. The fourth -** argument to this function is a void pointer passed to the progress callback -** function each time it is invoked. -** -** If a call to [sqlite3_exec()], [sqlite3_step()], or [sqlite3_get_table()] -** results in fewer than N opcodes being executed, then the progress -** callback is never invoked. -** -** Only a single progress callback function may be registered for each -** open database connection. Every call to sqlite3_progress_handler() -** overwrites the results of the previous call. -** To remove the progress callback altogether, pass NULL as the third -** argument to this function. -** -** If the progress callback returns a result other than 0, then the current -** query is immediately terminated and any database changes rolled back. -** The containing [sqlite3_exec()], [sqlite3_step()], or -** [sqlite3_get_table()] call returns SQLITE_INTERRUPT. This feature -** can be used, for example, to implement the "Cancel" button on a -** progress dialog box in a GUI. -*/ -void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); - -/* -** CAPI3REF: Opening A New Database Connection -** -** Open the sqlite database file "filename". The "filename" is UTF-8 -** encoded for [sqlite3_open()] and [sqlite3_open_v2()] and UTF-16 encoded -** in the native byte order for [sqlite3_open16()]. -** An [sqlite3*] handle is returned in *ppDb, even -** if an error occurs. If the database is opened (or created) successfully, -** then [SQLITE_OK] is returned. Otherwise an error code is returned. The -** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain -** an English language description of the error. -** -** The default encoding for the database will be UTF-8 if -** [sqlite3_open()] or [sqlite3_open_v2()] is called and -** UTF-16 if [sqlite3_open16()] is used. -** -** Whether or not an error occurs when it is opened, resources associated -** with the [sqlite3*] handle should be released by passing it to -** [sqlite3_close()] when it is no longer required. -** -** The [sqlite3_open_v2()] interface works like [sqlite3_open()] except that -** provides two additional parameters for additional control over the -** new database connection. The flags parameter can be one of: -** -**
      -**
    1. [SQLITE_OPEN_READONLY] -**
    2. [SQLITE_OPEN_READWRITE] -**
    3. [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE] -**
    -** -** The first value opens the database read-only. If the database does -** not previously exist, an error is returned. The second option opens -** the database for reading and writing if possible, or reading only if -** if the file is write protected. In either case the database must already -** exist or an error is returned. The third option opens the database -** for reading and writing and creates it if it does not already exist. -** The third options is behavior that is always used for [sqlite3_open()] -** and [sqlite3_open16()]. -** -** If the filename is ":memory:", then an private -** in-memory database is created for the connection. This in-memory -** database will vanish when the database connection is closed. Future -** version of SQLite might make use of additional special filenames -** that begin with the ":" character. It is recommended that -** when a database filename really does begin with -** ":" that you prefix the filename with a pathname like "./" to -** avoid ambiguity. -** -** If the filename is an empty string, then a private temporary -** on-disk database will be created. This private database will be -** automatically deleted as soon as the database connection is closed. -** -** The fourth parameter to sqlite3_open_v2() is the name of the -** [sqlite3_vfs] object that defines the operating system -** interface that the new database connection should use. If the -** fourth parameter is a NULL pointer then the default [sqlite3_vfs] -** object is used. -** -** Note to windows users: The encoding used for the filename argument -** of [sqlite3_open()] and [sqlite3_open_v2()] must be UTF-8, not whatever -** codepage is currently defined. Filenames containing international -** characters must be converted to UTF-8 prior to passing them into -** [sqlite3_open()] or [sqlite3_open_v2()]. -*/ -int sqlite3_open( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -int sqlite3_open16( - const void *filename, /* Database filename (UTF-16) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -); - -/* -** CAPI3REF: Error Codes And Messages -** -** The sqlite3_errcode() interface returns the numeric -** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code] -** for the most recent failed sqlite3_* API call associated -** with [sqlite3] handle 'db'. If a prior API call failed but the -** most recent API call succeeded, the return value from sqlite3_errcode() -** is undefined. -** -** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF8 or UTF16 respectively. -** Memory to hold the error message string is managed internally. The -** string may be overwritten or deallocated by subsequent calls to SQLite -** interface functions. -** -** Calls to many sqlite3_* functions set the error code and string returned -** by [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] -** (overwriting the previous values). Note that calls to [sqlite3_errcode()], -** [sqlite3_errmsg()], and [sqlite3_errmsg16()] themselves do not affect the -** results of future invocations. Calls to API routines that do not return -** an error code (example: [sqlite3_data_count()]) do not -** change the error code returned by this routine. Interfaces that are -** not associated with a specific database connection (examples: -** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()] do not change -** the return code. -** -** Assuming no other intervening sqlite3_* API calls are made, the error -** code returned by this function is associated with the same error as -** the strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]. -*/ -int sqlite3_errcode(sqlite3 *db); -const char *sqlite3_errmsg(sqlite3*); -const void *sqlite3_errmsg16(sqlite3*); - -/* -** CAPI3REF: SQL Statement Object -** -** Instance of this object represent single SQL statements. This -** is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". -** -** The life of a statement object goes something like this: -** -**
      -**
    1. Create the object using [sqlite3_prepare_v2()] or a related -** function. -**
    2. Bind values to host parameters using -** [sqlite3_bind_blob | sqlite3_bind_* interfaces]. -**
    3. Run the SQL by calling [sqlite3_step()] one or more times. -**
    4. Reset the statement using [sqlite3_reset()] then go back -** to step 2. Do this zero or more times. -**
    5. Destroy the object using [sqlite3_finalize()]. -**
    -** -** Refer to documentation on individual methods above for additional -** information. -*/ -typedef struct sqlite3_stmt sqlite3_stmt; - -/* -** CAPI3REF: Compiling An SQL Statement -** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. -** -** The first argument "db" is an [sqlite3 | SQLite database handle] -** obtained from a prior call to [sqlite3_open()], [sqlite3_open_v2()] -** or [sqlite3_open16()]. -** The second argument "zSql" is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. -** -** If the nByte argument is less -** than zero, then zSql is read up to the first zero terminator. If -** nByte is non-negative, then it is the maximum number of -** bytes read from zSql. When nByte is non-negative, the -** zSql string ends at either the first '\000' character or -** until the nByte-th byte, whichever comes first. -** -** *pzTail is made to point to the first byte past the end of the first -** SQL statement in zSql. This routine only compiles the first statement -** in zSql, so *pzTail is left pointing to what remains uncompiled. -** -** *ppStmt is left pointing to a compiled -** [sqlite3_stmt | SQL statement structure] that can be -** executed using [sqlite3_step()]. Or if there is an error, *ppStmt may be -** set to NULL. If the input text contained no SQL (if the input is and -** empty string or a comment) then *ppStmt is set to NULL. The calling -** procedure is responsible for deleting the compiled SQL statement -** using [sqlite3_finalize()] after it has finished with it. -** -** On success, [SQLITE_OK] is returned. Otherwise an -** [SQLITE_ERROR | error code] is returned. -** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** In the "v2" interfaces, the prepared statement -** that is returned (the [sqlite3_stmt] object) contains a copy of the -** original SQL text. This causes the [sqlite3_step()] interface to -** behave a differently in two ways: -** -**
      -**
    1. -** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it -** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. If the schema has changed in a way -** that makes the statement no longer valid, [sqlite3_step()] will still -** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is -** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the -** error go away. Note: use [sqlite3_errmsg()] to find the text of the parsing -** error that results in an [SQLITE_SCHEMA] return. -**
    2. -** -**
    3. -** When an error occurs, -** [sqlite3_step()] will return one of the detailed -** [SQLITE_ERROR | result codes] or -** [SQLITE_IOERR_READ | extended result codes] such as directly. -** The legacy behavior was that [sqlite3_step()] would only return a generic -** [SQLITE_ERROR] result code and you would have to make a second call to -** [sqlite3_reset()] in order to find the underlying cause of the problem. -** With the "v2" prepare interfaces, the underlying reason for the error is -** returned immediately. -**
    4. -**
    -*/ -int sqlite3_prepare( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -int sqlite3_prepare16( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); -int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); - -/* -** CAPI3REF: Dynamically Typed Value Object -** -** SQLite uses dynamic typing for the values it stores. Values can -** be integers, floating point values, strings, BLOBs, or NULL. When -** passing around values internally, each value is represented as -** an instance of the sqlite3_value object. -*/ -typedef struct Mem sqlite3_value; - -/* -** CAPI3REF: SQL Function Context Object -** -** The context in which an SQL function executes is stored in an -** sqlite3_context object. A pointer to such an object is the -** first parameter to user-defined SQL functions. -*/ -typedef struct sqlite3_context sqlite3_context; - -/* -** CAPI3REF: Binding Values To Prepared Statements -** -** In the SQL strings input to [sqlite3_prepare_v2()] and its variants, -** one or more literals can be replace by a parameter in one of these -** forms: -** -**
      -**
    • ? -**
    • ?NNN -**
    • :AAA -**
    • @AAA -**
    • $VVV -**
    -** -** In the parameter forms shown above NNN is an integer literal, -** AAA is an alphanumeric identifier and VVV is a variable name according -** to the syntax rules of the TCL programming language. -** The values of these parameters (also called "host parameter names") -** can be set using the sqlite3_bind_*() routines defined here. -** -** The first argument to the sqlite3_bind_*() routines always is a pointer -** to the [sqlite3_stmt] object returned from [sqlite3_prepare_v2()] or -** its variants. The second -** argument is the index of the parameter to be set. The first parameter has -** an index of 1. When the same named parameter is used more than once, second -** and subsequent -** occurrences have the same index as the first occurrence. The index for -** named parameters can be looked up using the -** [sqlite3_bind_parameter_name()] API if desired. The index for "?NNN" -** parametes is the value of NNN. -** The NNN value must be between 1 and the compile-time -** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999). -** See limits.html for additional information. -** -** The third argument is the value to bind to the parameter. -** -** In those -** routines that have a fourth argument, its value is the number of bytes -** in the parameter. To be clear: the value is the number of bytes in the -** string, not the number of characters. The number -** of bytes does not include the zero-terminator at the end of strings. -** If the fourth parameter is negative, the length of the string is -** number of bytes up to the first zero terminator. -** -** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and -** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** text after SQLite has finished with it. If the fifth argument is the -** special value [SQLITE_STATIC], then the library assumes that the information -** is in static, unmanaged space and does not need to be freed. If the -** fifth argument has the value [SQLITE_TRANSIENT], then SQLite makes its -** own private copy of the data immediately, before the sqlite3_bind_*() -** routine returns. -** -** The sqlite3_bind_zeroblob() routine binds a BLOB of length n that -** is filled with zeros. A zeroblob uses a fixed amount of memory -** (just an integer to hold it size) while it is being processed. -** Zeroblobs are intended to serve as place-holders for BLOBs whose -** content is later written using -** [sqlite3_blob_open | increment BLOB I/O] routines. A negative -** value for the zeroblob results in a zero-length BLOB. -** -** The sqlite3_bind_*() routines must be called after -** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and -** before [sqlite3_step()]. -** Bindings are not cleared by the [sqlite3_reset()] routine. -** Unbound parameters are interpreted as NULL. -** -** These routines return [SQLITE_OK] on success or an error code if -** anything goes wrong. [SQLITE_RANGE] is returned if the parameter -** index is out of range. [SQLITE_NOMEM] is returned if malloc fails. -** [SQLITE_MISUSE] is returned if these routines are called on a virtual -** machine that is the wrong state or which has already been finalized. -*/ -int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); -int sqlite3_bind_double(sqlite3_stmt*, int, double); -int sqlite3_bind_int(sqlite3_stmt*, int, int); -int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); -int sqlite3_bind_null(sqlite3_stmt*, int); -int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); -int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); -int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); -int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); - -/* -** CAPI3REF: Number Of Host Parameters -** -** Return the largest host parameter index in the precompiled statement given -** as the argument. When the host parameters are of the forms like ":AAA" -** or "?", then they are assigned sequential increasing numbers beginning -** with one, so the value returned is the number of parameters. However -** if the same host parameter name is used multiple times, each occurrance -** is given the same number, so the value returned in that case is the number -** of unique host parameter names. If host parameters of the form "?NNN" -** are used (where NNN is an integer) then there might be gaps in the -** numbering and the value returned by this interface is the index of the -** host parameter with the largest index value. -** -** The prepared statement must not be [sqlite3_finalize | finalized] -** prior to this routine returnning. Otherwise the results are undefined -** and probably undesirable. -*/ -int sqlite3_bind_parameter_count(sqlite3_stmt*); - -/* -** CAPI3REF: Name Of A Host Parameter -** -** This routine returns a pointer to the name of the n-th parameter in a -** [sqlite3_stmt | prepared statement]. -** Host parameters of the form ":AAA" or "@AAA" or "$VVV" have a name -** which is the string ":AAA" or "@AAA" or "$VVV". -** In other words, the initial ":" or "$" or "@" -** is included as part of the name. -** Parameters of the form "?" or "?NNN" have no name. -** -** The first bound parameter has an index of 1, not 0. -** -** If the value n is out of range or if the n-th parameter is nameless, -** then NULL is returned. The returned string is always in the -** UTF-8 encoding even if the named parameter was originally specified -** as UTF-16 in [sqlite3_prepare16()] or [sqlite3_prepare16_v2()]. -*/ -const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); - -/* -** CAPI3REF: Index Of A Parameter With A Given Name -** -** This routine returns the index of a host parameter with the given name. -** The name must match exactly. If no parameter with the given name is -** found, return 0. Parameter names must be UTF8. -*/ -int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); - -/* -** CAPI3REF: Reset All Bindings On A Prepared Statement -** -** Contrary to the intuition of many, [sqlite3_reset()] does not -** reset the [sqlite3_bind_blob | bindings] on a -** [sqlite3_stmt | prepared statement]. Use this routine to -** reset all host parameters to NULL. -*/ -int sqlite3_clear_bindings(sqlite3_stmt*); - -/* -** CAPI3REF: Number Of Columns In A Result Set -** -** Return the number of columns in the result set returned by the -** [sqlite3_stmt | compiled SQL statement]. This routine returns 0 -** if pStmt is an SQL statement that does not return data (for -** example an UPDATE). -*/ -int sqlite3_column_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Column Names In A Result Set -** -** These routines return the name assigned to a particular column -** in the result set of a SELECT statement. The sqlite3_column_name() -** interface returns a pointer to a UTF8 string and sqlite3_column_name16() -** returns a pointer to a UTF16 string. The first parameter is the -** [sqlite3_stmt | prepared statement] that implements the SELECT statement. -** The second parameter is the column number. The left-most column is -** number 0. -** -** The returned string pointer is valid until either the -** [sqlite3_stmt | prepared statement] is destroyed by [sqlite3_finalize()] -** or until the next call sqlite3_column_name() or sqlite3_column_name16() -** on the same column. -** -** If sqlite3_malloc() fails during the processing of either routine -** (for example during a conversion from UTF-8 to UTF-16) then a -** NULL pointer is returned. -*/ -const char *sqlite3_column_name(sqlite3_stmt*, int N); -const void *sqlite3_column_name16(sqlite3_stmt*, int N); - -/* -** CAPI3REF: Source Of Data In A Query Result -** -** These routines provide a means to determine what column of what -** table in which database a result of a SELECT statement comes from. -** The name of the database or table or column can be returned as -** either a UTF8 or UTF16 string. The _database_ routines return -** the database name, the _table_ routines return the table name, and -** the origin_ routines return the column name. -** The returned string is valid until -** the [sqlite3_stmt | prepared statement] is destroyed using -** [sqlite3_finalize()] or until the same information is requested -** again in a different encoding. -** -** The names returned are the original un-aliased names of the -** database, table, and column. -** -** The first argument to the following calls is a -** [sqlite3_stmt | compiled SQL statement]. -** These functions return information about the Nth column returned by -** the statement, where N is the second function argument. -** -** If the Nth column returned by the statement is an expression -** or subquery and is not a column value, then all of these functions -** return NULL. Otherwise, they return the -** name of the attached database, table and column that query result -** column was extracted from. -** -** As with all other SQLite APIs, those postfixed with "16" return UTF-16 -** encoded strings, the other functions return UTF-8. -** -** These APIs are only available if the library was compiled with the -** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. -** -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -*/ -const char *sqlite3_column_database_name(sqlite3_stmt*,int); -const void *sqlite3_column_database_name16(sqlite3_stmt*,int); -const char *sqlite3_column_table_name(sqlite3_stmt*,int); -const void *sqlite3_column_table_name16(sqlite3_stmt*,int); -const char *sqlite3_column_origin_name(sqlite3_stmt*,int); -const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Declared Datatype Of A Query Result -** -** The first parameter is a [sqlite3_stmt | compiled SQL statement]. -** If this statement is a SELECT statement and the Nth column of the -** returned result set of that SELECT is a table column (not an -** expression or subquery) then the declared type of the table -** column is returned. If the Nth column of the result set is an -** expression or subquery, then a NULL pointer is returned. -** The returned string is always UTF-8 encoded. For example, in -** the database schema: -** -** CREATE TABLE t1(c1 VARIANT); -** -** And the following statement compiled: -** -** SELECT c1 + 1, c1 FROM t1; -** -** Then this routine would return the string "VARIANT" for the second -** result column (i==1), and a NULL pointer for the first result column -** (i==0). -** -** SQLite uses dynamic run-time typing. So just because a column -** is declared to contain a particular type does not mean that the -** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. Type -** is associated with individual values, not with the containers -** used to hold those values. -*/ -const char *sqlite3_column_decltype(sqlite3_stmt *, int i); -const void *sqlite3_column_decltype16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Evaluate An SQL Statement -** -** After an [sqlite3_stmt | SQL statement] has been prepared with a call -** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of -** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], -** then this function must be called one or more times to evaluate the -** statement. -** -** The details of the behavior of this sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy -** interface will continue to be supported. -** -** In the lagacy interface, the return value will be either [SQLITE_BUSY], -** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** With the "v2" interface, any of the other [SQLITE_OK | result code] -** or [SQLITE_IOERR_READ | extended result code] might be returned as -** well. -** -** [SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. If the statement is a COMMIT -** or occurs outside of an explicit transaction, then you can retry the -** statement. If the statement is not a COMMIT and occurs within a -** explicit transaction then you should rollback the transaction before -** continuing. -** -** [SQLITE_DONE] means that the statement has finished executing -** successfully. sqlite3_step() should not be called again on this virtual -** machine without first calling [sqlite3_reset()] to reset the virtual -** machine back to its initial state. -** -** If the SQL statement being executed returns any data, then -** [SQLITE_ROW] is returned each time a new row of data is ready -** for processing by the caller. The values may be accessed using -** the [sqlite3_column_int | column access functions]. -** sqlite3_step() is called again to retrieve the next row of data. -** -** [SQLITE_ERROR] means that a run-time error (such as a constraint -** violation) has occurred. sqlite3_step() should not be called again on -** the VM. More information may be found by calling [sqlite3_errmsg()]. -** With the legacy interface, a more specific error code (example: -** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) -** can be obtained by calling [sqlite3_reset()] on the -** [sqlite3_stmt | prepared statement]. In the "v2" interface, -** the more specific error code is returned directly by sqlite3_step(). -** -** [SQLITE_MISUSE] means that the this routine was called inappropriately. -** Perhaps it was called on a [sqlite3_stmt | prepared statement] that has -** already been [sqlite3_finalize | finalized] or on one that had -** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could -** be the case that the same database connection is being used by two or -** more threads at the same moment in time. -** -** Goofy Interface Alert: -** In the legacy interface, -** the sqlite3_step() API always returns a generic error code, -** [SQLITE_ERROR], following any error other than [SQLITE_BUSY] -** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or -** [sqlite3_finalize()] in order to find one of the specific -** [SQLITE_ERROR | result codes] that better describes the error. -** We admit that this is a goofy design. The problem has been fixed -** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead -** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the -** more specific [SQLITE_ERROR | result codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. -*/ -int sqlite3_step(sqlite3_stmt*); - -/* -** CAPI3REF: -** -** Return the number of values in the current row of the result set. -** -** After a call to [sqlite3_step()] that returns [SQLITE_ROW], this routine -** will return the same value as the [sqlite3_column_count()] function. -** After [sqlite3_step()] has returned an [SQLITE_DONE], [SQLITE_BUSY], or -** a [SQLITE_ERROR | error code], or before [sqlite3_step()] has been -** called on the [sqlite3_stmt | prepared statement] for the first time, -** this routine returns zero. -*/ -int sqlite3_data_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Fundamental Datatypes -** -** Every value in SQLite has one of five fundamental datatypes: -** -**
      -**
    • 64-bit signed integer -**
    • 64-bit IEEE floating point number -**
    • string -**
    • BLOB -**
    • NULL -**
    -** -** These constants are codes for each of those types. -** -** Note that the SQLITE_TEXT constant was also used in SQLite version 2 -** for a completely different meaning. Software that links against both -** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not -** SQLITE_TEXT. -*/ -#define SQLITE_INTEGER 1 -#define SQLITE_FLOAT 2 -#define SQLITE_BLOB 4 -#define SQLITE_NULL 5 -#ifdef SQLITE_TEXT -# undef SQLITE_TEXT -#else -# define SQLITE_TEXT 3 -#endif -#define SQLITE3_TEXT 3 - -/* -** CAPI3REF: Results Values From A Query -** -** These routines return information about -** a single column of the current result row of a query. In every -** case the first argument is a pointer to the -** [sqlite3_stmt | SQL statement] that is being -** evaluated (the [sqlite3_stmt*] that was returned from -** [sqlite3_prepare_v2()] or one of its variants) and -** the second argument is the index of the column for which information -** should be returned. The left-most column of the result set -** has an index of 0. -** -** If the SQL statement is not currently point to a valid row, or if the -** the column index is out of range, the result is undefined. -** These routines may only be called when the most recent call to -** [sqlite3_step()] has returned [SQLITE_ROW] and neither -** [sqlite3_reset()] nor [sqlite3_finalize()] has been call subsequently. -** If any of these routines are called after [sqlite3_reset()] or -** [sqlite3_finalize()] or after [sqlite3_step()] has returned -** something other than [SQLITE_ROW], the results are undefined. -** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] -** are called from a different thread while any of these routines -** are pending, then the results are undefined. -** -** The sqlite3_column_type() routine returns -** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future -** versions of SQLite may change the behavior of sqlite3_column_type() -** following a type conversion. -** -** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() -** routine returns the number of bytes in that BLOB or string. -** If the result is a UTF-16 string, then sqlite3_column_bytes() converts -** the string to UTF-8 and then returns the number of bytes. -** If the result is a numeric value then sqlite3_column_bytes() uses -** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns -** the number of bytes in that string. -** The value returned does not include the zero terminator at the end -** of the string. For clarity: the value returned is the number of -** bytes in the string, not the number of characters. -** -** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even zero-length strings, are always zero terminated. The return -** value from sqlite3_column_blob() for a zero-length blob is an arbitrary -** pointer, possibly even a NULL pointer. -** -** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() -** but leaves the result in UTF-16 instead of UTF-8. -** The zero terminator is not included in this count. -** -** These routines attempt to convert the value where appropriate. For -** example, if the internal representation is FLOAT and a text result -** is requested, [sqlite3_snprintf()] is used internally to do the conversion -** automatically. The following table details the conversions that -** are applied: -** -**
    -**
    -**
    Internal
    Type
    Requested
    Type
    Conversion -** -**
    NULL INTEGER Result is 0 -**
    NULL FLOAT Result is 0.0 -**
    NULL TEXT Result is NULL pointer -**
    NULL BLOB Result is NULL pointer -**
    INTEGER FLOAT Convert from integer to float -**
    INTEGER TEXT ASCII rendering of the integer -**
    INTEGER BLOB Same as for INTEGER->TEXT -**
    FLOAT INTEGER Convert from float to integer -**
    FLOAT TEXT ASCII rendering of the float -**
    FLOAT BLOB Same as FLOAT->TEXT -**
    TEXT INTEGER Use atoi() -**
    TEXT FLOAT Use atof() -**
    TEXT BLOB No change -**
    BLOB INTEGER Convert to TEXT then use atoi() -**
    BLOB FLOAT Convert to TEXT then use atof() -**
    BLOB TEXT Add a zero terminator if needed -**
    -** -** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** on equavalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** -** Note that when type conversions occur, pointers returned by prior -** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or -** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur -** in the following cases: -** -**
      -**
    • The initial content is a BLOB and sqlite3_column_text() -** or sqlite3_column_text16() is called. A zero-terminator might -** need to be added to the string.

    • -** -**
    • The initial content is UTF-8 text and sqlite3_column_bytes16() or -** sqlite3_column_text16() is called. The content must be converted -** to UTF-16.

    • -** -**
    • The initial content is UTF-16 text and sqlite3_column_bytes() or -** sqlite3_column_text() is called. The content must be converted -** to UTF-8.

    • -**
    -** -** Conversions between UTF-16be and UTF-16le are always done in place and do -** not invalidate a prior pointer, though of course the content of the buffer -** that the prior pointer points to will have been modified. Other kinds -** of conversion are done in place when it is possible, but sometime it is -** not possible and in those cases prior pointers are invalidated. -** -** The safest and easiest to remember policy is to invoke these routines -** in one of the following ways: -** -**
      -**
    • sqlite3_column_text() followed by sqlite3_column_bytes()
    • -**
    • sqlite3_column_blob() followed by sqlite3_column_bytes()
    • -**
    • sqlite3_column_text16() followed by sqlite3_column_bytes16()
    • -**
    -** -** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(), -** or sqlite3_column_text16() first to force the result into the desired -** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to -** find the size of the result. Do not mix call to sqlite3_column_text() or -** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not -** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes(). -** -** The pointers returned are valid until a type conversion occurs as -** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. The memory space used to hold strings -** and blobs is freed automatically. Do not pass the pointers returned -** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into -** [sqlite3_free()]. -** -** If a memory allocation error occurs during the evaluation of any -** of these routines, a default value is returned. The default value -** is either the integer 0, the floating point number 0.0, or a NULL -** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM]. -*/ -const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); -double sqlite3_column_double(sqlite3_stmt*, int iCol); -int sqlite3_column_int(sqlite3_stmt*, int iCol); -sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); -const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); -const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -int sqlite3_column_type(sqlite3_stmt*, int iCol); -sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); - -/* -** CAPI3REF: Destroy A Prepared Statement Object -** -** The sqlite3_finalize() function is called to delete a -** [sqlite3_stmt | compiled SQL statement]. If the statement was -** executed successfully, or not executed at all, then SQLITE_OK is returned. -** If execution of the statement failed then an -** [SQLITE_ERROR | error code] or [SQLITE_IOERR_READ | extended error code] -** is returned. -** -** This routine can be called at any point during the execution of the -** [sqlite3_stmt | virtual machine]. If the virtual machine has not -** completed execution when this routine is called, that is like -** encountering an error or an interrupt. (See [sqlite3_interrupt()].) -** Incomplete updates may be rolled back and transactions cancelled, -** depending on the circumstances, and the -** [SQLITE_ERROR | result code] returned will be [SQLITE_ABORT]. -*/ -int sqlite3_finalize(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Reset A Prepared Statement Object -** -** The sqlite3_reset() function is called to reset a -** [sqlite3_stmt | compiled SQL statement] object. -** back to it's initial state, ready to be re-executed. -** Any SQL statement variables that had values bound to them using -** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. -** Use [sqlite3_clear_bindings()] to reset the bindings. -*/ -int sqlite3_reset(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Create Or Redefine SQL Functions -** -** The following two functions are used to add SQL functions or aggregates -** or to redefine the behavior of existing SQL functions or aggregates. The -** difference only between the two is that the second parameter, the -** name of the (scalar) function or aggregate, is encoded in UTF-8 for -** sqlite3_create_function() and UTF-16 for sqlite3_create_function16(). -** -** The first argument is the [sqlite3 | database handle] that holds the -** SQL function or aggregate is to be added or redefined. If a single -** program uses more than one database handle internally, then SQL -** functions or aggregates must be added individually to each database -** handle with which they will be used. -** -** The second parameter is the name of the SQL function to be created -** or redefined. -** The length of the name is limited to 255 bytes, exclusive of the -** zero-terminator. Note that the name length limit is in bytes, not -** characters. Any attempt to create a function with a longer name -** will result in an SQLITE_ERROR error. -** -** The third parameter is the number of arguments that the SQL function or -** aggregate takes. If this parameter is negative, then the SQL function or -** aggregate may take any number of arguments. -** -** The fourth parameter, eTextRep, specifies what -** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Any SQL function implementation should be able to work -** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. It is allowed to -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. -** When multiple implementations of the same function are available, SQLite -** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what -** text encoding is used, then the fourth argument should be -** [SQLITE_ANY]. -** -** The fifth parameter is an arbitrary pointer. The implementation -** of the function can gain access to this pointer using -** [sqlite3_user_data()]. -** -** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are -** pointers to C-language functions that implement the SQL -** function or aggregate. A scalar SQL function requires an implementation of -** the xFunc callback only, NULL pointers should be passed as the xStep -** and xFinal parameters. An aggregate SQL function requires an implementation -** of xStep and xFinal and NULL should be passed for xFunc. To delete an -** existing SQL function or aggregate, pass NULL for all three function -** callback. -** -** It is permitted to register multiple implementations of the same -** functions with the same name but with either differing numbers of -** arguments or differing perferred text encodings. SQLite will use -** the implementation most closely matches the way in which the -** SQL function is used. -*/ -int sqlite3_create_function( - sqlite3 *, - const char *zFunctionName, - int nArg, - int eTextRep, - void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -int sqlite3_create_function16( - sqlite3*, - const void *zFunctionName, - int nArg, - int eTextRep, - void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); - -/* -** CAPI3REF: Text Encodings -** -** These constant define integer codes that represent the various -** text encodings supported by SQLite. -*/ -#define SQLITE_UTF8 1 -#define SQLITE_UTF16LE 2 -#define SQLITE_UTF16BE 3 -#define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ -#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - -/* -** CAPI3REF: Obsolete Functions -** -** These functions are all now obsolete. In order to maintain -** backwards compatibility with older code, we continue to support -** these functions. However, new development projects should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you want they do. -*/ -int sqlite3_aggregate_count(sqlite3_context*); -int sqlite3_expired(sqlite3_stmt*); -int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); -int sqlite3_global_recover(void); -void sqlite3_thread_cleanup(void); - -/* -** CAPI3REF: Obtaining SQL Function Parameter Values -** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. -** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 4th parameter to these callbacks is an array of pointers to -** [sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. -** -** These routines work just like the corresponding -** [sqlite3_column_blob | sqlite3_column_* routines] except that -** these routines take a single [sqlite3_value*] pointer instead -** of an [sqlite3_stmt*] pointer and an integer column number. -** -** The sqlite3_value_text16() interface extracts a UTF16 string -** in the native byte-order of the host machine. The -** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces -** extract UTF16 strings as big-endian and little-endian respectively. -** -** The sqlite3_value_numeric_type() interface attempts to apply -** numeric affinity to the value. This means that an attempt is -** made to convert the value to an integer or floating point. If -** such a conversion is possible without loss of information (in order -** words if the value is original a string that looks like a number) -** then it is done. Otherwise no conversion occurs. The -** [SQLITE_INTEGER | datatype] after conversion is returned. -** -** Please pay particular attention to the fact that the pointer that -** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or -** [sqlite3_value_text16()] can be invalidated by a subsequent call to -** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], -** or [sqlite3_value_text16()]. -** -** These routines must be called from the same thread as -** the SQL function that supplied the sqlite3_value* parameters. -** Or, if the sqlite3_value* argument comes from the [sqlite3_column_value()] -** interface, then these routines should be called from the same thread -** that ran [sqlite3_column_value()]. -*/ -const void *sqlite3_value_blob(sqlite3_value*); -int sqlite3_value_bytes(sqlite3_value*); -int sqlite3_value_bytes16(sqlite3_value*); -double sqlite3_value_double(sqlite3_value*); -int sqlite3_value_int(sqlite3_value*); -sqlite3_int64 sqlite3_value_int64(sqlite3_value*); -const unsigned char *sqlite3_value_text(sqlite3_value*); -const void *sqlite3_value_text16(sqlite3_value*); -const void *sqlite3_value_text16le(sqlite3_value*); -const void *sqlite3_value_text16be(sqlite3_value*); -int sqlite3_value_type(sqlite3_value*); -int sqlite3_value_numeric_type(sqlite3_value*); - -/* -** CAPI3REF: Obtain Aggregate Function Context -** -** The implementation of aggregate SQL functions use this routine to allocate -** a structure for storing their state. The first time this routine -** is called for a particular aggregate, a new structure of size nBytes -** is allocated, zeroed, and returned. On subsequent calls (for the -** same aggregate instance) the same buffer is returned. The implementation -** of the aggregate can use the returned buffer to accumulate data. -** -** The buffer allocated is freed automatically by SQLite whan the aggregate -** query concludes. -** -** The first parameter should be a copy of the -** [sqlite3_context | SQL function context] that is the first -** parameter to the callback routine that implements the aggregate -** function. -** -** This routine must be called from the same thread in which -** the aggregate SQL function is running. -*/ -void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); - -/* -** CAPI3REF: User Data For Functions -** -** The pUserData parameter to the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines -** used to register user functions is available to -** the implementation of the function using this call. -** -** This routine must be called from the same thread in which -** the SQL function is running. -*/ -void *sqlite3_user_data(sqlite3_context*); - -/* -** CAPI3REF: Function Auxiliary Data -** -** The following two functions may be used by scalar SQL functions to -** associate meta-data with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated meta-data may be preserved. This may -** be used, for example, to add a regular-expression matching scalar -** function. The compiled version of the regular expression is stored as -** meta-data associated with the SQL value passed as the regular expression -** pattern. The compiled regular expression can be reused on multiple -** invocations of the same function so that the original pattern string -** does not need to be recompiled on each invocation. -** -** The sqlite3_get_auxdata() interface returns a pointer to the meta-data -** associated with the Nth argument value to the current SQL function -** call, where N is the second parameter. If no meta-data has been set for -** that value, then a NULL pointer is returned. -** -** The sqlite3_set_auxdata() is used to associate meta-data with an SQL -** function argument. The third parameter is a pointer to the meta-data -** to be associated with the Nth user function argument value. The fourth -** parameter specifies a destructor that will be called on the meta- -** data pointer to release it when it is no longer required. If the -** destructor is NULL, it is not invoked. -** -** In practice, meta-data is preserved between function calls for -** expressions that are constant at compile time. This includes literal -** values and SQL variables. -** -** These routines must be called from the same thread in which -** the SQL function is running. -*/ -void *sqlite3_get_auxdata(sqlite3_context*, int); -void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*)); - - -/* -** CAPI3REF: Constants Defining Special Destructor Behavior -** -** These are special value for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. If the destructor -** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. The -** SQLITE_TRANSIENT value means that the content will likely change in -** the near future and that SQLite should make its own private copy of -** the content before returning. -** -** The typedef is necessary to work around problems in certain -** C++ compilers. See ticket #2191. -*/ -typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) - -/* -** CAPI3REF: Setting The Result Of An SQL Function -** -** These routines are used by the xFunc or xFinal callbacks that -** implement SQL functions and aggregates. See -** [sqlite3_create_function()] and [sqlite3_create_function16()] -** for additional information. -** -** These functions work very much like the -** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used -** to bind values to host parameters in prepared statements. -** Refer to the -** [sqlite3_bind_blob | sqlite3_bind_* documentation] for -** additional information. -** -** The sqlite3_result_error() and sqlite3_result_error16() functions -** cause the implemented SQL function to throw an exception. The -** parameter to sqlite3_result_error() or sqlite3_result_error16() -** is the text of an error message. -** -** The sqlite3_result_toobig() cause the function implementation -** to throw and error indicating that a string or BLOB is to long -** to represent. -** -** These routines must be called from within the same thread as -** the SQL function associated with the [sqlite3_context] pointer. -*/ -void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); -void sqlite3_result_double(sqlite3_context*, double); -void sqlite3_result_error(sqlite3_context*, const char*, int); -void sqlite3_result_error16(sqlite3_context*, const void*, int); -void sqlite3_result_error_toobig(sqlite3_context*); -void sqlite3_result_error_nomem(sqlite3_context*); -void sqlite3_result_int(sqlite3_context*, int); -void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); -void sqlite3_result_null(sqlite3_context*); -void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); -void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); -void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); -void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); -void sqlite3_result_value(sqlite3_context*, sqlite3_value*); -void sqlite3_result_zeroblob(sqlite3_context*, int n); - -/* -** CAPI3REF: Define New Collating Sequences -** -** These functions are used to add new collation sequences to the -** [sqlite3*] handle specified as the first argument. -** -** The name of the new collation sequence is specified as a UTF-8 string -** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string for sqlite3_create_collation16(). In all cases -** the name is passed as the second function argument. -** -** The third argument must be one of the constants [SQLITE_UTF8], -** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied -** routine expects to be passed pointers to strings encoded using UTF-8, -** UTF-16 little-endian or UTF-16 big-endian respectively. -** -** A pointer to the user supplied routine must be passed as the fifth -** argument. If it is NULL, this is the same as deleting the collation -** sequence (so that SQLite cannot call it anymore). Each time the user -** supplied function is invoked, it is passed a copy of the void* passed as -** the fourth argument to sqlite3_create_collation() or -** sqlite3_create_collation16() as its first parameter. -** -** The remaining arguments to the user-supplied routine are two strings, -** each represented by a [length, data] pair and encoded in the encoding -** that was passed as the third argument when the collation sequence was -** registered. The user routine should return negative, zero or positive if -** the first string is less than, equal to, or greater than the second -** string. i.e. (STRING1 - STRING2). -** -** The sqlite3_create_collation_v2() works like sqlite3_create_collation() -** excapt that it takes an extra argument which is a destructor for -** the collation. The destructor is called when the collation is -** destroyed and is passed a copy of the fourth parameter void* pointer -** of the sqlite3_create_collation_v2(). Collations are destroyed when -** they are overridden by later calls to the collation creation functions -** or when the [sqlite3*] database handle is closed using [sqlite3_close()]. -** -** The sqlite3_create_collation_v2() interface is experimental and -** subject to change in future releases. The other collation creation -** functions are stable. -*/ -int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, - void*, - int(*xCompare)(void*,int,const void*,int,const void*) -); -int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, - void*, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDestroy)(void*) -); -int sqlite3_create_collation16( - sqlite3*, - const char *zName, - int eTextRep, - void*, - int(*xCompare)(void*,int,const void*,int,const void*) -); - -/* -** CAPI3REF: Collation Needed Callbacks -** -** To avoid having to register all collation sequences before a database -** can be used, a single callback function may be registered with the -** database handle to be called whenever an undefined collation sequence is -** required. -** -** If the function is registered using the sqlite3_collation_needed() API, -** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. If sqlite3_collation_needed16() is used, the names -** are passed as UTF-16 in machine native byte order. A call to either -** function replaces any existing callback. -** -** When the callback is invoked, the first argument passed is a copy -** of the second argument to sqlite3_collation_needed() or -** sqlite3_collation_needed16(). The second argument is the database -** handle. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], or -** [SQLITE_UTF16LE], indicating the most desirable form of the collation -** sequence function required. The fourth parameter is the name of the -** required collation sequence. -** -** The callback function should register the desired collation using -** [sqlite3_create_collation()], [sqlite3_create_collation16()], or -** [sqlite3_create_collation_v2()]. -*/ -int sqlite3_collation_needed( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const char*) -); -int sqlite3_collation_needed16( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const void*) -); - -/* -** Specify the key for an encrypted database. This routine should be -** called right after sqlite3_open(). -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -int sqlite3_key( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The key */ -); - -/* -** Change the key on an open database. If the current database is not -** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the -** database is decrypted. -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -int sqlite3_rekey( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The new key */ -); - -/* -** CAPI3REF: Suspend Execution For A Short Time -** -** This function causes the current thread to suspend execution -** a number of milliseconds specified in its parameter. -** -** If the operating system does not support sleep requests with -** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually -** requested from the operating system is returned. -** -** SQLite implements this interface by calling the xSleep() -** method of the default [sqlite3_vfs] object. -*/ -int sqlite3_sleep(int); - -/* -** CAPI3REF: Name Of The Folder Holding Temporary Files -** -** If this global variable is made to point to a string which is -** the name of a folder (a.ka. directory), then all temporary files -** created by SQLite will be placed in that directory. If this variable -** is NULL pointer, then SQLite does a search for an appropriate temporary -** file directory. -** -** It is not safe to modify this variable once a database connection -** has been opened. It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been call and remain unchanged thereafter. -*/ -SQLITE_EXTERN char *sqlite3_temp_directory; - -/* -** CAPI3REF: Test To See If The Database Is In Auto-Commit Mode -** -** Test to see whether or not the database connection is in autocommit -** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on -** by default. Autocommit is disabled by a BEGIN statement and reenabled -** by the next COMMIT or ROLLBACK. -** -** If certain kinds of errors occur on a statement within a multi-statement -** transactions (errors including [SQLITE_FULL], [SQLITE_IOERR], -** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the -** transaction might be rolled back automatically. The only way to -** find out if SQLite automatically rolled back the transaction after -** an error is to use this function. -** -** If another thread changes the autocommit status of the database -** connection while this routine is running, then the return value -** is undefined. -*/ -int sqlite3_get_autocommit(sqlite3*); - -/* -** CAPI3REF: Find The Database Handle Associated With A Prepared Statement -** -** Return the [sqlite3*] database handle to which a -** [sqlite3_stmt | prepared statement] belongs. -** This is the same database handle that was -** the first argument to the [sqlite3_prepare_v2()] or its variants -** that was used to create the statement in the first place. -*/ -sqlite3 *sqlite3_db_handle(sqlite3_stmt*); - - -/* -** CAPI3REF: Commit And Rollback Notification Callbacks -** -** These routines -** register callback functions to be invoked whenever a transaction -** is committed or rolled back. The pArg argument is passed through -** to the callback. If the callback on a commit hook function -** returns non-zero, then the commit is converted into a rollback. -** -** If another function was previously registered, its pArg value is returned. -** Otherwise NULL is returned. -** -** Registering a NULL function disables the callback. -** -** For the purposes of this API, a transaction is said to have been -** rolled back if an explicit "ROLLBACK" statement is executed, or -** an error or constraint causes an implicit rollback to occur. The -** callback is not invoked if a transaction is automatically rolled -** back because the database connection is closed. -** -** These are experimental interfaces and are subject to change. -*/ -void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); -void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); - -/* -** CAPI3REF: Data Change Notification Callbacks -** -** Register a callback function with the database connection identified by the -** first argument to be invoked whenever a row is updated, inserted or deleted. -** Any callback set by a previous call to this function for the same -** database connection is overridden. -** -** The second argument is a pointer to the function to invoke when a -** row is updated, inserted or deleted. The first argument to the callback is -** a copy of the third argument to sqlite3_update_hook(). The second callback -** argument is one of SQLITE_INSERT, SQLITE_DELETE or SQLITE_UPDATE, depending -** on the operation that caused the callback to be invoked. The third and -** fourth arguments to the callback contain pointers to the database and -** table name containing the affected row. The final callback parameter is -** the rowid of the row. In the case of an update, this is the rowid after -** the update takes place. -** -** The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence). -** -** If another function was previously registered, its pArg value is returned. -** Otherwise NULL is returned. -*/ -void *sqlite3_update_hook( - sqlite3*, - void(*)(void *,int ,char const *,char const *,sqlite3_int64), - void* -); - -/* -** CAPI3REF: Enable Or Disable Shared Pager Cache -** -** This routine enables or disables the sharing of the database cache -** and schema data structures between connections to the same database. -** Sharing is enabled if the argument is true and disabled if the argument -** is false. -** -** Beginning in SQLite version 3.5.0, cache sharing is enabled and disabled -** for an entire process. In prior versions of SQLite, sharing was -** enabled or disabled for each thread separately. -** -** The cache sharing mode set by this interface effects all subsequent -** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode that was -** in effect at the time they were opened. -** -** Virtual tables cannot be used with a shared cache. When shared -** cache is enabled, the [sqlite3_create_module()] API used to register -** virtual tables will always return an error. -** -** This routine returns [SQLITE_OK] if shared cache was -** enabled or disabled successfully. An [SQLITE_ERROR | error code] -** is returned otherwise. -** -** Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. -*/ -int sqlite3_enable_shared_cache(int); - -/* -** CAPI3REF: Attempt To Free Heap Memory -** -** Attempt to free N bytes of heap memory by deallocating non-essential -** memory allocations held by the database library (example: memory -** used to cache database pages to improve performance). -*/ -int sqlite3_release_memory(int); - -/* -** CAPI3REF: Impose A Limit On Heap Size -** -** Place a "soft" limit on the amount of heap memory that may be allocated -** by SQLite. If an internal allocation is requested -** that would exceed the specified limit, [sqlite3_release_memory()] is -** invoked one or more times to free up some space before the allocation -** is made. -** -** The limit is called "soft", because if [sqlite3_release_memory()] cannot -** free sufficient memory to prevent the limit from being exceeded, -** the memory is allocated anyway and the current operation proceeds. -** -** A negative or zero value for N means that there is no soft heap limit and -** [sqlite3_release_memory()] will only be called when memory is exhausted. -** The default value for the soft heap limit is zero. -** -** SQLite makes a best effort to honor the soft heap limit. But if it -** is unable to reduce memory usage below the soft limit, execution will -** continue without error or notification. This is why the limit is -** called a "soft" limit. It is advisory only. -** -** The soft heap limit is implemented using the [sqlite3_memory_alarm()] -** interface. Only a single memory alarm is available in the default -** implementation. This means that if the application also uses the -** memory alarm interface it will interfere with the operation of the -** soft heap limit and undefined behavior will result. -** -** Prior to SQLite version 3.5.0, this routine only constrained the memory -** allocated by a single thread - the same thread in which this routine -** runs. Beginning with SQLite version 3.5.0, the soft heap limit is -** applied to all threads. The value specified for the soft heap limit -** is an upper bound on the total memory allocation for all threads. In -** version 3.5.0 there is no mechanism for limiting the heap usage for -** individual threads. -*/ -void sqlite3_soft_heap_limit(int); - -/* -** CAPI3REF: Extract Metadata About A Column Of A Table -** -** This routine -** returns meta-data about a specific column of a specific database -** table accessible using the connection handle passed as the first function -** argument. -** -** The column is identified by the second, third and fourth parameters to -** this function. The second parameter is either the name of the database -** (i.e. "main", "temp" or an attached database) containing the specified -** table or NULL. If it is NULL, then all attached databases are searched -** for the table using the same algorithm as the database engine uses to -** resolve unqualified table references. -** -** The third and fourth parameters to this function are the table and column -** name of the desired column, respectively. Neither of these parameters -** may be NULL. -** -** Meta information is returned by writing to the memory locations passed as -** the 5th and subsequent parameters to this function. Any of these -** arguments may be NULL, in which case the corresponding element of meta -** information is ommitted. -** -**
    -** Parameter     Output Type      Description
    -** -----------------------------------
    -**
    -**   5th         const char*      Data type
    -**   6th         const char*      Name of the default collation sequence 
    -**   7th         int              True if the column has a NOT NULL constraint
    -**   8th         int              True if the column is part of the PRIMARY KEY
    -**   9th         int              True if the column is AUTOINCREMENT
    -** 
    -** -** -** The memory pointed to by the character pointers returned for the -** declaration type and collation sequence is valid only until the next -** call to any sqlite API function. -** -** If the specified table is actually a view, then an error is returned. -** -** If the specified column is "rowid", "oid" or "_rowid_" and an -** INTEGER PRIMARY KEY column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. If there is no -** explicitly declared IPK column, then the output parameters are set as -** follows: -** -**
    -**     data type: "INTEGER"
    -**     collation sequence: "BINARY"
    -**     not null: 0
    -**     primary key: 1
    -**     auto increment: 0
    -** 
    -** -** This function may load one or more schemas from database files. If an -** error occurs during this process, or if the requested table or column -** cannot be found, an SQLITE error code is returned and an error message -** left in the database handle (to be retrieved using sqlite3_errmsg()). -** -** This API is only available if the library was compiled with the -** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. -*/ -int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if column is auto-increment */ -); - -/* -** CAPI3REF: Load An Extension -** -** Attempt to load an SQLite extension library contained in the file -** zFile. The entry point is zProc. zProc may be 0 in which case the -** name of the entry point defaults to "sqlite3_extension_init". -** -** Return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** -** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with -** error message text. The calling function should free this memory -** by calling [sqlite3_free()]. -** -** Extension loading must be enabled using [sqlite3_enable_load_extension()] -** prior to calling this API or an error will be returned. -*/ -int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Derived from zFile if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -); - -/* -** CAPI3REF: Enable Or Disable Extension Loading -** -** So as not to open security holes in older applications that are -** unprepared to deal with extension loading, and as a means of disabling -** extension loading while evaluating user-entered SQL, the following -** API is provided to turn the [sqlite3_load_extension()] mechanism on and -** off. It is off by default. See ticket #1863. -** -** Call this routine with onoff==1 to turn extension loading on -** and call it with onoff==0 to turn it back off again. -*/ -int sqlite3_enable_load_extension(sqlite3 *db, int onoff); - -/* -** CAPI3REF: Make Arrangements To Automatically Load An Extension -** -** Register an extension entry point that is automatically invoked -** whenever a new database connection is opened using -** [sqlite3_open()], [sqlite3_open16()], or [sqlite3_open_v2()]. -** -** This API can be invoked at program startup in order to register -** one or more statically linked extensions that will be available -** to all new database connections. -** -** Duplicate extensions are detected so calling this routine multiple -** times with the same extension is harmless. -** -** This routine stores a pointer to the extension in an array -** that is obtained from malloc(). If you run a memory leak -** checker on your program and it reports a leak because of this -** array, then invoke [sqlite3_automatic_extension_reset()] prior -** to shutdown to free the memory. -** -** Automatic extensions apply across all threads. -** -** This interface is experimental and is subject to change or -** removal in future releases of SQLite. -*/ -int sqlite3_auto_extension(void *xEntryPoint); - - -/* -** CAPI3REF: Reset Automatic Extension Loading -** -** Disable all previously registered automatic extensions. This -** routine undoes the effect of all prior [sqlite3_automatic_extension()] -** calls. -** -** This call disabled automatic extensions in all threads. -** -** This interface is experimental and is subject to change or -** removal in future releases of SQLite. -*/ -void sqlite3_reset_auto_extension(void); - - -/* -****** EXPERIMENTAL - subject to change without notice ************** -** -** The interface to the virtual-table mechanism is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stablizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** Structures used by the virtual table interface -*/ -typedef struct sqlite3_vtab sqlite3_vtab; -typedef struct sqlite3_index_info sqlite3_index_info; -typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; -typedef struct sqlite3_module sqlite3_module; - -/* -** A module is a class of virtual tables. Each module is defined -** by an instance of the following structure. This structure consists -** mostly of methods for the module. -*/ -struct sqlite3_module { - int iVersion; - int (*xCreate)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xConnect)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); - int (*xDisconnect)(sqlite3_vtab *pVTab); - int (*xDestroy)(sqlite3_vtab *pVTab); - int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); - int (*xClose)(sqlite3_vtab_cursor*); - int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, - int argc, sqlite3_value **argv); - int (*xNext)(sqlite3_vtab_cursor*); - int (*xEof)(sqlite3_vtab_cursor*); - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); - int (*xBegin)(sqlite3_vtab *pVTab); - int (*xSync)(sqlite3_vtab *pVTab); - int (*xCommit)(sqlite3_vtab *pVTab); - int (*xRollback)(sqlite3_vtab *pVTab); - int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg); - - int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); -}; - -/* -** The sqlite3_index_info structure and its substructures is used to -** pass information into and receive the reply from the xBestIndex -** method of an sqlite3_module. The fields under **Inputs** are the -** inputs to xBestIndex and are read-only. xBestIndex inserts its -** results into the **Outputs** fields. -** -** The aConstraint[] array records WHERE clause constraints of the -** form: -** -** column OP expr -** -** Where OP is =, <, <=, >, or >=. The particular operator is stored -** in aConstraint[].op. The index of the column is stored in -** aConstraint[].iColumn. aConstraint[].usable is TRUE if the -** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot. -** -** The optimizer automatically inverts terms of the form "expr OP column" -** and makes other simplifications to the WHERE clause in an attempt to -** get as many WHERE clause terms into the form shown above as possible. -** The aConstraint[] array only reports WHERE clause terms in the correct -** form that refer to the particular virtual table being queried. -** -** Information about the ORDER BY clause is stored in aOrderBy[]. -** Each term of aOrderBy records a column of the ORDER BY clause. -** -** The xBestIndex method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. If argvIndex>0 then -** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit -** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite. -** -** The idxNum and idxPtr values are recorded and passed into xFilter. -** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true. -** -** The orderByConsumed means that output from xFilter will occur in -** the correct order to satisfy the ORDER BY clause so that no separate -** sorting step is required. -** -** The estimatedCost value is an estimate of the cost of doing the -** particular lookup. A full scan of a table with N entries should have -** a cost of N. A binary search of a table of N entries should have a -** cost of approximately log(N). -*/ -struct sqlite3_index_info { - /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ - struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ - unsigned char op; /* Constraint operator */ - unsigned char usable; /* True if this constraint is usable */ - int iTermOffset; /* Used internally - xBestIndex should ignore */ - } *aConstraint; /* Table of WHERE clause constraints */ - int nOrderBy; /* Number of terms in the ORDER BY clause */ - struct sqlite3_index_orderby { - int iColumn; /* Column number */ - unsigned char desc; /* True for DESC. False for ASC. */ - } *aOrderBy; /* The ORDER BY clause */ - - /* Outputs */ - struct sqlite3_index_constraint_usage { - int argvIndex; /* if >0, constraint is part of argv to xFilter */ - unsigned char omit; /* Do not code a test for this constraint */ - } *aConstraintUsage; - int idxNum; /* Number used to identify the index */ - char *idxStr; /* String, possibly obtained from sqlite3_malloc */ - int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ - int orderByConsumed; /* True if output is already ordered */ - double estimatedCost; /* Estimated cost of using this index */ -}; -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 - -/* -** This routine is used to register a new module name with an SQLite -** connection. Module names must be registered before creating new -** virtual tables on the module, or before using preexisting virtual -** tables of the module. -*/ -int sqlite3_create_module( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *, /* Methods for the module */ - void * /* Client data for xCreate/xConnect */ -); - -/* -** This routine is identical to the sqlite3_create_module() method above, -** except that it allows a destructor function to be specified. It is -** even more experimental than the rest of the virtual tables API. -*/ -int sqlite3_create_module_v2( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *, /* Methods for the module */ - void *, /* Client data for xCreate/xConnect */ - void(*xDestroy)(void*) /* Module destructor function */ -); - -/* -** Every module implementation uses a subclass of the following structure -** to describe a particular instance of the module. Each subclass will -** be tailored to the specific needs of the module implementation. The -** purpose of this superclass is to define certain fields that are common -** to all module implementations. -** -** Virtual tables methods can set an error message by assigning a -** string obtained from sqlite3_mprintf() to zErrMsg. The method should -** take care that any prior string is freed by a call to sqlite3_free() -** prior to assigning a new string to zErrMsg. After the error message -** is delivered up to the client application, the string will be automatically -** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note -** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field -** since virtual tables are commonly implemented in loadable extensions which -** do not have access to sqlite3MPrintf() or sqlite3Free(). -*/ -struct sqlite3_vtab { - const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* Used internally */ - char *zErrMsg; /* Error message from sqlite3_mprintf() */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* Every module implementation uses a subclass of the following structure -** to describe cursors that point into the virtual table and are used -** to loop through the virtual table. Cursors are created using the -** xOpen method of the module. Each module implementation will define -** the content of a cursor structure to suit its own needs. -** -** This superclass exists in order to define fields of the cursor that -** are common to all implementations. -*/ -struct sqlite3_vtab_cursor { - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** The xCreate and xConnect methods of a module use the following API -** to declare the format (the names and datatypes of the columns) of -** the virtual tables they implement. -*/ -int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable); - -/* -** Virtual tables can provide alternative implementations of functions -** using the xFindFunction method. But global versions of those functions -** must exist in order to be overloaded. -** -** This API makes sure a global version of a function with a particular -** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created. The implementation -** of the new function always causes an exception to be thrown. So -** the new function is not good for anything by itself. Its only -** purpose is to be a place-holder function that can be overloaded -** by virtual tables. -** -** This API should be considered part of the virtual table interface, -** which is experimental and subject to change. -*/ -int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); - -/* -** The interface to the virtual-table mechanism defined above (back up -** to a comment remarkably similar to this one) is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -** -****** EXPERIMENTAL - subject to change without notice ************** -*/ - -/* -** CAPI3REF: A Handle To An Open BLOB -** -** An instance of the following opaque structure is used to -** represent an blob-handle. A blob-handle is created by -** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()]. -** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces -** can be used to read or write small subsections of the blob. -** The [sqlite3_blob_bytes()] interface returns the size of the -** blob in bytes. -*/ -typedef struct sqlite3_blob sqlite3_blob; - -/* -** CAPI3REF: Open A BLOB For Incremental I/O -** -** Open a handle to the blob located in row iRow,, column zColumn, -** table zTable in database zDb. i.e. the same blob that would -** be selected by: -** -**
    -**     SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
    -** 
    -** -** If the flags parameter is non-zero, the blob is opened for -** read and write access. If it is zero, the blob is opened for read -** access. -** -** On success, [SQLITE_OK] is returned and the new -** [sqlite3_blob | blob handle] is written to *ppBlob. -** Otherwise an error code is returned and -** any value written to *ppBlob should not be used by the caller. -** This function sets the database-handle error code and message -** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()]. -*/ -int sqlite3_blob_open( - sqlite3*, - const char *zDb, - const char *zTable, - const char *zColumn, - sqlite3_int64 iRow, - int flags, - sqlite3_blob **ppBlob -); - -/* -** CAPI3REF: Close A BLOB Handle -** -** Close an open [sqlite3_blob | blob handle]. -*/ -int sqlite3_blob_close(sqlite3_blob *); - -/* -** CAPI3REF: Return The Size Of An Open BLOB -** -** Return the size in bytes of the blob accessible via the open -** [sqlite3_blob | blob-handle] passed as an argument. -*/ -int sqlite3_blob_bytes(sqlite3_blob *); - -/* -** CAPI3REF: Read Data From A BLOB Incrementally -** -** This function is used to read data from an open -** [sqlite3_blob | blob-handle] into a caller supplied buffer. -** n bytes of data are copied into buffer -** z from the open blob, starting at offset iOffset. -** -** On success, SQLITE_OK is returned. Otherwise, an -** [SQLITE_ERROR | SQLite error code] or an -** [SQLITE_IOERR_READ | extended error code] is returned. -*/ -int sqlite3_blob_read(sqlite3_blob *, void *z, int n, int iOffset); - -/* -** CAPI3REF: Write Data Into A BLOB Incrementally -** -** This function is used to write data into an open -** [sqlite3_blob | blob-handle] from a user supplied buffer. -** n bytes of data are copied from the buffer -** pointed to by z into the open blob, starting at offset iOffset. -** -** If the [sqlite3_blob | blob-handle] passed as the first argument -** was not opened for writing (the flags parameter to [sqlite3_blob_open()] -*** was zero), this function returns [SQLITE_READONLY]. -** -** This function may only modify the contents of the blob, it is -** not possible to increase the size of a blob using this API. If -** offset iOffset is less than n bytes from the end of the blob, -** [SQLITE_ERROR] is returned and no data is written. -** -** On success, SQLITE_OK is returned. Otherwise, an -** [SQLITE_ERROR | SQLite error code] or an -** [SQLITE_IOERR_READ | extended error code] is returned. -*/ -int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); - -/* -** CAPI3REF: Virtual File System Objects -** -** A virtual filesystem (VFS) is an [sqlite3_vfs] object -** that SQLite uses to interact -** with the underlying operating system. Most builds come with a -** single default VFS that is appropriate for the host computer. -** New VFSes can be registered and existing VFSes can be unregistered. -** The following interfaces are provided. -** -** The sqlite3_vfs_find() interface returns a pointer to a VFS given its -** name. Names are case sensitive. If there is no match, a NULL -** pointer is returned. If zVfsName is NULL then the default -** VFS is returned. -** -** New VFSes are registered with sqlite3_vfs_register(). Each -** new VFS becomes the default VFS if the makeDflt flag is set. -** The same VFS can be registered multiple times without injury. -** To make an existing VFS into the default VFS, register it again -** with the makeDflt flag set. If two different VFSes with the -** same name are registered, the behavior is undefined. If a -** VFS is registered with a name that is NULL or an empty string, -** then the behavior is undefined. -** -** Unregister a VFS with the sqlite3_vfs_unregister() interface. -** If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary. -*/ -sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); -int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); -int sqlite3_vfs_unregister(sqlite3_vfs*); - -/* -** CAPI3REF: Mutexes -** -** The SQLite core uses these routines for thread -** synchronization. Though they are intended for internal -** use by SQLite, code that links against SQLite is -** permitted to use any of these routines. -** -** The SQLite source code contains multiple implementations -** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. The following -** implementations are available in the SQLite core: -** -**
      -**
    • SQLITE_MUTEX_OS2 -**
    • SQLITE_MUTEX_PTHREAD -**
    • SQLITE_MUTEX_W32 -**
    • SQLITE_MUTEX_NOOP -**
    -** -** The SQLITE_MUTEX_NOOP implementation is a set of routines -** that does no real locking and is appropriate for use in -** a single-threaded application. The SQLITE_MUTEX_OS2, -** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations -** are appropriate for use on os/2, unix, and windows. -** -** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor -** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex -** implementation is included with the library. The -** mutex interface routines defined here become external -** references in the SQLite library for which implementations -** must be provided by the application. This facility allows an -** application that links against SQLite to provide its own mutex -** implementation without having to modify the SQLite core. -** -** The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. If it returns NULL -** that means that a mutex could not be allocated. SQLite -** will unwind its stack and return an error. The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
      -**
    • SQLITE_MUTEX_FAST -**
    • SQLITE_MUTEX_RECURSIVE -**
    • SQLITE_MUTEX_STATIC_MASTER -**
    • SQLITE_MUTEX_STATIC_MEM -**
    • SQLITE_MUTEX_STATIC_MEM2 -**
    • SQLITE_MUTEX_STATIC_PRNG -**
    • SQLITE_MUTEX_STATIC_LRU -**
    -** -** The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. But SQLite will only request a recursive mutex in -** cases where it really needs one. If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. Four static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -** -** The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. SQLite is careful to deallocate every -** dynamic mutex that it allocates. The dynamic mutexes must not be in -** use when they are deallocated. Attempting to deallocate a static -** mutex results in undefined behavior. SQLite never deallocates -** a static mutex. -** -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can -** be entered multiple times by the same thread. In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. If the same thread tries to enter any other kind of mutex -** more than once, the behavior is undefined. SQLite will never exhibit -** such behavior in its own use of mutexes. -** -** Some systems (ex: windows95) do not the operation implemented by -** sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() will -** always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior. -** -** The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. The behavior -** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. SQLite will -** never do either. -** -** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. -*/ -sqlite3_mutex *sqlite3_mutex_alloc(int); -void sqlite3_mutex_free(sqlite3_mutex*); -void sqlite3_mutex_enter(sqlite3_mutex*); -int sqlite3_mutex_try(sqlite3_mutex*); -void sqlite3_mutex_leave(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Verifcation Routines -** -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. The SQLite core -** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. The core only -** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. External mutex implementations -** are only required to provide these routines if SQLITE_DEBUG is -** defined and if NDEBUG is not defined. -** -** These routines should return true if the mutex in their argument -** is held or not held, respectively, by the calling thread. -** -** The implementation is not required to provided versions of these -** routines that actually work. -** If the implementation does not provide working -** versions of these routines, it should at least provide stubs -** that always return true so that one does not get spurious -** assertion failures. -** -** If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. This seems counter-intuitive since -** clearly the mutex cannot be held if it does not exist. But the -** the reason the mutex does not exist is because the build is not -** using mutexes. And we do not want the assert() containing the -** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. The sqlite3_mutex_notheld() -** interface should also return 1 when given a NULL pointer. -*/ -int sqlite3_mutex_held(sqlite3_mutex*); -int sqlite3_mutex_notheld(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Types -** -** The [sqlite3_mutex_alloc()] interface takes a single argument -** which is one of these integer constants. -*/ -#define SQLITE_MUTEX_FAST 0 -#define SQLITE_MUTEX_RECURSIVE 1 -#define SQLITE_MUTEX_STATIC_MASTER 2 -#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ -#define SQLITE_MUTEX_STATIC_MEM2 4 /* sqlite3_release_memory() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ -#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ - -/* -** CAPI3REF: Low-Level Control Of Database Files -** -** The [sqlite3_file_control()] interface makes a direct call to the -** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. The -** name of the database is the name assigned to the database by the -** ATTACH SQL command that opened the -** database. To control the main database file, use the name "main" -** or a NULL pointer. The third and fourth parameters to this routine -** are passed directly through to the second and third parameters of -** the xFileControl method. The return value of the xFileControl -** method becomes the return value of this routine. -** -** If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. This error -** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. The underlying xFileControl method might -** also return SQLITE_ERROR. There is no way to distinguish between -** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. -** -** See also: [SQLITE_FCNTL_LOCKSTATE] -*/ -int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); - -/* -** Undo the hack that converts floating point types to integer for -** builds on processors without floating point support. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# undef double -#endif - -#ifdef __cplusplus -} /* End of the 'extern "C"' block */ -#endif -#endif diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h b/libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h deleted file mode 100644 index 5d4c2dec96..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/sqlite3ext.h +++ /dev/null @@ -1,350 +0,0 @@ -/* -** 2006 June 7 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the SQLite interface for use by -** shared libraries that want to be imported as extensions into -** an SQLite instance. Shared libraries that intend to be loaded -** as extensions by SQLite should #include this file instead of -** sqlite3.h. -** -** @(#) $Id: sqlite3ext.h,v 1.17 2007/08/31 16:11:36 drh Exp $ -*/ -#ifndef _SQLITE3EXT_H_ -#define _SQLITE3EXT_H_ -#include "sqlite3.h" - -typedef struct sqlite3_api_routines sqlite3_api_routines; - -/* -** The following structure hold pointers to all of the SQLite API -** routines. -** -** WARNING: In order to maintain backwards compatibility, add new -** interfaces to the end of this structure only. If you insert new -** interfaces in the middle of this structure, then older different -** versions of SQLite will not be able to load each others shared -** libraries! -*/ -struct sqlite3_api_routines { - void * (*aggregate_context)(sqlite3_context*,int nBytes); - int (*aggregate_count)(sqlite3_context*); - int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); - int (*bind_double)(sqlite3_stmt*,int,double); - int (*bind_int)(sqlite3_stmt*,int,int); - int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); - int (*bind_null)(sqlite3_stmt*,int); - int (*bind_parameter_count)(sqlite3_stmt*); - int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); - const char * (*bind_parameter_name)(sqlite3_stmt*,int); - int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); - int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); - int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); - int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); - int (*busy_timeout)(sqlite3*,int ms); - int (*changes)(sqlite3*); - int (*close)(sqlite3*); - int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,int eTextRep,const char*)); - int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,int eTextRep,const void*)); - const void * (*column_blob)(sqlite3_stmt*,int iCol); - int (*column_bytes)(sqlite3_stmt*,int iCol); - int (*column_bytes16)(sqlite3_stmt*,int iCol); - int (*column_count)(sqlite3_stmt*pStmt); - const char * (*column_database_name)(sqlite3_stmt*,int); - const void * (*column_database_name16)(sqlite3_stmt*,int); - const char * (*column_decltype)(sqlite3_stmt*,int i); - const void * (*column_decltype16)(sqlite3_stmt*,int); - double (*column_double)(sqlite3_stmt*,int iCol); - int (*column_int)(sqlite3_stmt*,int iCol); - sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); - const char * (*column_name)(sqlite3_stmt*,int); - const void * (*column_name16)(sqlite3_stmt*,int); - const char * (*column_origin_name)(sqlite3_stmt*,int); - const void * (*column_origin_name16)(sqlite3_stmt*,int); - const char * (*column_table_name)(sqlite3_stmt*,int); - const void * (*column_table_name16)(sqlite3_stmt*,int); - const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); - const void * (*column_text16)(sqlite3_stmt*,int iCol); - int (*column_type)(sqlite3_stmt*,int iCol); - sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); - void * (*commit_hook)(sqlite3*,int(*)(void*),void*); - int (*complete)(const char*sql); - int (*complete16)(const void*sql); - int (*create_collation)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*)); - int (*create_collation16)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*)); - int (*create_function)(sqlite3*,const char*,int,int,void*,void (*xFunc)(sqlite3_context*,int,sqlite3_value**),void (*xStep)(sqlite3_context*,int,sqlite3_value**),void (*xFinal)(sqlite3_context*)); - int (*create_function16)(sqlite3*,const void*,int,int,void*,void (*xFunc)(sqlite3_context*,int,sqlite3_value**),void (*xStep)(sqlite3_context*,int,sqlite3_value**),void (*xFinal)(sqlite3_context*)); - int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); - int (*data_count)(sqlite3_stmt*pStmt); - sqlite3 * (*db_handle)(sqlite3_stmt*); - int (*declare_vtab)(sqlite3*,const char*); - int (*enable_shared_cache)(int); - int (*errcode)(sqlite3*db); - const char * (*errmsg)(sqlite3*); - const void * (*errmsg16)(sqlite3*); - int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); - int (*expired)(sqlite3_stmt*); - int (*finalize)(sqlite3_stmt*pStmt); - void (*free)(void*); - void (*free_table)(char**result); - int (*get_autocommit)(sqlite3*); - void * (*get_auxdata)(sqlite3_context*,int); - int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); - int (*global_recover)(void); - void (*interruptx)(sqlite3*); - sqlite_int64 (*last_insert_rowid)(sqlite3*); - const char * (*libversion)(void); - int (*libversion_number)(void); - void *(*malloc)(int); - char * (*mprintf)(const char*,...); - int (*open)(const char*,sqlite3**); - int (*open16)(const void*,sqlite3**); - int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); - int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); - void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); - void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); - void *(*realloc)(void*,int); - int (*reset)(sqlite3_stmt*pStmt); - void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_double)(sqlite3_context*,double); - void (*result_error)(sqlite3_context*,const char*,int); - void (*result_error16)(sqlite3_context*,const void*,int); - void (*result_int)(sqlite3_context*,int); - void (*result_int64)(sqlite3_context*,sqlite_int64); - void (*result_null)(sqlite3_context*); - void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); - void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); - void (*result_value)(sqlite3_context*,sqlite3_value*); - void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); - int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,const char*,const char*),void*); - void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); - char * (*snprintf)(int,char*,const char*,...); - int (*step)(sqlite3_stmt*); - int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,char const**,char const**,int*,int*,int*); - void (*thread_cleanup)(void); - int (*total_changes)(sqlite3*); - void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); - int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); - void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,sqlite_int64),void*); - void * (*user_data)(sqlite3_context*); - const void * (*value_blob)(sqlite3_value*); - int (*value_bytes)(sqlite3_value*); - int (*value_bytes16)(sqlite3_value*); - double (*value_double)(sqlite3_value*); - int (*value_int)(sqlite3_value*); - sqlite_int64 (*value_int64)(sqlite3_value*); - int (*value_numeric_type)(sqlite3_value*); - const unsigned char * (*value_text)(sqlite3_value*); - const void * (*value_text16)(sqlite3_value*); - const void * (*value_text16be)(sqlite3_value*); - const void * (*value_text16le)(sqlite3_value*); - int (*value_type)(sqlite3_value*); - char *(*vmprintf)(const char*,va_list); - /* Added ??? */ - int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); - /* Added by 3.3.13 */ - int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); - int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); - int (*clear_bindings)(sqlite3_stmt*); - /* Added by 3.4.1 */ - int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,void (*xDestroy)(void *)); - /* Added by 3.5.0 */ - int (*bind_zeroblob)(sqlite3_stmt*,int,int); - int (*blob_bytes)(sqlite3_blob*); - int (*blob_close)(sqlite3_blob*); - int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,int,sqlite3_blob**); - int (*blob_read)(sqlite3_blob*,void*,int,int); - int (*blob_write)(sqlite3_blob*,const void*,int,int); - int (*create_collation_v2)(sqlite3*,const char*,int,void*,int(*)(void*,int,const void*,int,const void*),void(*)(void*)); - int (*file_control)(sqlite3*,const char*,int,void*); - sqlite3_int64 (*memory_highwater)(int); - sqlite3_int64 (*memory_used)(void); - sqlite3_mutex *(*mutex_alloc)(int); - void (*mutex_enter)(sqlite3_mutex*); - void (*mutex_free)(sqlite3_mutex*); - void (*mutex_leave)(sqlite3_mutex*); - int (*mutex_try)(sqlite3_mutex*); - int (*open_v2)(const char*,sqlite3**,int,const char*); - int (*release_memory)(int); - void (*result_error_nomem)(sqlite3_context*); - void (*result_error_toobig)(sqlite3_context*); - int (*sleep)(int); - void (*soft_heap_limit)(int); - sqlite3_vfs *(*vfs_find)(const char*); - int (*vfs_register)(sqlite3_vfs*,int); - int (*vfs_unregister)(sqlite3_vfs*); -}; - -/* -** The following macros redefine the API routines so that they are -** redirected throught the global sqlite3_api structure. -** -** This header file is also used by the loadext.c source file -** (part of the main SQLite library - not an extension) so that -** it can get access to the sqlite3_api_routines structure -** definition. But the main library does not want to redefine -** the API. So the redefinition macros are only valid if the -** SQLITE_CORE macros is undefined. -*/ -#ifndef SQLITE_CORE -#define sqlite3_aggregate_context sqlite3_api->aggregate_context -#define sqlite3_aggregate_count sqlite3_api->aggregate_count -#define sqlite3_bind_blob sqlite3_api->bind_blob -#define sqlite3_bind_double sqlite3_api->bind_double -#define sqlite3_bind_int sqlite3_api->bind_int -#define sqlite3_bind_int64 sqlite3_api->bind_int64 -#define sqlite3_bind_null sqlite3_api->bind_null -#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count -#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index -#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name -#define sqlite3_bind_text sqlite3_api->bind_text -#define sqlite3_bind_text16 sqlite3_api->bind_text16 -#define sqlite3_bind_value sqlite3_api->bind_value -#define sqlite3_busy_handler sqlite3_api->busy_handler -#define sqlite3_busy_timeout sqlite3_api->busy_timeout -#define sqlite3_changes sqlite3_api->changes -#define sqlite3_close sqlite3_api->close -#define sqlite3_collation_needed sqlite3_api->collation_needed -#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 -#define sqlite3_column_blob sqlite3_api->column_blob -#define sqlite3_column_bytes sqlite3_api->column_bytes -#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 -#define sqlite3_column_count sqlite3_api->column_count -#define sqlite3_column_database_name sqlite3_api->column_database_name -#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 -#define sqlite3_column_decltype sqlite3_api->column_decltype -#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 -#define sqlite3_column_double sqlite3_api->column_double -#define sqlite3_column_int sqlite3_api->column_int -#define sqlite3_column_int64 sqlite3_api->column_int64 -#define sqlite3_column_name sqlite3_api->column_name -#define sqlite3_column_name16 sqlite3_api->column_name16 -#define sqlite3_column_origin_name sqlite3_api->column_origin_name -#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 -#define sqlite3_column_table_name sqlite3_api->column_table_name -#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 -#define sqlite3_column_text sqlite3_api->column_text -#define sqlite3_column_text16 sqlite3_api->column_text16 -#define sqlite3_column_type sqlite3_api->column_type -#define sqlite3_column_value sqlite3_api->column_value -#define sqlite3_commit_hook sqlite3_api->commit_hook -#define sqlite3_complete sqlite3_api->complete -#define sqlite3_complete16 sqlite3_api->complete16 -#define sqlite3_create_collation sqlite3_api->create_collation -#define sqlite3_create_collation16 sqlite3_api->create_collation16 -#define sqlite3_create_function sqlite3_api->create_function -#define sqlite3_create_function16 sqlite3_api->create_function16 -#define sqlite3_create_module sqlite3_api->create_module -#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 -#define sqlite3_data_count sqlite3_api->data_count -#define sqlite3_db_handle sqlite3_api->db_handle -#define sqlite3_declare_vtab sqlite3_api->declare_vtab -#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache -#define sqlite3_errcode sqlite3_api->errcode -#define sqlite3_errmsg sqlite3_api->errmsg -#define sqlite3_errmsg16 sqlite3_api->errmsg16 -#define sqlite3_exec sqlite3_api->exec -#define sqlite3_expired sqlite3_api->expired -#define sqlite3_finalize sqlite3_api->finalize -#define sqlite3_free sqlite3_api->free -#define sqlite3_free_table sqlite3_api->free_table -#define sqlite3_get_autocommit sqlite3_api->get_autocommit -#define sqlite3_get_auxdata sqlite3_api->get_auxdata -#define sqlite3_get_table sqlite3_api->get_table -#define sqlite3_global_recover sqlite3_api->global_recover -#define sqlite3_interrupt sqlite3_api->interruptx -#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid -#define sqlite3_libversion sqlite3_api->libversion -#define sqlite3_libversion_number sqlite3_api->libversion_number -#define sqlite3_malloc sqlite3_api->malloc -#define sqlite3_mprintf sqlite3_api->mprintf -#define sqlite3_open sqlite3_api->open -#define sqlite3_open16 sqlite3_api->open16 -#define sqlite3_prepare sqlite3_api->prepare -#define sqlite3_prepare16 sqlite3_api->prepare16 -#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 -#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 -#define sqlite3_profile sqlite3_api->profile -#define sqlite3_progress_handler sqlite3_api->progress_handler -#define sqlite3_realloc sqlite3_api->realloc -#define sqlite3_reset sqlite3_api->reset -#define sqlite3_result_blob sqlite3_api->result_blob -#define sqlite3_result_double sqlite3_api->result_double -#define sqlite3_result_error sqlite3_api->result_error -#define sqlite3_result_error16 sqlite3_api->result_error16 -#define sqlite3_result_int sqlite3_api->result_int -#define sqlite3_result_int64 sqlite3_api->result_int64 -#define sqlite3_result_null sqlite3_api->result_null -#define sqlite3_result_text sqlite3_api->result_text -#define sqlite3_result_text16 sqlite3_api->result_text16 -#define sqlite3_result_text16be sqlite3_api->result_text16be -#define sqlite3_result_text16le sqlite3_api->result_text16le -#define sqlite3_result_value sqlite3_api->result_value -#define sqlite3_rollback_hook sqlite3_api->rollback_hook -#define sqlite3_set_authorizer sqlite3_api->set_authorizer -#define sqlite3_set_auxdata sqlite3_api->set_auxdata -#define sqlite3_snprintf sqlite3_api->snprintf -#define sqlite3_step sqlite3_api->step -#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata -#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup -#define sqlite3_total_changes sqlite3_api->total_changes -#define sqlite3_trace sqlite3_api->trace -#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings -#define sqlite3_update_hook sqlite3_api->update_hook -#define sqlite3_user_data sqlite3_api->user_data -#define sqlite3_value_blob sqlite3_api->value_blob -#define sqlite3_value_bytes sqlite3_api->value_bytes -#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 -#define sqlite3_value_double sqlite3_api->value_double -#define sqlite3_value_int sqlite3_api->value_int -#define sqlite3_value_int64 sqlite3_api->value_int64 -#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type -#define sqlite3_value_text sqlite3_api->value_text -#define sqlite3_value_text16 sqlite3_api->value_text16 -#define sqlite3_value_text16be sqlite3_api->value_text16be -#define sqlite3_value_text16le sqlite3_api->value_text16le -#define sqlite3_value_type sqlite3_api->value_type -#define sqlite3_vmprintf sqlite3_api->vmprintf -#define sqlite3_overload_function sqlite3_api->overload_function -#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 -#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 -#define sqlite3_clear_bindings sqlite3_api->clear_bindings -#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob -#define sqlite3_blob_bytes sqlite3_api->blob_bytes -#define sqlite3_blob_close sqlite3_api->blob_close -#define sqlite3_blob_open sqlite3_api->blob_open -#define sqlite3_blob_read sqlite3_api->blob_read -#define sqlite3_blob_write sqlite3_api->blob_write -#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 -#define sqlite3_file_control sqlite3_api->file_control -#define sqlite3_memory_highwater sqlite3_api->memory_highwater -#define sqlite3_memory_used sqlite3_api->memory_used -#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc -#define sqlite3_mutex_enter sqlite3_api->mutex_enter -#define sqlite3_mutex_free sqlite3_api->mutex_free -#define sqlite3_mutex_leave sqlite3_api->mutex_leave -#define sqlite3_mutex_try sqlite3_api->mutex_try -#define sqlite3_open_v2 sqlite3_api->open_v2 -#define sqlite3_release_memory sqlite3_api->release_memory -#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem -#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig -#define sqlite3_sleep sqlite3_api->sleep -#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit -#define sqlite3_vfs_find sqlite3_api->vfs_find -#define sqlite3_vfs_register sqlite3_api->vfs_register -#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister -#endif /* SQLITE_CORE */ - -#define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api; -#define SQLITE_EXTENSION_INIT2(v) sqlite3_api = v; - -#endif /* _SQLITE3EXT_H_ */ diff --git a/libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h b/libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h deleted file mode 100644 index 2170e53912..0000000000 --- a/libraries/sqlite/unix/sqlite-3.5.1/src/sqliteInt.h +++ /dev/null @@ -1,1972 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Internal interface definitions for SQLite. -** -** @(#) $Id: sqliteInt.h,v 1.613 2007/10/03 08:46:45 danielk1977 Exp $ -*/ -#ifndef _SQLITEINT_H_ -#define _SQLITEINT_H_ -#include "sqliteLimit.h" - -/* -** For testing purposes, the various size limit constants are really -** variables that we can modify in the testfixture. -*/ -#ifdef SQLITE_TEST - #undef SQLITE_MAX_LENGTH - #undef SQLITE_MAX_COLUMN - #undef SQLITE_MAX_SQL_LENGTH - #undef SQLITE_MAX_EXPR_DEPTH - #undef SQLITE_MAX_COMPOUND_SELECT - #undef SQLITE_MAX_VDBE_OP - #undef SQLITE_MAX_FUNCTION_ARG - #undef SQLITE_MAX_VARIABLE_NUMBER - #undef SQLITE_MAX_PAGE_SIZE - #undef SQLITE_MAX_PAGE_COUNT - #undef SQLITE_MAX_LIKE_PATTERN_LENGTH - - #define SQLITE_MAX_LENGTH sqlite3MAX_LENGTH - #define SQLITE_MAX_COLUMN sqlite3MAX_COLUMN - #define SQLITE_MAX_SQL_LENGTH sqlite3MAX_SQL_LENGTH - #define SQLITE_MAX_EXPR_DEPTH sqlite3MAX_EXPR_DEPTH - #define SQLITE_MAX_COMPOUND_SELECT sqlite3MAX_COMPOUND_SELECT - #define SQLITE_MAX_VDBE_OP sqlite3MAX_VDBE_OP - #define SQLITE_MAX_FUNCTION_ARG sqlite3MAX_FUNCTION_ARG - #define SQLITE_MAX_VARIABLE_NUMBER sqlite3MAX_VARIABLE_NUMBER - #define SQLITE_MAX_PAGE_SIZE sqlite3MAX_PAGE_SIZE - #define SQLITE_MAX_PAGE_COUNT sqlite3MAX_PAGE_COUNT - #define SQLITE_MAX_LIKE_PATTERN_LENGTH sqlite3MAX_LIKE_PATTERN_LENGTH - - extern int sqlite3MAX_LENGTH; - extern int sqlite3MAX_COLUMN; - extern int sqlite3MAX_SQL_LENGTH; - extern int sqlite3MAX_EXPR_DEPTH; - extern int sqlite3MAX_COMPOUND_SELECT; - extern int sqlite3MAX_VDBE_OP; - extern int sqlite3MAX_FUNCTION_ARG; - extern int sqlite3MAX_VARIABLE_NUMBER; - extern int sqlite3MAX_PAGE_SIZE; - extern int sqlite3MAX_PAGE_COUNT; - extern int sqlite3MAX_LIKE_PATTERN_LENGTH; -#endif - - -/* -** The SQLITE_THREADSAFE macro must be defined as either 0 or 1. -** Older versions of SQLite used an optional THREADSAFE macro. -** We support that for legacy -*/ -#if !defined(SQLITE_THREADSAFE) -#if defined(THREADSAFE) -# define SQLITE_THREADSAFE THREADSAFE -#else -# define SQLITE_THREADSAFE 1 -#endif -#endif - -/* -** We need to define _XOPEN_SOURCE as follows in order to enable -** recursive mutexes on most unix systems. But Mac OS X is different. -** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, -** so it is omitted there. See ticket #2673. -** -** Later we learn that _XOPEN_SOURCE is poorly or incorrectly -** implemented on some systems. So we avoid defining it at all -** if it is already defined or if it is unneeded because we are -** not doing a threadsafe build. Ticket #2681. -*/ -#if !defined(_XOPEN_SOURCE) && !defined(__MACOS__) && SQLITE_THREADSAFE -# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ -#endif - -#if defined(SQLITE_TCL) || defined(TCLSH) -# include -#endif - -/* -** Many people are failing to set -DNDEBUG=1 when compiling SQLite. -** Setting NDEBUG makes the code smaller and run faster. So the following -** lines are added to automatically set NDEBUG unless the -DSQLITE_DEBUG=1 -** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out -** feature. -*/ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 -#endif - -/* -** These #defines should enable >2GB file support on Posix if the -** underlying operating system supports it. If the OS lacks -** large file support, or if the OS is windows, these should be no-ops. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: RedHat 7.2) but you want your code to work -** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in RedHat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** Similar is true for MacOS. LFS is only supported on MacOS 9 and later. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - -#include "sqlite3.h" -#include "hash.h" -#include "parse.h" -#include -#include -#include -#include -#include - -#define sqlite3_isnan(X) ((X)!=(X)) - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite_int64 -# define LONGDOUBLE_TYPE sqlite_int64 -# ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (0x7fffffffffffffff) -# endif -# define SQLITE_OMIT_DATETIME_FUNCS 1 -# define SQLITE_OMIT_TRACE 1 -# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -#endif -#ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (1e99) -#endif - -/* -** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 -** afterward. Having this macro allows us to cause the C compiler -** to omit code used by TEMP tables without messy #ifndef statements. -*/ -#ifdef SQLITE_OMIT_TEMPDB -#define OMIT_TEMPDB 1 -#else -#define OMIT_TEMPDB 0 -#endif - -/* -** If the following macro is set to 1, then NULL values are considered -** distinct when determining whether or not two entries are the same -** in a UNIQUE index. This is the way PostgreSQL, Oracle, DB2, MySQL, -** OCELOT, and Firebird all work. The SQL92 spec explicitly says this -** is the way things are suppose to work. -** -** If the following macro is set to 0, the NULLs are indistinct for -** a UNIQUE index. In this mode, you can only have a single NULL entry -** for a column declared UNIQUE. This is the way Informix and SQL Server -** work. -*/ -#define NULL_DISTINCT_FOR_UNIQUE 1 - -/* -** The "file format" number is an integer that is incremented whenever -** the VDBE-level file format changes. The following macros define the -** the default file format for new databases and the maximum file format -** that the library can read. -*/ -#define SQLITE_MAX_FILE_FORMAT 4 -#ifndef SQLITE_DEFAULT_FILE_FORMAT -# define SQLITE_DEFAULT_FILE_FORMAT 1 -#endif - -/* -** Provide a default value for TEMP_STORE in case it is not specified -** on the command-line -*/ -#ifndef TEMP_STORE -# define TEMP_STORE 1 -#endif - -/* -** GCC does not define the offsetof() macro so we'll have to do it -** ourselves. -*/ -#ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) -#endif - -/* -** Check to see if this machine uses EBCDIC. (Yes, believe it or -** not, there are still machines out there that use EBCDIC.) -*/ -#if 'A' == '\301' -# define SQLITE_EBCDIC 1 -#else -# define SQLITE_ASCII 1 -#endif - -/* -** Integers of known sizes. These typedefs might change for architectures -** where the sizes very. Preprocessor macros are available so that the -** types can be conveniently redefined at compile-type. Like this: -** -** cc '-DUINTPTR_TYPE=long long int' ... -*/ -#ifndef UINT32_TYPE -# define UINT32_TYPE unsigned int -#endif -#ifndef UINT16_TYPE -# define UINT16_TYPE unsigned short int -#endif -#ifndef INT16_TYPE -# define INT16_TYPE short int -#endif -#ifndef UINT8_TYPE -# define UINT8_TYPE unsigned char -#endif -#ifndef INT8_TYPE -# define INT8_TYPE signed char -#endif -#ifndef LONGDOUBLE_TYPE -# define LONGDOUBLE_TYPE long double -#endif -typedef sqlite_int64 i64; /* 8-byte signed integer */ -typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ -typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ -typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ -typedef INT16_TYPE i16; /* 2-byte signed integer */ -typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ -typedef UINT8_TYPE i8; /* 1-byte signed integer */ - -/* -** Macros to determine whether the machine is big or little endian, -** evaluated at runtime. -*/ -#ifdef SQLITE_AMALGAMATION -const int sqlite3One; -#else -extern const int sqlite3one; -#endif -#if defined(i386) || defined(__i386__) || defined(_M_IX86) -# define SQLITE_BIGENDIAN 0 -# define SQLITE_LITTLEENDIAN 1 -# define SQLITE_UTF16NATIVE SQLITE_UTF16LE -#else -# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) -# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) -# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) -#endif - -/* -** An instance of the following structure is used to store the busy-handler -** callback for a given sqlite handle. -** -** The sqlite.busyHandler member of the sqlite struct contains the busy -** callback for the database handle. Each pager opened via the sqlite -** handle is passed a pointer to sqlite.busyHandler. The busy-handler -** callback is currently invoked only from within pager.c. -*/ -typedef struct BusyHandler BusyHandler; -struct BusyHandler { - int (*xFunc)(void *,int); /* The busy callback */ - void *pArg; /* First arg to busy callback */ - int nBusy; /* Incremented with each busy call */ -}; - -/* -** Defer sourcing vdbe.h and btree.h until after the "u8" and -** "BusyHandler typedefs. -*/ -#include "btree.h" -#include "vdbe.h" -#include "pager.h" - - -/* -** Name of the master database table. The master database table -** is a special table that holds the names and attributes of all -** user tables and indices. -*/ -#define MASTER_NAME "sqlite_master" -#define TEMP_MASTER_NAME "sqlite_temp_master" - -/* -** The root-page of the master database table. -*/ -#define MASTER_ROOT 1 - -/* -** The name of the schema table. -*/ -#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) - -/* -** A convenience macro that returns the number of elements in -** an array. -*/ -#define ArraySize(X) (sizeof(X)/sizeof(X[0])) - -/* -** Forward references to structures -*/ -typedef struct AggInfo AggInfo; -typedef struct AuthContext AuthContext; -typedef struct CollSeq CollSeq; -typedef struct Column Column; -typedef struct Db Db; -typedef struct Schema Schema; -typedef struct Expr Expr; -typedef struct ExprList ExprList; -typedef struct FKey FKey; -typedef struct FuncDef FuncDef; -typedef struct IdList IdList; -typedef struct Index Index; -typedef struct KeyClass KeyClass; -typedef struct KeyInfo KeyInfo; -typedef struct Module Module; -typedef struct NameContext NameContext; -typedef struct Parse Parse; -typedef struct Select Select; -typedef struct SrcList SrcList; -typedef struct Table Table; -typedef struct TableLock TableLock; -typedef struct Token Token; -typedef struct TriggerStack TriggerStack; -typedef struct TriggerStep TriggerStep; -typedef struct Trigger Trigger; -typedef struct WhereInfo WhereInfo; -typedef struct WhereLevel WhereLevel; - -#include "os.h" -#include "mutex.h" - -/* -** Each database file to be accessed by the system is an instance -** of the following structure. There are normally two of these structures -** in the sqlite.aDb[] array. aDb[0] is the main database file and -** aDb[1] is the database file used to hold temporary tables. Additional -** databases may be attached. -*/ -struct Db { - char *zName; /* Name of this database */ - Btree *pBt; /* The B*Tree structure for this database file */ - u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ - u8 safety_level; /* How aggressive at synching data to disk */ - void *pAux; /* Auxiliary data. Usually NULL */ - void (*xFreeAux)(void*); /* Routine to free pAux */ - Schema *pSchema; /* Pointer to database schema (possibly shared) */ -}; - -/* -** An instance of the following structure stores a database schema. -** -** If there are no virtual tables configured in this schema, the -** Schema.db variable is set to NULL. After the first virtual table -** has been added, it is set to point to the database connection -** used to create the connection. Once a virtual table has been -** added to the Schema structure and the Schema.db variable populated, -** only that database connection may use the Schema to prepare -** statements. -*/ -struct Schema { - int schema_cookie; /* Database schema version number for this file */ - Hash tblHash; /* All tables indexed by name */ - Hash idxHash; /* All (named) indices indexed by name */ - Hash trigHash; /* All triggers indexed by name */ - Hash aFKey; /* Foreign keys indexed by to-table */ - Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ - u8 file_format; /* Schema format version for this file */ - u8 enc; /* Text encoding used by this database */ - u16 flags; /* Flags associated with this schema */ - int cache_size; /* Number of pages to use in the cache */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - sqlite3 *db; /* "Owner" connection. See comment above */ -#endif -}; - -/* -** These macros can be used to test, set, or clear bits in the -** Db.flags field. -*/ -#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) -#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) -#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) -#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) - -/* -** Allowed values for the DB.flags field. -** -** The DB_SchemaLoaded flag is set after the database schema has been -** read into internal hash tables. -** -** DB_UnresetViews means that one or more views have column names that -** have been filled out. If the schema changes, these column names might -** changes and so the view will need to be reset. -*/ -#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ -#define DB_UnresetViews 0x0002 /* Some views have defined column names */ -#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ - - -/* -** Each database is an instance of the following structure. -** -** The sqlite.lastRowid records the last insert rowid generated by an -** insert statement. Inserts on views do not affect its value. Each -** trigger has its own context, so that lastRowid can be updated inside -** triggers as usual. The previous value will be restored once the trigger -** exits. Upon entering a before or instead of trigger, lastRowid is no -** longer (since after version 2.8.12) reset to -1. -** -** The sqlite.nChange does not count changes within triggers and keeps no -** context. It is reset at start of sqlite3_exec. -** The sqlite.lsChange represents the number of changes made by the last -** insert, update, or delete statement. It remains constant throughout the -** length of a statement and is then updated by OP_SetCounts. It keeps a -** context stack just like lastRowid so that the count of changes -** within a trigger is not seen outside the trigger. Changes to views do not -** affect the value of lsChange. -** The sqlite.csChange keeps track of the number of current changes (since -** the last statement) and is used to update sqlite_lsChange. -** -** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 -** store the most recent error code and, if applicable, string. The -** internal function sqlite3Error() is used to set these variables -** consistently. -*/ -struct sqlite3 { - sqlite3_vfs *pVfs; /* OS Interface */ - int nDb; /* Number of backends currently in use */ - Db *aDb; /* All backends */ - int flags; /* Miscellanous flags. See below */ - int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ - int errCode; /* Most recent error code (SQLITE_*) */ - int errMask; /* & result codes with this before returning */ - u8 autoCommit; /* The auto-commit flag. */ - u8 temp_store; /* 1: file 2: memory 0: default */ - u8 mallocFailed; /* True if we have seen a malloc failure */ - int nTable; /* Number of tables in the database */ - CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ - i64 lastRowid; /* ROWID of most recent insert (see above) */ - i64 priorNewRowid; /* Last randomly generated ROWID */ - int magic; /* Magic number for detect library misuse */ - int nChange; /* Value returned by sqlite3_changes() */ - int nTotalChange; /* Value returned by sqlite3_total_changes() */ - sqlite3_mutex *mutex; /* Connection mutex */ - struct sqlite3InitInfo { /* Information used during initialization */ - int iDb; /* When back is being initialized */ - int newTnum; /* Rootpage of table being initialized */ - u8 busy; /* TRUE if currently initializing */ - } init; - int nExtension; /* Number of loaded extensions */ - void **aExtension; /* Array of shared libraray handles */ - struct Vdbe *pVdbe; /* List of active virtual machines */ - int activeVdbeCnt; /* Number of vdbes currently executing */ - void (*xTrace)(void*,const char*); /* Trace function */ - void *pTraceArg; /* Argument to the trace function */ - void (*xProfile)(void*,const char*,u64); /* Profiling function */ - void *pProfileArg; /* Argument to profile function */ - void *pCommitArg; /* Argument to xCommitCallback() */ - int (*xCommitCallback)(void*); /* Invoked at every commit. */ - void *pRollbackArg; /* Argument to xRollbackCallback() */ - void (*xRollbackCallback)(void*); /* Invoked at every commit. */ - void *pUpdateArg; - void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); - void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); - void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); - void *pCollNeededArg; - sqlite3_value *pErr; /* Most recent error message */ - char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ - char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ - union { - int isInterrupted; /* True if sqlite3_interrupt has been called */ - double notUsed1; /* Spacer */ - } u1; -#ifndef SQLITE_OMIT_AUTHORIZATION - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); - /* Access authorization function */ - void *pAuthArg; /* 1st argument to the access auth function */ -#endif -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - int (*xProgress)(void *); /* The progress callback */ - void *pProgressArg; /* Argument to the progress callback */ - int nProgressOps; /* Number of opcodes for progress callback */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - Hash aModule; /* populated by sqlite3_create_module() */ - Table *pVTab; /* vtab with active Connect/Create method */ - sqlite3_vtab **aVTrans; /* Virtual tables with open transactions */ - int nVTrans; /* Allocated size of aVTrans */ -#endif - Hash aFunc; /* All functions that can be in SQL exprs */ - Hash aCollSeq; /* All collating sequences */ - BusyHandler busyHandler; /* Busy callback */ - int busyTimeout; /* Busy handler timeout, in msec */ - Db aDbStatic[2]; /* Static space for the 2 default backends */ -#ifdef SQLITE_SSE - sqlite3_stmt *pFetch; /* Used by SSE to fetch stored statements */ -#endif - u8 dfltLockMode; /* Default locking-mode for attached dbs */ -}; - -/* -** A macro to discover the encoding of a database. -*/ -#define ENC(db) ((db)->aDb[0].pSchema->enc) - -/* -** Possible values for the sqlite.flags and or Db.flags fields. -** -** On sqlite.flags, the SQLITE_InTrans value means that we have -** executed a BEGIN. On Db.flags, SQLITE_InTrans means a statement -** transaction is active on that particular database file. -*/ -#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ -#define SQLITE_InTrans 0x00000008 /* True if in a transaction */ -#define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */ -#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */ -#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ -#define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ - /* DELETE, or UPDATE and return */ - /* the count using a callback. */ -#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ - /* result set is empty */ -#define SQLITE_SqlTrace 0x00000200 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x00000400 /* Debug listings of VDBE programs */ -#define SQLITE_WriteSchema 0x00000800 /* OK to update SQLITE_MASTER */ -#define SQLITE_NoReadlock 0x00001000 /* Readlocks are omitted when - ** accessing read-only databases */ -#define SQLITE_IgnoreChecks 0x00002000 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommitted 0x00004000 /* For shared-cache mode */ -#define SQLITE_LegacyFileFmt 0x00008000 /* Create new databases in format 1 */ -#define SQLITE_FullFSync 0x00010000 /* Use full fsync on the backend */ -#define SQLITE_LoadExtension 0x00020000 /* Enable load_extension */ - -#define SQLITE_RecoveryMode 0x00040000 /* Ignore schema errors */ -#define SQLITE_SharedCache 0x00080000 /* Cache sharing is enabled */ -#define SQLITE_Vtab 0x00100000 /* There exists a virtual table */ - -/* -** Possible values for the sqlite.magic field. -** The numbers are obtained at random and have no special meaning, other -** than being distinct from one another. -*/ -#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ -#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ -#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ -#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ - -/* -** Each SQL function is defined by an instance of the following -** structure. A pointer to this structure is stored in the sqlite.aFunc -** hash table. When multiple functions have the same name, the hash table -** points to a linked list of these structures. -*/ -struct FuncDef { - i16 nArg; /* Number of arguments. -1 means unlimited */ - u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ - u8 needCollSeq; /* True if sqlite3GetFuncCollSeq() might be called */ - u8 flags; /* Some combination of SQLITE_FUNC_* */ - void *pUserData; /* User data parameter */ - FuncDef *pNext; /* Next function with same name */ - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ - void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ - void (*xFinalize)(sqlite3_context*); /* Aggregate finializer */ - char zName[1]; /* SQL name of the function. MUST BE LAST */ -}; - -/* -** Each SQLite module (virtual table definition) is defined by an -** instance of the following structure, stored in the sqlite3.aModule -** hash table. -*/ -struct Module { - const sqlite3_module *pModule; /* Callback pointers */ - const char *zName; /* Name passed to create_module() */ - void *pAux; /* pAux passed to create_module() */ - void (*xDestroy)(void *); /* Module destructor function */ -}; - -/* -** Possible values for FuncDef.flags -*/ -#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ -#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ -#define SQLITE_FUNC_EPHEM 0x04 /* Ephermeral. Delete with VDBE */ - -/* -** information about each column of an SQL table is held in an instance -** of this structure. -*/ -struct Column { - char *zName; /* Name of this column */ - Expr *pDflt; /* Default value of this column */ - char *zType; /* Data type for this column */ - char *zColl; /* Collating sequence. If NULL, use the default */ - u8 notNull; /* True if there is a NOT NULL constraint */ - u8 isPrimKey; /* True if this column is part of the PRIMARY KEY */ - char affinity; /* One of the SQLITE_AFF_... values */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - u8 isHidden; /* True if this column is 'hidden' */ -#endif -}; - -/* -** A "Collating Sequence" is defined by an instance of the following -** structure. Conceptually, a collating sequence consists of a name and -** a comparison routine that defines the order of that sequence. -** -** There may two seperate implementations of the collation function, one -** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that -** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine -** native byte order. When a collation sequence is invoked, SQLite selects -** the version that will require the least expensive encoding -** translations, if any. -** -** The CollSeq.pUser member variable is an extra parameter that passed in -** as the first argument to the UTF-8 comparison function, xCmp. -** CollSeq.pUser16 is the equivalent for the UTF-16 comparison function, -** xCmp16. -** -** If both CollSeq.xCmp and CollSeq.xCmp16 are NULL, it means that the -** collating sequence is undefined. Indices built on an undefined -** collating sequence may not be read or written. -*/ -struct CollSeq { - char *zName; /* Name of the collating sequence, UTF-8 encoded */ - u8 enc; /* Text encoding handled by xCmp() */ - u8 type; /* One of the SQLITE_COLL_... values below */ - void *pUser; /* First argument to xCmp() */ - int (*xCmp)(void*,int, const void*, int, const void*); - void (*xDel)(void*); /* Destructor for pUser */ -}; - -/* -** Allowed values of CollSeq flags: -*/ -#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */ -#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */ -#define SQLITE_COLL_REVERSE 3 /* The built-in REVERSE collating sequence */ -#define SQLITE_COLL_USER 0 /* Any other user-defined collating sequence */ - -/* -** A sort order can be either ASC or DESC. -*/ -#define SQLITE_SO_ASC 0 /* Sort in ascending order */ -#define SQLITE_SO_DESC 1 /* Sort in ascending order */ - -/* -** Column affinity types. -** -** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and -** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve -** the speed a little by number the values consecutively. -** -** But rather than start with 0 or 1, we begin with 'a'. That way, -** when multiple affinity types are concatenated into a string and -** used as the P3 operand, they will be more readable. -** -** Note also that the numeric types are grouped together so that testing -** for a numeric type is a single comparison. -*/ -#define SQLITE_AFF_TEXT 'a' -#define SQLITE_AFF_NONE 'b' -#define SQLITE_AFF_NUMERIC 'c' -#define SQLITE_AFF_INTEGER 'd' -#define SQLITE_AFF_REAL 'e' - -#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) - -/* -** Each SQL table is represented in memory by an instance of the -** following structure. -** -** Table.zName is the name of the table. The case of the original -** CREATE TABLE statement is stored, but case is not significant for -** comparisons. -** -** Table.nCol is the number of columns in this table. Table.aCol is a -** pointer to an array of Column structures, one for each column. -** -** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of -** the column that is that key. Otherwise Table.iPKey is negative. Note -** that the datatype of the PRIMARY KEY must be INTEGER for this field to -** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of -** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid -** is generated for each row of the table. Table.hasPrimKey is true if -** the table has any PRIMARY KEY, INTEGER or otherwise. -** -** Table.tnum is the page number for the root BTree page of the table in the -** database file. If Table.iDb is the index of the database table backend -** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that -** holds temporary tables and indices. If Table.isEphem -** is true, then the table is stored in a file that is automatically deleted -** when the VDBE cursor to the table is closed. In this case Table.tnum -** refers VDBE cursor number that holds the table open, not to the root -** page number. Transient tables are used to hold the results of a -** sub-query that appears instead of a real table name in the FROM clause -** of a SELECT statement. -*/ -struct Table { - char *zName; /* Name of the table */ - int nCol; /* Number of columns in this table */ - Column *aCol; /* Information about each column */ - int iPKey; /* If not less then 0, use aCol[iPKey] as the primary key */ - Index *pIndex; /* List of SQL indexes on this table. */ - int tnum; /* Root BTree node for this table (see note above) */ - Select *pSelect; /* NULL for tables. Points to definition if a view. */ - int nRef; /* Number of pointers to this Table */ - Trigger *pTrigger; /* List of SQL triggers on this table */ - FKey *pFKey; /* Linked list of all foreign keys in this table */ - char *zColAff; /* String defining the affinity of each column */ -#ifndef SQLITE_OMIT_CHECK - Expr *pCheck; /* The AND of all CHECK constraints */ -#endif -#ifndef SQLITE_OMIT_ALTERTABLE - int addColOffset; /* Offset in CREATE TABLE statement to add a new column */ -#endif - u8 readOnly; /* True if this table should not be written by the user */ - u8 isEphem; /* True if created using OP_OpenEphermeral */ - u8 hasPrimKey; /* True if there exists a primary key */ - u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ - u8 autoInc; /* True if the integer primary key is autoincrement */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - u8 isVirtual; /* True if this is a virtual table */ - u8 isCommit; /* True once the CREATE TABLE has been committed */ - Module *pMod; /* Pointer to the implementation of the module */ - sqlite3_vtab *pVtab; /* Pointer to the module instance */ - int nModuleArg; /* Number of arguments to the module */ - char **azModuleArg; /* Text of all module args. [0] is module name */ -#endif - Schema *pSchema; /* Schema that contains this table */ -}; - -/* -** Test to see whether or not a table is a virtual table. This is -** done as a macro so that it will be optimized out when virtual -** table support is omitted from the build. -*/ -#ifndef SQLITE_OMIT_VIRTUALTABLE -# define IsVirtual(X) ((X)->isVirtual) -# define IsHiddenColumn(X) ((X)->isHidden) -#else -# define IsVirtual(X) 0 -# define IsHiddenColumn(X) 0 -#endif - -/* -** Each foreign key constraint is an instance of the following structure. -** -** A foreign key is associated with two tables. The "from" table is -** the table that contains the REFERENCES clause that creates the foreign -** key. The "to" table is the table that is named in the REFERENCES clause. -** Consider this example: -** -** CREATE TABLE ex1( -** a INTEGER PRIMARY KEY, -** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) -** ); -** -** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". -** -** Each REFERENCES clause generates an instance of the following structure -** which is attached to the from-table. The to-table need not exist when -** the from-table is created. The existance of the to-table is not checked -** until an attempt is made to insert data into the from-table. -** -** The sqlite.aFKey hash table stores pointers to this structure -** given the name of a to-table. For each to-table, all foreign keys -** associated with that table are on a linked list using the FKey.pNextTo -** field. -*/ -struct FKey { - Table *pFrom; /* The table that constains the REFERENCES clause */ - FKey *pNextFrom; /* Next foreign key in pFrom */ - char *zTo; /* Name of table that the key points to */ - FKey *pNextTo; /* Next foreign key that points to zTo */ - int nCol; /* Number of columns in this key */ - struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ - int iFrom; /* Index of column in pFrom */ - char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ - } *aCol; /* One entry for each of nCol column s */ - u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ - u8 updateConf; /* How to resolve conflicts that occur on UPDATE */ - u8 deleteConf; /* How to resolve conflicts that occur on DELETE */ - u8 insertConf; /* How to resolve conflicts that occur on INSERT */ -}; - -/* -** SQLite supports many different ways to resolve a constraint -** error. ROLLBACK processing means that a constraint violation -** causes the operation in process to fail and for the current transaction -** to be rolled back. ABORT processing means the operation in process -** fails and any prior changes from that one operation are backed out, -** but the transaction is not rolled back. FAIL processing means that -** the operation in progress stops and returns an error code. But prior -** changes due to the same operation are not backed out and no rollback -** occurs. IGNORE means that the particular row that caused the constraint -** error is not inserted or updated. Processing continues and no error -** is returned. REPLACE means that preexisting database rows that caused -** a UNIQUE constraint violation are removed so that the new insert or -** update can proceed. Processing continues and no error is reported. -** -** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. -** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the -** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign -** key is set to NULL. CASCADE means that a DELETE or UPDATE of the -** referenced table row is propagated into the row that holds the -** foreign key. -** -** The following symbolic values are used to record which type -** of action to take. -*/ -#define OE_None 0 /* There is no constraint to check */ -#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ -#define OE_Abort 2 /* Back out changes but do no rollback transaction */ -#define OE_Fail 3 /* Stop the operation but leave all prior changes */ -#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ -#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ - -#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ -#define OE_SetNull 7 /* Set the foreign key value to NULL */ -#define OE_SetDflt 8 /* Set the foreign key value to its default */ -#define OE_Cascade 9 /* Cascade the changes */ - -#define OE_Default 99 /* Do whatever the default action is */ - - -/* -** An instance of the following structure is passed as the first -** argument to sqlite3VdbeKeyCompare and is used to control the -** comparison of the two index keys. -** -** If the KeyInfo.incrKey value is true and the comparison would -** otherwise be equal, then return a result as if the second key -** were larger. -*/ -struct KeyInfo { - sqlite3 *db; /* The database connection */ - u8 enc; /* Text encoding - one of the TEXT_Utf* values */ - u8 incrKey; /* Increase 2nd key by epsilon before comparison */ - int nField; /* Number of entries in aColl[] */ - u8 *aSortOrder; /* If defined an aSortOrder[i] is true, sort DESC */ - CollSeq *aColl[1]; /* Collating sequence for each term of the key */ -}; - -/* -** Each SQL index is represented in memory by an -** instance of the following structure. -** -** The columns of the table that are to be indexed are described -** by the aiColumn[] field of this structure. For example, suppose -** we have the following table and index: -** -** CREATE TABLE Ex1(c1 int, c2 int, c3 text); -** CREATE INDEX Ex2 ON Ex1(c3,c1); -** -** In the Table structure describing Ex1, nCol==3 because there are -** three columns in the table. In the Index structure describing -** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. -** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the -** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. -** The second column to be indexed (c1) has an index of 0 in -** Ex1.aCol[], hence Ex2.aiColumn[1]==0. -** -** The Index.onError field determines whether or not the indexed columns -** must be unique and what to do if they are not. When Index.onError=OE_None, -** it means this is not a unique index. Otherwise it is a unique index -** and the value of Index.onError indicate the which conflict resolution -** algorithm to employ whenever an attempt is made to insert a non-unique -** element. -*/ -struct Index { - char *zName; /* Name of this index */ - int nColumn; /* Number of columns in the table used by this index */ - int *aiColumn; /* Which columns are used by this index. 1st is 0 */ - unsigned *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */ - Table *pTable; /* The SQL table being indexed */ - int tnum; /* Page containing root of this index in database file */ - u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */ - char *zColAff; /* String defining the affinity of each column */ - Index *pNext; /* The next index associated with the same table */ - Schema *pSchema; /* Schema containing this index */ - u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */ - char **azColl; /* Array of collation sequence names for index */ -}; - -/* -** Each token coming out of the lexer is an instance of -** this structure. Tokens are also used as part of an expression. -** -** Note if Token.z==0 then Token.dyn and Token.n are undefined and -** may contain random values. Do not make any assuptions about Token.dyn -** and Token.n when Token.z==0. -*/ -struct Token { - const unsigned char *z; /* Text of the token. Not NULL-terminated! */ - unsigned dyn : 1; /* True for malloced memory, false for static */ - unsigned n : 31; /* Number of characters in this token */ -}; - -/* -** An instance of this structure contains information needed to generate -** code for a SELECT that contains aggregate functions. -** -** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a -** pointer to this structure. The Expr.iColumn field is the index in -** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate -** code for that node. -** -** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the -** original Select structure that describes the SELECT statement. These -** fields do not need to be freed when deallocating the AggInfo structure. -*/ -struct AggInfo { - u8 directMode; /* Direct rendering mode means take data directly - ** from source tables rather than from accumulators */ - u8 useSortingIdx; /* In direct mode, reference the sorting index rather - ** than the source table */ - int sortingIdx; /* Cursor number of the sorting index */ - ExprList *pGroupBy; /* The group by clause */ - int nSortingColumn; /* Number of columns in the sorting index */ - struct AggInfo_col { /* For each column used in source tables */ - Table *pTab; /* Source table */ - int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ - int iMem; /* Memory location that acts as accumulator */ - Expr *pExpr; /* The original expression */ - } *aCol; - int nColumn; /* Number of used entries in aCol[] */ - int nColumnAlloc; /* Number of slots allocated for aCol[] */ - int nAccumulator; /* Number of columns that show through to the output. - ** Additional columns are used only as parameters to - ** aggregate functions */ - struct AggInfo_func { /* For each aggregate function */ - Expr *pExpr; /* Expression encoding the function */ - FuncDef *pFunc; /* The aggregate function implementation */ - int iMem; /* Memory location that acts as accumulator */ - int iDistinct; /* Ephermeral table used to enforce DISTINCT */ - } *aFunc; - int nFunc; /* Number of entries in aFunc[] */ - int nFuncAlloc; /* Number of slots allocated for aFunc[] */ -}; - -/* -** Each node of an expression in the parse tree is an instance -** of this structure. -** -** Expr.op is the opcode. The integer parser token codes are reused -** as opcodes here. For example, the parser defines TK_GE to be an integer -** code representing the ">=" operator. This same integer code is reused -** to represent the greater-than-or-equal-to operator in the expression -** tree. -** -** Expr.pRight and Expr.pLeft are subexpressions. Expr.pList is a list -** of argument if the expression is a function. -** -** Expr.token is the operator token for this node. For some expressions -** that have subexpressions, Expr.token can be the complete text that gave -** rise to the Expr. In the latter case, the token is marked as being -** a compound token. -** -** An expression of the form ID or ID.ID refers to a column in a table. -** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is -** the integer cursor number of a VDBE cursor pointing to that table and -** Expr.iColumn is the column number for the specific column. If the -** expression is used as a result in an aggregate SELECT, then the -** value is also stored in the Expr.iAgg column in the aggregate so that -** it can be accessed after all aggregates are computed. -** -** If the expression is a function, the Expr.iTable is an integer code -** representing which function. If the expression is an unbound variable -** marker (a question mark character '?' in the original SQL) then the -** Expr.iTable holds the index number for that variable. -** -** If the expression is a subquery then Expr.iColumn holds an integer -** register number containing the result of the subquery. If the -** subquery gives a constant result, then iTable is -1. If the subquery -** gives a different answer at different times during statement processing -** then iTable is the address of a subroutine that computes the subquery. -** -** The Expr.pSelect field points to a SELECT statement. The SELECT might -** be the right operand of an IN operator. Or, if a scalar SELECT appears -** in an expression the opcode is TK_SELECT and Expr.pSelect is the only -** operand. -** -** If the Expr is of type OP_Column, and the table it is selecting from -** is a disk table or the "old.*" pseudo-table, then pTab points to the -** corresponding table definition. -*/ -struct Expr { - u8 op; /* Operation performed by this node */ - char affinity; /* The affinity of the column or 0 if not a column */ - u16 flags; /* Various flags. See below */ - CollSeq *pColl; /* The collation type of the column or 0 */ - Expr *pLeft, *pRight; /* Left and right subnodes */ - ExprList *pList; /* A list of expressions used as function arguments - ** or in " IN (aCol[] or ->aFunc[] */ - int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ - Select *pSelect; /* When the expression is a sub-select. Also the - ** right side of " IN (